From 099192dd59ef438c1b92f278893d44a7d0169fe9 Mon Sep 17 00:00:00 2001 From: apple Date: Wed, 31 Jan 2018 16:12:26 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- all/pom.xml | 45 ++++++++++++++++++ all/tomcat-all.iml | 24 ++++++++++ core/pom.xml | 33 +++++++++++++ .../java/com/mat/net/AsyncContextExample.java | 0 .../main/java/javax/annotation/Generated.java | 0 .../java/javax/annotation/ManagedBean.java | 0 .../java/javax/annotation/PostConstruct.java | 0 .../java/javax/annotation/PreDestroy.java | 0 .../main/java/javax/annotation/Priority.java | 0 .../main/java/javax/annotation/Resource.java | 0 .../main/java/javax/annotation/Resources.java | 0 .../annotation/security/DeclareRoles.java | 0 .../javax/annotation/security/DenyAll.java | 0 .../javax/annotation/security/PermitAll.java | 0 .../annotation/security/RolesAllowed.java | 0 .../java/javax/annotation/security/RunAs.java | 0 .../annotation/sql/DataSourceDefinition.java | 0 .../annotation/sql/DataSourceDefinitions.java | 0 .../src}/main/java/javax/ejb/EJB.java | 0 .../src}/main/java/javax/ejb/EJBs.java | 0 .../main/java/javax/el/ArrayELResolver.java | 0 .../main/java/javax/el/BeanELResolver.java | 0 .../java/javax/el/BeanNameELResolver.java | 0 .../main/java/javax/el/BeanNameResolver.java | 0 .../java/javax/el/CompositeELResolver.java | 0 .../src}/main/java/javax/el/ELClass.java | 0 .../src}/main/java/javax/el/ELContext.java | 0 .../main/java/javax/el/ELContextEvent.java | 0 .../main/java/javax/el/ELContextListener.java | 0 .../src}/main/java/javax/el/ELException.java | 0 .../src}/main/java/javax/el/ELManager.java | 0 .../src}/main/java/javax/el/ELProcessor.java | 0 .../src}/main/java/javax/el/ELResolver.java | 0 .../java/javax/el/EvaluationListener.java | 0 .../src}/main/java/javax/el/Expression.java | 0 .../main/java/javax/el/ExpressionFactory.java | 0 .../main/java/javax/el/FunctionMapper.java | 0 .../main/java/javax/el/ImportHandler.java | 0 .../main/java/javax/el/LambdaExpression.java | 0 .../main/java/javax/el/ListELResolver.java | 0 .../java/javax/el/LocalStrings.properties | 0 .../java/javax/el/LocalStrings_es.properties | 0 .../main/java/javax/el/MapELResolver.java | 0 .../main/java/javax/el/MethodExpression.java | 0 .../src}/main/java/javax/el/MethodInfo.java | 0 .../javax/el/MethodNotFoundException.java | 0 .../javax/el/PropertyNotFoundException.java | 0 .../el/PropertyNotWritableException.java | 0 .../javax/el/ResourceBundleELResolver.java | 0 .../main/java/javax/el/StandardELContext.java | 0 .../java/javax/el/StaticFieldELResolver.java | 0 .../main/java/javax/el/TypeConverter.java | 0 .../src}/main/java/javax/el/Util.java | 0 .../main/java/javax/el/ValueExpression.java | 0 .../main/java/javax/el/ValueReference.java | 0 .../main/java/javax/el/VariableMapper.java | 0 .../main/java/javax/mail/Authenticator.java | 0 .../javax/mail/PasswordAuthentication.java | 0 .../src}/main/java/javax/mail/Session.java | 0 .../javax/mail/internet/InternetAddress.java | 0 .../java/javax/mail/internet/MimeMessage.java | 0 .../java/javax/mail/internet/MimePart.java | 0 .../mail/internet/MimePartDataSource.java | 0 .../javax/persistence/PersistenceContext.java | 0 .../persistence/PersistenceContextType.java | 0 .../persistence/PersistenceContexts.java | 0 .../persistence/PersistenceProperty.java | 0 .../javax/persistence/PersistenceUnit.java | 0 .../javax/persistence/PersistenceUnits.java | 0 .../persistence/SynchronizationType.java | 0 .../security/auth/message/AuthException.java | 0 .../security/auth/message/AuthStatus.java | 0 .../security/auth/message/ClientAuth.java | 0 .../security/auth/message/MessageInfo.java | 0 .../security/auth/message/MessagePolicy.java | 0 .../security/auth/message/ServerAuth.java | 0 .../callback/CallerPrincipalCallback.java | 0 .../message/callback/CertStoreCallback.java | 0 .../callback/GroupPrincipalCallback.java | 0 .../callback/PasswordValidationCallback.java | 0 .../message/callback/PrivateKeyCallback.java | 0 .../message/callback/SecretKeyCallback.java | 0 .../message/callback/TrustStoreCallback.java | 0 .../auth/message/config/AuthConfig.java | 0 .../message/config/AuthConfigFactory.java | 0 .../message/config/AuthConfigProvider.java | 0 .../auth/message/config/ClientAuthConfig.java | 0 .../message/config/ClientAuthContext.java | 0 .../message/config/RegistrationListener.java | 0 .../auth/message/config/ServerAuthConfig.java | 0 .../message/config/ServerAuthContext.java | 0 .../auth/message/module/ClientAuthModule.java | 0 .../auth/message/module/ServerAuthModule.java | 0 .../main/java/javax/servlet/AsyncContext.java | 0 .../main/java/javax/servlet/AsyncEvent.java | 0 .../java/javax/servlet/AsyncListener.java | 0 .../java/javax/servlet/DispatcherType.java | 0 .../src}/main/java/javax/servlet/Filter.java | 0 .../main/java/javax/servlet/FilterChain.java | 0 .../main/java/javax/servlet/FilterConfig.java | 0 .../javax/servlet/FilterRegistration.java | 0 .../java/javax/servlet/GenericFilter.java | 0 .../java/javax/servlet/GenericServlet.java | 0 .../javax/servlet/HttpConstraintElement.java | 0 .../servlet/HttpMethodConstraintElement.java | 0 .../javax/servlet/LocalStrings.properties | 0 .../javax/servlet/LocalStrings_es.properties | 0 .../javax/servlet/LocalStrings_fr.properties | 0 .../javax/servlet/LocalStrings_ja.properties | 0 .../javax/servlet/MultipartConfigElement.java | 0 .../main/java/javax/servlet/ReadListener.java | 0 .../main/java/javax/servlet/Registration.java | 0 .../java/javax/servlet/RequestDispatcher.java | 0 .../src}/main/java/javax/servlet/Servlet.java | 0 .../java/javax/servlet/ServletConfig.java | 0 .../servlet/ServletContainerInitializer.java | 0 .../java/javax/servlet/ServletContext.java | 0 .../servlet/ServletContextAttributeEvent.java | 0 .../ServletContextAttributeListener.java | 0 .../javax/servlet/ServletContextEvent.java | 0 .../javax/servlet/ServletContextListener.java | 0 .../java/javax/servlet/ServletException.java | 0 .../javax/servlet/ServletInputStream.java | 0 .../javax/servlet/ServletOutputStream.java | 0 .../javax/servlet/ServletRegistration.java | 0 .../java/javax/servlet/ServletRequest.java | 0 .../servlet/ServletRequestAttributeEvent.java | 0 .../ServletRequestAttributeListener.java | 0 .../javax/servlet/ServletRequestEvent.java | 0 .../javax/servlet/ServletRequestListener.java | 0 .../javax/servlet/ServletRequestWrapper.java | 0 .../java/javax/servlet/ServletResponse.java | 0 .../javax/servlet/ServletResponseWrapper.java | 0 .../javax/servlet/ServletSecurityElement.java | 0 .../javax/servlet/SessionCookieConfig.java | 0 .../javax/servlet/SessionTrackingMode.java | 0 .../java/javax/servlet/SingleThreadModel.java | 0 .../javax/servlet/UnavailableException.java | 0 .../java/javax/servlet/WriteListener.java | 0 .../servlet/annotation/HandlesTypes.java | 0 .../servlet/annotation/HttpConstraint.java | 0 .../annotation/HttpMethodConstraint.java | 0 .../servlet/annotation/MultipartConfig.java | 0 .../servlet/annotation/ServletSecurity.java | 0 .../javax/servlet/annotation/WebFilter.java | 0 .../servlet/annotation/WebInitParam.java | 0 .../javax/servlet/annotation/WebListener.java | 0 .../javax/servlet/annotation/WebServlet.java | 0 .../descriptor/JspConfigDescriptor.java | 0 .../JspPropertyGroupDescriptor.java | 0 .../servlet/descriptor/TaglibDescriptor.java | 0 .../main/java/javax/servlet/http/Cookie.java | 0 .../java/javax/servlet/http/HttpFilter.java | 0 .../java/javax/servlet/http/HttpServlet.java | 0 .../servlet/http/HttpServletRequest.java | 0 .../http/HttpServletRequestWrapper.java | 0 .../servlet/http/HttpServletResponse.java | 0 .../http/HttpServletResponseWrapper.java | 0 .../java/javax/servlet/http/HttpSession.java | 0 .../http/HttpSessionActivationListener.java | 0 .../http/HttpSessionAttributeListener.java | 0 .../servlet/http/HttpSessionBindingEvent.java | 0 .../http/HttpSessionBindingListener.java | 0 .../servlet/http/HttpSessionContext.java | 0 .../javax/servlet/http/HttpSessionEvent.java | 0 .../servlet/http/HttpSessionIdListener.java | 0 .../servlet/http/HttpSessionListener.java | 0 .../servlet/http/HttpUpgradeHandler.java | 0 .../java/javax/servlet/http/HttpUtils.java | 0 .../servlet/http/LocalStrings.properties | 0 .../servlet/http/LocalStrings_es.properties | 0 .../servlet/http/LocalStrings_fr.properties | 0 .../servlet/http/LocalStrings_ja.properties | 0 .../java/javax/servlet/http/MappingMatch.java | 0 .../main/java/javax/servlet/http/Part.java | 0 .../java/javax/servlet/http/PushBuilder.java | 0 .../javax/servlet/http/ServletMapping.java | 0 .../javax/servlet/http/WebConnection.java | 0 .../main/java/javax/servlet/http/package.html | 0 .../java/javax/servlet/jsp/ErrorData.java | 0 .../java/javax/servlet/jsp/HttpJspPage.java | 0 .../servlet/jsp/JspApplicationContext.java | 0 .../java/javax/servlet/jsp/JspContext.java | 0 .../java/javax/servlet/jsp/JspEngineInfo.java | 0 .../java/javax/servlet/jsp/JspException.java | 0 .../java/javax/servlet/jsp/JspFactory.java | 0 .../main/java/javax/servlet/jsp/JspPage.java | 0 .../javax/servlet/jsp/JspTagException.java | 0 .../java/javax/servlet/jsp/JspWriter.java | 0 .../java/javax/servlet/jsp/PageContext.java | 0 .../javax/servlet/jsp/SkipPageException.java | 0 .../javax/servlet/jsp/el/ELException.java | 0 .../servlet/jsp/el/ELParseException.java | 0 .../java/javax/servlet/jsp/el/Expression.java | 0 .../servlet/jsp/el/ExpressionEvaluator.java | 0 .../javax/servlet/jsp/el/FunctionMapper.java | 0 .../jsp/el/ImplicitObjectELResolver.java | 0 .../jsp/el/ScopedAttributeELResolver.java | 0 .../servlet/jsp/el/VariableResolver.java | 0 .../java/javax/servlet/jsp/el/package.html | 0 .../main/java/javax/servlet/jsp/package.html | 0 .../javax/servlet/jsp/resources/jspxml.dtd | 0 .../javax/servlet/jsp/resources/jspxml.xsd | 0 .../javax/servlet/jsp/tagext/BodyContent.java | 0 .../javax/servlet/jsp/tagext/BodyTag.java | 0 .../servlet/jsp/tagext/BodyTagSupport.java | 0 .../servlet/jsp/tagext/DynamicAttributes.java | 0 .../servlet/jsp/tagext/FunctionInfo.java | 0 .../servlet/jsp/tagext/IterationTag.java | 0 .../javax/servlet/jsp/tagext/JspFragment.java | 0 .../servlet/jsp/tagext/JspIdConsumer.java | 0 .../java/javax/servlet/jsp/tagext/JspTag.java | 0 .../javax/servlet/jsp/tagext/PageData.java | 0 .../javax/servlet/jsp/tagext/SimpleTag.java | 0 .../servlet/jsp/tagext/SimpleTagSupport.java | 0 .../java/javax/servlet/jsp/tagext/Tag.java | 0 .../javax/servlet/jsp/tagext/TagAdapter.java | 0 .../servlet/jsp/tagext/TagAttributeInfo.java | 0 .../javax/servlet/jsp/tagext/TagData.java | 0 .../servlet/jsp/tagext/TagExtraInfo.java | 0 .../javax/servlet/jsp/tagext/TagFileInfo.java | 0 .../javax/servlet/jsp/tagext/TagInfo.java | 0 .../servlet/jsp/tagext/TagLibraryInfo.java | 0 .../jsp/tagext/TagLibraryValidator.java | 0 .../javax/servlet/jsp/tagext/TagSupport.java | 0 .../servlet/jsp/tagext/TagVariableInfo.java | 0 .../servlet/jsp/tagext/TryCatchFinally.java | 0 .../servlet/jsp/tagext/ValidationMessage.java | 0 .../servlet/jsp/tagext/VariableInfo.java | 0 .../jsp/tagext/doc-files/BodyTagProtocol.gif | Bin .../tagext/doc-files/IterationTagProtocol.gif | Bin .../jsp/tagext/doc-files/TagProtocol.gif | Bin .../jsp/tagext/doc-files/VariableInfo-1.gif | Bin .../javax/servlet/jsp/tagext/package.html | 0 .../src}/main/java/javax/servlet/package.html | 0 .../javax/servlet/resources/XMLSchema.dtd | 0 .../javax/servlet/resources/datatypes.dtd | 0 .../java/javax/servlet/resources/j2ee_1_4.xsd | 0 .../resources/j2ee_web_services_1_1.xsd | 0 .../j2ee_web_services_client_1_1.xsd | 0 .../java/javax/servlet/resources/javaee_5.xsd | 0 .../java/javax/servlet/resources/javaee_6.xsd | 0 .../java/javax/servlet/resources/javaee_7.xsd | 0 .../java/javax/servlet/resources/javaee_8.xsd | 0 .../resources/javaee_web_services_1_2.xsd | 0 .../resources/javaee_web_services_1_3.xsd | 0 .../resources/javaee_web_services_1_4.xsd | 0 .../javaee_web_services_client_1_2.xsd | 0 .../javaee_web_services_client_1_3.xsd | 0 .../javaee_web_services_client_1_4.xsd | 0 .../java/javax/servlet/resources/jsp_2_0.xsd | 0 .../java/javax/servlet/resources/jsp_2_1.xsd | 0 .../java/javax/servlet/resources/jsp_2_2.xsd | 0 .../java/javax/servlet/resources/jsp_2_3.xsd | 0 .../javax/servlet/resources/web-app_2_2.dtd | 0 .../javax/servlet/resources/web-app_2_3.dtd | 0 .../javax/servlet/resources/web-app_2_4.xsd | 0 .../javax/servlet/resources/web-app_2_5.xsd | 0 .../javax/servlet/resources/web-app_3_0.xsd | 0 .../javax/servlet/resources/web-app_3_1.xsd | 0 .../javax/servlet/resources/web-app_4_0.xsd | 0 .../servlet/resources/web-common_3_0.xsd | 0 .../servlet/resources/web-common_3_1.xsd | 0 .../servlet/resources/web-common_4_0.xsd | 0 .../servlet/resources/web-fragment_3_0.xsd | 0 .../servlet/resources/web-fragment_3_1.xsd | 0 .../servlet/resources/web-fragment_4_0.xsd | 0 .../resources/web-jsptaglibrary_1_1.dtd | 0 .../resources/web-jsptaglibrary_1_2.dtd | 0 .../resources/web-jsptaglibrary_2_0.xsd | 0 .../resources/web-jsptaglibrary_2_1.xsd | 0 .../main/java/javax/servlet/resources/xml.xsd | 0 .../java/javax/websocket/ClientEndpoint.java | 0 .../javax/websocket/ClientEndpointConfig.java | 0 .../java/javax/websocket/CloseReason.java | 0 .../javax/websocket/ContainerProvider.java | 0 .../java/javax/websocket/DecodeException.java | 0 .../main/java/javax/websocket/Decoder.java | 0 .../DefaultClientEndpointConfig.java | 0 .../javax/websocket/DeploymentException.java | 0 .../java/javax/websocket/EncodeException.java | 0 .../main/java/javax/websocket/Encoder.java | 0 .../main/java/javax/websocket/Endpoint.java | 0 .../java/javax/websocket/EndpointConfig.java | 0 .../main/java/javax/websocket/Extension.java | 0 .../javax/websocket/HandshakeResponse.java | 0 .../java/javax/websocket/MessageHandler.java | 0 .../main/java/javax/websocket/OnClose.java | 0 .../main/java/javax/websocket/OnError.java | 0 .../main/java/javax/websocket/OnMessage.java | 0 .../main/java/javax/websocket/OnOpen.java | 0 .../java/javax/websocket/PongMessage.java | 0 .../java/javax/websocket/RemoteEndpoint.java | 0 .../java/javax/websocket/SendHandler.java | 0 .../main/java/javax/websocket/SendResult.java | 0 .../main/java/javax/websocket/Session.java | 0 .../javax/websocket/SessionException.java | 0 .../javax/websocket/WebSocketContainer.java | 0 .../server/DefaultServerEndpointConfig.java | 0 .../websocket/server/HandshakeRequest.java | 0 .../javax/websocket/server/PathParam.java | 0 .../server/ServerApplicationConfig.java | 0 .../websocket/server/ServerContainer.java | 0 .../websocket/server/ServerEndpoint.java | 0 .../server/ServerEndpointConfig.java | 0 .../java/org/apache/catalina/AccessLog.java | 0 .../org/apache/catalina/AsyncDispatcher.java | 0 .../org/apache/catalina/Authenticator.java | 0 .../java/org/apache/catalina/Cluster.java | 0 .../java/org/apache/catalina/Contained.java | 0 .../java/org/apache/catalina/Container.java | 0 .../org/apache/catalina/ContainerEvent.java | 0 .../apache/catalina/ContainerListener.java | 0 .../org/apache/catalina/ContainerServlet.java | 0 .../java/org/apache/catalina/Context.java | 0 .../apache/catalina/CredentialHandler.java | 0 .../apache/catalina/DistributedManager.java | 0 .../main/java/org/apache/catalina/Engine.java | 0 .../java/org/apache/catalina/Executor.java | 0 .../java/org/apache/catalina/Globals.java | 0 .../main/java/org/apache/catalina/Group.java | 0 .../main/java/org/apache/catalina/Host.java | 0 .../java/org/apache/catalina/JmxEnabled.java | 0 .../java/org/apache/catalina/Lifecycle.java | 0 .../org/apache/catalina/LifecycleEvent.java | 0 .../apache/catalina/LifecycleException.java | 0 .../apache/catalina/LifecycleListener.java | 0 .../org/apache/catalina/LifecycleState.java | 0 .../main/java/org/apache/catalina/Loader.java | 0 .../java/org/apache/catalina/Manager.java | 0 .../java/org/apache/catalina/Pipeline.java | 0 .../main/java/org/apache/catalina/Realm.java | 0 .../main/java/org/apache/catalina/Role.java | 0 .../main/java/org/apache/catalina/Server.java | 0 .../java/org/apache/catalina/Service.java | 0 .../java/org/apache/catalina/Session.java | 0 .../org/apache/catalina/SessionEvent.java | 0 .../apache/catalina/SessionIdGenerator.java | 0 .../org/apache/catalina/SessionListener.java | 0 .../main/java/org/apache/catalina/Store.java | 0 .../org/apache/catalina/StoreManager.java | 0 .../catalina/ThreadBindingListener.java | 0 .../org/apache/catalina/TomcatPrincipal.java | 0 .../apache/catalina/TrackedWebResource.java | 0 .../main/java/org/apache/catalina/User.java | 0 .../org/apache/catalina/UserDatabase.java | 0 .../main/java/org/apache/catalina/Valve.java | 0 .../java/org/apache/catalina/WebResource.java | 0 .../org/apache/catalina/WebResourceRoot.java | 0 .../org/apache/catalina/WebResourceSet.java | 0 .../java/org/apache/catalina/Wrapper.java | 0 .../ant/AbstractCatalinaCommandTask.java | 0 .../catalina/ant/AbstractCatalinaTask.java | 0 .../ant/BaseRedirectorHelperTask.java | 0 .../org/apache/catalina/ant/DeployTask.java | 0 .../apache/catalina/ant/FindLeaksTask.java | 0 .../catalina/ant/JKStatusUpdateTask.java | 0 .../org/apache/catalina/ant/JMXGetTask.java | 0 .../org/apache/catalina/ant/JMXQueryTask.java | 0 .../org/apache/catalina/ant/JMXSetTask.java | 0 .../org/apache/catalina/ant/ListTask.java | 0 .../org/apache/catalina/ant/ReloadTask.java | 0 .../apache/catalina/ant/ResourcesTask.java | 0 .../apache/catalina/ant/ServerinfoTask.java | 0 .../org/apache/catalina/ant/SessionsTask.java | 0 .../catalina/ant/SslConnectorCiphersTask.java | 0 .../org/apache/catalina/ant/StartTask.java | 0 .../org/apache/catalina/ant/StopTask.java | 0 .../apache/catalina/ant/ThreaddumpTask.java | 0 .../org/apache/catalina/ant/UndeployTask.java | 0 .../apache/catalina/ant/ValidatorTask.java | 0 .../org/apache/catalina/ant/VminfoTask.java | 0 .../java/org/apache/catalina/ant/antlib.xml | 0 .../org/apache/catalina/ant/catalina.tasks | 0 .../java/org/apache/catalina/ant/jmx/Arg.java | 0 .../ant/jmx/JMXAccessorCondition.java | 0 .../ant/jmx/JMXAccessorConditionBase.java | 0 .../ant/jmx/JMXAccessorCreateTask.java | 0 .../ant/jmx/JMXAccessorEqualsCondition.java | 0 .../catalina/ant/jmx/JMXAccessorGetTask.java | 0 .../ant/jmx/JMXAccessorInvokeTask.java | 0 .../ant/jmx/JMXAccessorQueryTask.java | 0 .../catalina/ant/jmx/JMXAccessorSetTask.java | 0 .../catalina/ant/jmx/JMXAccessorTask.java | 0 .../ant/jmx/JMXAccessorUnregisterTask.java | 0 .../org/apache/catalina/ant/jmx/antlib.xml | 0 .../apache/catalina/ant/jmx/jmxaccessor.tasks | 0 .../org/apache/catalina/ant/jmx/package.html | 0 .../java/org/apache/catalina/ant/package.html | 0 .../authenticator/AuthenticatorBase.java | 0 .../authenticator/BasicAuthenticator.java | 0 .../catalina/authenticator/Constants.java | 0 .../authenticator/DigestAuthenticator.java | 0 .../authenticator/FormAuthenticator.java | 0 .../authenticator/LocalStrings.properties | 0 .../authenticator/LocalStrings_es.properties | 0 .../authenticator/LocalStrings_fr.properties | 0 .../authenticator/LocalStrings_ja.properties | 0 .../authenticator/NonLoginAuthenticator.java | 0 .../authenticator/SSLAuthenticator.java | 0 .../catalina/authenticator/SavedRequest.java | 0 .../catalina/authenticator/SingleSignOn.java | 0 .../authenticator/SingleSignOnEntry.java | 0 .../authenticator/SingleSignOnListener.java | 0 .../authenticator/SingleSignOnSessionKey.java | 0 .../authenticator/SpnegoAuthenticator.java | 0 .../jaspic/AuthConfigFactoryImpl.java | 0 .../jaspic/CallbackHandlerImpl.java | 0 .../jaspic/LocalStrings.properties | 0 .../authenticator/jaspic/MessageInfoImpl.java | 0 .../PersistentProviderRegistrations.java | 0 .../jaspic/SimpleAuthConfigProvider.java | 0 .../jaspic/SimpleServerAuthConfig.java | 0 .../jaspic/SimpleServerAuthContext.java | 0 .../authenticator/mbeans-descriptors.xml | 0 .../catalina/authenticator/package.html | 0 .../connector/ClientAbortException.java | 0 .../apache/catalina/connector/Connector.java | 0 .../catalina/connector/CoyoteAdapter.java | 0 .../catalina/connector/CoyoteInputStream.java | 0 .../connector/CoyoteOutputStream.java | 0 .../catalina/connector/CoyotePrincipal.java | 0 .../catalina/connector/CoyoteReader.java | 0 .../catalina/connector/CoyoteWriter.java | 0 .../catalina/connector/InputBuffer.java | 0 .../connector/LocalStrings.properties | 0 .../connector/LocalStrings_es.properties | 0 .../connector/LocalStrings_fr.properties | 0 .../connector/LocalStrings_ja.properties | 0 .../catalina/connector/OutputBuffer.java | 0 .../apache/catalina/connector/Request.java | 0 .../catalina/connector/RequestFacade.java | 0 .../apache/catalina/connector/Response.java | 0 .../catalina/connector/ResponseFacade.java | 0 .../catalina/connector/mbeans-descriptors.xml | 0 .../catalina/core/AccessLogAdapter.java | 0 .../catalina/core/ApplicationContext.java | 0 .../core/ApplicationContextFacade.java | 0 .../catalina/core/ApplicationDispatcher.java | 0 .../catalina/core/ApplicationFilterChain.java | 0 .../core/ApplicationFilterConfig.java | 0 .../core/ApplicationFilterFactory.java | 0 .../core/ApplicationFilterRegistration.java | 0 .../catalina/core/ApplicationHttpRequest.java | 0 .../core/ApplicationHttpResponse.java | 0 .../catalina/core/ApplicationMapping.java | 0 .../apache/catalina/core/ApplicationPart.java | 0 .../catalina/core/ApplicationPushBuilder.java | 0 .../catalina/core/ApplicationRequest.java | 0 .../catalina/core/ApplicationResponse.java | 0 .../core/ApplicationServletRegistration.java | 0 .../core/ApplicationSessionCookieConfig.java | 0 .../catalina/core/AprLifecycleListener.java | 0 .../catalina/core/AsyncContextImpl.java | 0 .../catalina/core/AsyncListenerWrapper.java | 0 .../org/apache/catalina/core/Constants.java | 0 .../apache/catalina/core/ContainerBase.java | 0 .../catalina/core/DefaultInstanceManager.java | 0 .../core/JreMemoryLeakPreventionListener.java | 0 .../catalina/core/LocalStrings.properties | 0 .../catalina/core/LocalStrings_es.properties | 0 .../catalina/core/LocalStrings_fr.properties | 0 .../catalina/core/LocalStrings_ja.properties | 0 .../catalina/core/NamingContextListener.java | 0 .../core/RestrictedFilters.properties | 0 .../core/RestrictedListeners.properties | 0 .../core/RestrictedServlets.properties | 0 .../apache/catalina/core/StandardContext.java | 0 .../catalina/core/StandardContextValve.java | 0 .../apache/catalina/core/StandardEngine.java | 0 .../catalina/core/StandardEngineValve.java | 0 .../apache/catalina/core/StandardHost.java | 0 .../catalina/core/StandardHostValve.java | 0 .../catalina/core/StandardPipeline.java | 0 .../apache/catalina/core/StandardServer.java | 0 .../apache/catalina/core/StandardService.java | 0 .../catalina/core/StandardThreadExecutor.java | 0 .../apache/catalina/core/StandardWrapper.java | 0 .../catalina/core/StandardWrapperFacade.java | 0 .../catalina/core/StandardWrapperValve.java | 0 .../ThreadLocalLeakPreventionListener.java | 0 .../catalina/core/mbeans-descriptors.xml | 0 .../catalina/deploy/LocalStrings.properties | 0 .../catalina/deploy/NamingResourcesImpl.java | 0 .../catalina/deploy/mbeans-descriptors.xml | 0 .../filters/AddDefaultCharsetFilter.java | 0 .../apache/catalina/filters/Constants.java | 0 .../apache/catalina/filters/CorsFilter.java | 0 .../filters/CsrfPreventionFilter.java | 0 .../filters/CsrfPreventionFilterBase.java | 0 .../catalina/filters/ExpiresFilter.java | 0 .../catalina/filters/FailedRequestFilter.java | 0 .../apache/catalina/filters/FilterBase.java | 0 .../filters/HttpHeaderSecurityFilter.java | 0 .../catalina/filters/LocalStrings.properties | 0 .../filters/LocalStrings_es.properties | 0 .../filters/LocalStrings_fr.properties | 0 .../catalina/filters/RemoteAddrFilter.java | 0 .../catalina/filters/RemoteHostFilter.java | 0 .../catalina/filters/RemoteIpFilter.java | 0 .../catalina/filters/RequestDumperFilter.java | 0 .../catalina/filters/RequestFilter.java | 0 .../filters/RestCsrfPreventionFilter.java | 0 .../filters/SetCharacterEncodingFilter.java | 0 .../catalina/filters/WebdavFixFilter.java | 0 .../apache/catalina/ha/CatalinaCluster.java | 0 .../apache/catalina/ha/ClusterDeployer.java | 0 .../apache/catalina/ha/ClusterListener.java | 0 .../apache/catalina/ha/ClusterManager.java | 0 .../apache/catalina/ha/ClusterMessage.java | 0 .../catalina/ha/ClusterMessageBase.java | 0 .../apache/catalina/ha/ClusterRuleSet.java | 0 .../apache/catalina/ha/ClusterSession.java | 0 .../org/apache/catalina/ha/ClusterValve.java | 0 .../ha/authenticator/ClusterSingleSignOn.java | 0 .../ClusterSingleSignOnListener.java | 0 .../ha/authenticator/LocalStrings.properties | 0 .../ha/authenticator/mbeans-descriptors.xml | 0 .../catalina/ha/backend/CollectedInfo.java | 0 .../ha/backend/HeartbeatListener.java | 0 .../catalina/ha/backend/MultiCastSender.java | 0 .../org/apache/catalina/ha/backend/Proxy.java | 0 .../apache/catalina/ha/backend/Sender.java | 0 .../apache/catalina/ha/backend/TcpSender.java | 0 .../ha/context/LocalStrings.properties | 0 .../ha/context/ReplicatedContext.java | 0 .../catalina/ha/deploy/FarmWarDeployer.java | 0 .../ha/deploy/FileChangeListener.java | 0 .../catalina/ha/deploy/FileMessage.java | 0 .../ha/deploy/FileMessageFactory.java | 0 .../ha/deploy/LocalStrings.properties | 0 .../catalina/ha/deploy/UndeployMessage.java | 0 .../apache/catalina/ha/deploy/WarWatcher.java | 0 .../catalina/ha/deploy/mbeans-descriptors.xml | 0 .../java/org/apache/catalina/ha/package.html | 0 .../catalina/ha/session/BackupManager.java | 0 .../ha/session/ClusterManagerBase.java | 0 .../ha/session/ClusterSessionListener.java | 0 .../catalina/ha/session/DeltaManager.java | 0 .../catalina/ha/session/DeltaRequest.java | 0 .../catalina/ha/session/DeltaSession.java | 0 .../ha/session/JvmRouteBinderValve.java | 0 .../ha/session/LocalStrings.properties | 0 .../ha/session/LocalStrings_es.properties | 0 .../ha/session/ReplicatedSessionListener.java | 0 .../catalina/ha/session/SessionMessage.java | 0 .../ha/session/SessionMessageImpl.java | 0 .../ha/session/mbeans-descriptors.xml | 0 .../org/apache/catalina/ha/tcp/Constants.java | 0 .../catalina/ha/tcp/LocalStrings.properties | 0 .../ha/tcp/LocalStrings_es.properties | 0 .../catalina/ha/tcp/ReplicationValve.java | 0 .../catalina/ha/tcp/SendMessageData.java | 0 .../catalina/ha/tcp/SimpleTcpCluster.java | 0 .../catalina/ha/tcp/mbeans-descriptors.xml | 0 .../org/apache/catalina/loader/Constants.java | 0 .../catalina/loader/JdbcLeakPrevention.java | 0 .../catalina/loader/LocalStrings.properties | 0 .../loader/LocalStrings_es.properties | 0 .../loader/LocalStrings_fr.properties | 0 .../loader/LocalStrings_ja.properties | 0 .../loader/ParallelWebappClassLoader.java | 0 .../apache/catalina/loader/ResourceEntry.java | 0 .../catalina/loader/WebappClassLoader.java | 0 .../loader/WebappClassLoaderBase.java | 0 .../apache/catalina/loader/WebappLoader.java | 0 .../catalina/loader/mbeans-descriptors.xml | 0 .../apache/catalina/manager/Constants.java | 0 .../catalina/manager/DummyProxySession.java | 0 .../catalina/manager/HTMLManagerServlet.java | 0 .../catalina/manager/JMXProxyServlet.java | 0 .../apache/catalina/manager/JspHelper.java | 0 .../catalina/manager/LocalStrings.properties | 0 .../manager/LocalStrings_de.properties | 0 .../manager/LocalStrings_es.properties | 0 .../manager/LocalStrings_fr.properties | 0 .../manager/LocalStrings_ja.properties | 0 .../catalina/manager/ManagerServlet.java | 0 .../manager/StatusManagerServlet.java | 0 .../catalina/manager/StatusTransformer.java | 0 .../catalina/manager/host/Constants.java | 0 .../manager/host/HTMLHostManagerServlet.java | 0 .../manager/host/HostManagerServlet.java | 0 .../manager/host/LocalStrings.properties | 0 .../manager/host/LocalStrings_es.properties | 0 .../manager/util/BaseSessionComparator.java | 0 .../catalina/manager/util/SessionUtils.java | 0 .../org/apache/catalina/mapper/Constants.java | 0 .../catalina/mapper/LocalStrings.properties | 0 .../org/apache/catalina/mapper/Mapper.java | 0 .../catalina/mapper/MapperListener.java | 0 .../apache/catalina/mapper/MappingData.java | 0 .../catalina/mapper/WrapperMappingInfo.java | 0 .../catalina/mapper/mbeans-descriptors.xml | 0 .../apache/catalina/mbeans-descriptors.xml | 0 .../catalina/mbeans/BaseCatalinaMBean.java | 0 .../catalina/mbeans/ClassNameMBean.java | 0 .../catalina/mbeans/ConnectorMBean.java | 0 .../catalina/mbeans/ContainerMBean.java | 0 .../mbeans/ContextEnvironmentMBean.java | 0 .../apache/catalina/mbeans/ContextMBean.java | 0 .../mbeans/ContextResourceLinkMBean.java | 0 .../catalina/mbeans/ContextResourceMBean.java | 0 .../GlobalResourcesLifecycleListener.java | 0 .../apache/catalina/mbeans/GroupMBean.java | 0 .../mbeans/JmxRemoteLifecycleListener.java | 0 .../catalina/mbeans/LocalStrings.properties | 0 .../mbeans/LocalStrings_fr.properties | 0 .../apache/catalina/mbeans/MBeanDumper.java | 0 .../apache/catalina/mbeans/MBeanFactory.java | 0 .../apache/catalina/mbeans/MBeanUtils.java | 0 .../mbeans/MemoryUserDatabaseMBean.java | 0 .../catalina/mbeans/NamingResourcesMBean.java | 0 .../org/apache/catalina/mbeans/RoleMBean.java | 0 .../apache/catalina/mbeans/ServiceMBean.java | 0 .../org/apache/catalina/mbeans/UserMBean.java | 0 .../catalina/mbeans/mbeans-descriptors.xml | 0 .../apache/catalina/realm/CombinedRealm.java | 0 .../catalina/realm/DataSourceRealm.java | 0 .../realm/DigestCredentialHandlerBase.java | 0 .../catalina/realm/GenericPrincipal.java | 0 .../catalina/realm/JAASCallbackHandler.java | 0 .../catalina/realm/JAASMemoryLoginModule.java | 0 .../org/apache/catalina/realm/JAASRealm.java | 0 .../org/apache/catalina/realm/JDBCRealm.java | 0 .../org/apache/catalina/realm/JNDIRealm.java | 0 .../catalina/realm/LocalStrings.properties | 0 .../catalina/realm/LocalStrings_es.properties | 0 .../catalina/realm/LocalStrings_fr.properties | 0 .../catalina/realm/LocalStrings_ja.properties | 0 .../apache/catalina/realm/LockOutRealm.java | 0 .../apache/catalina/realm/MemoryRealm.java | 0 .../apache/catalina/realm/MemoryRuleSet.java | 0 .../realm/MessageDigestCredentialHandler.java | 0 .../realm/NestedCredentialHandler.java | 0 .../org/apache/catalina/realm/NullRealm.java | 0 .../org/apache/catalina/realm/RealmBase.java | 0 .../realm/SecretKeyCredentialHandler.java | 0 .../catalina/realm/UserDatabaseRealm.java | 0 .../realm/X509SubjectDnRetriever.java | 0 .../catalina/realm/X509UsernameRetriever.java | 0 .../catalina/realm/mbeans-descriptors.xml | 0 .../org/apache/catalina/realm/package.html | 0 .../apache/catalina/security/Constants.java | 0 .../catalina/security/LocalStrings.properties | 0 .../security/LocalStrings_es.properties | 0 .../security/LocalStrings_fr.properties | 0 .../security/LocalStrings_ja.properties | 0 .../catalina/security/SecurityClassLoad.java | 0 .../catalina/security/SecurityConfig.java | 0 .../catalina/security/SecurityListener.java | 0 .../catalina/security/SecurityUtil.java | 0 .../apache/catalina/servlets/CGIServlet.java | 0 .../apache/catalina/servlets/Constants.java | 0 .../catalina/servlets/DefaultServlet.java | 0 .../catalina/servlets/LocalStrings.properties | 0 .../servlets/LocalStrings_es.properties | 0 .../servlets/LocalStrings_fr.properties | 0 .../servlets/LocalStrings_ja.properties | 0 .../catalina/servlets/WebdavServlet.java | 0 .../org/apache/catalina/servlets/package.html | 0 .../apache/catalina/session/Constants.java | 0 .../apache/catalina/session/FileStore.java | 0 .../apache/catalina/session/JDBCStore.java | 0 .../catalina/session/LocalStrings.properties | 0 .../session/LocalStrings_es.properties | 0 .../session/LocalStrings_fr.properties | 0 .../session/LocalStrings_ja.properties | 0 .../apache/catalina/session/ManagerBase.java | 0 .../catalina/session/PersistentManager.java | 0 .../session/PersistentManagerBase.java | 0 .../catalina/session/StandardManager.java | 0 .../catalina/session/StandardSession.java | 0 .../session/StandardSessionFacade.java | 0 .../apache/catalina/session/StoreBase.java | 0 .../TooManyActiveSessionsException.java | 0 .../catalina/session/mbeans-descriptors.xml | 0 .../org/apache/catalina/session/package.html | 0 .../ssi/ByteArrayServletOutputStream.java | 0 .../catalina/ssi/ExpressionParseTree.java | 0 .../catalina/ssi/ExpressionTokenizer.java | 0 .../catalina/ssi/ResponseIncludeWrapper.java | 0 .../org/apache/catalina/ssi/SSICommand.java | 0 .../apache/catalina/ssi/SSIConditional.java | 0 .../catalina/ssi/SSIConditionalState.java | 0 .../org/apache/catalina/ssi/SSIConfig.java | 0 .../java/org/apache/catalina/ssi/SSIEcho.java | 0 .../java/org/apache/catalina/ssi/SSIExec.java | 0 .../catalina/ssi/SSIExternalResolver.java | 0 .../org/apache/catalina/ssi/SSIFilter.java | 0 .../org/apache/catalina/ssi/SSIFlastmod.java | 0 .../org/apache/catalina/ssi/SSIFsize.java | 0 .../org/apache/catalina/ssi/SSIInclude.java | 0 .../org/apache/catalina/ssi/SSIMediator.java | 0 .../org/apache/catalina/ssi/SSIPrintenv.java | 0 .../org/apache/catalina/ssi/SSIProcessor.java | 0 .../org/apache/catalina/ssi/SSIServlet.java | 0 .../ssi/SSIServletExternalResolver.java | 0 .../catalina/ssi/SSIServletRequestUtil.java | 0 .../java/org/apache/catalina/ssi/SSISet.java | 0 .../ssi/SSIStopProcessingException.java | 0 .../java/org/apache/catalina/ssi/package.html | 0 .../startup/Authenticators.properties | 0 .../apache/catalina/startup/Bootstrap.java | 0 .../org/apache/catalina/startup/Catalina.java | 0 .../catalina/startup/CatalinaProperties.java | 0 .../startup/CertificateCreateRule.java | 0 .../catalina/startup/ClassLoaderFactory.java | 0 .../catalina/startup/ConnectorCreateRule.java | 0 .../apache/catalina/startup/Constants.java | 0 .../catalina/startup/ContextConfig.java | 0 .../catalina/startup/ContextRuleSet.java | 0 .../startup/CopyParentClassLoaderRule.java | 0 .../startup/CredentialHandlerRuleSet.java | 0 .../apache/catalina/startup/EngineConfig.java | 0 .../catalina/startup/EngineRuleSet.java | 0 .../apache/catalina/startup/ExpandWar.java | 0 .../catalina/startup/FailedContext.java | 0 .../catalina/startup/HomesUserDatabase.java | 0 .../apache/catalina/startup/HostConfig.java | 0 .../apache/catalina/startup/HostRuleSet.java | 0 .../startup/LifecycleListenerRule.java | 0 .../catalina/startup/LocalStrings.properties | 0 .../startup/LocalStrings_es.properties | 0 .../startup/LocalStrings_fr.properties | 0 .../startup/LocalStrings_ja.properties | 0 .../catalina/startup/NamingRuleSet.java | 0 .../catalina/startup/PasswdUserDatabase.java | 0 .../apache/catalina/startup/RealmRuleSet.java | 0 .../SafeForkJoinWorkerThreadFactory.java | 0 .../startup/SetAllPropertiesRule.java | 0 .../startup/SetContextPropertiesRule.java | 0 .../catalina/startup/SetNextNamingRule.java | 0 .../org/apache/catalina/startup/Tomcat.java | 0 .../org/apache/catalina/startup/Tool.java | 0 .../apache/catalina/startup/UserConfig.java | 0 .../apache/catalina/startup/UserDatabase.java | 0 .../startup/VersionLoggerListener.java | 0 .../catalina/startup/WebAnnotationSet.java | 0 .../catalina/startup/WebappServiceLoader.java | 0 .../catalina/startup/mbeans-descriptors.xml | 0 .../storeconfig/CatalinaClusterSF.java | 0 .../catalina/storeconfig/ChannelSF.java | 0 .../catalina/storeconfig/ConnectorSF.java | 0 .../storeconfig/ConnectorStoreAppender.java | 0 .../catalina/storeconfig/Constants.java | 0 .../storeconfig/CredentialHandlerSF.java | 0 .../storeconfig/GlobalNamingResourcesSF.java | 0 .../catalina/storeconfig/IStoreConfig.java | 0 .../catalina/storeconfig/IStoreFactory.java | 0 .../catalina/storeconfig/InterceptorSF.java | 0 .../catalina/storeconfig/JarScannerSF.java | 0 .../apache/catalina/storeconfig/LoaderSF.java | 0 .../storeconfig/LocalStrings.properties | 0 .../catalina/storeconfig/ManagerSF.java | 0 .../storeconfig/NamingResourcesSF.java | 0 .../storeconfig/PersistentManagerSF.java | 0 .../apache/catalina/storeconfig/RealmSF.java | 0 .../catalina/storeconfig/SSLHostConfigSF.java | 0 .../apache/catalina/storeconfig/SenderSF.java | 0 .../storeconfig/StandardContextSF.java | 0 .../storeconfig/StandardEngineSF.java | 0 .../catalina/storeconfig/StandardHostSF.java | 0 .../storeconfig/StandardServerSF.java | 0 .../storeconfig/StandardServiceSF.java | 0 .../catalina/storeconfig/StoreAppender.java | 0 .../catalina/storeconfig/StoreConfig.java | 0 .../StoreConfigLifecycleListener.java | 0 .../storeconfig/StoreContextAppender.java | 0 .../storeconfig/StoreDescription.java | 0 .../storeconfig/StoreFactoryBase.java | 0 .../storeconfig/StoreFactoryRule.java | 0 .../catalina/storeconfig/StoreFileMover.java | 0 .../catalina/storeconfig/StoreLoader.java | 0 .../catalina/storeconfig/StoreRegistry.java | 0 .../storeconfig/WatchedResourceSF.java | 0 .../storeconfig/WebResourceRootSF.java | 0 .../storeconfig/WrapperLifecycleSF.java | 0 .../storeconfig/WrapperListenerSF.java | 0 .../storeconfig/mbeans-descriptors.xml | 0 .../catalina/storeconfig/server-registry.xml | 0 .../apache/catalina/tribes/ByteMessage.java | 0 .../org/apache/catalina/tribes/Channel.java | 0 .../catalina/tribes/ChannelException.java | 0 .../catalina/tribes/ChannelInterceptor.java | 0 .../catalina/tribes/ChannelListener.java | 0 .../catalina/tribes/ChannelMessage.java | 0 .../catalina/tribes/ChannelReceiver.java | 0 .../apache/catalina/tribes/ChannelSender.java | 0 .../apache/catalina/tribes/ErrorHandler.java | 0 .../org/apache/catalina/tribes/Heartbeat.java | 0 .../apache/catalina/tribes/JmxChannel.java | 0 .../catalina/tribes/ManagedChannel.java | 0 .../org/apache/catalina/tribes/Member.java | 0 .../catalina/tribes/MembershipListener.java | 0 .../catalina/tribes/MembershipService.java | 0 .../catalina/tribes/MessageListener.java | 0 .../tribes/RemoteProcessException.java | 0 .../org/apache/catalina/tribes/UniqueId.java | 0 .../catalina/tribes/group/AbsoluteOrder.java | 0 .../tribes/group/ChannelCoordinator.java | 0 .../tribes/group/ChannelInterceptorBase.java | 0 .../tribes/group/ExtendedRpcCallback.java | 0 .../catalina/tribes/group/GroupChannel.java | 0 .../tribes/group/GroupChannelMBean.java | 0 .../tribes/group/InterceptorPayload.java | 0 .../tribes/group/LocalStrings.properties | 0 .../catalina/tribes/group/Response.java | 0 .../catalina/tribes/group/RpcCallback.java | 0 .../catalina/tribes/group/RpcChannel.java | 0 .../catalina/tribes/group/RpcMessage.java | 0 .../interceptors/DomainFilterInterceptor.java | 0 .../DomainFilterInterceptorMBean.java | 0 .../FragmentationInterceptor.java | 0 .../group/interceptors/GzipInterceptor.java | 0 .../interceptors/LocalStrings.properties | 0 .../MessageDispatchInterceptor.java | 0 .../MessageDispatchInterceptorMBean.java | 0 .../interceptors/NonBlockingCoordinator.java | 0 .../group/interceptors/OrderInterceptor.java | 0 .../group/interceptors/SimpleCoordinator.java | 0 .../StaticMembershipInterceptor.java | 0 .../StaticMembershipInterceptorMBean.java | 0 .../interceptors/TcpFailureDetector.java | 0 .../interceptors/TcpFailureDetectorMBean.java | 0 .../interceptors/TcpPingInterceptor.java | 0 .../interceptors/TcpPingInterceptorMBean.java | 0 .../interceptors/ThroughputInterceptor.java | 0 .../ThroughputInterceptorMBean.java | 0 .../TwoPhaseCommitInterceptor.java | 0 .../apache/catalina/tribes/io/BufferPool.java | 0 .../catalina/tribes/io/BufferPool15Impl.java | 0 .../catalina/tribes/io/ChannelData.java | 0 .../io/DirectByteArrayOutputStream.java | 0 .../catalina/tribes/io/ListenCallback.java | 0 .../tribes/io/LocalStrings.properties | 0 .../catalina/tribes/io/ObjectReader.java | 0 .../catalina/tribes/io/ReplicationStream.java | 0 .../catalina/tribes/io/XByteBuffer.java | 0 .../catalina/tribes/jmx/JmxRegistry.java | 0 .../tribes/jmx/LocalStrings.properties | 0 .../catalina/tribes/membership/Constants.java | 0 .../tribes/membership/LocalStrings.properties | 0 .../tribes/membership/McastService.java | 0 .../tribes/membership/McastServiceImpl.java | 0 .../tribes/membership/McastServiceMBean.java | 0 .../tribes/membership/MemberImpl.java | 0 .../tribes/membership/Membership.java | 0 .../tribes/membership/StaticMember.java | 0 .../tribes/membership/mbeans-descriptors.xml | 0 .../org/apache/catalina/tribes/package.html | 0 .../tribes/tipis/AbstractReplicatedMap.java | 0 .../tribes/tipis/LazyReplicatedMap.java | 0 .../tribes/tipis/LocalStrings.properties | 0 .../catalina/tribes/tipis/ReplicatedMap.java | 0 .../tribes/tipis/ReplicatedMapEntry.java | 0 .../tribes/transport/AbstractRxTask.java | 0 .../tribes/transport/AbstractSender.java | 0 .../catalina/tribes/transport/Constants.java | 0 .../catalina/tribes/transport/DataSender.java | 0 .../tribes/transport/LocalStrings.properties | 0 .../transport/LocalStrings_es.properties | 0 .../tribes/transport/MultiPointSender.java | 0 .../tribes/transport/PooledSender.java | 0 .../tribes/transport/ReceiverBase.java | 0 .../transport/ReplicationTransmitter.java | 0 .../catalina/tribes/transport/RxTaskPool.java | 0 .../tribes/transport/SenderState.java | 0 .../tribes/transport/bio/BioReceiver.java | 0 .../transport/bio/BioReplicationTask.java | 0 .../tribes/transport/bio/BioSender.java | 0 .../transport/bio/LocalStrings.properties | 0 .../transport/bio/MultipointBioSender.java | 0 .../transport/bio/PooledMultiSender.java | 0 .../transport/nio/LocalStrings.properties | 0 .../tribes/transport/nio/NioReceiver.java | 0 .../transport/nio/NioReceiverMBean.java | 0 .../transport/nio/NioReplicationTask.java | 0 .../tribes/transport/nio/NioSender.java | 0 .../transport/nio/ParallelNioSender.java | 0 .../transport/nio/PooledParallelSender.java | 0 .../nio/PooledParallelSenderMBean.java | 0 .../apache/catalina/tribes/util/Arrays.java | 0 .../catalina/tribes/util/ExceptionUtils.java | 0 .../catalina/tribes/util/ExecutorFactory.java | 0 .../tribes/util/LocalStrings.properties | 0 .../org/apache/catalina/tribes/util/Logs.java | 0 .../catalina/tribes/util/StringManager.java | 0 .../tribes/util/TcclThreadFactory.java | 0 .../catalina/tribes/util/UUIDGenerator.java | 0 .../apache/catalina/users/AbstractGroup.java | 0 .../apache/catalina/users/AbstractRole.java | 0 .../apache/catalina/users/AbstractUser.java | 0 .../org/apache/catalina/users/Constants.java | 0 .../catalina/users/LocalStrings.properties | 0 .../catalina/users/LocalStrings_es.properties | 0 .../catalina/users/LocalStrings_fr.properties | 0 .../catalina/users/LocalStrings_ja.properties | 0 .../apache/catalina/users/MemoryGroup.java | 0 .../org/apache/catalina/users/MemoryRole.java | 0 .../org/apache/catalina/users/MemoryUser.java | 0 .../catalina/users/MemoryUserDatabase.java | 0 .../users/MemoryUserDatabaseFactory.java | 0 .../catalina/users/mbeans-descriptors.xml | 0 .../apache/catalina/util/CharsetMapper.java | 0 .../util/CharsetMapperDefault.properties | 0 .../catalina/util/ConcurrentDateFormat.java | 0 .../org/apache/catalina/util/ContextName.java | 0 .../util/CustomObjectInputStream.java | 0 .../org/apache/catalina/util/DOMWriter.java | 0 .../org/apache/catalina/util/Extension.java | 0 .../catalina/util/ExtensionValidator.java | 0 .../org/apache/catalina/util/IOTools.java | 0 .../apache/catalina/util/Introspection.java | 0 .../apache/catalina/util/LifecycleBase.java | 0 .../catalina/util/LifecycleMBeanBase.java | 0 .../catalina/util/LocalStrings.properties | 0 .../catalina/util/LocalStrings_es.properties | 0 .../catalina/util/LocalStrings_fr.properties | 0 .../catalina/util/LocalStrings_ja.properties | 0 .../catalina/util/ManifestResource.java | 0 .../apache/catalina/util/ParameterMap.java | 0 .../org/apache/catalina/util/RequestUtil.java | 0 .../org/apache/catalina/util/ResourceSet.java | 0 .../org/apache/catalina/util/ServerInfo.java | 0 .../catalina/util/ServerInfo.properties | 0 .../apache/catalina/util/SessionConfig.java | 0 .../catalina/util/SessionIdGeneratorBase.java | 0 .../util/StandardSessionIdGenerator.java | 0 .../org/apache/catalina/util/Strftime.java | 0 .../apache/catalina/util/ToStringUtil.java | 0 .../org/apache/catalina/util/TomcatCSS.java | 0 .../org/apache/catalina/util/URLEncoder.java | 0 .../org/apache/catalina/util/XMLWriter.java | 0 .../valves/AbstractAccessLogValve.java | 0 .../catalina/valves/AccessLogValve.java | 0 .../org/apache/catalina/valves/Constants.java | 0 .../valves/CrawlerSessionManagerValve.java | 0 .../catalina/valves/ErrorReportValve.java | 0 .../valves/ExtendedAccessLogValve.java | 0 .../catalina/valves/JDBCAccessLogValve.java | 0 .../catalina/valves/LocalStrings.properties | 0 .../valves/LocalStrings_es.properties | 0 .../valves/LocalStrings_fr.properties | 0 .../valves/LocalStrings_ja.properties | 0 .../catalina/valves/PersistentValve.java | 0 .../catalina/valves/RemoteAddrValve.java | 0 .../catalina/valves/RemoteHostValve.java | 0 .../apache/catalina/valves/RemoteIpValve.java | 0 .../catalina/valves/RequestFilterValve.java | 0 .../org/apache/catalina/valves/SSLValve.java | 0 .../catalina/valves/SemaphoreValve.java | 0 .../valves/StuckThreadDetectionValve.java | 0 .../org/apache/catalina/valves/ValveBase.java | 0 .../catalina/valves/mbeans-descriptors.xml | 0 .../org/apache/catalina/valves/package.html | 0 .../catalina/valves/rewrite/Resolver.java | 0 .../catalina/valves/rewrite/ResolverImpl.java | 0 .../catalina/valves/rewrite/RewriteCond.java | 0 .../catalina/valves/rewrite/RewriteMap.java | 0 .../catalina/valves/rewrite/RewriteRule.java | 0 .../catalina/valves/rewrite/RewriteValve.java | 0 .../catalina/valves/rewrite/Substitution.java | 0 .../valves/rewrite/mbeans-descriptors.xml | 0 .../webresources/AbstractArchiveResource.java | 0 .../AbstractArchiveResourceSet.java | 0 .../webresources/AbstractFileResourceSet.java | 0 .../webresources/AbstractResource.java | 0 .../webresources/AbstractResourceSet.java | 0 .../AbstractSingleArchiveResource.java | 0 .../AbstractSingleArchiveResourceSet.java | 0 .../apache/catalina/webresources/Cache.java | 0 .../catalina/webresources/CachedResource.java | 0 .../ClasspathURLStreamHandler.java | 0 .../catalina/webresources/DirResourceSet.java | 0 .../catalina/webresources/EmptyResource.java | 0 .../webresources/EmptyResourceSet.java | 0 .../catalina/webresources/FileResource.java | 0 .../webresources/FileResourceSet.java | 0 .../catalina/webresources/JarResource.java | 0 .../webresources/JarResourceRoot.java | 0 .../catalina/webresources/JarResourceSet.java | 0 .../catalina/webresources/JarWarResource.java | 0 .../webresources/JarWarResourceSet.java | 0 .../webresources/LocalStrings.properties | 0 .../catalina/webresources/StandardRoot.java | 0 .../TomcatURLStreamHandlerFactory.java | 0 .../webresources/TrackedInputStream.java | 0 .../webresources/VirtualResource.java | 0 .../catalina/webresources/WarResource.java | 0 .../catalina/webresources/WarResourceSet.java | 0 .../webresources/mbeans-descriptors.xml | 0 .../catalina/webresources/war/Handler.java | 0 .../webresources/war/WarURLConnection.java | 0 .../org/apache/coyote/AbstractProcessor.java | 0 .../apache/coyote/AbstractProcessorLight.java | 0 .../org/apache/coyote/AbstractProtocol.java | 0 .../java/org/apache/coyote/ActionCode.java | 0 .../java/org/apache/coyote/ActionHook.java | 0 .../main/java/org/apache/coyote/Adapter.java | 0 .../apache/coyote/AsyncContextCallback.java | 0 .../org/apache/coyote/AsyncStateMachine.java | 0 .../org/apache/coyote/CloseNowException.java | 0 .../java/org/apache/coyote/Constants.java | 0 .../apache/coyote/ContainerThreadMarker.java | 0 .../java/org/apache/coyote/ErrorState.java | 0 .../java/org/apache/coyote/InputBuffer.java | 0 .../org/apache/coyote/LocalStrings.properties | 0 .../apache/coyote/LocalStrings_es.properties | 0 .../java/org/apache/coyote/OutputBuffer.java | 0 .../java/org/apache/coyote/Processor.java | 0 .../org/apache/coyote/ProtocolException.java | 0 .../org/apache/coyote/ProtocolHandler.java | 0 .../main/java/org/apache/coyote/Request.java | 0 .../org/apache/coyote/RequestGroupInfo.java | 0 .../java/org/apache/coyote/RequestInfo.java | 0 .../main/java/org/apache/coyote/Response.java | 0 .../org/apache/coyote/UpgradeProtocol.java | 0 .../java/org/apache/coyote/UpgradeToken.java | 0 .../coyote/ajp/AbstractAjpProtocol.java | 0 .../org/apache/coyote/ajp/AjpAprProtocol.java | 0 .../org/apache/coyote/ajp/AjpMessage.java | 0 .../apache/coyote/ajp/AjpNio2Protocol.java | 0 .../org/apache/coyote/ajp/AjpNioProtocol.java | 0 .../org/apache/coyote/ajp/AjpProcessor.java | 0 .../java/org/apache/coyote/ajp/Constants.java | 0 .../apache/coyote/ajp/LocalStrings.properties | 0 .../coyote/ajp/LocalStrings_es.properties | 0 .../http11/AbstractHttp11JsseProtocol.java | 0 .../coyote/http11/AbstractHttp11Protocol.java | 0 .../org/apache/coyote/http11/Constants.java | 0 .../http11/HeadersTooLargeException.java | 0 .../coyote/http11/Http11AprProtocol.java | 0 .../coyote/http11/Http11InputBuffer.java | 0 .../coyote/http11/Http11Nio2Protocol.java | 0 .../coyote/http11/Http11NioProtocol.java | 0 .../coyote/http11/Http11OutputBuffer.java | 0 .../apache/coyote/http11/Http11Processor.java | 0 .../org/apache/coyote/http11/InputFilter.java | 0 .../coyote/http11/LocalStrings.properties | 0 .../coyote/http11/LocalStrings_es.properties | 0 .../coyote/http11/LocalStrings_fr.properties | 0 .../coyote/http11/LocalStrings_ja.properties | 0 .../apache/coyote/http11/OutputFilter.java | 0 .../http11/filters/BufferedInputFilter.java | 0 .../http11/filters/ChunkedInputFilter.java | 0 .../http11/filters/ChunkedOutputFilter.java | 0 .../http11/filters/GzipOutputFilter.java | 0 .../http11/filters/IdentityInputFilter.java | 0 .../http11/filters/IdentityOutputFilter.java | 0 .../http11/filters/LocalStrings.properties | 0 .../filters/SavedRequestInputFilter.java | 0 .../http11/filters/VoidInputFilter.java | 0 .../http11/filters/VoidOutputFilter.java | 0 .../upgrade/InternalHttpUpgradeHandler.java | 0 .../http11/upgrade/LocalStrings.properties | 0 .../http11/upgrade/UpgradeProcessorBase.java | 0 .../upgrade/UpgradeProcessorExternal.java | 0 .../upgrade/UpgradeProcessorInternal.java | 0 .../upgrade/UpgradeServletInputStream.java | 0 .../upgrade/UpgradeServletOutputStream.java | 0 .../apache/coyote/http2/AbstractStream.java | 0 .../org/apache/coyote/http2/ByteUtil.java | 0 .../coyote/http2/ConnectionException.java | 0 .../coyote/http2/ConnectionSettingsBase.java | 0 .../coyote/http2/ConnectionSettingsLocal.java | 0 .../http2/ConnectionSettingsRemote.java | 0 .../org/apache/coyote/http2/Constants.java | 0 .../java/org/apache/coyote/http2/Flags.java | 0 .../org/apache/coyote/http2/FrameType.java | 0 .../org/apache/coyote/http2/HPackHuffman.java | 0 .../org/apache/coyote/http2/HeaderSink.java | 0 .../java/org/apache/coyote/http2/Hpack.java | 0 .../org/apache/coyote/http2/HpackDecoder.java | 0 .../org/apache/coyote/http2/HpackEncoder.java | 0 .../apache/coyote/http2/HpackException.java | 0 .../http2/Http2AsyncUpgradeHandler.java | 0 .../org/apache/coyote/http2/Http2Error.java | 0 .../apache/coyote/http2/Http2Exception.java | 0 .../org/apache/coyote/http2/Http2Parser.java | 0 .../apache/coyote/http2/Http2Protocol.java | 0 .../coyote/http2/Http2UpgradeHandler.java | 0 .../coyote/http2/LocalStrings.properties | 0 .../java/org/apache/coyote/http2/Setting.java | 0 .../java/org/apache/coyote/http2/Stream.java | 0 .../apache/coyote/http2/StreamException.java | 0 .../apache/coyote/http2/StreamProcessor.java | 0 .../apache/coyote/http2/StreamRunnable.java | 0 .../coyote/http2/StreamStateMachine.java | 0 .../org/apache/el/ExpressionFactoryImpl.java | 0 .../java/org/apache/el/Messages.properties | 0 .../java/org/apache/el/Messages_es.properties | 0 .../org/apache/el/MethodExpressionImpl.java | 0 .../apache/el/MethodExpressionLiteral.java | 0 .../org/apache/el/ValueExpressionImpl.java | 0 .../org/apache/el/ValueExpressionLiteral.java | 0 .../java/org/apache/el/lang/ELArithmetic.java | 0 .../java/org/apache/el/lang/ELSupport.java | 0 .../org/apache/el/lang/EvaluationContext.java | 0 .../org/apache/el/lang/ExpressionBuilder.java | 0 .../apache/el/lang/FunctionMapperFactory.java | 0 .../apache/el/lang/FunctionMapperImpl.java | 0 .../apache/el/lang/VariableMapperFactory.java | 0 .../apache/el/lang/VariableMapperImpl.java | 0 .../org/apache/el/parser/ArithmeticNode.java | 0 .../java/org/apache/el/parser/AstAnd.java | 0 .../java/org/apache/el/parser/AstAssign.java | 0 .../apache/el/parser/AstBracketSuffix.java | 0 .../java/org/apache/el/parser/AstChoice.java | 0 .../el/parser/AstCompositeExpression.java | 0 .../apache/el/parser/AstConcatenation.java | 0 .../el/parser/AstDeferredExpression.java | 0 .../java/org/apache/el/parser/AstDiv.java | 0 .../org/apache/el/parser/AstDotSuffix.java | 0 .../el/parser/AstDynamicExpression.java | 0 .../java/org/apache/el/parser/AstEmpty.java | 0 .../java/org/apache/el/parser/AstEqual.java | 0 .../java/org/apache/el/parser/AstFalse.java | 0 .../apache/el/parser/AstFloatingPoint.java | 0 .../org/apache/el/parser/AstFunction.java | 0 .../org/apache/el/parser/AstGreaterThan.java | 0 .../apache/el/parser/AstGreaterThanEqual.java | 0 .../org/apache/el/parser/AstIdentifier.java | 0 .../java/org/apache/el/parser/AstInteger.java | 0 .../apache/el/parser/AstLambdaExpression.java | 0 .../apache/el/parser/AstLambdaParameters.java | 0 .../org/apache/el/parser/AstLessThan.java | 0 .../apache/el/parser/AstLessThanEqual.java | 0 .../org/apache/el/parser/AstListData.java | 0 .../el/parser/AstLiteralExpression.java | 0 .../java/org/apache/el/parser/AstMapData.java | 0 .../org/apache/el/parser/AstMapEntry.java | 0 .../apache/el/parser/AstMethodParameters.java | 0 .../java/org/apache/el/parser/AstMinus.java | 0 .../java/org/apache/el/parser/AstMod.java | 0 .../java/org/apache/el/parser/AstMult.java | 0 .../org/apache/el/parser/AstNegative.java | 0 .../java/org/apache/el/parser/AstNot.java | 0 .../org/apache/el/parser/AstNotEqual.java | 0 .../java/org/apache/el/parser/AstNull.java | 0 .../main/java/org/apache/el/parser/AstOr.java | 0 .../java/org/apache/el/parser/AstPlus.java | 0 .../org/apache/el/parser/AstSemicolon.java | 0 .../java/org/apache/el/parser/AstSetData.java | 0 .../java/org/apache/el/parser/AstString.java | 0 .../java/org/apache/el/parser/AstTrue.java | 0 .../java/org/apache/el/parser/AstValue.java | 0 .../org/apache/el/parser/BooleanNode.java | 0 .../java/org/apache/el/parser/ELParser.html | 0 .../java/org/apache/el/parser/ELParser.java | 0 .../java/org/apache/el/parser/ELParser.jjt | 0 .../apache/el/parser/ELParserConstants.java | 0 .../el/parser/ELParserTokenManager.java | 0 .../el/parser/ELParserTreeConstants.java | 0 .../apache/el/parser/JJTELParserState.java | 0 .../main/java/org/apache/el/parser/Node.java | 0 .../org/apache/el/parser/NodeVisitor.java | 0 .../org/apache/el/parser/ParseException.java | 0 .../apache/el/parser/SimpleCharStream.java | 0 .../java/org/apache/el/parser/SimpleNode.java | 0 .../main/java/org/apache/el/parser/Token.java | 0 .../org/apache/el/parser/TokenMgrError.java | 0 .../java/org/apache/el/stream/Optional.java | 0 .../java/org/apache/el/stream/Stream.java | 0 .../el/stream/StreamELResolverImpl.java | 0 .../org/apache/el/util/ConcurrentCache.java | 0 .../org/apache/el/util/MessageFactory.java | 0 .../org/apache/el/util/ReflectionUtil.java | 0 .../java/org/apache/el/util/Validation.java | 0 .../java/org/apache/jasper/Constants.java | 0 .../apache/jasper/EmbeddedServletOptions.java | 0 .../org/apache/jasper/JasperException.java | 0 .../main/java/org/apache/jasper/JspC.java | 0 .../apache/jasper/JspCompilationContext.java | 0 .../main/java/org/apache/jasper/Options.java | 0 .../apache/jasper/compiler/AntCompiler.java | 0 .../jasper/compiler/AttributeParser.java | 0 .../jasper/compiler/BeanRepository.java | 0 .../org/apache/jasper/compiler/Collector.java | 0 .../org/apache/jasper/compiler/Compiler.java | 0 .../jasper/compiler/DefaultErrorHandler.java | 0 .../jasper/compiler/ELFunctionMapper.java | 0 .../apache/jasper/compiler/ELInterpreter.java | 0 .../jasper/compiler/ELInterpreterFactory.java | 0 .../org/apache/jasper/compiler/ELNode.java | 0 .../org/apache/jasper/compiler/ELParser.java | 0 .../jasper/compiler/EncodingDetector.java | 0 .../jasper/compiler/ErrorDispatcher.java | 0 .../apache/jasper/compiler/ErrorHandler.java | 0 .../org/apache/jasper/compiler/Generator.java | 0 .../compiler/ImplicitTagLibraryInfo.java | 0 .../apache/jasper/compiler/JDTCompiler.java | 0 .../jasper/compiler/JarScannerFactory.java | 0 .../apache/jasper/compiler/JasperTagInfo.java | 0 .../jasper/compiler/JavacErrorDetail.java | 0 .../org/apache/jasper/compiler/JspConfig.java | 0 .../jasper/compiler/JspDocumentParser.java | 0 .../org/apache/jasper/compiler/JspReader.java | 0 .../jasper/compiler/JspRuntimeContext.java | 0 .../org/apache/jasper/compiler/JspUtil.java | 0 .../org/apache/jasper/compiler/Localizer.java | 0 .../java/org/apache/jasper/compiler/Mark.java | 0 .../java/org/apache/jasper/compiler/Node.java | 0 .../apache/jasper/compiler/PageDataImpl.java | 0 .../org/apache/jasper/compiler/PageInfo.java | 0 .../org/apache/jasper/compiler/Parser.java | 0 .../jasper/compiler/ParserController.java | 0 .../jasper/compiler/ScriptingVariabler.java | 0 .../apache/jasper/compiler/ServletWriter.java | 0 .../apache/jasper/compiler/SmapGenerator.java | 0 .../apache/jasper/compiler/SmapStratum.java | 0 .../org/apache/jasper/compiler/SmapUtil.java | 0 .../apache/jasper/compiler/TagConstants.java | 0 .../jasper/compiler/TagFileProcessor.java | 0 .../jasper/compiler/TagLibraryInfoImpl.java | 0 .../jasper/compiler/TagPluginManager.java | 0 .../apache/jasper/compiler/TextOptimizer.java | 0 .../org/apache/jasper/compiler/TldCache.java | 0 .../org/apache/jasper/compiler/Validator.java | 0 .../jasper/compiler/tagplugin/TagPlugin.java | 0 .../compiler/tagplugin/TagPluginContext.java | 0 .../org/apache/jasper/el/ELContextImpl.java | 0 .../apache/jasper/el/ELContextWrapper.java | 0 .../org/apache/jasper/el/ELResolverImpl.java | 0 .../jasper/el/ExpressionEvaluatorImpl.java | 0 .../org/apache/jasper/el/ExpressionImpl.java | 0 .../apache/jasper/el/FunctionMapperImpl.java | 0 .../apache/jasper/el/JasperELResolver.java | 0 .../org/apache/jasper/el/JspELException.java | 0 .../apache/jasper/el/JspMethodExpression.java | 0 .../jasper/el/JspMethodNotFoundException.java | 0 .../el/JspPropertyNotFoundException.java | 0 .../el/JspPropertyNotWritableException.java | 0 .../apache/jasper/el/JspValueExpression.java | 0 .../jasper/el/VariableResolverImpl.java | 0 .../jasper/resources/LocalStrings.properties | 0 .../resources/LocalStrings_es.properties | 0 .../resources/LocalStrings_fr.properties | 0 .../resources/LocalStrings_ja.properties | 0 .../jasper/runtime/BodyContentImpl.java | 0 .../apache/jasper/runtime/ExceptionUtils.java | 0 .../apache/jasper/runtime/HttpJspBase.java | 0 .../runtime/InstanceManagerFactory.java | 0 .../runtime/JspApplicationContextImpl.java | 0 .../jasper/runtime/JspContextWrapper.java | 0 .../apache/jasper/runtime/JspFactoryImpl.java | 0 .../jasper/runtime/JspFragmentHelper.java | 0 .../jasper/runtime/JspRuntimeLibrary.java | 0 .../jasper/runtime/JspSourceDependent.java | 0 .../jasper/runtime/JspSourceImports.java | 0 .../apache/jasper/runtime/JspWriterImpl.java | 0 .../jasper/runtime/PageContextImpl.java | 0 .../runtime/ProtectedFunctionMapper.java | 0 .../ServletResponseWrapperInclude.java | 0 .../apache/jasper/runtime/TagHandlerPool.java | 0 .../jasper/security/SecurityClassLoad.java | 0 .../apache/jasper/security/SecurityUtil.java | 0 .../jasper/servlet/JasperInitializer.java | 0 .../apache/jasper/servlet/JasperLoader.java | 0 .../jasper/servlet/JspCServletContext.java | 0 .../org/apache/jasper/servlet/JspServlet.java | 0 .../jasper/servlet/JspServletWrapper.java | 0 .../apache/jasper/servlet/TldPreScanned.java | 0 .../org/apache/jasper/servlet/TldScanner.java | 0 .../jasper/servlet/mbeans-descriptors.xml | 0 .../apache/jasper/tagplugins/jstl/Util.java | 0 .../jasper/tagplugins/jstl/core/Catch.java | 0 .../jasper/tagplugins/jstl/core/Choose.java | 0 .../jasper/tagplugins/jstl/core/ForEach.java | 0 .../tagplugins/jstl/core/ForTokens.java | 0 .../jasper/tagplugins/jstl/core/If.java | 0 .../jasper/tagplugins/jstl/core/Import.java | 0 .../tagplugins/jstl/core/Otherwise.java | 0 .../jasper/tagplugins/jstl/core/Out.java | 0 .../jasper/tagplugins/jstl/core/Param.java | 0 .../jasper/tagplugins/jstl/core/Redirect.java | 0 .../jasper/tagplugins/jstl/core/Remove.java | 0 .../jasper/tagplugins/jstl/core/Set.java | 0 .../jasper/tagplugins/jstl/core/Url.java | 0 .../jasper/tagplugins/jstl/core/When.java | 0 .../jasper/tagplugins/jstl/tagPlugins.xml | 0 .../jasper/util/FastRemovalDequeue.java | 0 .../jasper/util/UniqueAttributesImpl.java | 0 .../org/apache/juli/AsyncFileHandler.java | 0 .../apache/juli/ClassLoaderLogManager.java | 0 .../java/org/apache/juli/DateFormatCache.java | 0 .../java/org/apache/juli/FileHandler.java | 0 .../org/apache/juli/JdkLoggerFormatter.java | 0 .../org/apache/juli/OneLineFormatter.java | 0 .../org/apache/juli/VerbatimFormatter.java | 0 .../org/apache/juli/WebappProperties.java | 0 .../org/apache/juli/logging/DirectJDKLog.java | 0 .../java/org/apache/juli/logging/Log.java | 0 .../logging/LogConfigurationException.java | 0 .../org/apache/juli/logging/LogFactory.java | 0 .../java/org/apache/juli/logging/package.html | 0 .../java/org/apache/naming/AbstractRef.java | 0 .../naming/ContextAccessController.java | 0 .../org/apache/naming/ContextBindings.java | 0 .../main/java/org/apache/naming/EjbRef.java | 0 .../java/org/apache/naming/HandlerRef.java | 0 .../org/apache/naming/LocalStrings.properties | 0 .../apache/naming/LocalStrings_es.properties | 0 .../apache/naming/LocalStrings_fr.properties | 0 .../apache/naming/LocalStrings_ja.properties | 0 .../org/apache/naming/NameParserImpl.java | 0 .../java/org/apache/naming/NamingContext.java | 0 .../NamingContextBindingsEnumeration.java | 0 .../naming/NamingContextEnumeration.java | 0 .../java/org/apache/naming/NamingEntry.java | 0 .../org/apache/naming/ResourceEnvRef.java | 0 .../org/apache/naming/ResourceLinkRef.java | 0 .../java/org/apache/naming/ResourceRef.java | 0 .../org/apache/naming/SelectorContext.java | 0 .../java/org/apache/naming/ServiceRef.java | 0 .../java/org/apache/naming/StringManager.java | 0 .../org/apache/naming/TransactionRef.java | 0 .../apache/naming/factory/BeanFactory.java | 0 .../org/apache/naming/factory/Constants.java | 0 .../naming/factory/DataSourceLinkFactory.java | 0 .../org/apache/naming/factory/EjbFactory.java | 0 .../apache/naming/factory/FactoryBase.java | 0 .../naming/factory/LocalStrings.properties | 0 .../naming/factory/MailSessionFactory.java | 0 .../apache/naming/factory/OpenEjbFactory.java | 0 .../naming/factory/ResourceEnvFactory.java | 0 .../naming/factory/ResourceFactory.java | 0 .../naming/factory/ResourceLinkFactory.java | 0 .../naming/factory/SendMailFactory.java | 0 .../naming/factory/TransactionFactory.java | 0 .../org/apache/naming/factory/package.html | 0 .../factory/webservices/ServiceProxy.java | 0 .../webservices/ServiceRefFactory.java | 0 .../naming/java/javaURLContextFactory.java | 0 .../java/org/apache/naming/java/package.html | 0 .../main/java/org/apache/naming/package.html | 0 .../java/org/apache/tomcat/ContextBind.java | 0 .../org/apache/tomcat/InstanceManager.java | 0 .../tomcat/InstanceManagerBindings.java | 0 .../tomcat/InstrumentableClassLoader.java | 0 .../src}/main/java/org/apache/tomcat/Jar.java | 0 .../java/org/apache/tomcat/JarScanFilter.java | 0 .../java/org/apache/tomcat/JarScanType.java | 0 .../java/org/apache/tomcat/JarScanner.java | 0 .../org/apache/tomcat/JarScannerCallback.java | 0 .../apache/tomcat/PeriodicEventListener.java | 0 .../apache/tomcat/SimpleInstanceManager.java | 0 .../org/apache/tomcat/buildutil/CheckEol.java | 0 .../org/apache/tomcat/buildutil/SignCode.java | 0 .../org/apache/tomcat/buildutil/Txt2Html.java | 0 .../tomcat/dbcp/dbcp2/AbandonedTrace.java | 0 .../tomcat/dbcp/dbcp2/BasicDataSource.java | 0 .../dbcp/dbcp2/BasicDataSourceFactory.java | 0 .../dbcp/dbcp2/BasicDataSourceMXBean.java | 0 .../tomcat/dbcp/dbcp2/ConnectionFactory.java | 0 .../apache/tomcat/dbcp/dbcp2/Constants.java | 0 .../dbcp2/DataSourceConnectionFactory.java | 0 .../dbcp2/DelegatingCallableStatement.java | 0 .../dbcp/dbcp2/DelegatingConnection.java | 0 .../dbcp2/DelegatingDatabaseMetaData.java | 0 .../dbcp2/DelegatingPreparedStatement.java | 0 .../dbcp/dbcp2/DelegatingResultSet.java | 0 .../dbcp/dbcp2/DelegatingStatement.java | 0 .../dbcp/dbcp2/DriverConnectionFactory.java | 0 .../dbcp2/DriverManagerConnectionFactory.java | 0 .../dbcp/dbcp2/LifetimeExceededException.java | 0 .../tomcat/dbcp/dbcp2/LocalStrings.properties | 0 .../apache/tomcat/dbcp/dbcp2/PStmtKey.java | 0 .../dbcp/dbcp2/PoolableCallableStatement.java | 0 .../tomcat/dbcp/dbcp2/PoolableConnection.java | 0 .../dbcp/dbcp2/PoolableConnectionFactory.java | 0 .../dbcp/dbcp2/PoolableConnectionMXBean.java | 0 .../dbcp/dbcp2/PoolablePreparedStatement.java | 0 .../tomcat/dbcp/dbcp2/PoolingConnection.java | 0 .../tomcat/dbcp/dbcp2/PoolingDataSource.java | 0 .../tomcat/dbcp/dbcp2/PoolingDriver.java | 0 .../dbcp/dbcp2/SwallowedExceptionLogger.java | 0 .../org/apache/tomcat/dbcp/dbcp2/Utils.java | 0 .../dbcp2/cpdsadapter/ConnectionImpl.java | 0 .../dbcp2/cpdsadapter/DriverAdapterCPDS.java | 0 .../dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java | 0 .../cpdsadapter/PooledConnectionImpl.java | 0 .../dbcp/dbcp2/cpdsadapter/package-info.java | 0 .../datasources/CPDSConnectionFactory.java | 0 .../datasources/InstanceKeyDataSource.java | 0 .../InstanceKeyDataSourceFactory.java | 0 .../KeyedCPDSConnectionFactory.java | 0 .../datasources/PerUserPoolDataSource.java | 0 .../PerUserPoolDataSourceFactory.java | 0 .../dbcp/dbcp2/datasources/PoolKey.java | 0 .../datasources/PooledConnectionAndInfo.java | 0 .../datasources/PooledConnectionManager.java | 0 .../datasources/SharedPoolDataSource.java | 0 .../SharedPoolDataSourceFactory.java | 0 .../dbcp/dbcp2/datasources/UserPassKey.java | 0 .../dbcp/dbcp2/datasources/package-info.java | 0 .../apache/tomcat/dbcp/dbcp2/overview.html | 0 .../tomcat/dbcp/dbcp2/package-info.java | 0 .../pool2/BaseKeyedPooledObjectFactory.java | 0 .../apache/tomcat/dbcp/pool2/BaseObject.java | 0 .../tomcat/dbcp/pool2/BaseObjectPool.java | 0 .../dbcp/pool2/BasePooledObjectFactory.java | 0 .../tomcat/dbcp/pool2/KeyedObjectPool.java | 0 .../dbcp/pool2/KeyedPooledObjectFactory.java | 0 .../apache/tomcat/dbcp/pool2/ObjectPool.java | 0 .../apache/tomcat/dbcp/pool2/PoolUtils.java | 0 .../tomcat/dbcp/pool2/PooledObject.java | 0 .../dbcp/pool2/PooledObjectFactory.java | 0 .../tomcat/dbcp/pool2/PooledObjectState.java | 0 .../pool2/SwallowedExceptionListener.java | 0 .../apache/tomcat/dbcp/pool2/TrackedUse.java | 0 .../tomcat/dbcp/pool2/UsageTracking.java | 0 .../dbcp/pool2/impl/AbandonedConfig.java | 0 .../pool2/impl/BaseGenericObjectPool.java | 0 .../dbcp/pool2/impl/BaseObjectPoolConfig.java | 0 .../pool2/impl/DefaultEvictionPolicy.java | 0 .../dbcp/pool2/impl/DefaultPooledObject.java | 0 .../pool2/impl/DefaultPooledObjectInfo.java | 0 .../impl/DefaultPooledObjectInfoMBean.java | 0 .../dbcp/pool2/impl/EvictionConfig.java | 0 .../dbcp/pool2/impl/EvictionPolicy.java | 0 .../tomcat/dbcp/pool2/impl/EvictionTimer.java | 0 .../pool2/impl/GenericKeyedObjectPool.java | 0 .../impl/GenericKeyedObjectPoolConfig.java | 0 .../impl/GenericKeyedObjectPoolMXBean.java | 0 .../dbcp/pool2/impl/GenericObjectPool.java | 0 .../pool2/impl/GenericObjectPoolConfig.java | 0 .../pool2/impl/GenericObjectPoolMXBean.java | 0 .../impl/InterruptibleReentrantLock.java | 0 .../dbcp/pool2/impl/LinkedBlockingDeque.java | 0 .../tomcat/dbcp/pool2/impl/PoolImplUtils.java | 0 .../dbcp/pool2/impl/PooledSoftReference.java | 0 .../pool2/impl/SoftReferenceObjectPool.java | 0 .../tomcat/dbcp/pool2/impl/package.html | 0 .../apache/tomcat/dbcp/pool2/overview.html | 0 .../org/apache/tomcat/dbcp/pool2/package.html | 0 .../java/org/apache/tomcat/jni/Address.java | 0 .../org/apache/tomcat/jni/BIOCallback.java | 0 .../java/org/apache/tomcat/jni/Buffer.java | 0 .../tomcat/jni/CertificateVerifier.java | 0 .../java/org/apache/tomcat/jni/Directory.java | 0 .../java/org/apache/tomcat/jni/Error.java | 0 .../main/java/org/apache/tomcat/jni/File.java | 0 .../java/org/apache/tomcat/jni/FileInfo.java | 0 .../java/org/apache/tomcat/jni/Global.java | 0 .../java/org/apache/tomcat/jni/Library.java | 0 .../tomcat/jni/LibraryNotFoundError.java | 0 .../java/org/apache/tomcat/jni/Local.java | 0 .../main/java/org/apache/tomcat/jni/Lock.java | 0 .../main/java/org/apache/tomcat/jni/Mmap.java | 0 .../java/org/apache/tomcat/jni/Multicast.java | 0 .../main/java/org/apache/tomcat/jni/OS.java | 0 .../apache/tomcat/jni/PasswordCallback.java | 0 .../main/java/org/apache/tomcat/jni/Poll.java | 0 .../main/java/org/apache/tomcat/jni/Pool.java | 0 .../org/apache/tomcat/jni/PoolCallback.java | 0 .../main/java/org/apache/tomcat/jni/Proc.java | 0 .../apache/tomcat/jni/ProcErrorCallback.java | 0 .../java/org/apache/tomcat/jni/Procattr.java | 0 .../java/org/apache/tomcat/jni/Registry.java | 0 .../main/java/org/apache/tomcat/jni/SSL.java | 0 .../org/apache/tomcat/jni/SSLContext.java | 0 .../java/org/apache/tomcat/jni/SSLSocket.java | 0 .../main/java/org/apache/tomcat/jni/Shm.java | 0 .../java/org/apache/tomcat/jni/Sockaddr.java | 0 .../java/org/apache/tomcat/jni/Socket.java | 0 .../java/org/apache/tomcat/jni/Status.java | 0 .../java/org/apache/tomcat/jni/Stdlib.java | 0 .../java/org/apache/tomcat/jni/Thread.java | 0 .../main/java/org/apache/tomcat/jni/Time.java | 0 .../main/java/org/apache/tomcat/jni/User.java | 0 .../org/apache/tomcat/util/Diagnostics.java | 0 .../apache/tomcat/util/ExceptionUtils.java | 0 .../tomcat/util/IntrospectionUtils.java | 0 .../tomcat/util/LocalStrings.properties | 0 .../org/apache/tomcat/util/bcel/Const.java | 0 .../classfile/AnnotationElementValue.java | 0 .../util/bcel/classfile/AnnotationEntry.java | 0 .../util/bcel/classfile/Annotations.java | 0 .../bcel/classfile/ArrayElementValue.java | 0 .../bcel/classfile/ClassElementValue.java | 0 .../bcel/classfile/ClassFormatException.java | 0 .../util/bcel/classfile/ClassParser.java | 0 .../tomcat/util/bcel/classfile/Constant.java | 0 .../util/bcel/classfile/ConstantClass.java | 0 .../util/bcel/classfile/ConstantDouble.java | 0 .../util/bcel/classfile/ConstantFloat.java | 0 .../util/bcel/classfile/ConstantInteger.java | 0 .../util/bcel/classfile/ConstantLong.java | 0 .../util/bcel/classfile/ConstantPool.java | 0 .../util/bcel/classfile/ConstantUtf8.java | 0 .../util/bcel/classfile/ElementValue.java | 0 .../util/bcel/classfile/ElementValuePair.java | 0 .../util/bcel/classfile/EnumElementValue.java | 0 .../tomcat/util/bcel/classfile/JavaClass.java | 0 .../bcel/classfile/SimpleElementValue.java | 0 .../tomcat/util/bcel/classfile/Utility.java | 0 .../tomcat/util/bcel/classfile/package.html | 0 .../org/apache/tomcat/util/bcel/package.html | 0 .../org/apache/tomcat/util/buf/Ascii.java | 0 .../apache/tomcat/util/buf/B2CConverter.java | 0 .../tomcat/util/buf/ByteBufferHolder.java | 0 .../tomcat/util/buf/ByteBufferUtils.java | 0 .../org/apache/tomcat/util/buf/ByteChunk.java | 0 .../apache/tomcat/util/buf/C2BConverter.java | 0 .../org/apache/tomcat/util/buf/CharChunk.java | 0 .../org/apache/tomcat/util/buf/HexUtils.java | 0 .../tomcat/util/buf/LocalStrings.properties | 0 .../util/buf/LocalStrings_es.properties | 0 .../apache/tomcat/util/buf/MessageBytes.java | 0 .../apache/tomcat/util/buf/StringCache.java | 0 .../apache/tomcat/util/buf/StringUtils.java | 0 .../org/apache/tomcat/util/buf/UDecoder.java | 0 .../org/apache/tomcat/util/buf/UEncoder.java | 0 .../org/apache/tomcat/util/buf/UriUtil.java | 0 .../apache/tomcat/util/buf/Utf8Decoder.java | 0 .../apache/tomcat/util/buf/Utf8Encoder.java | 0 .../org/apache/tomcat/util/buf/package.html | 0 .../tomcat/util/codec/binary/Base64.java | 0 .../tomcat/util/codec/binary/BaseNCodec.java | 0 .../tomcat/util/codec/binary/StringUtils.java | 0 .../tomcat/util/codec/binary/package.html | 0 .../collections/CaseInsensitiveKeyMap.java | 0 .../util/collections/ConcurrentCache.java | 0 .../ManagedConcurrentWeakHashMap.java | 0 .../util/collections/SynchronizedQueue.java | 0 .../util/collections/SynchronizedStack.java | 0 .../apache/tomcat/util/compat/Jre9Compat.java | 0 .../apache/tomcat/util/compat/JreCompat.java | 0 .../apache/tomcat/util/compat/JreVendor.java | 0 .../util/compat/LocalStrings.properties | 0 .../tomcat/util/descriptor/Constants.java | 0 .../util/descriptor/DigesterFactory.java | 0 .../util/descriptor/InputSourceUtil.java | 0 .../tomcat/util/descriptor/LocalResolver.java | 0 .../util/descriptor/LocalStrings.properties | 0 .../descriptor/LocalStrings_es.properties | 0 .../util/descriptor/XmlErrorHandler.java | 0 .../util/descriptor/XmlIdentifiers.java | 0 .../descriptor/tagplugin/TagPluginParser.java | 0 .../descriptor/tld/ImplicitTldRuleSet.java | 0 .../descriptor/tld/LocalStrings.properties | 0 .../util/descriptor/tld/TagFileXml.java | 0 .../tomcat/util/descriptor/tld/TagXml.java | 0 .../tomcat/util/descriptor/tld/TaglibXml.java | 0 .../tomcat/util/descriptor/tld/TldParser.java | 0 .../util/descriptor/tld/TldResourcePath.java | 0 .../util/descriptor/tld/TldRuleSet.java | 0 .../util/descriptor/tld/ValidatorXml.java | 0 .../util/descriptor/tld/package-info.java | 0 .../descriptor/web/ApplicationParameter.java | 0 .../tomcat/util/descriptor/web/Constants.java | 0 .../util/descriptor/web/ContextEjb.java | 0 .../descriptor/web/ContextEnvironment.java | 0 .../util/descriptor/web/ContextHandler.java | 0 .../util/descriptor/web/ContextLocalEjb.java | 0 .../util/descriptor/web/ContextResource.java | 0 .../descriptor/web/ContextResourceEnvRef.java | 0 .../descriptor/web/ContextResourceLink.java | 0 .../util/descriptor/web/ContextService.java | 0 .../descriptor/web/ContextTransaction.java | 0 .../tomcat/util/descriptor/web/ErrorPage.java | 0 .../tomcat/util/descriptor/web/FilterDef.java | 0 .../tomcat/util/descriptor/web/FilterMap.java | 0 .../web/FragmentJarScannerCallback.java | 0 .../util/descriptor/web/Injectable.java | 0 .../util/descriptor/web/InjectionTarget.java | 0 .../web/JspConfigDescriptorImpl.java | 0 .../util/descriptor/web/JspPropertyGroup.java | 0 .../web/JspPropertyGroupDescriptorImpl.java | 0 .../descriptor/web/LocalStrings.properties | 0 .../descriptor/web/LocalStrings_es.properties | 0 .../util/descriptor/web/LoginConfig.java | 0 .../descriptor/web/MessageDestination.java | 0 .../descriptor/web/MessageDestinationRef.java | 0 .../util/descriptor/web/MultipartDef.java | 0 .../util/descriptor/web/NamingResources.java | 0 .../util/descriptor/web/ResourceBase.java | 0 .../descriptor/web/SecurityCollection.java | 0 .../descriptor/web/SecurityConstraint.java | 0 .../util/descriptor/web/SecurityRoleRef.java | 0 .../util/descriptor/web/ServletDef.java | 0 .../util/descriptor/web/SessionConfig.java | 0 .../descriptor/web/TaglibDescriptorImpl.java | 0 .../util/descriptor/web/WebRuleSet.java | 0 .../tomcat/util/descriptor/web/WebXml.java | 0 .../util/descriptor/web/WebXmlParser.java | 0 .../util/descriptor/web/XmlEncodingBase.java | 0 .../descriptor/web/mbeans-descriptors.xml | 0 .../tomcat/util/descriptor/web/package.html | 0 .../AbstractObjectCreationFactory.java | 0 .../tomcat/util/digester/ArrayStack.java | 0 .../tomcat/util/digester/CallMethodRule.java | 0 .../tomcat/util/digester/CallParamRule.java | 0 .../apache/tomcat/util/digester/Digester.java | 0 .../util/digester/DocumentProperties.java | 0 .../util/digester/FactoryCreateRule.java | 0 .../util/digester/LocalStrings.properties | 0 .../util/digester/ObjectCreateRule.java | 0 .../util/digester/ObjectCreationFactory.java | 0 .../org/apache/tomcat/util/digester/Rule.java | 0 .../apache/tomcat/util/digester/RuleSet.java | 0 .../tomcat/util/digester/RuleSetBase.java | 0 .../apache/tomcat/util/digester/Rules.java | 0 .../tomcat/util/digester/RulesBase.java | 0 .../tomcat/util/digester/SetNextRule.java | 0 .../util/digester/SetPropertiesRule.java | 0 .../apache/tomcat/util/digester/package.html | 0 .../tomcat/util/file/ConfigFileLoader.java | 0 .../tomcat/util/file/LocalStrings.properties | 0 .../org/apache/tomcat/util/file/Matcher.java | 0 .../org/apache/tomcat/util/file/package.html | 0 .../tomcat/util/http/CookieProcessor.java | 0 .../tomcat/util/http/CookieProcessorBase.java | 0 .../tomcat/util/http/FastHttpDateFormat.java | 0 .../util/http/LegacyCookieProcessor.java | 0 .../tomcat/util/http/LocalStrings.properties | 0 .../apache/tomcat/util/http/MimeHeaders.java | 0 .../apache/tomcat/util/http/Parameters.java | 0 .../apache/tomcat/util/http/RequestUtil.java | 0 .../util/http/Rfc6265CookieProcessor.java | 0 .../apache/tomcat/util/http/ServerCookie.java | 0 .../tomcat/util/http/ServerCookies.java | 0 .../fileupload/ByteArrayOutputStream.java | 0 .../fileupload/DeferredFileOutputStream.java | 0 .../tomcat/util/http/fileupload/FileItem.java | 0 .../util/http/fileupload/FileItemFactory.java | 0 .../util/http/fileupload/FileItemHeaders.java | 0 .../fileupload/FileItemHeadersSupport.java | 0 .../http/fileupload/FileItemIterator.java | 0 .../util/http/fileupload/FileItemStream.java | 0 .../util/http/fileupload/FileUpload.java | 0 .../util/http/fileupload/FileUploadBase.java | 0 .../http/fileupload/FileUploadException.java | 0 .../util/http/fileupload/FileUtils.java | 0 .../tomcat/util/http/fileupload/IOUtils.java | 0 .../fileupload/InvalidFileNameException.java | 0 .../util/http/fileupload/MultipartStream.java | 0 .../util/http/fileupload/ParameterParser.java | 0 .../http/fileupload/ProgressListener.java | 0 .../util/http/fileupload/RequestContext.java | 0 .../fileupload/ThresholdingOutputStream.java | 0 .../util/http/fileupload/UploadContext.java | 0 .../http/fileupload/disk/DiskFileItem.java | 0 .../fileupload/disk/DiskFileItemFactory.java | 0 .../http/fileupload/disk/package-info.java | 0 .../util/http/fileupload/package-info.java | 0 .../fileupload/servlet/ServletFileUpload.java | 0 .../servlet/ServletRequestContext.java | 0 .../http/fileupload/servlet/package-info.java | 0 .../util/http/fileupload/util/Closeable.java | 0 .../fileupload/util/FileItemHeadersImpl.java | 0 .../fileupload/util/LimitedInputStream.java | 0 .../util/http/fileupload/util/Streams.java | 0 .../fileupload/util/mime/MimeUtility.java | 0 .../fileupload/util/mime/ParseException.java | 0 .../util/mime/QuotedPrintableDecoder.java | 0 .../fileupload/util/mime/package-info.java | 0 .../http/fileupload/util/package-info.java | 0 .../org/apache/tomcat/util/http/package.html | 0 .../util/http/parser/AcceptLanguage.java | 0 .../util/http/parser/Authorization.java | 0 .../tomcat/util/http/parser/Cookie.java | 0 .../apache/tomcat/util/http/parser/Host.java | 0 .../tomcat/util/http/parser/HttpParser.java | 0 .../util/http/parser/LocalStrings.properties | 0 .../tomcat/util/http/parser/MediaType.java | 0 .../util/http/parser/MediaTypeCache.java | 0 .../tomcat/util/http/parser/SkipResult.java | 0 .../apache/tomcat/util/log/CaptureLog.java | 0 .../tomcat/util/log/SystemLogHandler.java | 0 .../tomcat/util/log/UserDataHelper.java | 0 .../tomcat/util/modeler/AttributeInfo.java | 0 .../util/modeler/BaseAttributeFilter.java | 0 .../tomcat/util/modeler/BaseModelMBean.java | 0 .../modeler/BaseNotificationBroadcaster.java | 0 .../tomcat/util/modeler/FeatureInfo.java | 0 .../tomcat/util/modeler/ManagedBean.java | 0 .../tomcat/util/modeler/NotificationInfo.java | 0 .../tomcat/util/modeler/OperationInfo.java | 0 .../tomcat/util/modeler/ParameterInfo.java | 0 .../apache/tomcat/util/modeler/Registry.java | 0 .../tomcat/util/modeler/RegistryMBean.java | 0 .../org/apache/tomcat/util/modeler/Util.java | 0 .../util/modeler/mbeans-descriptors.dtd | 0 .../MbeansDescriptorsDigesterSource.java | 0 .../MbeansDescriptorsIntrospectionSource.java | 0 .../util/modeler/modules/ModelerSource.java | 0 .../tomcat/util/modeler/modules/package.html | 0 .../apache/tomcat/util/modeler/package.html | 0 .../tomcat/util/net/AbstractEndpoint.java | 0 .../tomcat/util/net/AbstractJsseEndpoint.java | 0 .../org/apache/tomcat/util/net/Acceptor.java | 0 .../util/net/ApplicationBufferHandler.java | 0 .../apache/tomcat/util/net/AprEndpoint.java | 0 .../apache/tomcat/util/net/AprSSLSupport.java | 0 .../org/apache/tomcat/util/net/Constants.java | 0 .../apache/tomcat/util/net/DispatchType.java | 0 .../tomcat/util/net/LocalStrings.properties | 0 .../util/net/LocalStrings_es.properties | 0 .../util/net/LocalStrings_fr.properties | 0 .../util/net/LocalStrings_ja.properties | 0 .../apache/tomcat/util/net/Nio2Channel.java | 0 .../apache/tomcat/util/net/Nio2Endpoint.java | 0 .../tomcat/util/net/NioBlockingSelector.java | 0 .../apache/tomcat/util/net/NioChannel.java | 0 .../apache/tomcat/util/net/NioEndpoint.java | 0 .../tomcat/util/net/NioSelectorPool.java | 0 .../apache/tomcat/util/net/SSLContext.java | 0 .../apache/tomcat/util/net/SSLHostConfig.java | 0 .../util/net/SSLHostConfigCertificate.java | 0 .../tomcat/util/net/SSLImplementation.java | 0 .../tomcat/util/net/SSLSessionManager.java | 0 .../apache/tomcat/util/net/SSLSupport.java | 0 .../org/apache/tomcat/util/net/SSLUtil.java | 0 .../apache/tomcat/util/net/SSLUtilBase.java | 0 .../tomcat/util/net/SecureNio2Channel.java | 0 .../tomcat/util/net/SecureNioChannel.java | 0 .../tomcat/util/net/SendfileDataBase.java | 0 .../util/net/SendfileKeepAliveState.java | 0 .../apache/tomcat/util/net/SendfileState.java | 0 .../tomcat/util/net/SocketBufferHandler.java | 0 .../apache/tomcat/util/net/SocketEvent.java | 0 .../tomcat/util/net/SocketProcessorBase.java | 0 .../tomcat/util/net/SocketProperties.java | 0 .../tomcat/util/net/SocketWrapperBase.java | 0 .../util/net/TLSClientHelloExtractor.java | 0 .../util/net/jsse/JSSEImplementation.java | 0 .../tomcat/util/net/jsse/JSSEKeyManager.java | 0 .../tomcat/util/net/jsse/JSSESSLContext.java | 0 .../tomcat/util/net/jsse/JSSESupport.java | 0 .../apache/tomcat/util/net/jsse/JSSEUtil.java | 0 .../util/net/jsse/LocalStrings.properties | 0 .../util/net/jsse/LocalStrings_es.properties | 0 .../util/net/jsse/LocalStrings_fr.properties | 0 .../util/net/jsse/LocalStrings_ja.properties | 0 .../apache/tomcat/util/net/jsse/PEMFile.java | 0 .../util/net/openssl/LocalStrings.properties | 0 .../util/net/openssl/OpenSSLContext.java | 0 .../util/net/openssl/OpenSSLEngine.java | 0 .../net/openssl/OpenSSLImplementation.java | 0 .../util/net/openssl/OpenSSLKeyManager.java | 0 .../util/net/openssl/OpenSSLProtocols.java | 0 .../net/openssl/OpenSSLSessionContext.java | 0 .../util/net/openssl/OpenSSLSessionStats.java | 0 .../tomcat/util/net/openssl/OpenSSLUtil.java | 0 .../net/openssl/OpenSSLX509Certificate.java | 0 .../net/openssl/ciphers/Authentication.java | 0 .../util/net/openssl/ciphers/Cipher.java | 0 .../util/net/openssl/ciphers/Encryption.java | 0 .../net/openssl/ciphers/EncryptionLevel.java | 0 .../util/net/openssl/ciphers/KeyExchange.java | 0 .../openssl/ciphers/LocalStrings.properties | 0 .../net/openssl/ciphers/MessageDigest.java | 0 .../OpenSSLCipherConfigurationParser.java | 0 .../util/net/openssl/ciphers/Protocol.java | 0 .../apache/tomcat/util/res/StringManager.java | 0 .../util/scan/AbstractInputStreamJar.java | 0 .../apache/tomcat/util/scan/Constants.java | 0 .../apache/tomcat/util/scan/JarFactory.java | 0 .../tomcat/util/scan/JarFileUrlJar.java | 0 .../tomcat/util/scan/JarFileUrlNestedJar.java | 0 .../tomcat/util/scan/LocalStrings.properties | 0 .../util/scan/NonClosingJarInputStream.java | 0 .../util/scan/StandardJarScanFilter.java | 0 .../tomcat/util/scan/StandardJarScanner.java | 0 .../org/apache/tomcat/util/scan/UrlJar.java | 0 .../org/apache/tomcat/util/scan/package.html | 0 .../security/ConcurrentMessageDigest.java | 0 .../tomcat/util/security/MD5Encoder.java | 0 .../tomcat/util/security/PermissionCheck.java | 0 .../util/security/PrivilegedGetTccl.java | 0 .../util/security/PrivilegedSetTccl.java | 0 .../apache/tomcat/util/threads/Constants.java | 0 .../util/threads/InlineExecutorService.java | 0 .../tomcat/util/threads/LimitLatch.java | 0 .../util/threads/ResizableExecutor.java | 0 .../threads/StopPooledThreadException.java | 0 .../apache/tomcat/util/threads/TaskQueue.java | 0 .../tomcat/util/threads/TaskThread.java | 0 .../util/threads/TaskThreadFactory.java | 0 .../util/threads/ThreadPoolExecutor.java | 0 .../util/threads/res/LocalStrings.properties | 0 .../threads/res/LocalStrings_es.properties | 0 .../threads/res/LocalStrings_fr.properties | 0 .../threads/res/LocalStrings_ja.properties | 0 .../websocket/AsyncChannelGroupUtil.java | 0 .../tomcat/websocket/AsyncChannelWrapper.java | 0 .../AsyncChannelWrapperNonSecure.java | 0 .../websocket/AsyncChannelWrapperSecure.java | 0 .../tomcat/websocket/BackgroundProcess.java | 0 .../websocket/BackgroundProcessManager.java | 0 .../apache/tomcat/websocket/Constants.java | 0 .../apache/tomcat/websocket/DecoderEntry.java | 0 .../tomcat/websocket/FutureToSendHandler.java | 0 .../tomcat/websocket/LocalStrings.properties | 0 .../websocket/MessageHandlerResult.java | 0 .../websocket/MessageHandlerResultType.java | 0 .../apache/tomcat/websocket/MessagePart.java | 0 .../tomcat/websocket/PerMessageDeflate.java | 0 .../ReadBufferOverflowException.java | 0 .../tomcat/websocket/Transformation.java | 0 .../websocket/TransformationFactory.java | 0 .../websocket/TransformationResult.java | 0 .../org/apache/tomcat/websocket/Util.java | 0 .../websocket/WrappedMessageHandler.java | 0 .../tomcat/websocket/WsContainerProvider.java | 0 .../apache/tomcat/websocket/WsExtension.java | 0 .../websocket/WsExtensionParameter.java | 0 .../apache/tomcat/websocket/WsFrameBase.java | 0 .../tomcat/websocket/WsFrameClient.java | 0 .../tomcat/websocket/WsHandshakeResponse.java | 0 .../tomcat/websocket/WsIOException.java | 0 .../tomcat/websocket/WsPongMessage.java | 0 .../websocket/WsRemoteEndpointAsync.java | 0 .../websocket/WsRemoteEndpointBase.java | 0 .../websocket/WsRemoteEndpointBasic.java | 0 .../websocket/WsRemoteEndpointImplBase.java | 0 .../websocket/WsRemoteEndpointImplClient.java | 0 .../apache/tomcat/websocket/WsSession.java | 0 .../websocket/WsWebSocketContainer.java | 0 .../tomcat/websocket/pojo/Constants.java | 0 .../websocket/pojo/LocalStrings.properties | 0 .../websocket/pojo/PojoEndpointBase.java | 0 .../websocket/pojo/PojoEndpointClient.java | 0 .../websocket/pojo/PojoEndpointServer.java | 0 .../pojo/PojoMessageHandlerBase.java | 0 .../pojo/PojoMessageHandlerPartialBase.java | 0 .../pojo/PojoMessageHandlerPartialBinary.java | 0 .../pojo/PojoMessageHandlerPartialText.java | 0 .../pojo/PojoMessageHandlerWholeBase.java | 0 .../pojo/PojoMessageHandlerWholeBinary.java | 0 .../pojo/PojoMessageHandlerWholePong.java | 0 .../pojo/PojoMessageHandlerWholeText.java | 0 .../websocket/pojo/PojoMethodMapping.java | 0 .../tomcat/websocket/pojo/PojoPathParam.java | 0 .../tomcat/websocket/pojo/package-info.java | 0 .../tomcat/websocket/server/Constants.java | 0 .../DefaultServerEndpointConfigurator.java | 0 .../websocket/server/LocalStrings.properties | 0 .../tomcat/websocket/server/UpgradeUtil.java | 0 .../tomcat/websocket/server/UriTemplate.java | 0 .../websocket/server/WsContextListener.java | 0 .../tomcat/websocket/server/WsFilter.java | 0 .../websocket/server/WsFrameServer.java | 0 .../websocket/server/WsHandshakeRequest.java | 0 .../server/WsHttpUpgradeHandler.java | 0 .../websocket/server/WsMappingResult.java | 0 .../WsPerSessionServerEndpointConfig.java | 0 .../server/WsRemoteEndpointImplServer.java | 0 .../apache/tomcat/websocket/server/WsSci.java | 0 .../websocket/server/WsServerContainer.java | 0 .../websocket/server/WsSessionListener.java | 0 .../websocket/server/WsWriteTimeout.java | 0 .../tomcat/websocket/server/package-info.java | 0 core/tomcat-core.iml | 26 ++++++++++ pom.xml | 10 ++-- transport/pom.xml | 33 +++++++++++++ transport/tomcat-transport.iml | 24 ++++++++++ 1860 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 all/pom.xml create mode 100644 all/tomcat-all.iml create mode 100644 core/pom.xml rename {src => core/src}/main/java/com/mat/net/AsyncContextExample.java (100%) rename {src => core/src}/main/java/javax/annotation/Generated.java (100%) rename {src => core/src}/main/java/javax/annotation/ManagedBean.java (100%) rename {src => core/src}/main/java/javax/annotation/PostConstruct.java (100%) rename {src => core/src}/main/java/javax/annotation/PreDestroy.java (100%) rename {src => core/src}/main/java/javax/annotation/Priority.java (100%) rename {src => core/src}/main/java/javax/annotation/Resource.java (100%) rename {src => core/src}/main/java/javax/annotation/Resources.java (100%) rename {src => core/src}/main/java/javax/annotation/security/DeclareRoles.java (100%) rename {src => core/src}/main/java/javax/annotation/security/DenyAll.java (100%) rename {src => core/src}/main/java/javax/annotation/security/PermitAll.java (100%) rename {src => core/src}/main/java/javax/annotation/security/RolesAllowed.java (100%) rename {src => core/src}/main/java/javax/annotation/security/RunAs.java (100%) rename {src => core/src}/main/java/javax/annotation/sql/DataSourceDefinition.java (100%) rename {src => core/src}/main/java/javax/annotation/sql/DataSourceDefinitions.java (100%) rename {src => core/src}/main/java/javax/ejb/EJB.java (100%) rename {src => core/src}/main/java/javax/ejb/EJBs.java (100%) rename {src => core/src}/main/java/javax/el/ArrayELResolver.java (100%) rename {src => core/src}/main/java/javax/el/BeanELResolver.java (100%) rename {src => core/src}/main/java/javax/el/BeanNameELResolver.java (100%) rename {src => core/src}/main/java/javax/el/BeanNameResolver.java (100%) rename {src => core/src}/main/java/javax/el/CompositeELResolver.java (100%) rename {src => core/src}/main/java/javax/el/ELClass.java (100%) rename {src => core/src}/main/java/javax/el/ELContext.java (100%) rename {src => core/src}/main/java/javax/el/ELContextEvent.java (100%) rename {src => core/src}/main/java/javax/el/ELContextListener.java (100%) rename {src => core/src}/main/java/javax/el/ELException.java (100%) rename {src => core/src}/main/java/javax/el/ELManager.java (100%) rename {src => core/src}/main/java/javax/el/ELProcessor.java (100%) rename {src => core/src}/main/java/javax/el/ELResolver.java (100%) rename {src => core/src}/main/java/javax/el/EvaluationListener.java (100%) rename {src => core/src}/main/java/javax/el/Expression.java (100%) rename {src => core/src}/main/java/javax/el/ExpressionFactory.java (100%) rename {src => core/src}/main/java/javax/el/FunctionMapper.java (100%) rename {src => core/src}/main/java/javax/el/ImportHandler.java (100%) rename {src => core/src}/main/java/javax/el/LambdaExpression.java (100%) rename {src => core/src}/main/java/javax/el/ListELResolver.java (100%) rename {src => core/src}/main/java/javax/el/LocalStrings.properties (100%) rename {src => core/src}/main/java/javax/el/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/javax/el/MapELResolver.java (100%) rename {src => core/src}/main/java/javax/el/MethodExpression.java (100%) rename {src => core/src}/main/java/javax/el/MethodInfo.java (100%) rename {src => core/src}/main/java/javax/el/MethodNotFoundException.java (100%) rename {src => core/src}/main/java/javax/el/PropertyNotFoundException.java (100%) rename {src => core/src}/main/java/javax/el/PropertyNotWritableException.java (100%) rename {src => core/src}/main/java/javax/el/ResourceBundleELResolver.java (100%) rename {src => core/src}/main/java/javax/el/StandardELContext.java (100%) rename {src => core/src}/main/java/javax/el/StaticFieldELResolver.java (100%) rename {src => core/src}/main/java/javax/el/TypeConverter.java (100%) rename {src => core/src}/main/java/javax/el/Util.java (100%) rename {src => core/src}/main/java/javax/el/ValueExpression.java (100%) rename {src => core/src}/main/java/javax/el/ValueReference.java (100%) rename {src => core/src}/main/java/javax/el/VariableMapper.java (100%) rename {src => core/src}/main/java/javax/mail/Authenticator.java (100%) rename {src => core/src}/main/java/javax/mail/PasswordAuthentication.java (100%) rename {src => core/src}/main/java/javax/mail/Session.java (100%) rename {src => core/src}/main/java/javax/mail/internet/InternetAddress.java (100%) rename {src => core/src}/main/java/javax/mail/internet/MimeMessage.java (100%) rename {src => core/src}/main/java/javax/mail/internet/MimePart.java (100%) rename {src => core/src}/main/java/javax/mail/internet/MimePartDataSource.java (100%) rename {src => core/src}/main/java/javax/persistence/PersistenceContext.java (100%) rename {src => core/src}/main/java/javax/persistence/PersistenceContextType.java (100%) rename {src => core/src}/main/java/javax/persistence/PersistenceContexts.java (100%) rename {src => core/src}/main/java/javax/persistence/PersistenceProperty.java (100%) rename {src => core/src}/main/java/javax/persistence/PersistenceUnit.java (100%) rename {src => core/src}/main/java/javax/persistence/PersistenceUnits.java (100%) rename {src => core/src}/main/java/javax/persistence/SynchronizationType.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/AuthException.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/AuthStatus.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/ClientAuth.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/MessageInfo.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/MessagePolicy.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/ServerAuth.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/callback/CallerPrincipalCallback.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/callback/CertStoreCallback.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/callback/GroupPrincipalCallback.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/callback/PasswordValidationCallback.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/callback/PrivateKeyCallback.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/callback/SecretKeyCallback.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/callback/TrustStoreCallback.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/config/AuthConfig.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/config/AuthConfigFactory.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/config/AuthConfigProvider.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/config/ClientAuthConfig.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/config/ClientAuthContext.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/config/RegistrationListener.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/config/ServerAuthConfig.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/config/ServerAuthContext.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/module/ClientAuthModule.java (100%) rename {src => core/src}/main/java/javax/security/auth/message/module/ServerAuthModule.java (100%) rename {src => core/src}/main/java/javax/servlet/AsyncContext.java (100%) rename {src => core/src}/main/java/javax/servlet/AsyncEvent.java (100%) rename {src => core/src}/main/java/javax/servlet/AsyncListener.java (100%) rename {src => core/src}/main/java/javax/servlet/DispatcherType.java (100%) rename {src => core/src}/main/java/javax/servlet/Filter.java (100%) rename {src => core/src}/main/java/javax/servlet/FilterChain.java (100%) rename {src => core/src}/main/java/javax/servlet/FilterConfig.java (100%) rename {src => core/src}/main/java/javax/servlet/FilterRegistration.java (100%) rename {src => core/src}/main/java/javax/servlet/GenericFilter.java (100%) rename {src => core/src}/main/java/javax/servlet/GenericServlet.java (100%) rename {src => core/src}/main/java/javax/servlet/HttpConstraintElement.java (100%) rename {src => core/src}/main/java/javax/servlet/HttpMethodConstraintElement.java (100%) rename {src => core/src}/main/java/javax/servlet/LocalStrings.properties (100%) rename {src => core/src}/main/java/javax/servlet/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/javax/servlet/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/javax/servlet/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/javax/servlet/MultipartConfigElement.java (100%) rename {src => core/src}/main/java/javax/servlet/ReadListener.java (100%) rename {src => core/src}/main/java/javax/servlet/Registration.java (100%) rename {src => core/src}/main/java/javax/servlet/RequestDispatcher.java (100%) rename {src => core/src}/main/java/javax/servlet/Servlet.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletConfig.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletContainerInitializer.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletContext.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletContextAttributeEvent.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletContextAttributeListener.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletContextEvent.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletContextListener.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletException.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletInputStream.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletOutputStream.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletRegistration.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletRequest.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletRequestAttributeEvent.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletRequestAttributeListener.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletRequestEvent.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletRequestListener.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletRequestWrapper.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletResponse.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletResponseWrapper.java (100%) rename {src => core/src}/main/java/javax/servlet/ServletSecurityElement.java (100%) rename {src => core/src}/main/java/javax/servlet/SessionCookieConfig.java (100%) rename {src => core/src}/main/java/javax/servlet/SessionTrackingMode.java (100%) rename {src => core/src}/main/java/javax/servlet/SingleThreadModel.java (100%) rename {src => core/src}/main/java/javax/servlet/UnavailableException.java (100%) rename {src => core/src}/main/java/javax/servlet/WriteListener.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/HandlesTypes.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/HttpConstraint.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/HttpMethodConstraint.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/MultipartConfig.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/ServletSecurity.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/WebFilter.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/WebInitParam.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/WebListener.java (100%) rename {src => core/src}/main/java/javax/servlet/annotation/WebServlet.java (100%) rename {src => core/src}/main/java/javax/servlet/descriptor/JspConfigDescriptor.java (100%) rename {src => core/src}/main/java/javax/servlet/descriptor/JspPropertyGroupDescriptor.java (100%) rename {src => core/src}/main/java/javax/servlet/descriptor/TaglibDescriptor.java (100%) rename {src => core/src}/main/java/javax/servlet/http/Cookie.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpFilter.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpServlet.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpServletRequest.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpServletRequestWrapper.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpServletResponse.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpServletResponseWrapper.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSession.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSessionActivationListener.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSessionAttributeListener.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSessionBindingEvent.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSessionBindingListener.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSessionContext.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSessionEvent.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSessionIdListener.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpSessionListener.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpUpgradeHandler.java (100%) rename {src => core/src}/main/java/javax/servlet/http/HttpUtils.java (100%) rename {src => core/src}/main/java/javax/servlet/http/LocalStrings.properties (100%) rename {src => core/src}/main/java/javax/servlet/http/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/javax/servlet/http/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/javax/servlet/http/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/javax/servlet/http/MappingMatch.java (100%) rename {src => core/src}/main/java/javax/servlet/http/Part.java (100%) rename {src => core/src}/main/java/javax/servlet/http/PushBuilder.java (100%) rename {src => core/src}/main/java/javax/servlet/http/ServletMapping.java (100%) rename {src => core/src}/main/java/javax/servlet/http/WebConnection.java (100%) rename {src => core/src}/main/java/javax/servlet/http/package.html (100%) rename {src => core/src}/main/java/javax/servlet/jsp/ErrorData.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/HttpJspPage.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/JspApplicationContext.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/JspContext.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/JspEngineInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/JspException.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/JspFactory.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/JspPage.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/JspTagException.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/JspWriter.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/PageContext.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/SkipPageException.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/ELException.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/ELParseException.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/Expression.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/ExpressionEvaluator.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/FunctionMapper.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/VariableResolver.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/el/package.html (100%) rename {src => core/src}/main/java/javax/servlet/jsp/package.html (100%) rename {src => core/src}/main/java/javax/servlet/jsp/resources/jspxml.dtd (100%) rename {src => core/src}/main/java/javax/servlet/jsp/resources/jspxml.xsd (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/BodyContent.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/BodyTag.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/BodyTagSupport.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/DynamicAttributes.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/FunctionInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/IterationTag.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/JspFragment.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/JspIdConsumer.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/JspTag.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/PageData.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/SimpleTag.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/SimpleTagSupport.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/Tag.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagAdapter.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagAttributeInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagData.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagExtraInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagFileInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagLibraryValidator.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagSupport.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TagVariableInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/TryCatchFinally.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/ValidationMessage.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/VariableInfo.java (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/doc-files/BodyTagProtocol.gif (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/doc-files/IterationTagProtocol.gif (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/doc-files/TagProtocol.gif (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/doc-files/VariableInfo-1.gif (100%) rename {src => core/src}/main/java/javax/servlet/jsp/tagext/package.html (100%) rename {src => core/src}/main/java/javax/servlet/package.html (100%) rename {src => core/src}/main/java/javax/servlet/resources/XMLSchema.dtd (100%) rename {src => core/src}/main/java/javax/servlet/resources/datatypes.dtd (100%) rename {src => core/src}/main/java/javax/servlet/resources/j2ee_1_4.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/j2ee_web_services_1_1.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/j2ee_web_services_client_1_1.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_5.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_6.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_7.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_8.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_web_services_1_2.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_web_services_1_3.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_web_services_client_1_2.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_web_services_client_1_3.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/jsp_2_0.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/jsp_2_1.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/jsp_2_2.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/jsp_2_3.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-app_2_2.dtd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-app_2_3.dtd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-app_2_4.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-app_2_5.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-app_3_0.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-app_3_1.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-app_4_0.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-common_3_0.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-common_3_1.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-common_4_0.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-fragment_3_0.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-fragment_3_1.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-fragment_4_0.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-jsptaglibrary_1_1.dtd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-jsptaglibrary_1_2.dtd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-jsptaglibrary_2_0.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/web-jsptaglibrary_2_1.xsd (100%) rename {src => core/src}/main/java/javax/servlet/resources/xml.xsd (100%) rename {src => core/src}/main/java/javax/websocket/ClientEndpoint.java (100%) rename {src => core/src}/main/java/javax/websocket/ClientEndpointConfig.java (100%) rename {src => core/src}/main/java/javax/websocket/CloseReason.java (100%) rename {src => core/src}/main/java/javax/websocket/ContainerProvider.java (100%) rename {src => core/src}/main/java/javax/websocket/DecodeException.java (100%) rename {src => core/src}/main/java/javax/websocket/Decoder.java (100%) rename {src => core/src}/main/java/javax/websocket/DefaultClientEndpointConfig.java (100%) rename {src => core/src}/main/java/javax/websocket/DeploymentException.java (100%) rename {src => core/src}/main/java/javax/websocket/EncodeException.java (100%) rename {src => core/src}/main/java/javax/websocket/Encoder.java (100%) rename {src => core/src}/main/java/javax/websocket/Endpoint.java (100%) rename {src => core/src}/main/java/javax/websocket/EndpointConfig.java (100%) rename {src => core/src}/main/java/javax/websocket/Extension.java (100%) rename {src => core/src}/main/java/javax/websocket/HandshakeResponse.java (100%) rename {src => core/src}/main/java/javax/websocket/MessageHandler.java (100%) rename {src => core/src}/main/java/javax/websocket/OnClose.java (100%) rename {src => core/src}/main/java/javax/websocket/OnError.java (100%) rename {src => core/src}/main/java/javax/websocket/OnMessage.java (100%) rename {src => core/src}/main/java/javax/websocket/OnOpen.java (100%) rename {src => core/src}/main/java/javax/websocket/PongMessage.java (100%) rename {src => core/src}/main/java/javax/websocket/RemoteEndpoint.java (100%) rename {src => core/src}/main/java/javax/websocket/SendHandler.java (100%) rename {src => core/src}/main/java/javax/websocket/SendResult.java (100%) rename {src => core/src}/main/java/javax/websocket/Session.java (100%) rename {src => core/src}/main/java/javax/websocket/SessionException.java (100%) rename {src => core/src}/main/java/javax/websocket/WebSocketContainer.java (100%) rename {src => core/src}/main/java/javax/websocket/server/DefaultServerEndpointConfig.java (100%) rename {src => core/src}/main/java/javax/websocket/server/HandshakeRequest.java (100%) rename {src => core/src}/main/java/javax/websocket/server/PathParam.java (100%) rename {src => core/src}/main/java/javax/websocket/server/ServerApplicationConfig.java (100%) rename {src => core/src}/main/java/javax/websocket/server/ServerContainer.java (100%) rename {src => core/src}/main/java/javax/websocket/server/ServerEndpoint.java (100%) rename {src => core/src}/main/java/javax/websocket/server/ServerEndpointConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/AccessLog.java (100%) rename {src => core/src}/main/java/org/apache/catalina/AsyncDispatcher.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Authenticator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Cluster.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Contained.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Container.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ContainerEvent.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ContainerListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ContainerServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Context.java (100%) rename {src => core/src}/main/java/org/apache/catalina/CredentialHandler.java (100%) rename {src => core/src}/main/java/org/apache/catalina/DistributedManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Engine.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Executor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Globals.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Group.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Host.java (100%) rename {src => core/src}/main/java/org/apache/catalina/JmxEnabled.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Lifecycle.java (100%) rename {src => core/src}/main/java/org/apache/catalina/LifecycleEvent.java (100%) rename {src => core/src}/main/java/org/apache/catalina/LifecycleException.java (100%) rename {src => core/src}/main/java/org/apache/catalina/LifecycleListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/LifecycleState.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Loader.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Manager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Pipeline.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Realm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Role.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Server.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Service.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Session.java (100%) rename {src => core/src}/main/java/org/apache/catalina/SessionEvent.java (100%) rename {src => core/src}/main/java/org/apache/catalina/SessionIdGenerator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/SessionListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Store.java (100%) rename {src => core/src}/main/java/org/apache/catalina/StoreManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ThreadBindingListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/TomcatPrincipal.java (100%) rename {src => core/src}/main/java/org/apache/catalina/TrackedWebResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/User.java (100%) rename {src => core/src}/main/java/org/apache/catalina/UserDatabase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Valve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/WebResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/WebResourceRoot.java (100%) rename {src => core/src}/main/java/org/apache/catalina/WebResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/Wrapper.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/AbstractCatalinaCommandTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/BaseRedirectorHelperTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/DeployTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/FindLeaksTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/JKStatusUpdateTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/JMXGetTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/JMXQueryTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/JMXSetTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/ListTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/ReloadTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/ResourcesTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/ServerinfoTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/SessionsTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/SslConnectorCiphersTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/StartTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/StopTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/ThreaddumpTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/UndeployTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/ValidatorTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/VminfoTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/antlib.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/catalina.tasks (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/Arg.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorCondition.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/antlib.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/jmxaccessor.tasks (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/jmx/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/ant/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/DigestAuthenticator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/FormAuthenticator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/SSLAuthenticator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/SavedRequest.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/SingleSignOn.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/SingleSignOnEntry.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/SingleSignOnListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/SingleSignOnSessionKey.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/jaspic/CallbackHandlerImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/jaspic/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/jaspic/MessageInfoImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/jaspic/SimpleAuthConfigProvider.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/authenticator/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/ClientAbortException.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/Connector.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/CoyoteAdapter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/CoyoteInputStream.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/CoyoteOutputStream.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/CoyotePrincipal.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/CoyoteReader.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/CoyoteWriter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/InputBuffer.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/OutputBuffer.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/Request.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/RequestFacade.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/Response.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/ResponseFacade.java (100%) rename {src => core/src}/main/java/org/apache/catalina/connector/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/core/AccessLogAdapter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationContext.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationContextFacade.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationDispatcher.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationFilterChain.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationFilterConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationFilterFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationFilterRegistration.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationHttpRequest.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationHttpResponse.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationMapping.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationPart.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationPushBuilder.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationRequest.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationResponse.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationServletRegistration.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ApplicationSessionCookieConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/AprLifecycleListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/AsyncContextImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/AsyncListenerWrapper.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ContainerBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/DefaultInstanceManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/core/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/core/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/core/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/core/NamingContextListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/RestrictedFilters.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/core/RestrictedListeners.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/core/RestrictedServlets.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardContext.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardContextValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardEngine.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardEngineValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardHost.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardHostValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardPipeline.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardServer.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardService.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardThreadExecutor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardWrapper.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardWrapperFacade.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/StandardWrapperValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/core/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/deploy/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/deploy/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/CorsFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/ExpiresFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/FailedRequestFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/FilterBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/RemoteAddrFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/RemoteHostFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/RemoteIpFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/RequestDumperFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/RequestFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/SetCharacterEncodingFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/filters/WebdavFixFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/CatalinaCluster.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/ClusterDeployer.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/ClusterListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/ClusterManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/ClusterMessage.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/ClusterMessageBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/ClusterRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/ClusterSession.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/ClusterValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/authenticator/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/authenticator/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/backend/CollectedInfo.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/backend/HeartbeatListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/backend/MultiCastSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/backend/Proxy.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/backend/Sender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/backend/TcpSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/context/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/context/ReplicatedContext.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/deploy/FileChangeListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/deploy/FileMessage.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/deploy/UndeployMessage.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/deploy/WarWatcher.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/BackupManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/DeltaManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/DeltaRequest.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/DeltaSession.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/SessionMessage.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/SessionMessageImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/tcp/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/tcp/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/tcp/ReplicationValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/tcp/SendMessageData.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/JdbcLeakPrevention.java (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/ParallelWebappClassLoader.java (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/ResourceEntry.java (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/WebappClassLoader.java (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/WebappLoader.java (100%) rename {src => core/src}/main/java/org/apache/catalina/loader/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/DummyProxySession.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/HTMLManagerServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/JMXProxyServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/JspHelper.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/LocalStrings_de.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/ManagerServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/StatusManagerServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/StatusTransformer.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/host/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/host/HostManagerServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/host/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/util/BaseSessionComparator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/manager/util/SessionUtils.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mapper/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mapper/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/mapper/Mapper.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mapper/MapperListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mapper/MappingData.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mapper/WrapperMappingInfo.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mapper/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/ClassNameMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/ConnectorMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/ContainerMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/ContextMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/GroupMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/MBeanDumper.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/MBeanFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/MBeanUtils.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/RoleMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/ServiceMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/UserMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/mbeans/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/CombinedRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/DataSourceRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/GenericPrincipal.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/JAASCallbackHandler.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/JAASRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/JDBCRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/JNDIRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/LockOutRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/MemoryRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/MemoryRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/MessageDigestCredentialHandler.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/NestedCredentialHandler.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/NullRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/RealmBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/SecretKeyCredentialHandler.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/UserDatabaseRealm.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/X509SubjectDnRetriever.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/X509UsernameRetriever.java (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/realm/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/security/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/security/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/security/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/security/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/security/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/security/SecurityClassLoad.java (100%) rename {src => core/src}/main/java/org/apache/catalina/security/SecurityConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/security/SecurityListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/security/SecurityUtil.java (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/CGIServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/DefaultServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/WebdavServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/servlets/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/session/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/FileStore.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/JDBCStore.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/session/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/session/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/session/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/session/ManagerBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/PersistentManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/PersistentManagerBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/StandardManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/StandardSession.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/StandardSessionFacade.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/StoreBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/TooManyActiveSessionsException.java (100%) rename {src => core/src}/main/java/org/apache/catalina/session/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/session/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/ByteArrayServletOutputStream.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/ExpressionParseTree.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/ExpressionTokenizer.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSICommand.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIConditional.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIConditionalState.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIEcho.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIExec.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIExternalResolver.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIFilter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIFlastmod.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIFsize.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIInclude.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIMediator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIPrintenv.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIProcessor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIServlet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSISet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/SSIStopProcessingException.java (100%) rename {src => core/src}/main/java/org/apache/catalina/ssi/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/Authenticators.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/Bootstrap.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/Catalina.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/CatalinaProperties.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/CertificateCreateRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/ClassLoaderFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/ConnectorCreateRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/ContextConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/ContextRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/EngineConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/EngineRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/ExpandWar.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/FailedContext.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/HomesUserDatabase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/HostConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/HostRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/LifecycleListenerRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/NamingRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/PasswdUserDatabase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/RealmRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/SafeForkJoinWorkerThreadFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/SetAllPropertiesRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/SetContextPropertiesRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/SetNextNamingRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/Tomcat.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/Tool.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/UserConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/UserDatabase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/VersionLoggerListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/WebAnnotationSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/WebappServiceLoader.java (100%) rename {src => core/src}/main/java/org/apache/catalina/startup/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/ChannelSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/ConnectorSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/CredentialHandlerSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/GlobalNamingResourcesSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/IStoreConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/IStoreFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/InterceptorSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/JarScannerSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/LoaderSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/ManagerSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/NamingResourcesSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/PersistentManagerSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/RealmSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/SenderSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StandardContextSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StandardHostSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StandardServerSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreAppender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreDescription.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreFileMover.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreLoader.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/StoreRegistry.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/WatchedResourceSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/WebResourceRootSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/WrapperLifecycleSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/WrapperListenerSF.java (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/storeconfig/server-registry.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ByteMessage.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/Channel.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ChannelException.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ChannelInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ChannelListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ChannelMessage.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ChannelReceiver.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ChannelSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ErrorHandler.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/Heartbeat.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/JmxChannel.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/ManagedChannel.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/Member.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/MembershipListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/MembershipService.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/MessageListener.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/RemoteProcessException.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/UniqueId.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/AbsoluteOrder.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/ChannelCoordinator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/ChannelInterceptorBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/ExtendedRpcCallback.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/GroupChannel.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/GroupChannelMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/InterceptorPayload.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/Response.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/RpcCallback.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/RpcChannel.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/RpcMessage.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptorMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/FragmentationInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptorMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptorMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetectorMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptorMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptorMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/group/interceptors/TwoPhaseCommitInterceptor.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/BufferPool.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/BufferPool15Impl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/ChannelData.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/DirectByteArrayOutputStream.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/ListenCallback.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/ObjectReader.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/ReplicationStream.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/io/XByteBuffer.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/jmx/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/McastService.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/McastServiceImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/McastServiceMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/MemberImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/Membership.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/StaticMember.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/membership/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/tipis/ReplicatedMapEntry.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/AbstractRxTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/AbstractSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/DataSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/MultiPointSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/PooledSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/ReceiverBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/ReplicationTransmitter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/SenderState.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/nio/NioReceiverMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSenderMBean.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/util/Arrays.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/util/ExceptionUtils.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/util/ExecutorFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/util/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/util/Logs.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/util/StringManager.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/util/TcclThreadFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/tribes/util/UUIDGenerator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/AbstractGroup.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/AbstractRole.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/AbstractUser.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/users/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/users/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/users/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/users/MemoryGroup.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/MemoryRole.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/MemoryUser.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/MemoryUserDatabase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/users/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/util/CharsetMapper.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/CharsetMapperDefault.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ConcurrentDateFormat.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ContextName.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/CustomObjectInputStream.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/DOMWriter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/Extension.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ExtensionValidator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/IOTools.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/Introspection.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/LifecycleBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/LifecycleMBeanBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/util/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/util/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/util/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ManifestResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ParameterMap.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/RequestUtil.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ServerInfo.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ServerInfo.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/util/SessionConfig.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/StandardSessionIdGenerator.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/Strftime.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/ToStringUtil.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/TomcatCSS.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/URLEncoder.java (100%) rename {src => core/src}/main/java/org/apache/catalina/util/XMLWriter.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/AccessLogValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/Constants.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/ErrorReportValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/ExtendedAccessLogValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/PersistentValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/RemoteAddrValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/RemoteHostValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/RemoteIpValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/RequestFilterValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/SSLValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/SemaphoreValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/ValveBase.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/package.html (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/rewrite/Resolver.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/rewrite/ResolverImpl.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/rewrite/RewriteCond.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/rewrite/RewriteMap.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/rewrite/Substitution.java (100%) rename {src => core/src}/main/java/org/apache/catalina/valves/rewrite/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/AbstractArchiveResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/AbstractResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/AbstractResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/Cache.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/CachedResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/ClasspathURLStreamHandler.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/DirResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/EmptyResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/EmptyResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/FileResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/FileResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/JarResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/JarResourceRoot.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/JarResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/JarWarResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/JarWarResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/StandardRoot.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/TomcatURLStreamHandlerFactory.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/TrackedInputStream.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/VirtualResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/WarResource.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/WarResourceSet.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/war/Handler.java (100%) rename {src => core/src}/main/java/org/apache/catalina/webresources/war/WarURLConnection.java (100%) rename {src => core/src}/main/java/org/apache/coyote/AbstractProcessor.java (100%) rename {src => core/src}/main/java/org/apache/coyote/AbstractProcessorLight.java (100%) rename {src => core/src}/main/java/org/apache/coyote/AbstractProtocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ActionCode.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ActionHook.java (100%) rename {src => core/src}/main/java/org/apache/coyote/Adapter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/AsyncContextCallback.java (100%) rename {src => core/src}/main/java/org/apache/coyote/AsyncStateMachine.java (100%) rename {src => core/src}/main/java/org/apache/coyote/CloseNowException.java (100%) rename {src => core/src}/main/java/org/apache/coyote/Constants.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ContainerThreadMarker.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ErrorState.java (100%) rename {src => core/src}/main/java/org/apache/coyote/InputBuffer.java (100%) rename {src => core/src}/main/java/org/apache/coyote/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/OutputBuffer.java (100%) rename {src => core/src}/main/java/org/apache/coyote/Processor.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ProtocolException.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ProtocolHandler.java (100%) rename {src => core/src}/main/java/org/apache/coyote/Request.java (100%) rename {src => core/src}/main/java/org/apache/coyote/RequestGroupInfo.java (100%) rename {src => core/src}/main/java/org/apache/coyote/RequestInfo.java (100%) rename {src => core/src}/main/java/org/apache/coyote/Response.java (100%) rename {src => core/src}/main/java/org/apache/coyote/UpgradeProtocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/UpgradeToken.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/AjpAprProtocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/AjpMessage.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/AjpNioProtocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/AjpProcessor.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/Constants.java (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/ajp/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/AbstractHttp11JsseProtocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/Constants.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/HeadersTooLargeException.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/Http11AprProtocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/Http11InputBuffer.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/Http11NioProtocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/Http11OutputBuffer.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/Http11Processor.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/InputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/OutputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/BufferedInputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/IdentityInputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/VoidInputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/upgrade/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorBase.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/AbstractStream.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/ByteUtil.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/ConnectionException.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/ConnectionSettingsLocal.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/ConnectionSettingsRemote.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Constants.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Flags.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/FrameType.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/HPackHuffman.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/HeaderSink.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Hpack.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/HpackDecoder.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/HpackEncoder.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/HpackException.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Http2Error.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Http2Exception.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Http2Parser.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Http2Protocol.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Setting.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/Stream.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/StreamException.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/StreamProcessor.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/StreamRunnable.java (100%) rename {src => core/src}/main/java/org/apache/coyote/http2/StreamStateMachine.java (100%) rename {src => core/src}/main/java/org/apache/el/ExpressionFactoryImpl.java (100%) rename {src => core/src}/main/java/org/apache/el/Messages.properties (100%) rename {src => core/src}/main/java/org/apache/el/Messages_es.properties (100%) rename {src => core/src}/main/java/org/apache/el/MethodExpressionImpl.java (100%) rename {src => core/src}/main/java/org/apache/el/MethodExpressionLiteral.java (100%) rename {src => core/src}/main/java/org/apache/el/ValueExpressionImpl.java (100%) rename {src => core/src}/main/java/org/apache/el/ValueExpressionLiteral.java (100%) rename {src => core/src}/main/java/org/apache/el/lang/ELArithmetic.java (100%) rename {src => core/src}/main/java/org/apache/el/lang/ELSupport.java (100%) rename {src => core/src}/main/java/org/apache/el/lang/EvaluationContext.java (100%) rename {src => core/src}/main/java/org/apache/el/lang/ExpressionBuilder.java (100%) rename {src => core/src}/main/java/org/apache/el/lang/FunctionMapperFactory.java (100%) rename {src => core/src}/main/java/org/apache/el/lang/FunctionMapperImpl.java (100%) rename {src => core/src}/main/java/org/apache/el/lang/VariableMapperFactory.java (100%) rename {src => core/src}/main/java/org/apache/el/lang/VariableMapperImpl.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/ArithmeticNode.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstAnd.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstAssign.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstBracketSuffix.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstChoice.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstCompositeExpression.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstConcatenation.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstDeferredExpression.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstDiv.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstDotSuffix.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstDynamicExpression.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstEmpty.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstEqual.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstFalse.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstFloatingPoint.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstFunction.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstGreaterThan.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstGreaterThanEqual.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstIdentifier.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstInteger.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstLambdaExpression.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstLambdaParameters.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstLessThan.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstLessThanEqual.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstListData.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstLiteralExpression.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstMapData.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstMapEntry.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstMethodParameters.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstMinus.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstMod.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstMult.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstNegative.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstNot.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstNotEqual.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstNull.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstOr.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstPlus.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstSemicolon.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstSetData.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstString.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstTrue.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/AstValue.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/BooleanNode.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/ELParser.html (100%) rename {src => core/src}/main/java/org/apache/el/parser/ELParser.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/ELParser.jjt (100%) rename {src => core/src}/main/java/org/apache/el/parser/ELParserConstants.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/ELParserTokenManager.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/ELParserTreeConstants.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/JJTELParserState.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/Node.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/NodeVisitor.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/ParseException.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/SimpleCharStream.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/SimpleNode.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/Token.java (100%) rename {src => core/src}/main/java/org/apache/el/parser/TokenMgrError.java (100%) rename {src => core/src}/main/java/org/apache/el/stream/Optional.java (100%) rename {src => core/src}/main/java/org/apache/el/stream/Stream.java (100%) rename {src => core/src}/main/java/org/apache/el/stream/StreamELResolverImpl.java (100%) rename {src => core/src}/main/java/org/apache/el/util/ConcurrentCache.java (100%) rename {src => core/src}/main/java/org/apache/el/util/MessageFactory.java (100%) rename {src => core/src}/main/java/org/apache/el/util/ReflectionUtil.java (100%) rename {src => core/src}/main/java/org/apache/el/util/Validation.java (100%) rename {src => core/src}/main/java/org/apache/jasper/Constants.java (100%) rename {src => core/src}/main/java/org/apache/jasper/EmbeddedServletOptions.java (100%) rename {src => core/src}/main/java/org/apache/jasper/JasperException.java (100%) rename {src => core/src}/main/java/org/apache/jasper/JspC.java (100%) rename {src => core/src}/main/java/org/apache/jasper/JspCompilationContext.java (100%) rename {src => core/src}/main/java/org/apache/jasper/Options.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/AntCompiler.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/AttributeParser.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/BeanRepository.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/Collector.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/Compiler.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/DefaultErrorHandler.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ELFunctionMapper.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ELInterpreter.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ELNode.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ELParser.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/EncodingDetector.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ErrorDispatcher.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ErrorHandler.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/Generator.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JDTCompiler.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JarScannerFactory.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JasperTagInfo.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JavacErrorDetail.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JspConfig.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JspDocumentParser.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JspReader.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JspRuntimeContext.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/JspUtil.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/Localizer.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/Mark.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/Node.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/PageDataImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/PageInfo.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/Parser.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ParserController.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ScriptingVariabler.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/ServletWriter.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/SmapGenerator.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/SmapStratum.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/SmapUtil.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/TagConstants.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/TagFileProcessor.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/TagPluginManager.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/TextOptimizer.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/TldCache.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/Validator.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/tagplugin/TagPlugin.java (100%) rename {src => core/src}/main/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/ELContextImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/ELContextWrapper.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/ELResolverImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/ExpressionEvaluatorImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/ExpressionImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/FunctionMapperImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/JasperELResolver.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/JspELException.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/JspMethodExpression.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/JspMethodNotFoundException.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/JspPropertyNotFoundException.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/JspPropertyNotWritableException.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/JspValueExpression.java (100%) rename {src => core/src}/main/java/org/apache/jasper/el/VariableResolverImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/resources/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/jasper/resources/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/jasper/resources/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/jasper/resources/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/BodyContentImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/ExceptionUtils.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/HttpJspBase.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/InstanceManagerFactory.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/JspApplicationContextImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/JspContextWrapper.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/JspFactoryImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/JspFragmentHelper.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/JspSourceDependent.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/JspSourceImports.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/JspWriterImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/PageContextImpl.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/ProtectedFunctionMapper.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/ServletResponseWrapperInclude.java (100%) rename {src => core/src}/main/java/org/apache/jasper/runtime/TagHandlerPool.java (100%) rename {src => core/src}/main/java/org/apache/jasper/security/SecurityClassLoad.java (100%) rename {src => core/src}/main/java/org/apache/jasper/security/SecurityUtil.java (100%) rename {src => core/src}/main/java/org/apache/jasper/servlet/JasperInitializer.java (100%) rename {src => core/src}/main/java/org/apache/jasper/servlet/JasperLoader.java (100%) rename {src => core/src}/main/java/org/apache/jasper/servlet/JspCServletContext.java (100%) rename {src => core/src}/main/java/org/apache/jasper/servlet/JspServlet.java (100%) rename {src => core/src}/main/java/org/apache/jasper/servlet/JspServletWrapper.java (100%) rename {src => core/src}/main/java/org/apache/jasper/servlet/TldPreScanned.java (100%) rename {src => core/src}/main/java/org/apache/jasper/servlet/TldScanner.java (100%) rename {src => core/src}/main/java/org/apache/jasper/servlet/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/Util.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Catch.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Choose.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/ForTokens.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/If.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Import.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Otherwise.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Out.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Param.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Redirect.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Remove.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Set.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/Url.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/core/When.java (100%) rename {src => core/src}/main/java/org/apache/jasper/tagplugins/jstl/tagPlugins.xml (100%) rename {src => core/src}/main/java/org/apache/jasper/util/FastRemovalDequeue.java (100%) rename {src => core/src}/main/java/org/apache/jasper/util/UniqueAttributesImpl.java (100%) rename {src => core/src}/main/java/org/apache/juli/AsyncFileHandler.java (100%) rename {src => core/src}/main/java/org/apache/juli/ClassLoaderLogManager.java (100%) rename {src => core/src}/main/java/org/apache/juli/DateFormatCache.java (100%) rename {src => core/src}/main/java/org/apache/juli/FileHandler.java (100%) rename {src => core/src}/main/java/org/apache/juli/JdkLoggerFormatter.java (100%) rename {src => core/src}/main/java/org/apache/juli/OneLineFormatter.java (100%) rename {src => core/src}/main/java/org/apache/juli/VerbatimFormatter.java (100%) rename {src => core/src}/main/java/org/apache/juli/WebappProperties.java (100%) rename {src => core/src}/main/java/org/apache/juli/logging/DirectJDKLog.java (100%) rename {src => core/src}/main/java/org/apache/juli/logging/Log.java (100%) rename {src => core/src}/main/java/org/apache/juli/logging/LogConfigurationException.java (100%) rename {src => core/src}/main/java/org/apache/juli/logging/LogFactory.java (100%) rename {src => core/src}/main/java/org/apache/juli/logging/package.html (100%) rename {src => core/src}/main/java/org/apache/naming/AbstractRef.java (100%) rename {src => core/src}/main/java/org/apache/naming/ContextAccessController.java (100%) rename {src => core/src}/main/java/org/apache/naming/ContextBindings.java (100%) rename {src => core/src}/main/java/org/apache/naming/EjbRef.java (100%) rename {src => core/src}/main/java/org/apache/naming/HandlerRef.java (100%) rename {src => core/src}/main/java/org/apache/naming/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/naming/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/naming/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/naming/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/naming/NameParserImpl.java (100%) rename {src => core/src}/main/java/org/apache/naming/NamingContext.java (100%) rename {src => core/src}/main/java/org/apache/naming/NamingContextBindingsEnumeration.java (100%) rename {src => core/src}/main/java/org/apache/naming/NamingContextEnumeration.java (100%) rename {src => core/src}/main/java/org/apache/naming/NamingEntry.java (100%) rename {src => core/src}/main/java/org/apache/naming/ResourceEnvRef.java (100%) rename {src => core/src}/main/java/org/apache/naming/ResourceLinkRef.java (100%) rename {src => core/src}/main/java/org/apache/naming/ResourceRef.java (100%) rename {src => core/src}/main/java/org/apache/naming/SelectorContext.java (100%) rename {src => core/src}/main/java/org/apache/naming/ServiceRef.java (100%) rename {src => core/src}/main/java/org/apache/naming/StringManager.java (100%) rename {src => core/src}/main/java/org/apache/naming/TransactionRef.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/BeanFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/Constants.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/DataSourceLinkFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/EjbFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/FactoryBase.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/naming/factory/MailSessionFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/OpenEjbFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/ResourceEnvFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/ResourceFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/ResourceLinkFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/SendMailFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/TransactionFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/package.html (100%) rename {src => core/src}/main/java/org/apache/naming/factory/webservices/ServiceProxy.java (100%) rename {src => core/src}/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/java/javaURLContextFactory.java (100%) rename {src => core/src}/main/java/org/apache/naming/java/package.html (100%) rename {src => core/src}/main/java/org/apache/naming/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/ContextBind.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/InstanceManager.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/InstanceManagerBindings.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/InstrumentableClassLoader.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/Jar.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/JarScanFilter.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/JarScanType.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/JarScanner.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/JarScannerCallback.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/PeriodicEventListener.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/SimpleInstanceManager.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/buildutil/CheckEol.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/buildutil/SignCode.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/buildutil/Txt2Html.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/AbandonedTrace.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceMXBean.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/ConnectionFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DataSourceConnectionFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingCallableStatement.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingConnection.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingPreparedStatement.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DriverConnectionFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/DriverManagerConnectionFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/LifetimeExceededException.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableCallableStatement.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionMXBean.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PoolablePreparedStatement.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDriver.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/SwallowedExceptionLogger.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/Utils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/ConnectionImpl.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PooledConnectionImpl.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSourceFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/KeyedCPDSConnectionFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSourceFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PoolKey.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionAndInfo.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionManager.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSourceFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/UserPassKey.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/overview.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/dbcp2/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/BaseObject.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/BaseObjectPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/KeyedPooledObjectFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectState.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/SwallowedExceptionListener.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/TrackedUse.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/UsageTracking.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultEvictionPolicy.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfo.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionPolicy.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/PoolImplUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/PooledSoftReference.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/impl/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/overview.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/dbcp/pool2/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Address.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/BIOCallback.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Buffer.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/CertificateVerifier.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Directory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Error.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/File.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/FileInfo.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Global.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Library.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/LibraryNotFoundError.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Local.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Lock.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Mmap.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Multicast.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/OS.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/PasswordCallback.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Poll.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Pool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/PoolCallback.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Proc.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/ProcErrorCallback.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Procattr.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Registry.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/SSL.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/SSLContext.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/SSLSocket.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Shm.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Sockaddr.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Socket.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Status.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Stdlib.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Thread.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/Time.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/jni/User.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/Diagnostics.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/ExceptionUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/IntrospectionUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/Const.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationElementValue.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationEntry.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/Annotations.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ArrayElementValue.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ClassElementValue.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ClassFormatException.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/Constant.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ConstantClass.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ConstantDouble.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ConstantFloat.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ConstantInteger.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ConstantLong.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ConstantPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ConstantUtf8.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ElementValue.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/ElementValuePair.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/EnumElementValue.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/SimpleElementValue.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/Utility.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/classfile/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/bcel/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/Ascii.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/B2CConverter.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/ByteBufferHolder.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/ByteBufferUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/ByteChunk.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/C2BConverter.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/CharChunk.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/HexUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/MessageBytes.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/StringCache.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/StringUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/UDecoder.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/UEncoder.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/UriUtil.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/Utf8Decoder.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/Utf8Encoder.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/buf/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/codec/binary/Base64.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/codec/binary/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/collections/CaseInsensitiveKeyMap.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/collections/ConcurrentCache.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/collections/ManagedConcurrentWeakHashMap.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/collections/SynchronizedQueue.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/collections/SynchronizedStack.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/compat/Jre9Compat.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/compat/JreCompat.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/compat/JreVendor.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/compat/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/DigesterFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/InputSourceUtil.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/XmlIdentifiers.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/TagFileXml.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/TagXml.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/TaglibXml.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/TldParser.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/ValidatorXml.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/tld/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/Injectable.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/InjectionTarget.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/JspConfigDescriptorImpl.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroup.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroupDescriptorImpl.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/MultipartDef.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/NamingResources.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/SessionConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/TaglibDescriptorImpl.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/WebXmlParser.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/XmlEncodingBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/mbeans-descriptors.xml (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/descriptor/web/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/ArrayStack.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/CallMethodRule.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/CallParamRule.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/Digester.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/DocumentProperties.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/ObjectCreationFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/Rule.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/RuleSet.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/RuleSetBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/Rules.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/RulesBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/SetNextRule.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/digester/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/file/ConfigFileLoader.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/file/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/file/Matcher.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/file/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/CookieProcessor.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/CookieProcessorBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/FastHttpDateFormat.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/LegacyCookieProcessor.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/MimeHeaders.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/Parameters.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/RequestUtil.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/ServerCookie.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/ServerCookies.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileItem.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileItemFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeaders.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeadersSupport.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileItemIterator.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileItemStream.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileUpload.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileUploadBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileUploadException.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/FileUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/IOUtils.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/InvalidFileNameException.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/ParameterParser.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/ProgressListener.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/RequestContext.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/UploadContext.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItem.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItemFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/disk/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletFileUpload.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletRequestContext.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/servlet/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/Closeable.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/FileItemHeadersImpl.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/LimitedInputStream.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/Streams.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/mime/MimeUtility.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/mime/ParseException.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/mime/QuotedPrintableDecoder.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/mime/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/fileupload/util/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/AcceptLanguage.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/Authorization.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/Cookie.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/Host.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/HttpParser.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/MediaType.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/MediaTypeCache.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/http/parser/SkipResult.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/log/CaptureLog.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/log/SystemLogHandler.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/log/UserDataHelper.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/AttributeInfo.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/BaseAttributeFilter.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/BaseModelMBean.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/BaseNotificationBroadcaster.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/FeatureInfo.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/ManagedBean.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/NotificationInfo.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/OperationInfo.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/ParameterInfo.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/Registry.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/RegistryMBean.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/Util.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/mbeans-descriptors.dtd (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsDigesterSource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/modules/ModelerSource.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/modules/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/modeler/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/AbstractEndpoint.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/Acceptor.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/AprEndpoint.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/AprSSLSupport.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/DispatchType.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/Nio2Channel.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/Nio2Endpoint.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/NioBlockingSelector.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/NioChannel.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/NioEndpoint.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/NioSelectorPool.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SSLContext.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SSLHostConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SSLImplementation.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SSLSessionManager.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SSLSupport.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SSLUtil.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SSLUtilBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SecureNio2Channel.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SecureNioChannel.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SendfileDataBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SendfileKeepAliveState.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SendfileState.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SocketBufferHandler.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SocketEvent.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SocketProcessorBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SocketProperties.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/SocketWrapperBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/JSSEKeyManager.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/JSSESSLContext.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/JSSESupport.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/JSSEUtil.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/jsse/PEMFile.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLImplementation.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLKeyManager.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLProtocols.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionContext.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionStats.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLUtil.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/OpenSSLX509Certificate.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/Authentication.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/Cipher.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/Encryption.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/EncryptionLevel.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/KeyExchange.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/MessageDigest.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/OpenSSLCipherConfigurationParser.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/net/openssl/ciphers/Protocol.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/res/StringManager.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/JarFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/JarFileUrlJar.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/NonClosingJarInputStream.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/StandardJarScanner.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/UrlJar.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/scan/package.html (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/security/ConcurrentMessageDigest.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/security/MD5Encoder.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/security/PermissionCheck.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/InlineExecutorService.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/LimitLatch.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/ResizableExecutor.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/StopPooledThreadException.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/TaskQueue.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/TaskThread.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/TaskThreadFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/res/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/res/LocalStrings_es.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/res/LocalStrings_fr.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/util/threads/res/LocalStrings_ja.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/BackgroundProcess.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/BackgroundProcessManager.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/DecoderEntry.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/MessageHandlerResult.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/MessageHandlerResultType.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/MessagePart.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/PerMessageDeflate.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/ReadBufferOverflowException.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/Transformation.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/TransformationFactory.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/TransformationResult.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/Util.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WrappedMessageHandler.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsContainerProvider.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsExtension.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsExtensionParameter.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsFrameBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsFrameClient.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsHandshakeResponse.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsIOException.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsPongMessage.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsRemoteEndpointAsync.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBasic.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsSession.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/WsWebSocketContainer.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/PojoPathParam.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/pojo/package-info.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/Constants.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/DefaultServerEndpointConfigurator.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/LocalStrings.properties (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/UpgradeUtil.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/UriTemplate.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsContextListener.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsFilter.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsFrameServer.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsMappingResult.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsPerSessionServerEndpointConfig.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsSci.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsServerContainer.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsSessionListener.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/WsWriteTimeout.java (100%) rename {src => core/src}/main/java/org/apache/tomcat/websocket/server/package-info.java (100%) create mode 100644 core/tomcat-core.iml create mode 100644 transport/pom.xml create mode 100644 transport/tomcat-transport.iml diff --git a/.gitignore b/.gitignore index 60e3fde..4c5f5f5 100755 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ /tomcat.iml *.class -target/* +*/target/* .idea/* output/logs/* output/work/* diff --git a/all/pom.xml b/all/pom.xml new file mode 100644 index 0000000..9daf039 --- /dev/null +++ b/all/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + + tomcat + org.apache + 9.0.0.M21 + + tomcat-all + tomcat-all + jar + + + + + ${project.groupId} + tomcat-core + ${project.version} + compile + + + ${project.groupId} + tomcat-transport + ${project.version} + compile + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + ${project.artifactId} + + diff --git a/all/tomcat-all.iml b/all/tomcat-all.iml new file mode 100644 index 0000000..cf42eba --- /dev/null +++ b/all/tomcat-all.iml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/pom.xml b/core/pom.xml new file mode 100644 index 0000000..14ced4b --- /dev/null +++ b/core/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + + tomcat + org.apache + 9.0.0.M21 + + tomcat-core + tomcat-core + jar + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + ${project.artifactId} + + diff --git a/src/main/java/com/mat/net/AsyncContextExample.java b/core/src/main/java/com/mat/net/AsyncContextExample.java similarity index 100% rename from src/main/java/com/mat/net/AsyncContextExample.java rename to core/src/main/java/com/mat/net/AsyncContextExample.java diff --git a/src/main/java/javax/annotation/Generated.java b/core/src/main/java/javax/annotation/Generated.java similarity index 100% rename from src/main/java/javax/annotation/Generated.java rename to core/src/main/java/javax/annotation/Generated.java diff --git a/src/main/java/javax/annotation/ManagedBean.java b/core/src/main/java/javax/annotation/ManagedBean.java similarity index 100% rename from src/main/java/javax/annotation/ManagedBean.java rename to core/src/main/java/javax/annotation/ManagedBean.java diff --git a/src/main/java/javax/annotation/PostConstruct.java b/core/src/main/java/javax/annotation/PostConstruct.java similarity index 100% rename from src/main/java/javax/annotation/PostConstruct.java rename to core/src/main/java/javax/annotation/PostConstruct.java diff --git a/src/main/java/javax/annotation/PreDestroy.java b/core/src/main/java/javax/annotation/PreDestroy.java similarity index 100% rename from src/main/java/javax/annotation/PreDestroy.java rename to core/src/main/java/javax/annotation/PreDestroy.java diff --git a/src/main/java/javax/annotation/Priority.java b/core/src/main/java/javax/annotation/Priority.java similarity index 100% rename from src/main/java/javax/annotation/Priority.java rename to core/src/main/java/javax/annotation/Priority.java diff --git a/src/main/java/javax/annotation/Resource.java b/core/src/main/java/javax/annotation/Resource.java similarity index 100% rename from src/main/java/javax/annotation/Resource.java rename to core/src/main/java/javax/annotation/Resource.java diff --git a/src/main/java/javax/annotation/Resources.java b/core/src/main/java/javax/annotation/Resources.java similarity index 100% rename from src/main/java/javax/annotation/Resources.java rename to core/src/main/java/javax/annotation/Resources.java diff --git a/src/main/java/javax/annotation/security/DeclareRoles.java b/core/src/main/java/javax/annotation/security/DeclareRoles.java similarity index 100% rename from src/main/java/javax/annotation/security/DeclareRoles.java rename to core/src/main/java/javax/annotation/security/DeclareRoles.java diff --git a/src/main/java/javax/annotation/security/DenyAll.java b/core/src/main/java/javax/annotation/security/DenyAll.java similarity index 100% rename from src/main/java/javax/annotation/security/DenyAll.java rename to core/src/main/java/javax/annotation/security/DenyAll.java diff --git a/src/main/java/javax/annotation/security/PermitAll.java b/core/src/main/java/javax/annotation/security/PermitAll.java similarity index 100% rename from src/main/java/javax/annotation/security/PermitAll.java rename to core/src/main/java/javax/annotation/security/PermitAll.java diff --git a/src/main/java/javax/annotation/security/RolesAllowed.java b/core/src/main/java/javax/annotation/security/RolesAllowed.java similarity index 100% rename from src/main/java/javax/annotation/security/RolesAllowed.java rename to core/src/main/java/javax/annotation/security/RolesAllowed.java diff --git a/src/main/java/javax/annotation/security/RunAs.java b/core/src/main/java/javax/annotation/security/RunAs.java similarity index 100% rename from src/main/java/javax/annotation/security/RunAs.java rename to core/src/main/java/javax/annotation/security/RunAs.java diff --git a/src/main/java/javax/annotation/sql/DataSourceDefinition.java b/core/src/main/java/javax/annotation/sql/DataSourceDefinition.java similarity index 100% rename from src/main/java/javax/annotation/sql/DataSourceDefinition.java rename to core/src/main/java/javax/annotation/sql/DataSourceDefinition.java diff --git a/src/main/java/javax/annotation/sql/DataSourceDefinitions.java b/core/src/main/java/javax/annotation/sql/DataSourceDefinitions.java similarity index 100% rename from src/main/java/javax/annotation/sql/DataSourceDefinitions.java rename to core/src/main/java/javax/annotation/sql/DataSourceDefinitions.java diff --git a/src/main/java/javax/ejb/EJB.java b/core/src/main/java/javax/ejb/EJB.java similarity index 100% rename from src/main/java/javax/ejb/EJB.java rename to core/src/main/java/javax/ejb/EJB.java diff --git a/src/main/java/javax/ejb/EJBs.java b/core/src/main/java/javax/ejb/EJBs.java similarity index 100% rename from src/main/java/javax/ejb/EJBs.java rename to core/src/main/java/javax/ejb/EJBs.java diff --git a/src/main/java/javax/el/ArrayELResolver.java b/core/src/main/java/javax/el/ArrayELResolver.java similarity index 100% rename from src/main/java/javax/el/ArrayELResolver.java rename to core/src/main/java/javax/el/ArrayELResolver.java diff --git a/src/main/java/javax/el/BeanELResolver.java b/core/src/main/java/javax/el/BeanELResolver.java similarity index 100% rename from src/main/java/javax/el/BeanELResolver.java rename to core/src/main/java/javax/el/BeanELResolver.java diff --git a/src/main/java/javax/el/BeanNameELResolver.java b/core/src/main/java/javax/el/BeanNameELResolver.java similarity index 100% rename from src/main/java/javax/el/BeanNameELResolver.java rename to core/src/main/java/javax/el/BeanNameELResolver.java diff --git a/src/main/java/javax/el/BeanNameResolver.java b/core/src/main/java/javax/el/BeanNameResolver.java similarity index 100% rename from src/main/java/javax/el/BeanNameResolver.java rename to core/src/main/java/javax/el/BeanNameResolver.java diff --git a/src/main/java/javax/el/CompositeELResolver.java b/core/src/main/java/javax/el/CompositeELResolver.java similarity index 100% rename from src/main/java/javax/el/CompositeELResolver.java rename to core/src/main/java/javax/el/CompositeELResolver.java diff --git a/src/main/java/javax/el/ELClass.java b/core/src/main/java/javax/el/ELClass.java similarity index 100% rename from src/main/java/javax/el/ELClass.java rename to core/src/main/java/javax/el/ELClass.java diff --git a/src/main/java/javax/el/ELContext.java b/core/src/main/java/javax/el/ELContext.java similarity index 100% rename from src/main/java/javax/el/ELContext.java rename to core/src/main/java/javax/el/ELContext.java diff --git a/src/main/java/javax/el/ELContextEvent.java b/core/src/main/java/javax/el/ELContextEvent.java similarity index 100% rename from src/main/java/javax/el/ELContextEvent.java rename to core/src/main/java/javax/el/ELContextEvent.java diff --git a/src/main/java/javax/el/ELContextListener.java b/core/src/main/java/javax/el/ELContextListener.java similarity index 100% rename from src/main/java/javax/el/ELContextListener.java rename to core/src/main/java/javax/el/ELContextListener.java diff --git a/src/main/java/javax/el/ELException.java b/core/src/main/java/javax/el/ELException.java similarity index 100% rename from src/main/java/javax/el/ELException.java rename to core/src/main/java/javax/el/ELException.java diff --git a/src/main/java/javax/el/ELManager.java b/core/src/main/java/javax/el/ELManager.java similarity index 100% rename from src/main/java/javax/el/ELManager.java rename to core/src/main/java/javax/el/ELManager.java diff --git a/src/main/java/javax/el/ELProcessor.java b/core/src/main/java/javax/el/ELProcessor.java similarity index 100% rename from src/main/java/javax/el/ELProcessor.java rename to core/src/main/java/javax/el/ELProcessor.java diff --git a/src/main/java/javax/el/ELResolver.java b/core/src/main/java/javax/el/ELResolver.java similarity index 100% rename from src/main/java/javax/el/ELResolver.java rename to core/src/main/java/javax/el/ELResolver.java diff --git a/src/main/java/javax/el/EvaluationListener.java b/core/src/main/java/javax/el/EvaluationListener.java similarity index 100% rename from src/main/java/javax/el/EvaluationListener.java rename to core/src/main/java/javax/el/EvaluationListener.java diff --git a/src/main/java/javax/el/Expression.java b/core/src/main/java/javax/el/Expression.java similarity index 100% rename from src/main/java/javax/el/Expression.java rename to core/src/main/java/javax/el/Expression.java diff --git a/src/main/java/javax/el/ExpressionFactory.java b/core/src/main/java/javax/el/ExpressionFactory.java similarity index 100% rename from src/main/java/javax/el/ExpressionFactory.java rename to core/src/main/java/javax/el/ExpressionFactory.java diff --git a/src/main/java/javax/el/FunctionMapper.java b/core/src/main/java/javax/el/FunctionMapper.java similarity index 100% rename from src/main/java/javax/el/FunctionMapper.java rename to core/src/main/java/javax/el/FunctionMapper.java diff --git a/src/main/java/javax/el/ImportHandler.java b/core/src/main/java/javax/el/ImportHandler.java similarity index 100% rename from src/main/java/javax/el/ImportHandler.java rename to core/src/main/java/javax/el/ImportHandler.java diff --git a/src/main/java/javax/el/LambdaExpression.java b/core/src/main/java/javax/el/LambdaExpression.java similarity index 100% rename from src/main/java/javax/el/LambdaExpression.java rename to core/src/main/java/javax/el/LambdaExpression.java diff --git a/src/main/java/javax/el/ListELResolver.java b/core/src/main/java/javax/el/ListELResolver.java similarity index 100% rename from src/main/java/javax/el/ListELResolver.java rename to core/src/main/java/javax/el/ListELResolver.java diff --git a/src/main/java/javax/el/LocalStrings.properties b/core/src/main/java/javax/el/LocalStrings.properties similarity index 100% rename from src/main/java/javax/el/LocalStrings.properties rename to core/src/main/java/javax/el/LocalStrings.properties diff --git a/src/main/java/javax/el/LocalStrings_es.properties b/core/src/main/java/javax/el/LocalStrings_es.properties similarity index 100% rename from src/main/java/javax/el/LocalStrings_es.properties rename to core/src/main/java/javax/el/LocalStrings_es.properties diff --git a/src/main/java/javax/el/MapELResolver.java b/core/src/main/java/javax/el/MapELResolver.java similarity index 100% rename from src/main/java/javax/el/MapELResolver.java rename to core/src/main/java/javax/el/MapELResolver.java diff --git a/src/main/java/javax/el/MethodExpression.java b/core/src/main/java/javax/el/MethodExpression.java similarity index 100% rename from src/main/java/javax/el/MethodExpression.java rename to core/src/main/java/javax/el/MethodExpression.java diff --git a/src/main/java/javax/el/MethodInfo.java b/core/src/main/java/javax/el/MethodInfo.java similarity index 100% rename from src/main/java/javax/el/MethodInfo.java rename to core/src/main/java/javax/el/MethodInfo.java diff --git a/src/main/java/javax/el/MethodNotFoundException.java b/core/src/main/java/javax/el/MethodNotFoundException.java similarity index 100% rename from src/main/java/javax/el/MethodNotFoundException.java rename to core/src/main/java/javax/el/MethodNotFoundException.java diff --git a/src/main/java/javax/el/PropertyNotFoundException.java b/core/src/main/java/javax/el/PropertyNotFoundException.java similarity index 100% rename from src/main/java/javax/el/PropertyNotFoundException.java rename to core/src/main/java/javax/el/PropertyNotFoundException.java diff --git a/src/main/java/javax/el/PropertyNotWritableException.java b/core/src/main/java/javax/el/PropertyNotWritableException.java similarity index 100% rename from src/main/java/javax/el/PropertyNotWritableException.java rename to core/src/main/java/javax/el/PropertyNotWritableException.java diff --git a/src/main/java/javax/el/ResourceBundleELResolver.java b/core/src/main/java/javax/el/ResourceBundleELResolver.java similarity index 100% rename from src/main/java/javax/el/ResourceBundleELResolver.java rename to core/src/main/java/javax/el/ResourceBundleELResolver.java diff --git a/src/main/java/javax/el/StandardELContext.java b/core/src/main/java/javax/el/StandardELContext.java similarity index 100% rename from src/main/java/javax/el/StandardELContext.java rename to core/src/main/java/javax/el/StandardELContext.java diff --git a/src/main/java/javax/el/StaticFieldELResolver.java b/core/src/main/java/javax/el/StaticFieldELResolver.java similarity index 100% rename from src/main/java/javax/el/StaticFieldELResolver.java rename to core/src/main/java/javax/el/StaticFieldELResolver.java diff --git a/src/main/java/javax/el/TypeConverter.java b/core/src/main/java/javax/el/TypeConverter.java similarity index 100% rename from src/main/java/javax/el/TypeConverter.java rename to core/src/main/java/javax/el/TypeConverter.java diff --git a/src/main/java/javax/el/Util.java b/core/src/main/java/javax/el/Util.java similarity index 100% rename from src/main/java/javax/el/Util.java rename to core/src/main/java/javax/el/Util.java diff --git a/src/main/java/javax/el/ValueExpression.java b/core/src/main/java/javax/el/ValueExpression.java similarity index 100% rename from src/main/java/javax/el/ValueExpression.java rename to core/src/main/java/javax/el/ValueExpression.java diff --git a/src/main/java/javax/el/ValueReference.java b/core/src/main/java/javax/el/ValueReference.java similarity index 100% rename from src/main/java/javax/el/ValueReference.java rename to core/src/main/java/javax/el/ValueReference.java diff --git a/src/main/java/javax/el/VariableMapper.java b/core/src/main/java/javax/el/VariableMapper.java similarity index 100% rename from src/main/java/javax/el/VariableMapper.java rename to core/src/main/java/javax/el/VariableMapper.java diff --git a/src/main/java/javax/mail/Authenticator.java b/core/src/main/java/javax/mail/Authenticator.java similarity index 100% rename from src/main/java/javax/mail/Authenticator.java rename to core/src/main/java/javax/mail/Authenticator.java diff --git a/src/main/java/javax/mail/PasswordAuthentication.java b/core/src/main/java/javax/mail/PasswordAuthentication.java similarity index 100% rename from src/main/java/javax/mail/PasswordAuthentication.java rename to core/src/main/java/javax/mail/PasswordAuthentication.java diff --git a/src/main/java/javax/mail/Session.java b/core/src/main/java/javax/mail/Session.java similarity index 100% rename from src/main/java/javax/mail/Session.java rename to core/src/main/java/javax/mail/Session.java diff --git a/src/main/java/javax/mail/internet/InternetAddress.java b/core/src/main/java/javax/mail/internet/InternetAddress.java similarity index 100% rename from src/main/java/javax/mail/internet/InternetAddress.java rename to core/src/main/java/javax/mail/internet/InternetAddress.java diff --git a/src/main/java/javax/mail/internet/MimeMessage.java b/core/src/main/java/javax/mail/internet/MimeMessage.java similarity index 100% rename from src/main/java/javax/mail/internet/MimeMessage.java rename to core/src/main/java/javax/mail/internet/MimeMessage.java diff --git a/src/main/java/javax/mail/internet/MimePart.java b/core/src/main/java/javax/mail/internet/MimePart.java similarity index 100% rename from src/main/java/javax/mail/internet/MimePart.java rename to core/src/main/java/javax/mail/internet/MimePart.java diff --git a/src/main/java/javax/mail/internet/MimePartDataSource.java b/core/src/main/java/javax/mail/internet/MimePartDataSource.java similarity index 100% rename from src/main/java/javax/mail/internet/MimePartDataSource.java rename to core/src/main/java/javax/mail/internet/MimePartDataSource.java diff --git a/src/main/java/javax/persistence/PersistenceContext.java b/core/src/main/java/javax/persistence/PersistenceContext.java similarity index 100% rename from src/main/java/javax/persistence/PersistenceContext.java rename to core/src/main/java/javax/persistence/PersistenceContext.java diff --git a/src/main/java/javax/persistence/PersistenceContextType.java b/core/src/main/java/javax/persistence/PersistenceContextType.java similarity index 100% rename from src/main/java/javax/persistence/PersistenceContextType.java rename to core/src/main/java/javax/persistence/PersistenceContextType.java diff --git a/src/main/java/javax/persistence/PersistenceContexts.java b/core/src/main/java/javax/persistence/PersistenceContexts.java similarity index 100% rename from src/main/java/javax/persistence/PersistenceContexts.java rename to core/src/main/java/javax/persistence/PersistenceContexts.java diff --git a/src/main/java/javax/persistence/PersistenceProperty.java b/core/src/main/java/javax/persistence/PersistenceProperty.java similarity index 100% rename from src/main/java/javax/persistence/PersistenceProperty.java rename to core/src/main/java/javax/persistence/PersistenceProperty.java diff --git a/src/main/java/javax/persistence/PersistenceUnit.java b/core/src/main/java/javax/persistence/PersistenceUnit.java similarity index 100% rename from src/main/java/javax/persistence/PersistenceUnit.java rename to core/src/main/java/javax/persistence/PersistenceUnit.java diff --git a/src/main/java/javax/persistence/PersistenceUnits.java b/core/src/main/java/javax/persistence/PersistenceUnits.java similarity index 100% rename from src/main/java/javax/persistence/PersistenceUnits.java rename to core/src/main/java/javax/persistence/PersistenceUnits.java diff --git a/src/main/java/javax/persistence/SynchronizationType.java b/core/src/main/java/javax/persistence/SynchronizationType.java similarity index 100% rename from src/main/java/javax/persistence/SynchronizationType.java rename to core/src/main/java/javax/persistence/SynchronizationType.java diff --git a/src/main/java/javax/security/auth/message/AuthException.java b/core/src/main/java/javax/security/auth/message/AuthException.java similarity index 100% rename from src/main/java/javax/security/auth/message/AuthException.java rename to core/src/main/java/javax/security/auth/message/AuthException.java diff --git a/src/main/java/javax/security/auth/message/AuthStatus.java b/core/src/main/java/javax/security/auth/message/AuthStatus.java similarity index 100% rename from src/main/java/javax/security/auth/message/AuthStatus.java rename to core/src/main/java/javax/security/auth/message/AuthStatus.java diff --git a/src/main/java/javax/security/auth/message/ClientAuth.java b/core/src/main/java/javax/security/auth/message/ClientAuth.java similarity index 100% rename from src/main/java/javax/security/auth/message/ClientAuth.java rename to core/src/main/java/javax/security/auth/message/ClientAuth.java diff --git a/src/main/java/javax/security/auth/message/MessageInfo.java b/core/src/main/java/javax/security/auth/message/MessageInfo.java similarity index 100% rename from src/main/java/javax/security/auth/message/MessageInfo.java rename to core/src/main/java/javax/security/auth/message/MessageInfo.java diff --git a/src/main/java/javax/security/auth/message/MessagePolicy.java b/core/src/main/java/javax/security/auth/message/MessagePolicy.java similarity index 100% rename from src/main/java/javax/security/auth/message/MessagePolicy.java rename to core/src/main/java/javax/security/auth/message/MessagePolicy.java diff --git a/src/main/java/javax/security/auth/message/ServerAuth.java b/core/src/main/java/javax/security/auth/message/ServerAuth.java similarity index 100% rename from src/main/java/javax/security/auth/message/ServerAuth.java rename to core/src/main/java/javax/security/auth/message/ServerAuth.java diff --git a/src/main/java/javax/security/auth/message/callback/CallerPrincipalCallback.java b/core/src/main/java/javax/security/auth/message/callback/CallerPrincipalCallback.java similarity index 100% rename from src/main/java/javax/security/auth/message/callback/CallerPrincipalCallback.java rename to core/src/main/java/javax/security/auth/message/callback/CallerPrincipalCallback.java diff --git a/src/main/java/javax/security/auth/message/callback/CertStoreCallback.java b/core/src/main/java/javax/security/auth/message/callback/CertStoreCallback.java similarity index 100% rename from src/main/java/javax/security/auth/message/callback/CertStoreCallback.java rename to core/src/main/java/javax/security/auth/message/callback/CertStoreCallback.java diff --git a/src/main/java/javax/security/auth/message/callback/GroupPrincipalCallback.java b/core/src/main/java/javax/security/auth/message/callback/GroupPrincipalCallback.java similarity index 100% rename from src/main/java/javax/security/auth/message/callback/GroupPrincipalCallback.java rename to core/src/main/java/javax/security/auth/message/callback/GroupPrincipalCallback.java diff --git a/src/main/java/javax/security/auth/message/callback/PasswordValidationCallback.java b/core/src/main/java/javax/security/auth/message/callback/PasswordValidationCallback.java similarity index 100% rename from src/main/java/javax/security/auth/message/callback/PasswordValidationCallback.java rename to core/src/main/java/javax/security/auth/message/callback/PasswordValidationCallback.java diff --git a/src/main/java/javax/security/auth/message/callback/PrivateKeyCallback.java b/core/src/main/java/javax/security/auth/message/callback/PrivateKeyCallback.java similarity index 100% rename from src/main/java/javax/security/auth/message/callback/PrivateKeyCallback.java rename to core/src/main/java/javax/security/auth/message/callback/PrivateKeyCallback.java diff --git a/src/main/java/javax/security/auth/message/callback/SecretKeyCallback.java b/core/src/main/java/javax/security/auth/message/callback/SecretKeyCallback.java similarity index 100% rename from src/main/java/javax/security/auth/message/callback/SecretKeyCallback.java rename to core/src/main/java/javax/security/auth/message/callback/SecretKeyCallback.java diff --git a/src/main/java/javax/security/auth/message/callback/TrustStoreCallback.java b/core/src/main/java/javax/security/auth/message/callback/TrustStoreCallback.java similarity index 100% rename from src/main/java/javax/security/auth/message/callback/TrustStoreCallback.java rename to core/src/main/java/javax/security/auth/message/callback/TrustStoreCallback.java diff --git a/src/main/java/javax/security/auth/message/config/AuthConfig.java b/core/src/main/java/javax/security/auth/message/config/AuthConfig.java similarity index 100% rename from src/main/java/javax/security/auth/message/config/AuthConfig.java rename to core/src/main/java/javax/security/auth/message/config/AuthConfig.java diff --git a/src/main/java/javax/security/auth/message/config/AuthConfigFactory.java b/core/src/main/java/javax/security/auth/message/config/AuthConfigFactory.java similarity index 100% rename from src/main/java/javax/security/auth/message/config/AuthConfigFactory.java rename to core/src/main/java/javax/security/auth/message/config/AuthConfigFactory.java diff --git a/src/main/java/javax/security/auth/message/config/AuthConfigProvider.java b/core/src/main/java/javax/security/auth/message/config/AuthConfigProvider.java similarity index 100% rename from src/main/java/javax/security/auth/message/config/AuthConfigProvider.java rename to core/src/main/java/javax/security/auth/message/config/AuthConfigProvider.java diff --git a/src/main/java/javax/security/auth/message/config/ClientAuthConfig.java b/core/src/main/java/javax/security/auth/message/config/ClientAuthConfig.java similarity index 100% rename from src/main/java/javax/security/auth/message/config/ClientAuthConfig.java rename to core/src/main/java/javax/security/auth/message/config/ClientAuthConfig.java diff --git a/src/main/java/javax/security/auth/message/config/ClientAuthContext.java b/core/src/main/java/javax/security/auth/message/config/ClientAuthContext.java similarity index 100% rename from src/main/java/javax/security/auth/message/config/ClientAuthContext.java rename to core/src/main/java/javax/security/auth/message/config/ClientAuthContext.java diff --git a/src/main/java/javax/security/auth/message/config/RegistrationListener.java b/core/src/main/java/javax/security/auth/message/config/RegistrationListener.java similarity index 100% rename from src/main/java/javax/security/auth/message/config/RegistrationListener.java rename to core/src/main/java/javax/security/auth/message/config/RegistrationListener.java diff --git a/src/main/java/javax/security/auth/message/config/ServerAuthConfig.java b/core/src/main/java/javax/security/auth/message/config/ServerAuthConfig.java similarity index 100% rename from src/main/java/javax/security/auth/message/config/ServerAuthConfig.java rename to core/src/main/java/javax/security/auth/message/config/ServerAuthConfig.java diff --git a/src/main/java/javax/security/auth/message/config/ServerAuthContext.java b/core/src/main/java/javax/security/auth/message/config/ServerAuthContext.java similarity index 100% rename from src/main/java/javax/security/auth/message/config/ServerAuthContext.java rename to core/src/main/java/javax/security/auth/message/config/ServerAuthContext.java diff --git a/src/main/java/javax/security/auth/message/module/ClientAuthModule.java b/core/src/main/java/javax/security/auth/message/module/ClientAuthModule.java similarity index 100% rename from src/main/java/javax/security/auth/message/module/ClientAuthModule.java rename to core/src/main/java/javax/security/auth/message/module/ClientAuthModule.java diff --git a/src/main/java/javax/security/auth/message/module/ServerAuthModule.java b/core/src/main/java/javax/security/auth/message/module/ServerAuthModule.java similarity index 100% rename from src/main/java/javax/security/auth/message/module/ServerAuthModule.java rename to core/src/main/java/javax/security/auth/message/module/ServerAuthModule.java diff --git a/src/main/java/javax/servlet/AsyncContext.java b/core/src/main/java/javax/servlet/AsyncContext.java similarity index 100% rename from src/main/java/javax/servlet/AsyncContext.java rename to core/src/main/java/javax/servlet/AsyncContext.java diff --git a/src/main/java/javax/servlet/AsyncEvent.java b/core/src/main/java/javax/servlet/AsyncEvent.java similarity index 100% rename from src/main/java/javax/servlet/AsyncEvent.java rename to core/src/main/java/javax/servlet/AsyncEvent.java diff --git a/src/main/java/javax/servlet/AsyncListener.java b/core/src/main/java/javax/servlet/AsyncListener.java similarity index 100% rename from src/main/java/javax/servlet/AsyncListener.java rename to core/src/main/java/javax/servlet/AsyncListener.java diff --git a/src/main/java/javax/servlet/DispatcherType.java b/core/src/main/java/javax/servlet/DispatcherType.java similarity index 100% rename from src/main/java/javax/servlet/DispatcherType.java rename to core/src/main/java/javax/servlet/DispatcherType.java diff --git a/src/main/java/javax/servlet/Filter.java b/core/src/main/java/javax/servlet/Filter.java similarity index 100% rename from src/main/java/javax/servlet/Filter.java rename to core/src/main/java/javax/servlet/Filter.java diff --git a/src/main/java/javax/servlet/FilterChain.java b/core/src/main/java/javax/servlet/FilterChain.java similarity index 100% rename from src/main/java/javax/servlet/FilterChain.java rename to core/src/main/java/javax/servlet/FilterChain.java diff --git a/src/main/java/javax/servlet/FilterConfig.java b/core/src/main/java/javax/servlet/FilterConfig.java similarity index 100% rename from src/main/java/javax/servlet/FilterConfig.java rename to core/src/main/java/javax/servlet/FilterConfig.java diff --git a/src/main/java/javax/servlet/FilterRegistration.java b/core/src/main/java/javax/servlet/FilterRegistration.java similarity index 100% rename from src/main/java/javax/servlet/FilterRegistration.java rename to core/src/main/java/javax/servlet/FilterRegistration.java diff --git a/src/main/java/javax/servlet/GenericFilter.java b/core/src/main/java/javax/servlet/GenericFilter.java similarity index 100% rename from src/main/java/javax/servlet/GenericFilter.java rename to core/src/main/java/javax/servlet/GenericFilter.java diff --git a/src/main/java/javax/servlet/GenericServlet.java b/core/src/main/java/javax/servlet/GenericServlet.java similarity index 100% rename from src/main/java/javax/servlet/GenericServlet.java rename to core/src/main/java/javax/servlet/GenericServlet.java diff --git a/src/main/java/javax/servlet/HttpConstraintElement.java b/core/src/main/java/javax/servlet/HttpConstraintElement.java similarity index 100% rename from src/main/java/javax/servlet/HttpConstraintElement.java rename to core/src/main/java/javax/servlet/HttpConstraintElement.java diff --git a/src/main/java/javax/servlet/HttpMethodConstraintElement.java b/core/src/main/java/javax/servlet/HttpMethodConstraintElement.java similarity index 100% rename from src/main/java/javax/servlet/HttpMethodConstraintElement.java rename to core/src/main/java/javax/servlet/HttpMethodConstraintElement.java diff --git a/src/main/java/javax/servlet/LocalStrings.properties b/core/src/main/java/javax/servlet/LocalStrings.properties similarity index 100% rename from src/main/java/javax/servlet/LocalStrings.properties rename to core/src/main/java/javax/servlet/LocalStrings.properties diff --git a/src/main/java/javax/servlet/LocalStrings_es.properties b/core/src/main/java/javax/servlet/LocalStrings_es.properties similarity index 100% rename from src/main/java/javax/servlet/LocalStrings_es.properties rename to core/src/main/java/javax/servlet/LocalStrings_es.properties diff --git a/src/main/java/javax/servlet/LocalStrings_fr.properties b/core/src/main/java/javax/servlet/LocalStrings_fr.properties similarity index 100% rename from src/main/java/javax/servlet/LocalStrings_fr.properties rename to core/src/main/java/javax/servlet/LocalStrings_fr.properties diff --git a/src/main/java/javax/servlet/LocalStrings_ja.properties b/core/src/main/java/javax/servlet/LocalStrings_ja.properties similarity index 100% rename from src/main/java/javax/servlet/LocalStrings_ja.properties rename to core/src/main/java/javax/servlet/LocalStrings_ja.properties diff --git a/src/main/java/javax/servlet/MultipartConfigElement.java b/core/src/main/java/javax/servlet/MultipartConfigElement.java similarity index 100% rename from src/main/java/javax/servlet/MultipartConfigElement.java rename to core/src/main/java/javax/servlet/MultipartConfigElement.java diff --git a/src/main/java/javax/servlet/ReadListener.java b/core/src/main/java/javax/servlet/ReadListener.java similarity index 100% rename from src/main/java/javax/servlet/ReadListener.java rename to core/src/main/java/javax/servlet/ReadListener.java diff --git a/src/main/java/javax/servlet/Registration.java b/core/src/main/java/javax/servlet/Registration.java similarity index 100% rename from src/main/java/javax/servlet/Registration.java rename to core/src/main/java/javax/servlet/Registration.java diff --git a/src/main/java/javax/servlet/RequestDispatcher.java b/core/src/main/java/javax/servlet/RequestDispatcher.java similarity index 100% rename from src/main/java/javax/servlet/RequestDispatcher.java rename to core/src/main/java/javax/servlet/RequestDispatcher.java diff --git a/src/main/java/javax/servlet/Servlet.java b/core/src/main/java/javax/servlet/Servlet.java similarity index 100% rename from src/main/java/javax/servlet/Servlet.java rename to core/src/main/java/javax/servlet/Servlet.java diff --git a/src/main/java/javax/servlet/ServletConfig.java b/core/src/main/java/javax/servlet/ServletConfig.java similarity index 100% rename from src/main/java/javax/servlet/ServletConfig.java rename to core/src/main/java/javax/servlet/ServletConfig.java diff --git a/src/main/java/javax/servlet/ServletContainerInitializer.java b/core/src/main/java/javax/servlet/ServletContainerInitializer.java similarity index 100% rename from src/main/java/javax/servlet/ServletContainerInitializer.java rename to core/src/main/java/javax/servlet/ServletContainerInitializer.java diff --git a/src/main/java/javax/servlet/ServletContext.java b/core/src/main/java/javax/servlet/ServletContext.java similarity index 100% rename from src/main/java/javax/servlet/ServletContext.java rename to core/src/main/java/javax/servlet/ServletContext.java diff --git a/src/main/java/javax/servlet/ServletContextAttributeEvent.java b/core/src/main/java/javax/servlet/ServletContextAttributeEvent.java similarity index 100% rename from src/main/java/javax/servlet/ServletContextAttributeEvent.java rename to core/src/main/java/javax/servlet/ServletContextAttributeEvent.java diff --git a/src/main/java/javax/servlet/ServletContextAttributeListener.java b/core/src/main/java/javax/servlet/ServletContextAttributeListener.java similarity index 100% rename from src/main/java/javax/servlet/ServletContextAttributeListener.java rename to core/src/main/java/javax/servlet/ServletContextAttributeListener.java diff --git a/src/main/java/javax/servlet/ServletContextEvent.java b/core/src/main/java/javax/servlet/ServletContextEvent.java similarity index 100% rename from src/main/java/javax/servlet/ServletContextEvent.java rename to core/src/main/java/javax/servlet/ServletContextEvent.java diff --git a/src/main/java/javax/servlet/ServletContextListener.java b/core/src/main/java/javax/servlet/ServletContextListener.java similarity index 100% rename from src/main/java/javax/servlet/ServletContextListener.java rename to core/src/main/java/javax/servlet/ServletContextListener.java diff --git a/src/main/java/javax/servlet/ServletException.java b/core/src/main/java/javax/servlet/ServletException.java similarity index 100% rename from src/main/java/javax/servlet/ServletException.java rename to core/src/main/java/javax/servlet/ServletException.java diff --git a/src/main/java/javax/servlet/ServletInputStream.java b/core/src/main/java/javax/servlet/ServletInputStream.java similarity index 100% rename from src/main/java/javax/servlet/ServletInputStream.java rename to core/src/main/java/javax/servlet/ServletInputStream.java diff --git a/src/main/java/javax/servlet/ServletOutputStream.java b/core/src/main/java/javax/servlet/ServletOutputStream.java similarity index 100% rename from src/main/java/javax/servlet/ServletOutputStream.java rename to core/src/main/java/javax/servlet/ServletOutputStream.java diff --git a/src/main/java/javax/servlet/ServletRegistration.java b/core/src/main/java/javax/servlet/ServletRegistration.java similarity index 100% rename from src/main/java/javax/servlet/ServletRegistration.java rename to core/src/main/java/javax/servlet/ServletRegistration.java diff --git a/src/main/java/javax/servlet/ServletRequest.java b/core/src/main/java/javax/servlet/ServletRequest.java similarity index 100% rename from src/main/java/javax/servlet/ServletRequest.java rename to core/src/main/java/javax/servlet/ServletRequest.java diff --git a/src/main/java/javax/servlet/ServletRequestAttributeEvent.java b/core/src/main/java/javax/servlet/ServletRequestAttributeEvent.java similarity index 100% rename from src/main/java/javax/servlet/ServletRequestAttributeEvent.java rename to core/src/main/java/javax/servlet/ServletRequestAttributeEvent.java diff --git a/src/main/java/javax/servlet/ServletRequestAttributeListener.java b/core/src/main/java/javax/servlet/ServletRequestAttributeListener.java similarity index 100% rename from src/main/java/javax/servlet/ServletRequestAttributeListener.java rename to core/src/main/java/javax/servlet/ServletRequestAttributeListener.java diff --git a/src/main/java/javax/servlet/ServletRequestEvent.java b/core/src/main/java/javax/servlet/ServletRequestEvent.java similarity index 100% rename from src/main/java/javax/servlet/ServletRequestEvent.java rename to core/src/main/java/javax/servlet/ServletRequestEvent.java diff --git a/src/main/java/javax/servlet/ServletRequestListener.java b/core/src/main/java/javax/servlet/ServletRequestListener.java similarity index 100% rename from src/main/java/javax/servlet/ServletRequestListener.java rename to core/src/main/java/javax/servlet/ServletRequestListener.java diff --git a/src/main/java/javax/servlet/ServletRequestWrapper.java b/core/src/main/java/javax/servlet/ServletRequestWrapper.java similarity index 100% rename from src/main/java/javax/servlet/ServletRequestWrapper.java rename to core/src/main/java/javax/servlet/ServletRequestWrapper.java diff --git a/src/main/java/javax/servlet/ServletResponse.java b/core/src/main/java/javax/servlet/ServletResponse.java similarity index 100% rename from src/main/java/javax/servlet/ServletResponse.java rename to core/src/main/java/javax/servlet/ServletResponse.java diff --git a/src/main/java/javax/servlet/ServletResponseWrapper.java b/core/src/main/java/javax/servlet/ServletResponseWrapper.java similarity index 100% rename from src/main/java/javax/servlet/ServletResponseWrapper.java rename to core/src/main/java/javax/servlet/ServletResponseWrapper.java diff --git a/src/main/java/javax/servlet/ServletSecurityElement.java b/core/src/main/java/javax/servlet/ServletSecurityElement.java similarity index 100% rename from src/main/java/javax/servlet/ServletSecurityElement.java rename to core/src/main/java/javax/servlet/ServletSecurityElement.java diff --git a/src/main/java/javax/servlet/SessionCookieConfig.java b/core/src/main/java/javax/servlet/SessionCookieConfig.java similarity index 100% rename from src/main/java/javax/servlet/SessionCookieConfig.java rename to core/src/main/java/javax/servlet/SessionCookieConfig.java diff --git a/src/main/java/javax/servlet/SessionTrackingMode.java b/core/src/main/java/javax/servlet/SessionTrackingMode.java similarity index 100% rename from src/main/java/javax/servlet/SessionTrackingMode.java rename to core/src/main/java/javax/servlet/SessionTrackingMode.java diff --git a/src/main/java/javax/servlet/SingleThreadModel.java b/core/src/main/java/javax/servlet/SingleThreadModel.java similarity index 100% rename from src/main/java/javax/servlet/SingleThreadModel.java rename to core/src/main/java/javax/servlet/SingleThreadModel.java diff --git a/src/main/java/javax/servlet/UnavailableException.java b/core/src/main/java/javax/servlet/UnavailableException.java similarity index 100% rename from src/main/java/javax/servlet/UnavailableException.java rename to core/src/main/java/javax/servlet/UnavailableException.java diff --git a/src/main/java/javax/servlet/WriteListener.java b/core/src/main/java/javax/servlet/WriteListener.java similarity index 100% rename from src/main/java/javax/servlet/WriteListener.java rename to core/src/main/java/javax/servlet/WriteListener.java diff --git a/src/main/java/javax/servlet/annotation/HandlesTypes.java b/core/src/main/java/javax/servlet/annotation/HandlesTypes.java similarity index 100% rename from src/main/java/javax/servlet/annotation/HandlesTypes.java rename to core/src/main/java/javax/servlet/annotation/HandlesTypes.java diff --git a/src/main/java/javax/servlet/annotation/HttpConstraint.java b/core/src/main/java/javax/servlet/annotation/HttpConstraint.java similarity index 100% rename from src/main/java/javax/servlet/annotation/HttpConstraint.java rename to core/src/main/java/javax/servlet/annotation/HttpConstraint.java diff --git a/src/main/java/javax/servlet/annotation/HttpMethodConstraint.java b/core/src/main/java/javax/servlet/annotation/HttpMethodConstraint.java similarity index 100% rename from src/main/java/javax/servlet/annotation/HttpMethodConstraint.java rename to core/src/main/java/javax/servlet/annotation/HttpMethodConstraint.java diff --git a/src/main/java/javax/servlet/annotation/MultipartConfig.java b/core/src/main/java/javax/servlet/annotation/MultipartConfig.java similarity index 100% rename from src/main/java/javax/servlet/annotation/MultipartConfig.java rename to core/src/main/java/javax/servlet/annotation/MultipartConfig.java diff --git a/src/main/java/javax/servlet/annotation/ServletSecurity.java b/core/src/main/java/javax/servlet/annotation/ServletSecurity.java similarity index 100% rename from src/main/java/javax/servlet/annotation/ServletSecurity.java rename to core/src/main/java/javax/servlet/annotation/ServletSecurity.java diff --git a/src/main/java/javax/servlet/annotation/WebFilter.java b/core/src/main/java/javax/servlet/annotation/WebFilter.java similarity index 100% rename from src/main/java/javax/servlet/annotation/WebFilter.java rename to core/src/main/java/javax/servlet/annotation/WebFilter.java diff --git a/src/main/java/javax/servlet/annotation/WebInitParam.java b/core/src/main/java/javax/servlet/annotation/WebInitParam.java similarity index 100% rename from src/main/java/javax/servlet/annotation/WebInitParam.java rename to core/src/main/java/javax/servlet/annotation/WebInitParam.java diff --git a/src/main/java/javax/servlet/annotation/WebListener.java b/core/src/main/java/javax/servlet/annotation/WebListener.java similarity index 100% rename from src/main/java/javax/servlet/annotation/WebListener.java rename to core/src/main/java/javax/servlet/annotation/WebListener.java diff --git a/src/main/java/javax/servlet/annotation/WebServlet.java b/core/src/main/java/javax/servlet/annotation/WebServlet.java similarity index 100% rename from src/main/java/javax/servlet/annotation/WebServlet.java rename to core/src/main/java/javax/servlet/annotation/WebServlet.java diff --git a/src/main/java/javax/servlet/descriptor/JspConfigDescriptor.java b/core/src/main/java/javax/servlet/descriptor/JspConfigDescriptor.java similarity index 100% rename from src/main/java/javax/servlet/descriptor/JspConfigDescriptor.java rename to core/src/main/java/javax/servlet/descriptor/JspConfigDescriptor.java diff --git a/src/main/java/javax/servlet/descriptor/JspPropertyGroupDescriptor.java b/core/src/main/java/javax/servlet/descriptor/JspPropertyGroupDescriptor.java similarity index 100% rename from src/main/java/javax/servlet/descriptor/JspPropertyGroupDescriptor.java rename to core/src/main/java/javax/servlet/descriptor/JspPropertyGroupDescriptor.java diff --git a/src/main/java/javax/servlet/descriptor/TaglibDescriptor.java b/core/src/main/java/javax/servlet/descriptor/TaglibDescriptor.java similarity index 100% rename from src/main/java/javax/servlet/descriptor/TaglibDescriptor.java rename to core/src/main/java/javax/servlet/descriptor/TaglibDescriptor.java diff --git a/src/main/java/javax/servlet/http/Cookie.java b/core/src/main/java/javax/servlet/http/Cookie.java similarity index 100% rename from src/main/java/javax/servlet/http/Cookie.java rename to core/src/main/java/javax/servlet/http/Cookie.java diff --git a/src/main/java/javax/servlet/http/HttpFilter.java b/core/src/main/java/javax/servlet/http/HttpFilter.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpFilter.java rename to core/src/main/java/javax/servlet/http/HttpFilter.java diff --git a/src/main/java/javax/servlet/http/HttpServlet.java b/core/src/main/java/javax/servlet/http/HttpServlet.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpServlet.java rename to core/src/main/java/javax/servlet/http/HttpServlet.java diff --git a/src/main/java/javax/servlet/http/HttpServletRequest.java b/core/src/main/java/javax/servlet/http/HttpServletRequest.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpServletRequest.java rename to core/src/main/java/javax/servlet/http/HttpServletRequest.java diff --git a/src/main/java/javax/servlet/http/HttpServletRequestWrapper.java b/core/src/main/java/javax/servlet/http/HttpServletRequestWrapper.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpServletRequestWrapper.java rename to core/src/main/java/javax/servlet/http/HttpServletRequestWrapper.java diff --git a/src/main/java/javax/servlet/http/HttpServletResponse.java b/core/src/main/java/javax/servlet/http/HttpServletResponse.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpServletResponse.java rename to core/src/main/java/javax/servlet/http/HttpServletResponse.java diff --git a/src/main/java/javax/servlet/http/HttpServletResponseWrapper.java b/core/src/main/java/javax/servlet/http/HttpServletResponseWrapper.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpServletResponseWrapper.java rename to core/src/main/java/javax/servlet/http/HttpServletResponseWrapper.java diff --git a/src/main/java/javax/servlet/http/HttpSession.java b/core/src/main/java/javax/servlet/http/HttpSession.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSession.java rename to core/src/main/java/javax/servlet/http/HttpSession.java diff --git a/src/main/java/javax/servlet/http/HttpSessionActivationListener.java b/core/src/main/java/javax/servlet/http/HttpSessionActivationListener.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSessionActivationListener.java rename to core/src/main/java/javax/servlet/http/HttpSessionActivationListener.java diff --git a/src/main/java/javax/servlet/http/HttpSessionAttributeListener.java b/core/src/main/java/javax/servlet/http/HttpSessionAttributeListener.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSessionAttributeListener.java rename to core/src/main/java/javax/servlet/http/HttpSessionAttributeListener.java diff --git a/src/main/java/javax/servlet/http/HttpSessionBindingEvent.java b/core/src/main/java/javax/servlet/http/HttpSessionBindingEvent.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSessionBindingEvent.java rename to core/src/main/java/javax/servlet/http/HttpSessionBindingEvent.java diff --git a/src/main/java/javax/servlet/http/HttpSessionBindingListener.java b/core/src/main/java/javax/servlet/http/HttpSessionBindingListener.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSessionBindingListener.java rename to core/src/main/java/javax/servlet/http/HttpSessionBindingListener.java diff --git a/src/main/java/javax/servlet/http/HttpSessionContext.java b/core/src/main/java/javax/servlet/http/HttpSessionContext.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSessionContext.java rename to core/src/main/java/javax/servlet/http/HttpSessionContext.java diff --git a/src/main/java/javax/servlet/http/HttpSessionEvent.java b/core/src/main/java/javax/servlet/http/HttpSessionEvent.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSessionEvent.java rename to core/src/main/java/javax/servlet/http/HttpSessionEvent.java diff --git a/src/main/java/javax/servlet/http/HttpSessionIdListener.java b/core/src/main/java/javax/servlet/http/HttpSessionIdListener.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSessionIdListener.java rename to core/src/main/java/javax/servlet/http/HttpSessionIdListener.java diff --git a/src/main/java/javax/servlet/http/HttpSessionListener.java b/core/src/main/java/javax/servlet/http/HttpSessionListener.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpSessionListener.java rename to core/src/main/java/javax/servlet/http/HttpSessionListener.java diff --git a/src/main/java/javax/servlet/http/HttpUpgradeHandler.java b/core/src/main/java/javax/servlet/http/HttpUpgradeHandler.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpUpgradeHandler.java rename to core/src/main/java/javax/servlet/http/HttpUpgradeHandler.java diff --git a/src/main/java/javax/servlet/http/HttpUtils.java b/core/src/main/java/javax/servlet/http/HttpUtils.java similarity index 100% rename from src/main/java/javax/servlet/http/HttpUtils.java rename to core/src/main/java/javax/servlet/http/HttpUtils.java diff --git a/src/main/java/javax/servlet/http/LocalStrings.properties b/core/src/main/java/javax/servlet/http/LocalStrings.properties similarity index 100% rename from src/main/java/javax/servlet/http/LocalStrings.properties rename to core/src/main/java/javax/servlet/http/LocalStrings.properties diff --git a/src/main/java/javax/servlet/http/LocalStrings_es.properties b/core/src/main/java/javax/servlet/http/LocalStrings_es.properties similarity index 100% rename from src/main/java/javax/servlet/http/LocalStrings_es.properties rename to core/src/main/java/javax/servlet/http/LocalStrings_es.properties diff --git a/src/main/java/javax/servlet/http/LocalStrings_fr.properties b/core/src/main/java/javax/servlet/http/LocalStrings_fr.properties similarity index 100% rename from src/main/java/javax/servlet/http/LocalStrings_fr.properties rename to core/src/main/java/javax/servlet/http/LocalStrings_fr.properties diff --git a/src/main/java/javax/servlet/http/LocalStrings_ja.properties b/core/src/main/java/javax/servlet/http/LocalStrings_ja.properties similarity index 100% rename from src/main/java/javax/servlet/http/LocalStrings_ja.properties rename to core/src/main/java/javax/servlet/http/LocalStrings_ja.properties diff --git a/src/main/java/javax/servlet/http/MappingMatch.java b/core/src/main/java/javax/servlet/http/MappingMatch.java similarity index 100% rename from src/main/java/javax/servlet/http/MappingMatch.java rename to core/src/main/java/javax/servlet/http/MappingMatch.java diff --git a/src/main/java/javax/servlet/http/Part.java b/core/src/main/java/javax/servlet/http/Part.java similarity index 100% rename from src/main/java/javax/servlet/http/Part.java rename to core/src/main/java/javax/servlet/http/Part.java diff --git a/src/main/java/javax/servlet/http/PushBuilder.java b/core/src/main/java/javax/servlet/http/PushBuilder.java similarity index 100% rename from src/main/java/javax/servlet/http/PushBuilder.java rename to core/src/main/java/javax/servlet/http/PushBuilder.java diff --git a/src/main/java/javax/servlet/http/ServletMapping.java b/core/src/main/java/javax/servlet/http/ServletMapping.java similarity index 100% rename from src/main/java/javax/servlet/http/ServletMapping.java rename to core/src/main/java/javax/servlet/http/ServletMapping.java diff --git a/src/main/java/javax/servlet/http/WebConnection.java b/core/src/main/java/javax/servlet/http/WebConnection.java similarity index 100% rename from src/main/java/javax/servlet/http/WebConnection.java rename to core/src/main/java/javax/servlet/http/WebConnection.java diff --git a/src/main/java/javax/servlet/http/package.html b/core/src/main/java/javax/servlet/http/package.html similarity index 100% rename from src/main/java/javax/servlet/http/package.html rename to core/src/main/java/javax/servlet/http/package.html diff --git a/src/main/java/javax/servlet/jsp/ErrorData.java b/core/src/main/java/javax/servlet/jsp/ErrorData.java similarity index 100% rename from src/main/java/javax/servlet/jsp/ErrorData.java rename to core/src/main/java/javax/servlet/jsp/ErrorData.java diff --git a/src/main/java/javax/servlet/jsp/HttpJspPage.java b/core/src/main/java/javax/servlet/jsp/HttpJspPage.java similarity index 100% rename from src/main/java/javax/servlet/jsp/HttpJspPage.java rename to core/src/main/java/javax/servlet/jsp/HttpJspPage.java diff --git a/src/main/java/javax/servlet/jsp/JspApplicationContext.java b/core/src/main/java/javax/servlet/jsp/JspApplicationContext.java similarity index 100% rename from src/main/java/javax/servlet/jsp/JspApplicationContext.java rename to core/src/main/java/javax/servlet/jsp/JspApplicationContext.java diff --git a/src/main/java/javax/servlet/jsp/JspContext.java b/core/src/main/java/javax/servlet/jsp/JspContext.java similarity index 100% rename from src/main/java/javax/servlet/jsp/JspContext.java rename to core/src/main/java/javax/servlet/jsp/JspContext.java diff --git a/src/main/java/javax/servlet/jsp/JspEngineInfo.java b/core/src/main/java/javax/servlet/jsp/JspEngineInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/JspEngineInfo.java rename to core/src/main/java/javax/servlet/jsp/JspEngineInfo.java diff --git a/src/main/java/javax/servlet/jsp/JspException.java b/core/src/main/java/javax/servlet/jsp/JspException.java similarity index 100% rename from src/main/java/javax/servlet/jsp/JspException.java rename to core/src/main/java/javax/servlet/jsp/JspException.java diff --git a/src/main/java/javax/servlet/jsp/JspFactory.java b/core/src/main/java/javax/servlet/jsp/JspFactory.java similarity index 100% rename from src/main/java/javax/servlet/jsp/JspFactory.java rename to core/src/main/java/javax/servlet/jsp/JspFactory.java diff --git a/src/main/java/javax/servlet/jsp/JspPage.java b/core/src/main/java/javax/servlet/jsp/JspPage.java similarity index 100% rename from src/main/java/javax/servlet/jsp/JspPage.java rename to core/src/main/java/javax/servlet/jsp/JspPage.java diff --git a/src/main/java/javax/servlet/jsp/JspTagException.java b/core/src/main/java/javax/servlet/jsp/JspTagException.java similarity index 100% rename from src/main/java/javax/servlet/jsp/JspTagException.java rename to core/src/main/java/javax/servlet/jsp/JspTagException.java diff --git a/src/main/java/javax/servlet/jsp/JspWriter.java b/core/src/main/java/javax/servlet/jsp/JspWriter.java similarity index 100% rename from src/main/java/javax/servlet/jsp/JspWriter.java rename to core/src/main/java/javax/servlet/jsp/JspWriter.java diff --git a/src/main/java/javax/servlet/jsp/PageContext.java b/core/src/main/java/javax/servlet/jsp/PageContext.java similarity index 100% rename from src/main/java/javax/servlet/jsp/PageContext.java rename to core/src/main/java/javax/servlet/jsp/PageContext.java diff --git a/src/main/java/javax/servlet/jsp/SkipPageException.java b/core/src/main/java/javax/servlet/jsp/SkipPageException.java similarity index 100% rename from src/main/java/javax/servlet/jsp/SkipPageException.java rename to core/src/main/java/javax/servlet/jsp/SkipPageException.java diff --git a/src/main/java/javax/servlet/jsp/el/ELException.java b/core/src/main/java/javax/servlet/jsp/el/ELException.java similarity index 100% rename from src/main/java/javax/servlet/jsp/el/ELException.java rename to core/src/main/java/javax/servlet/jsp/el/ELException.java diff --git a/src/main/java/javax/servlet/jsp/el/ELParseException.java b/core/src/main/java/javax/servlet/jsp/el/ELParseException.java similarity index 100% rename from src/main/java/javax/servlet/jsp/el/ELParseException.java rename to core/src/main/java/javax/servlet/jsp/el/ELParseException.java diff --git a/src/main/java/javax/servlet/jsp/el/Expression.java b/core/src/main/java/javax/servlet/jsp/el/Expression.java similarity index 100% rename from src/main/java/javax/servlet/jsp/el/Expression.java rename to core/src/main/java/javax/servlet/jsp/el/Expression.java diff --git a/src/main/java/javax/servlet/jsp/el/ExpressionEvaluator.java b/core/src/main/java/javax/servlet/jsp/el/ExpressionEvaluator.java similarity index 100% rename from src/main/java/javax/servlet/jsp/el/ExpressionEvaluator.java rename to core/src/main/java/javax/servlet/jsp/el/ExpressionEvaluator.java diff --git a/src/main/java/javax/servlet/jsp/el/FunctionMapper.java b/core/src/main/java/javax/servlet/jsp/el/FunctionMapper.java similarity index 100% rename from src/main/java/javax/servlet/jsp/el/FunctionMapper.java rename to core/src/main/java/javax/servlet/jsp/el/FunctionMapper.java diff --git a/src/main/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java b/core/src/main/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java similarity index 100% rename from src/main/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java rename to core/src/main/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java diff --git a/src/main/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java b/core/src/main/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java similarity index 100% rename from src/main/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java rename to core/src/main/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java diff --git a/src/main/java/javax/servlet/jsp/el/VariableResolver.java b/core/src/main/java/javax/servlet/jsp/el/VariableResolver.java similarity index 100% rename from src/main/java/javax/servlet/jsp/el/VariableResolver.java rename to core/src/main/java/javax/servlet/jsp/el/VariableResolver.java diff --git a/src/main/java/javax/servlet/jsp/el/package.html b/core/src/main/java/javax/servlet/jsp/el/package.html similarity index 100% rename from src/main/java/javax/servlet/jsp/el/package.html rename to core/src/main/java/javax/servlet/jsp/el/package.html diff --git a/src/main/java/javax/servlet/jsp/package.html b/core/src/main/java/javax/servlet/jsp/package.html similarity index 100% rename from src/main/java/javax/servlet/jsp/package.html rename to core/src/main/java/javax/servlet/jsp/package.html diff --git a/src/main/java/javax/servlet/jsp/resources/jspxml.dtd b/core/src/main/java/javax/servlet/jsp/resources/jspxml.dtd similarity index 100% rename from src/main/java/javax/servlet/jsp/resources/jspxml.dtd rename to core/src/main/java/javax/servlet/jsp/resources/jspxml.dtd diff --git a/src/main/java/javax/servlet/jsp/resources/jspxml.xsd b/core/src/main/java/javax/servlet/jsp/resources/jspxml.xsd similarity index 100% rename from src/main/java/javax/servlet/jsp/resources/jspxml.xsd rename to core/src/main/java/javax/servlet/jsp/resources/jspxml.xsd diff --git a/src/main/java/javax/servlet/jsp/tagext/BodyContent.java b/core/src/main/java/javax/servlet/jsp/tagext/BodyContent.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/BodyContent.java rename to core/src/main/java/javax/servlet/jsp/tagext/BodyContent.java diff --git a/src/main/java/javax/servlet/jsp/tagext/BodyTag.java b/core/src/main/java/javax/servlet/jsp/tagext/BodyTag.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/BodyTag.java rename to core/src/main/java/javax/servlet/jsp/tagext/BodyTag.java diff --git a/src/main/java/javax/servlet/jsp/tagext/BodyTagSupport.java b/core/src/main/java/javax/servlet/jsp/tagext/BodyTagSupport.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/BodyTagSupport.java rename to core/src/main/java/javax/servlet/jsp/tagext/BodyTagSupport.java diff --git a/src/main/java/javax/servlet/jsp/tagext/DynamicAttributes.java b/core/src/main/java/javax/servlet/jsp/tagext/DynamicAttributes.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/DynamicAttributes.java rename to core/src/main/java/javax/servlet/jsp/tagext/DynamicAttributes.java diff --git a/src/main/java/javax/servlet/jsp/tagext/FunctionInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/FunctionInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/FunctionInfo.java rename to core/src/main/java/javax/servlet/jsp/tagext/FunctionInfo.java diff --git a/src/main/java/javax/servlet/jsp/tagext/IterationTag.java b/core/src/main/java/javax/servlet/jsp/tagext/IterationTag.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/IterationTag.java rename to core/src/main/java/javax/servlet/jsp/tagext/IterationTag.java diff --git a/src/main/java/javax/servlet/jsp/tagext/JspFragment.java b/core/src/main/java/javax/servlet/jsp/tagext/JspFragment.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/JspFragment.java rename to core/src/main/java/javax/servlet/jsp/tagext/JspFragment.java diff --git a/src/main/java/javax/servlet/jsp/tagext/JspIdConsumer.java b/core/src/main/java/javax/servlet/jsp/tagext/JspIdConsumer.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/JspIdConsumer.java rename to core/src/main/java/javax/servlet/jsp/tagext/JspIdConsumer.java diff --git a/src/main/java/javax/servlet/jsp/tagext/JspTag.java b/core/src/main/java/javax/servlet/jsp/tagext/JspTag.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/JspTag.java rename to core/src/main/java/javax/servlet/jsp/tagext/JspTag.java diff --git a/src/main/java/javax/servlet/jsp/tagext/PageData.java b/core/src/main/java/javax/servlet/jsp/tagext/PageData.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/PageData.java rename to core/src/main/java/javax/servlet/jsp/tagext/PageData.java diff --git a/src/main/java/javax/servlet/jsp/tagext/SimpleTag.java b/core/src/main/java/javax/servlet/jsp/tagext/SimpleTag.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/SimpleTag.java rename to core/src/main/java/javax/servlet/jsp/tagext/SimpleTag.java diff --git a/src/main/java/javax/servlet/jsp/tagext/SimpleTagSupport.java b/core/src/main/java/javax/servlet/jsp/tagext/SimpleTagSupport.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/SimpleTagSupport.java rename to core/src/main/java/javax/servlet/jsp/tagext/SimpleTagSupport.java diff --git a/src/main/java/javax/servlet/jsp/tagext/Tag.java b/core/src/main/java/javax/servlet/jsp/tagext/Tag.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/Tag.java rename to core/src/main/java/javax/servlet/jsp/tagext/Tag.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagAdapter.java b/core/src/main/java/javax/servlet/jsp/tagext/TagAdapter.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagAdapter.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagAdapter.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagAttributeInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/TagAttributeInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagAttributeInfo.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagAttributeInfo.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagData.java b/core/src/main/java/javax/servlet/jsp/tagext/TagData.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagData.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagData.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagExtraInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/TagExtraInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagExtraInfo.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagExtraInfo.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagFileInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/TagFileInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagFileInfo.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagFileInfo.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/TagInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagInfo.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagInfo.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagLibraryValidator.java b/core/src/main/java/javax/servlet/jsp/tagext/TagLibraryValidator.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagLibraryValidator.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagLibraryValidator.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagSupport.java b/core/src/main/java/javax/servlet/jsp/tagext/TagSupport.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagSupport.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagSupport.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TagVariableInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/TagVariableInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TagVariableInfo.java rename to core/src/main/java/javax/servlet/jsp/tagext/TagVariableInfo.java diff --git a/src/main/java/javax/servlet/jsp/tagext/TryCatchFinally.java b/core/src/main/java/javax/servlet/jsp/tagext/TryCatchFinally.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/TryCatchFinally.java rename to core/src/main/java/javax/servlet/jsp/tagext/TryCatchFinally.java diff --git a/src/main/java/javax/servlet/jsp/tagext/ValidationMessage.java b/core/src/main/java/javax/servlet/jsp/tagext/ValidationMessage.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/ValidationMessage.java rename to core/src/main/java/javax/servlet/jsp/tagext/ValidationMessage.java diff --git a/src/main/java/javax/servlet/jsp/tagext/VariableInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/VariableInfo.java similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/VariableInfo.java rename to core/src/main/java/javax/servlet/jsp/tagext/VariableInfo.java diff --git a/src/main/java/javax/servlet/jsp/tagext/doc-files/BodyTagProtocol.gif b/core/src/main/java/javax/servlet/jsp/tagext/doc-files/BodyTagProtocol.gif similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/doc-files/BodyTagProtocol.gif rename to core/src/main/java/javax/servlet/jsp/tagext/doc-files/BodyTagProtocol.gif diff --git a/src/main/java/javax/servlet/jsp/tagext/doc-files/IterationTagProtocol.gif b/core/src/main/java/javax/servlet/jsp/tagext/doc-files/IterationTagProtocol.gif similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/doc-files/IterationTagProtocol.gif rename to core/src/main/java/javax/servlet/jsp/tagext/doc-files/IterationTagProtocol.gif diff --git a/src/main/java/javax/servlet/jsp/tagext/doc-files/TagProtocol.gif b/core/src/main/java/javax/servlet/jsp/tagext/doc-files/TagProtocol.gif similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/doc-files/TagProtocol.gif rename to core/src/main/java/javax/servlet/jsp/tagext/doc-files/TagProtocol.gif diff --git a/src/main/java/javax/servlet/jsp/tagext/doc-files/VariableInfo-1.gif b/core/src/main/java/javax/servlet/jsp/tagext/doc-files/VariableInfo-1.gif similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/doc-files/VariableInfo-1.gif rename to core/src/main/java/javax/servlet/jsp/tagext/doc-files/VariableInfo-1.gif diff --git a/src/main/java/javax/servlet/jsp/tagext/package.html b/core/src/main/java/javax/servlet/jsp/tagext/package.html similarity index 100% rename from src/main/java/javax/servlet/jsp/tagext/package.html rename to core/src/main/java/javax/servlet/jsp/tagext/package.html diff --git a/src/main/java/javax/servlet/package.html b/core/src/main/java/javax/servlet/package.html similarity index 100% rename from src/main/java/javax/servlet/package.html rename to core/src/main/java/javax/servlet/package.html diff --git a/src/main/java/javax/servlet/resources/XMLSchema.dtd b/core/src/main/java/javax/servlet/resources/XMLSchema.dtd similarity index 100% rename from src/main/java/javax/servlet/resources/XMLSchema.dtd rename to core/src/main/java/javax/servlet/resources/XMLSchema.dtd diff --git a/src/main/java/javax/servlet/resources/datatypes.dtd b/core/src/main/java/javax/servlet/resources/datatypes.dtd similarity index 100% rename from src/main/java/javax/servlet/resources/datatypes.dtd rename to core/src/main/java/javax/servlet/resources/datatypes.dtd diff --git a/src/main/java/javax/servlet/resources/j2ee_1_4.xsd b/core/src/main/java/javax/servlet/resources/j2ee_1_4.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/j2ee_1_4.xsd rename to core/src/main/java/javax/servlet/resources/j2ee_1_4.xsd diff --git a/src/main/java/javax/servlet/resources/j2ee_web_services_1_1.xsd b/core/src/main/java/javax/servlet/resources/j2ee_web_services_1_1.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/j2ee_web_services_1_1.xsd rename to core/src/main/java/javax/servlet/resources/j2ee_web_services_1_1.xsd diff --git a/src/main/java/javax/servlet/resources/j2ee_web_services_client_1_1.xsd b/core/src/main/java/javax/servlet/resources/j2ee_web_services_client_1_1.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/j2ee_web_services_client_1_1.xsd rename to core/src/main/java/javax/servlet/resources/j2ee_web_services_client_1_1.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_5.xsd b/core/src/main/java/javax/servlet/resources/javaee_5.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_5.xsd rename to core/src/main/java/javax/servlet/resources/javaee_5.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_6.xsd b/core/src/main/java/javax/servlet/resources/javaee_6.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_6.xsd rename to core/src/main/java/javax/servlet/resources/javaee_6.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_7.xsd b/core/src/main/java/javax/servlet/resources/javaee_7.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_7.xsd rename to core/src/main/java/javax/servlet/resources/javaee_7.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_8.xsd b/core/src/main/java/javax/servlet/resources/javaee_8.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_8.xsd rename to core/src/main/java/javax/servlet/resources/javaee_8.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_web_services_1_2.xsd b/core/src/main/java/javax/servlet/resources/javaee_web_services_1_2.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_web_services_1_2.xsd rename to core/src/main/java/javax/servlet/resources/javaee_web_services_1_2.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_web_services_1_3.xsd b/core/src/main/java/javax/servlet/resources/javaee_web_services_1_3.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_web_services_1_3.xsd rename to core/src/main/java/javax/servlet/resources/javaee_web_services_1_3.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd b/core/src/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd rename to core/src/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_web_services_client_1_2.xsd b/core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_2.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_web_services_client_1_2.xsd rename to core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_2.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_web_services_client_1_3.xsd b/core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_3.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_web_services_client_1_3.xsd rename to core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_3.xsd diff --git a/src/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd b/core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd rename to core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd diff --git a/src/main/java/javax/servlet/resources/jsp_2_0.xsd b/core/src/main/java/javax/servlet/resources/jsp_2_0.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/jsp_2_0.xsd rename to core/src/main/java/javax/servlet/resources/jsp_2_0.xsd diff --git a/src/main/java/javax/servlet/resources/jsp_2_1.xsd b/core/src/main/java/javax/servlet/resources/jsp_2_1.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/jsp_2_1.xsd rename to core/src/main/java/javax/servlet/resources/jsp_2_1.xsd diff --git a/src/main/java/javax/servlet/resources/jsp_2_2.xsd b/core/src/main/java/javax/servlet/resources/jsp_2_2.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/jsp_2_2.xsd rename to core/src/main/java/javax/servlet/resources/jsp_2_2.xsd diff --git a/src/main/java/javax/servlet/resources/jsp_2_3.xsd b/core/src/main/java/javax/servlet/resources/jsp_2_3.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/jsp_2_3.xsd rename to core/src/main/java/javax/servlet/resources/jsp_2_3.xsd diff --git a/src/main/java/javax/servlet/resources/web-app_2_2.dtd b/core/src/main/java/javax/servlet/resources/web-app_2_2.dtd similarity index 100% rename from src/main/java/javax/servlet/resources/web-app_2_2.dtd rename to core/src/main/java/javax/servlet/resources/web-app_2_2.dtd diff --git a/src/main/java/javax/servlet/resources/web-app_2_3.dtd b/core/src/main/java/javax/servlet/resources/web-app_2_3.dtd similarity index 100% rename from src/main/java/javax/servlet/resources/web-app_2_3.dtd rename to core/src/main/java/javax/servlet/resources/web-app_2_3.dtd diff --git a/src/main/java/javax/servlet/resources/web-app_2_4.xsd b/core/src/main/java/javax/servlet/resources/web-app_2_4.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-app_2_4.xsd rename to core/src/main/java/javax/servlet/resources/web-app_2_4.xsd diff --git a/src/main/java/javax/servlet/resources/web-app_2_5.xsd b/core/src/main/java/javax/servlet/resources/web-app_2_5.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-app_2_5.xsd rename to core/src/main/java/javax/servlet/resources/web-app_2_5.xsd diff --git a/src/main/java/javax/servlet/resources/web-app_3_0.xsd b/core/src/main/java/javax/servlet/resources/web-app_3_0.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-app_3_0.xsd rename to core/src/main/java/javax/servlet/resources/web-app_3_0.xsd diff --git a/src/main/java/javax/servlet/resources/web-app_3_1.xsd b/core/src/main/java/javax/servlet/resources/web-app_3_1.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-app_3_1.xsd rename to core/src/main/java/javax/servlet/resources/web-app_3_1.xsd diff --git a/src/main/java/javax/servlet/resources/web-app_4_0.xsd b/core/src/main/java/javax/servlet/resources/web-app_4_0.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-app_4_0.xsd rename to core/src/main/java/javax/servlet/resources/web-app_4_0.xsd diff --git a/src/main/java/javax/servlet/resources/web-common_3_0.xsd b/core/src/main/java/javax/servlet/resources/web-common_3_0.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-common_3_0.xsd rename to core/src/main/java/javax/servlet/resources/web-common_3_0.xsd diff --git a/src/main/java/javax/servlet/resources/web-common_3_1.xsd b/core/src/main/java/javax/servlet/resources/web-common_3_1.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-common_3_1.xsd rename to core/src/main/java/javax/servlet/resources/web-common_3_1.xsd diff --git a/src/main/java/javax/servlet/resources/web-common_4_0.xsd b/core/src/main/java/javax/servlet/resources/web-common_4_0.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-common_4_0.xsd rename to core/src/main/java/javax/servlet/resources/web-common_4_0.xsd diff --git a/src/main/java/javax/servlet/resources/web-fragment_3_0.xsd b/core/src/main/java/javax/servlet/resources/web-fragment_3_0.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-fragment_3_0.xsd rename to core/src/main/java/javax/servlet/resources/web-fragment_3_0.xsd diff --git a/src/main/java/javax/servlet/resources/web-fragment_3_1.xsd b/core/src/main/java/javax/servlet/resources/web-fragment_3_1.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-fragment_3_1.xsd rename to core/src/main/java/javax/servlet/resources/web-fragment_3_1.xsd diff --git a/src/main/java/javax/servlet/resources/web-fragment_4_0.xsd b/core/src/main/java/javax/servlet/resources/web-fragment_4_0.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-fragment_4_0.xsd rename to core/src/main/java/javax/servlet/resources/web-fragment_4_0.xsd diff --git a/src/main/java/javax/servlet/resources/web-jsptaglibrary_1_1.dtd b/core/src/main/java/javax/servlet/resources/web-jsptaglibrary_1_1.dtd similarity index 100% rename from src/main/java/javax/servlet/resources/web-jsptaglibrary_1_1.dtd rename to core/src/main/java/javax/servlet/resources/web-jsptaglibrary_1_1.dtd diff --git a/src/main/java/javax/servlet/resources/web-jsptaglibrary_1_2.dtd b/core/src/main/java/javax/servlet/resources/web-jsptaglibrary_1_2.dtd similarity index 100% rename from src/main/java/javax/servlet/resources/web-jsptaglibrary_1_2.dtd rename to core/src/main/java/javax/servlet/resources/web-jsptaglibrary_1_2.dtd diff --git a/src/main/java/javax/servlet/resources/web-jsptaglibrary_2_0.xsd b/core/src/main/java/javax/servlet/resources/web-jsptaglibrary_2_0.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-jsptaglibrary_2_0.xsd rename to core/src/main/java/javax/servlet/resources/web-jsptaglibrary_2_0.xsd diff --git a/src/main/java/javax/servlet/resources/web-jsptaglibrary_2_1.xsd b/core/src/main/java/javax/servlet/resources/web-jsptaglibrary_2_1.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/web-jsptaglibrary_2_1.xsd rename to core/src/main/java/javax/servlet/resources/web-jsptaglibrary_2_1.xsd diff --git a/src/main/java/javax/servlet/resources/xml.xsd b/core/src/main/java/javax/servlet/resources/xml.xsd similarity index 100% rename from src/main/java/javax/servlet/resources/xml.xsd rename to core/src/main/java/javax/servlet/resources/xml.xsd diff --git a/src/main/java/javax/websocket/ClientEndpoint.java b/core/src/main/java/javax/websocket/ClientEndpoint.java similarity index 100% rename from src/main/java/javax/websocket/ClientEndpoint.java rename to core/src/main/java/javax/websocket/ClientEndpoint.java diff --git a/src/main/java/javax/websocket/ClientEndpointConfig.java b/core/src/main/java/javax/websocket/ClientEndpointConfig.java similarity index 100% rename from src/main/java/javax/websocket/ClientEndpointConfig.java rename to core/src/main/java/javax/websocket/ClientEndpointConfig.java diff --git a/src/main/java/javax/websocket/CloseReason.java b/core/src/main/java/javax/websocket/CloseReason.java similarity index 100% rename from src/main/java/javax/websocket/CloseReason.java rename to core/src/main/java/javax/websocket/CloseReason.java diff --git a/src/main/java/javax/websocket/ContainerProvider.java b/core/src/main/java/javax/websocket/ContainerProvider.java similarity index 100% rename from src/main/java/javax/websocket/ContainerProvider.java rename to core/src/main/java/javax/websocket/ContainerProvider.java diff --git a/src/main/java/javax/websocket/DecodeException.java b/core/src/main/java/javax/websocket/DecodeException.java similarity index 100% rename from src/main/java/javax/websocket/DecodeException.java rename to core/src/main/java/javax/websocket/DecodeException.java diff --git a/src/main/java/javax/websocket/Decoder.java b/core/src/main/java/javax/websocket/Decoder.java similarity index 100% rename from src/main/java/javax/websocket/Decoder.java rename to core/src/main/java/javax/websocket/Decoder.java diff --git a/src/main/java/javax/websocket/DefaultClientEndpointConfig.java b/core/src/main/java/javax/websocket/DefaultClientEndpointConfig.java similarity index 100% rename from src/main/java/javax/websocket/DefaultClientEndpointConfig.java rename to core/src/main/java/javax/websocket/DefaultClientEndpointConfig.java diff --git a/src/main/java/javax/websocket/DeploymentException.java b/core/src/main/java/javax/websocket/DeploymentException.java similarity index 100% rename from src/main/java/javax/websocket/DeploymentException.java rename to core/src/main/java/javax/websocket/DeploymentException.java diff --git a/src/main/java/javax/websocket/EncodeException.java b/core/src/main/java/javax/websocket/EncodeException.java similarity index 100% rename from src/main/java/javax/websocket/EncodeException.java rename to core/src/main/java/javax/websocket/EncodeException.java diff --git a/src/main/java/javax/websocket/Encoder.java b/core/src/main/java/javax/websocket/Encoder.java similarity index 100% rename from src/main/java/javax/websocket/Encoder.java rename to core/src/main/java/javax/websocket/Encoder.java diff --git a/src/main/java/javax/websocket/Endpoint.java b/core/src/main/java/javax/websocket/Endpoint.java similarity index 100% rename from src/main/java/javax/websocket/Endpoint.java rename to core/src/main/java/javax/websocket/Endpoint.java diff --git a/src/main/java/javax/websocket/EndpointConfig.java b/core/src/main/java/javax/websocket/EndpointConfig.java similarity index 100% rename from src/main/java/javax/websocket/EndpointConfig.java rename to core/src/main/java/javax/websocket/EndpointConfig.java diff --git a/src/main/java/javax/websocket/Extension.java b/core/src/main/java/javax/websocket/Extension.java similarity index 100% rename from src/main/java/javax/websocket/Extension.java rename to core/src/main/java/javax/websocket/Extension.java diff --git a/src/main/java/javax/websocket/HandshakeResponse.java b/core/src/main/java/javax/websocket/HandshakeResponse.java similarity index 100% rename from src/main/java/javax/websocket/HandshakeResponse.java rename to core/src/main/java/javax/websocket/HandshakeResponse.java diff --git a/src/main/java/javax/websocket/MessageHandler.java b/core/src/main/java/javax/websocket/MessageHandler.java similarity index 100% rename from src/main/java/javax/websocket/MessageHandler.java rename to core/src/main/java/javax/websocket/MessageHandler.java diff --git a/src/main/java/javax/websocket/OnClose.java b/core/src/main/java/javax/websocket/OnClose.java similarity index 100% rename from src/main/java/javax/websocket/OnClose.java rename to core/src/main/java/javax/websocket/OnClose.java diff --git a/src/main/java/javax/websocket/OnError.java b/core/src/main/java/javax/websocket/OnError.java similarity index 100% rename from src/main/java/javax/websocket/OnError.java rename to core/src/main/java/javax/websocket/OnError.java diff --git a/src/main/java/javax/websocket/OnMessage.java b/core/src/main/java/javax/websocket/OnMessage.java similarity index 100% rename from src/main/java/javax/websocket/OnMessage.java rename to core/src/main/java/javax/websocket/OnMessage.java diff --git a/src/main/java/javax/websocket/OnOpen.java b/core/src/main/java/javax/websocket/OnOpen.java similarity index 100% rename from src/main/java/javax/websocket/OnOpen.java rename to core/src/main/java/javax/websocket/OnOpen.java diff --git a/src/main/java/javax/websocket/PongMessage.java b/core/src/main/java/javax/websocket/PongMessage.java similarity index 100% rename from src/main/java/javax/websocket/PongMessage.java rename to core/src/main/java/javax/websocket/PongMessage.java diff --git a/src/main/java/javax/websocket/RemoteEndpoint.java b/core/src/main/java/javax/websocket/RemoteEndpoint.java similarity index 100% rename from src/main/java/javax/websocket/RemoteEndpoint.java rename to core/src/main/java/javax/websocket/RemoteEndpoint.java diff --git a/src/main/java/javax/websocket/SendHandler.java b/core/src/main/java/javax/websocket/SendHandler.java similarity index 100% rename from src/main/java/javax/websocket/SendHandler.java rename to core/src/main/java/javax/websocket/SendHandler.java diff --git a/src/main/java/javax/websocket/SendResult.java b/core/src/main/java/javax/websocket/SendResult.java similarity index 100% rename from src/main/java/javax/websocket/SendResult.java rename to core/src/main/java/javax/websocket/SendResult.java diff --git a/src/main/java/javax/websocket/Session.java b/core/src/main/java/javax/websocket/Session.java similarity index 100% rename from src/main/java/javax/websocket/Session.java rename to core/src/main/java/javax/websocket/Session.java diff --git a/src/main/java/javax/websocket/SessionException.java b/core/src/main/java/javax/websocket/SessionException.java similarity index 100% rename from src/main/java/javax/websocket/SessionException.java rename to core/src/main/java/javax/websocket/SessionException.java diff --git a/src/main/java/javax/websocket/WebSocketContainer.java b/core/src/main/java/javax/websocket/WebSocketContainer.java similarity index 100% rename from src/main/java/javax/websocket/WebSocketContainer.java rename to core/src/main/java/javax/websocket/WebSocketContainer.java diff --git a/src/main/java/javax/websocket/server/DefaultServerEndpointConfig.java b/core/src/main/java/javax/websocket/server/DefaultServerEndpointConfig.java similarity index 100% rename from src/main/java/javax/websocket/server/DefaultServerEndpointConfig.java rename to core/src/main/java/javax/websocket/server/DefaultServerEndpointConfig.java diff --git a/src/main/java/javax/websocket/server/HandshakeRequest.java b/core/src/main/java/javax/websocket/server/HandshakeRequest.java similarity index 100% rename from src/main/java/javax/websocket/server/HandshakeRequest.java rename to core/src/main/java/javax/websocket/server/HandshakeRequest.java diff --git a/src/main/java/javax/websocket/server/PathParam.java b/core/src/main/java/javax/websocket/server/PathParam.java similarity index 100% rename from src/main/java/javax/websocket/server/PathParam.java rename to core/src/main/java/javax/websocket/server/PathParam.java diff --git a/src/main/java/javax/websocket/server/ServerApplicationConfig.java b/core/src/main/java/javax/websocket/server/ServerApplicationConfig.java similarity index 100% rename from src/main/java/javax/websocket/server/ServerApplicationConfig.java rename to core/src/main/java/javax/websocket/server/ServerApplicationConfig.java diff --git a/src/main/java/javax/websocket/server/ServerContainer.java b/core/src/main/java/javax/websocket/server/ServerContainer.java similarity index 100% rename from src/main/java/javax/websocket/server/ServerContainer.java rename to core/src/main/java/javax/websocket/server/ServerContainer.java diff --git a/src/main/java/javax/websocket/server/ServerEndpoint.java b/core/src/main/java/javax/websocket/server/ServerEndpoint.java similarity index 100% rename from src/main/java/javax/websocket/server/ServerEndpoint.java rename to core/src/main/java/javax/websocket/server/ServerEndpoint.java diff --git a/src/main/java/javax/websocket/server/ServerEndpointConfig.java b/core/src/main/java/javax/websocket/server/ServerEndpointConfig.java similarity index 100% rename from src/main/java/javax/websocket/server/ServerEndpointConfig.java rename to core/src/main/java/javax/websocket/server/ServerEndpointConfig.java diff --git a/src/main/java/org/apache/catalina/AccessLog.java b/core/src/main/java/org/apache/catalina/AccessLog.java similarity index 100% rename from src/main/java/org/apache/catalina/AccessLog.java rename to core/src/main/java/org/apache/catalina/AccessLog.java diff --git a/src/main/java/org/apache/catalina/AsyncDispatcher.java b/core/src/main/java/org/apache/catalina/AsyncDispatcher.java similarity index 100% rename from src/main/java/org/apache/catalina/AsyncDispatcher.java rename to core/src/main/java/org/apache/catalina/AsyncDispatcher.java diff --git a/src/main/java/org/apache/catalina/Authenticator.java b/core/src/main/java/org/apache/catalina/Authenticator.java similarity index 100% rename from src/main/java/org/apache/catalina/Authenticator.java rename to core/src/main/java/org/apache/catalina/Authenticator.java diff --git a/src/main/java/org/apache/catalina/Cluster.java b/core/src/main/java/org/apache/catalina/Cluster.java similarity index 100% rename from src/main/java/org/apache/catalina/Cluster.java rename to core/src/main/java/org/apache/catalina/Cluster.java diff --git a/src/main/java/org/apache/catalina/Contained.java b/core/src/main/java/org/apache/catalina/Contained.java similarity index 100% rename from src/main/java/org/apache/catalina/Contained.java rename to core/src/main/java/org/apache/catalina/Contained.java diff --git a/src/main/java/org/apache/catalina/Container.java b/core/src/main/java/org/apache/catalina/Container.java similarity index 100% rename from src/main/java/org/apache/catalina/Container.java rename to core/src/main/java/org/apache/catalina/Container.java diff --git a/src/main/java/org/apache/catalina/ContainerEvent.java b/core/src/main/java/org/apache/catalina/ContainerEvent.java similarity index 100% rename from src/main/java/org/apache/catalina/ContainerEvent.java rename to core/src/main/java/org/apache/catalina/ContainerEvent.java diff --git a/src/main/java/org/apache/catalina/ContainerListener.java b/core/src/main/java/org/apache/catalina/ContainerListener.java similarity index 100% rename from src/main/java/org/apache/catalina/ContainerListener.java rename to core/src/main/java/org/apache/catalina/ContainerListener.java diff --git a/src/main/java/org/apache/catalina/ContainerServlet.java b/core/src/main/java/org/apache/catalina/ContainerServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/ContainerServlet.java rename to core/src/main/java/org/apache/catalina/ContainerServlet.java diff --git a/src/main/java/org/apache/catalina/Context.java b/core/src/main/java/org/apache/catalina/Context.java similarity index 100% rename from src/main/java/org/apache/catalina/Context.java rename to core/src/main/java/org/apache/catalina/Context.java diff --git a/src/main/java/org/apache/catalina/CredentialHandler.java b/core/src/main/java/org/apache/catalina/CredentialHandler.java similarity index 100% rename from src/main/java/org/apache/catalina/CredentialHandler.java rename to core/src/main/java/org/apache/catalina/CredentialHandler.java diff --git a/src/main/java/org/apache/catalina/DistributedManager.java b/core/src/main/java/org/apache/catalina/DistributedManager.java similarity index 100% rename from src/main/java/org/apache/catalina/DistributedManager.java rename to core/src/main/java/org/apache/catalina/DistributedManager.java diff --git a/src/main/java/org/apache/catalina/Engine.java b/core/src/main/java/org/apache/catalina/Engine.java similarity index 100% rename from src/main/java/org/apache/catalina/Engine.java rename to core/src/main/java/org/apache/catalina/Engine.java diff --git a/src/main/java/org/apache/catalina/Executor.java b/core/src/main/java/org/apache/catalina/Executor.java similarity index 100% rename from src/main/java/org/apache/catalina/Executor.java rename to core/src/main/java/org/apache/catalina/Executor.java diff --git a/src/main/java/org/apache/catalina/Globals.java b/core/src/main/java/org/apache/catalina/Globals.java similarity index 100% rename from src/main/java/org/apache/catalina/Globals.java rename to core/src/main/java/org/apache/catalina/Globals.java diff --git a/src/main/java/org/apache/catalina/Group.java b/core/src/main/java/org/apache/catalina/Group.java similarity index 100% rename from src/main/java/org/apache/catalina/Group.java rename to core/src/main/java/org/apache/catalina/Group.java diff --git a/src/main/java/org/apache/catalina/Host.java b/core/src/main/java/org/apache/catalina/Host.java similarity index 100% rename from src/main/java/org/apache/catalina/Host.java rename to core/src/main/java/org/apache/catalina/Host.java diff --git a/src/main/java/org/apache/catalina/JmxEnabled.java b/core/src/main/java/org/apache/catalina/JmxEnabled.java similarity index 100% rename from src/main/java/org/apache/catalina/JmxEnabled.java rename to core/src/main/java/org/apache/catalina/JmxEnabled.java diff --git a/src/main/java/org/apache/catalina/Lifecycle.java b/core/src/main/java/org/apache/catalina/Lifecycle.java similarity index 100% rename from src/main/java/org/apache/catalina/Lifecycle.java rename to core/src/main/java/org/apache/catalina/Lifecycle.java diff --git a/src/main/java/org/apache/catalina/LifecycleEvent.java b/core/src/main/java/org/apache/catalina/LifecycleEvent.java similarity index 100% rename from src/main/java/org/apache/catalina/LifecycleEvent.java rename to core/src/main/java/org/apache/catalina/LifecycleEvent.java diff --git a/src/main/java/org/apache/catalina/LifecycleException.java b/core/src/main/java/org/apache/catalina/LifecycleException.java similarity index 100% rename from src/main/java/org/apache/catalina/LifecycleException.java rename to core/src/main/java/org/apache/catalina/LifecycleException.java diff --git a/src/main/java/org/apache/catalina/LifecycleListener.java b/core/src/main/java/org/apache/catalina/LifecycleListener.java similarity index 100% rename from src/main/java/org/apache/catalina/LifecycleListener.java rename to core/src/main/java/org/apache/catalina/LifecycleListener.java diff --git a/src/main/java/org/apache/catalina/LifecycleState.java b/core/src/main/java/org/apache/catalina/LifecycleState.java similarity index 100% rename from src/main/java/org/apache/catalina/LifecycleState.java rename to core/src/main/java/org/apache/catalina/LifecycleState.java diff --git a/src/main/java/org/apache/catalina/Loader.java b/core/src/main/java/org/apache/catalina/Loader.java similarity index 100% rename from src/main/java/org/apache/catalina/Loader.java rename to core/src/main/java/org/apache/catalina/Loader.java diff --git a/src/main/java/org/apache/catalina/Manager.java b/core/src/main/java/org/apache/catalina/Manager.java similarity index 100% rename from src/main/java/org/apache/catalina/Manager.java rename to core/src/main/java/org/apache/catalina/Manager.java diff --git a/src/main/java/org/apache/catalina/Pipeline.java b/core/src/main/java/org/apache/catalina/Pipeline.java similarity index 100% rename from src/main/java/org/apache/catalina/Pipeline.java rename to core/src/main/java/org/apache/catalina/Pipeline.java diff --git a/src/main/java/org/apache/catalina/Realm.java b/core/src/main/java/org/apache/catalina/Realm.java similarity index 100% rename from src/main/java/org/apache/catalina/Realm.java rename to core/src/main/java/org/apache/catalina/Realm.java diff --git a/src/main/java/org/apache/catalina/Role.java b/core/src/main/java/org/apache/catalina/Role.java similarity index 100% rename from src/main/java/org/apache/catalina/Role.java rename to core/src/main/java/org/apache/catalina/Role.java diff --git a/src/main/java/org/apache/catalina/Server.java b/core/src/main/java/org/apache/catalina/Server.java similarity index 100% rename from src/main/java/org/apache/catalina/Server.java rename to core/src/main/java/org/apache/catalina/Server.java diff --git a/src/main/java/org/apache/catalina/Service.java b/core/src/main/java/org/apache/catalina/Service.java similarity index 100% rename from src/main/java/org/apache/catalina/Service.java rename to core/src/main/java/org/apache/catalina/Service.java diff --git a/src/main/java/org/apache/catalina/Session.java b/core/src/main/java/org/apache/catalina/Session.java similarity index 100% rename from src/main/java/org/apache/catalina/Session.java rename to core/src/main/java/org/apache/catalina/Session.java diff --git a/src/main/java/org/apache/catalina/SessionEvent.java b/core/src/main/java/org/apache/catalina/SessionEvent.java similarity index 100% rename from src/main/java/org/apache/catalina/SessionEvent.java rename to core/src/main/java/org/apache/catalina/SessionEvent.java diff --git a/src/main/java/org/apache/catalina/SessionIdGenerator.java b/core/src/main/java/org/apache/catalina/SessionIdGenerator.java similarity index 100% rename from src/main/java/org/apache/catalina/SessionIdGenerator.java rename to core/src/main/java/org/apache/catalina/SessionIdGenerator.java diff --git a/src/main/java/org/apache/catalina/SessionListener.java b/core/src/main/java/org/apache/catalina/SessionListener.java similarity index 100% rename from src/main/java/org/apache/catalina/SessionListener.java rename to core/src/main/java/org/apache/catalina/SessionListener.java diff --git a/src/main/java/org/apache/catalina/Store.java b/core/src/main/java/org/apache/catalina/Store.java similarity index 100% rename from src/main/java/org/apache/catalina/Store.java rename to core/src/main/java/org/apache/catalina/Store.java diff --git a/src/main/java/org/apache/catalina/StoreManager.java b/core/src/main/java/org/apache/catalina/StoreManager.java similarity index 100% rename from src/main/java/org/apache/catalina/StoreManager.java rename to core/src/main/java/org/apache/catalina/StoreManager.java diff --git a/src/main/java/org/apache/catalina/ThreadBindingListener.java b/core/src/main/java/org/apache/catalina/ThreadBindingListener.java similarity index 100% rename from src/main/java/org/apache/catalina/ThreadBindingListener.java rename to core/src/main/java/org/apache/catalina/ThreadBindingListener.java diff --git a/src/main/java/org/apache/catalina/TomcatPrincipal.java b/core/src/main/java/org/apache/catalina/TomcatPrincipal.java similarity index 100% rename from src/main/java/org/apache/catalina/TomcatPrincipal.java rename to core/src/main/java/org/apache/catalina/TomcatPrincipal.java diff --git a/src/main/java/org/apache/catalina/TrackedWebResource.java b/core/src/main/java/org/apache/catalina/TrackedWebResource.java similarity index 100% rename from src/main/java/org/apache/catalina/TrackedWebResource.java rename to core/src/main/java/org/apache/catalina/TrackedWebResource.java diff --git a/src/main/java/org/apache/catalina/User.java b/core/src/main/java/org/apache/catalina/User.java similarity index 100% rename from src/main/java/org/apache/catalina/User.java rename to core/src/main/java/org/apache/catalina/User.java diff --git a/src/main/java/org/apache/catalina/UserDatabase.java b/core/src/main/java/org/apache/catalina/UserDatabase.java similarity index 100% rename from src/main/java/org/apache/catalina/UserDatabase.java rename to core/src/main/java/org/apache/catalina/UserDatabase.java diff --git a/src/main/java/org/apache/catalina/Valve.java b/core/src/main/java/org/apache/catalina/Valve.java similarity index 100% rename from src/main/java/org/apache/catalina/Valve.java rename to core/src/main/java/org/apache/catalina/Valve.java diff --git a/src/main/java/org/apache/catalina/WebResource.java b/core/src/main/java/org/apache/catalina/WebResource.java similarity index 100% rename from src/main/java/org/apache/catalina/WebResource.java rename to core/src/main/java/org/apache/catalina/WebResource.java diff --git a/src/main/java/org/apache/catalina/WebResourceRoot.java b/core/src/main/java/org/apache/catalina/WebResourceRoot.java similarity index 100% rename from src/main/java/org/apache/catalina/WebResourceRoot.java rename to core/src/main/java/org/apache/catalina/WebResourceRoot.java diff --git a/src/main/java/org/apache/catalina/WebResourceSet.java b/core/src/main/java/org/apache/catalina/WebResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/WebResourceSet.java rename to core/src/main/java/org/apache/catalina/WebResourceSet.java diff --git a/src/main/java/org/apache/catalina/Wrapper.java b/core/src/main/java/org/apache/catalina/Wrapper.java similarity index 100% rename from src/main/java/org/apache/catalina/Wrapper.java rename to core/src/main/java/org/apache/catalina/Wrapper.java diff --git a/src/main/java/org/apache/catalina/ant/AbstractCatalinaCommandTask.java b/core/src/main/java/org/apache/catalina/ant/AbstractCatalinaCommandTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/AbstractCatalinaCommandTask.java rename to core/src/main/java/org/apache/catalina/ant/AbstractCatalinaCommandTask.java diff --git a/src/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java b/core/src/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java rename to core/src/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java diff --git a/src/main/java/org/apache/catalina/ant/BaseRedirectorHelperTask.java b/core/src/main/java/org/apache/catalina/ant/BaseRedirectorHelperTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/BaseRedirectorHelperTask.java rename to core/src/main/java/org/apache/catalina/ant/BaseRedirectorHelperTask.java diff --git a/src/main/java/org/apache/catalina/ant/DeployTask.java b/core/src/main/java/org/apache/catalina/ant/DeployTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/DeployTask.java rename to core/src/main/java/org/apache/catalina/ant/DeployTask.java diff --git a/src/main/java/org/apache/catalina/ant/FindLeaksTask.java b/core/src/main/java/org/apache/catalina/ant/FindLeaksTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/FindLeaksTask.java rename to core/src/main/java/org/apache/catalina/ant/FindLeaksTask.java diff --git a/src/main/java/org/apache/catalina/ant/JKStatusUpdateTask.java b/core/src/main/java/org/apache/catalina/ant/JKStatusUpdateTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/JKStatusUpdateTask.java rename to core/src/main/java/org/apache/catalina/ant/JKStatusUpdateTask.java diff --git a/src/main/java/org/apache/catalina/ant/JMXGetTask.java b/core/src/main/java/org/apache/catalina/ant/JMXGetTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/JMXGetTask.java rename to core/src/main/java/org/apache/catalina/ant/JMXGetTask.java diff --git a/src/main/java/org/apache/catalina/ant/JMXQueryTask.java b/core/src/main/java/org/apache/catalina/ant/JMXQueryTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/JMXQueryTask.java rename to core/src/main/java/org/apache/catalina/ant/JMXQueryTask.java diff --git a/src/main/java/org/apache/catalina/ant/JMXSetTask.java b/core/src/main/java/org/apache/catalina/ant/JMXSetTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/JMXSetTask.java rename to core/src/main/java/org/apache/catalina/ant/JMXSetTask.java diff --git a/src/main/java/org/apache/catalina/ant/ListTask.java b/core/src/main/java/org/apache/catalina/ant/ListTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/ListTask.java rename to core/src/main/java/org/apache/catalina/ant/ListTask.java diff --git a/src/main/java/org/apache/catalina/ant/ReloadTask.java b/core/src/main/java/org/apache/catalina/ant/ReloadTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/ReloadTask.java rename to core/src/main/java/org/apache/catalina/ant/ReloadTask.java diff --git a/src/main/java/org/apache/catalina/ant/ResourcesTask.java b/core/src/main/java/org/apache/catalina/ant/ResourcesTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/ResourcesTask.java rename to core/src/main/java/org/apache/catalina/ant/ResourcesTask.java diff --git a/src/main/java/org/apache/catalina/ant/ServerinfoTask.java b/core/src/main/java/org/apache/catalina/ant/ServerinfoTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/ServerinfoTask.java rename to core/src/main/java/org/apache/catalina/ant/ServerinfoTask.java diff --git a/src/main/java/org/apache/catalina/ant/SessionsTask.java b/core/src/main/java/org/apache/catalina/ant/SessionsTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/SessionsTask.java rename to core/src/main/java/org/apache/catalina/ant/SessionsTask.java diff --git a/src/main/java/org/apache/catalina/ant/SslConnectorCiphersTask.java b/core/src/main/java/org/apache/catalina/ant/SslConnectorCiphersTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/SslConnectorCiphersTask.java rename to core/src/main/java/org/apache/catalina/ant/SslConnectorCiphersTask.java diff --git a/src/main/java/org/apache/catalina/ant/StartTask.java b/core/src/main/java/org/apache/catalina/ant/StartTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/StartTask.java rename to core/src/main/java/org/apache/catalina/ant/StartTask.java diff --git a/src/main/java/org/apache/catalina/ant/StopTask.java b/core/src/main/java/org/apache/catalina/ant/StopTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/StopTask.java rename to core/src/main/java/org/apache/catalina/ant/StopTask.java diff --git a/src/main/java/org/apache/catalina/ant/ThreaddumpTask.java b/core/src/main/java/org/apache/catalina/ant/ThreaddumpTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/ThreaddumpTask.java rename to core/src/main/java/org/apache/catalina/ant/ThreaddumpTask.java diff --git a/src/main/java/org/apache/catalina/ant/UndeployTask.java b/core/src/main/java/org/apache/catalina/ant/UndeployTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/UndeployTask.java rename to core/src/main/java/org/apache/catalina/ant/UndeployTask.java diff --git a/src/main/java/org/apache/catalina/ant/ValidatorTask.java b/core/src/main/java/org/apache/catalina/ant/ValidatorTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/ValidatorTask.java rename to core/src/main/java/org/apache/catalina/ant/ValidatorTask.java diff --git a/src/main/java/org/apache/catalina/ant/VminfoTask.java b/core/src/main/java/org/apache/catalina/ant/VminfoTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/VminfoTask.java rename to core/src/main/java/org/apache/catalina/ant/VminfoTask.java diff --git a/src/main/java/org/apache/catalina/ant/antlib.xml b/core/src/main/java/org/apache/catalina/ant/antlib.xml similarity index 100% rename from src/main/java/org/apache/catalina/ant/antlib.xml rename to core/src/main/java/org/apache/catalina/ant/antlib.xml diff --git a/src/main/java/org/apache/catalina/ant/catalina.tasks b/core/src/main/java/org/apache/catalina/ant/catalina.tasks similarity index 100% rename from src/main/java/org/apache/catalina/ant/catalina.tasks rename to core/src/main/java/org/apache/catalina/ant/catalina.tasks diff --git a/src/main/java/org/apache/catalina/ant/jmx/Arg.java b/core/src/main/java/org/apache/catalina/ant/jmx/Arg.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/Arg.java rename to core/src/main/java/org/apache/catalina/ant/jmx/Arg.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorCondition.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorCondition.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorCondition.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorCondition.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorConditionBase.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorCreateTask.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorEqualsCondition.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorGetTask.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorInvokeTask.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorQueryTask.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java rename to core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorUnregisterTask.java diff --git a/src/main/java/org/apache/catalina/ant/jmx/antlib.xml b/core/src/main/java/org/apache/catalina/ant/jmx/antlib.xml similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/antlib.xml rename to core/src/main/java/org/apache/catalina/ant/jmx/antlib.xml diff --git a/src/main/java/org/apache/catalina/ant/jmx/jmxaccessor.tasks b/core/src/main/java/org/apache/catalina/ant/jmx/jmxaccessor.tasks similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/jmxaccessor.tasks rename to core/src/main/java/org/apache/catalina/ant/jmx/jmxaccessor.tasks diff --git a/src/main/java/org/apache/catalina/ant/jmx/package.html b/core/src/main/java/org/apache/catalina/ant/jmx/package.html similarity index 100% rename from src/main/java/org/apache/catalina/ant/jmx/package.html rename to core/src/main/java/org/apache/catalina/ant/jmx/package.html diff --git a/src/main/java/org/apache/catalina/ant/package.html b/core/src/main/java/org/apache/catalina/ant/package.html similarity index 100% rename from src/main/java/org/apache/catalina/ant/package.html rename to core/src/main/java/org/apache/catalina/ant/package.html diff --git a/src/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java b/core/src/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java rename to core/src/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java diff --git a/src/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java rename to core/src/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java diff --git a/src/main/java/org/apache/catalina/authenticator/Constants.java b/core/src/main/java/org/apache/catalina/authenticator/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/Constants.java rename to core/src/main/java/org/apache/catalina/authenticator/Constants.java diff --git a/src/main/java/org/apache/catalina/authenticator/DigestAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/DigestAuthenticator.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/DigestAuthenticator.java rename to core/src/main/java/org/apache/catalina/authenticator/DigestAuthenticator.java diff --git a/src/main/java/org/apache/catalina/authenticator/FormAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/FormAuthenticator.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/FormAuthenticator.java rename to core/src/main/java/org/apache/catalina/authenticator/FormAuthenticator.java diff --git a/src/main/java/org/apache/catalina/authenticator/LocalStrings.properties b/core/src/main/java/org/apache/catalina/authenticator/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/authenticator/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/authenticator/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/authenticator/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/authenticator/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/authenticator/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/authenticator/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/authenticator/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java rename to core/src/main/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java diff --git a/src/main/java/org/apache/catalina/authenticator/SSLAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/SSLAuthenticator.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/SSLAuthenticator.java rename to core/src/main/java/org/apache/catalina/authenticator/SSLAuthenticator.java diff --git a/src/main/java/org/apache/catalina/authenticator/SavedRequest.java b/core/src/main/java/org/apache/catalina/authenticator/SavedRequest.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/SavedRequest.java rename to core/src/main/java/org/apache/catalina/authenticator/SavedRequest.java diff --git a/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java b/core/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/SingleSignOn.java rename to core/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java diff --git a/src/main/java/org/apache/catalina/authenticator/SingleSignOnEntry.java b/core/src/main/java/org/apache/catalina/authenticator/SingleSignOnEntry.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/SingleSignOnEntry.java rename to core/src/main/java/org/apache/catalina/authenticator/SingleSignOnEntry.java diff --git a/src/main/java/org/apache/catalina/authenticator/SingleSignOnListener.java b/core/src/main/java/org/apache/catalina/authenticator/SingleSignOnListener.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/SingleSignOnListener.java rename to core/src/main/java/org/apache/catalina/authenticator/SingleSignOnListener.java diff --git a/src/main/java/org/apache/catalina/authenticator/SingleSignOnSessionKey.java b/core/src/main/java/org/apache/catalina/authenticator/SingleSignOnSessionKey.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/SingleSignOnSessionKey.java rename to core/src/main/java/org/apache/catalina/authenticator/SingleSignOnSessionKey.java diff --git a/src/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java rename to core/src/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java diff --git a/src/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java rename to core/src/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java diff --git a/src/main/java/org/apache/catalina/authenticator/jaspic/CallbackHandlerImpl.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/CallbackHandlerImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/jaspic/CallbackHandlerImpl.java rename to core/src/main/java/org/apache/catalina/authenticator/jaspic/CallbackHandlerImpl.java diff --git a/src/main/java/org/apache/catalina/authenticator/jaspic/LocalStrings.properties b/core/src/main/java/org/apache/catalina/authenticator/jaspic/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/jaspic/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/authenticator/jaspic/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/authenticator/jaspic/MessageInfoImpl.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/MessageInfoImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/jaspic/MessageInfoImpl.java rename to core/src/main/java/org/apache/catalina/authenticator/jaspic/MessageInfoImpl.java diff --git a/src/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java rename to core/src/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java diff --git a/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleAuthConfigProvider.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleAuthConfigProvider.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/jaspic/SimpleAuthConfigProvider.java rename to core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleAuthConfigProvider.java diff --git a/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java rename to core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java diff --git a/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java rename to core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthContext.java diff --git a/src/main/java/org/apache/catalina/authenticator/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/authenticator/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/authenticator/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/authenticator/package.html b/core/src/main/java/org/apache/catalina/authenticator/package.html similarity index 100% rename from src/main/java/org/apache/catalina/authenticator/package.html rename to core/src/main/java/org/apache/catalina/authenticator/package.html diff --git a/src/main/java/org/apache/catalina/connector/ClientAbortException.java b/core/src/main/java/org/apache/catalina/connector/ClientAbortException.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/ClientAbortException.java rename to core/src/main/java/org/apache/catalina/connector/ClientAbortException.java diff --git a/src/main/java/org/apache/catalina/connector/Connector.java b/core/src/main/java/org/apache/catalina/connector/Connector.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/Connector.java rename to core/src/main/java/org/apache/catalina/connector/Connector.java diff --git a/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java b/core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/CoyoteAdapter.java rename to core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java diff --git a/src/main/java/org/apache/catalina/connector/CoyoteInputStream.java b/core/src/main/java/org/apache/catalina/connector/CoyoteInputStream.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/CoyoteInputStream.java rename to core/src/main/java/org/apache/catalina/connector/CoyoteInputStream.java diff --git a/src/main/java/org/apache/catalina/connector/CoyoteOutputStream.java b/core/src/main/java/org/apache/catalina/connector/CoyoteOutputStream.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/CoyoteOutputStream.java rename to core/src/main/java/org/apache/catalina/connector/CoyoteOutputStream.java diff --git a/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java b/core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/CoyotePrincipal.java rename to core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java diff --git a/src/main/java/org/apache/catalina/connector/CoyoteReader.java b/core/src/main/java/org/apache/catalina/connector/CoyoteReader.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/CoyoteReader.java rename to core/src/main/java/org/apache/catalina/connector/CoyoteReader.java diff --git a/src/main/java/org/apache/catalina/connector/CoyoteWriter.java b/core/src/main/java/org/apache/catalina/connector/CoyoteWriter.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/CoyoteWriter.java rename to core/src/main/java/org/apache/catalina/connector/CoyoteWriter.java diff --git a/src/main/java/org/apache/catalina/connector/InputBuffer.java b/core/src/main/java/org/apache/catalina/connector/InputBuffer.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/InputBuffer.java rename to core/src/main/java/org/apache/catalina/connector/InputBuffer.java diff --git a/src/main/java/org/apache/catalina/connector/LocalStrings.properties b/core/src/main/java/org/apache/catalina/connector/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/connector/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/connector/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/connector/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/connector/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/connector/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/connector/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/connector/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/connector/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/connector/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/connector/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/connector/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/connector/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/connector/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/connector/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/connector/OutputBuffer.java b/core/src/main/java/org/apache/catalina/connector/OutputBuffer.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/OutputBuffer.java rename to core/src/main/java/org/apache/catalina/connector/OutputBuffer.java diff --git a/src/main/java/org/apache/catalina/connector/Request.java b/core/src/main/java/org/apache/catalina/connector/Request.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/Request.java rename to core/src/main/java/org/apache/catalina/connector/Request.java diff --git a/src/main/java/org/apache/catalina/connector/RequestFacade.java b/core/src/main/java/org/apache/catalina/connector/RequestFacade.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/RequestFacade.java rename to core/src/main/java/org/apache/catalina/connector/RequestFacade.java diff --git a/src/main/java/org/apache/catalina/connector/Response.java b/core/src/main/java/org/apache/catalina/connector/Response.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/Response.java rename to core/src/main/java/org/apache/catalina/connector/Response.java diff --git a/src/main/java/org/apache/catalina/connector/ResponseFacade.java b/core/src/main/java/org/apache/catalina/connector/ResponseFacade.java similarity index 100% rename from src/main/java/org/apache/catalina/connector/ResponseFacade.java rename to core/src/main/java/org/apache/catalina/connector/ResponseFacade.java diff --git a/src/main/java/org/apache/catalina/connector/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/connector/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/connector/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/connector/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/core/AccessLogAdapter.java b/core/src/main/java/org/apache/catalina/core/AccessLogAdapter.java similarity index 100% rename from src/main/java/org/apache/catalina/core/AccessLogAdapter.java rename to core/src/main/java/org/apache/catalina/core/AccessLogAdapter.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationContext.java b/core/src/main/java/org/apache/catalina/core/ApplicationContext.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationContext.java rename to core/src/main/java/org/apache/catalina/core/ApplicationContext.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationContextFacade.java b/core/src/main/java/org/apache/catalina/core/ApplicationContextFacade.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationContextFacade.java rename to core/src/main/java/org/apache/catalina/core/ApplicationContextFacade.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java b/core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationDispatcher.java rename to core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationFilterChain.java b/core/src/main/java/org/apache/catalina/core/ApplicationFilterChain.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationFilterChain.java rename to core/src/main/java/org/apache/catalina/core/ApplicationFilterChain.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationFilterConfig.java b/core/src/main/java/org/apache/catalina/core/ApplicationFilterConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationFilterConfig.java rename to core/src/main/java/org/apache/catalina/core/ApplicationFilterConfig.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationFilterFactory.java b/core/src/main/java/org/apache/catalina/core/ApplicationFilterFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationFilterFactory.java rename to core/src/main/java/org/apache/catalina/core/ApplicationFilterFactory.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationFilterRegistration.java b/core/src/main/java/org/apache/catalina/core/ApplicationFilterRegistration.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationFilterRegistration.java rename to core/src/main/java/org/apache/catalina/core/ApplicationFilterRegistration.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationHttpRequest.java b/core/src/main/java/org/apache/catalina/core/ApplicationHttpRequest.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationHttpRequest.java rename to core/src/main/java/org/apache/catalina/core/ApplicationHttpRequest.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationHttpResponse.java b/core/src/main/java/org/apache/catalina/core/ApplicationHttpResponse.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationHttpResponse.java rename to core/src/main/java/org/apache/catalina/core/ApplicationHttpResponse.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationMapping.java b/core/src/main/java/org/apache/catalina/core/ApplicationMapping.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationMapping.java rename to core/src/main/java/org/apache/catalina/core/ApplicationMapping.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationPart.java b/core/src/main/java/org/apache/catalina/core/ApplicationPart.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationPart.java rename to core/src/main/java/org/apache/catalina/core/ApplicationPart.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java b/core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java rename to core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationRequest.java b/core/src/main/java/org/apache/catalina/core/ApplicationRequest.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationRequest.java rename to core/src/main/java/org/apache/catalina/core/ApplicationRequest.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationResponse.java b/core/src/main/java/org/apache/catalina/core/ApplicationResponse.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationResponse.java rename to core/src/main/java/org/apache/catalina/core/ApplicationResponse.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationServletRegistration.java b/core/src/main/java/org/apache/catalina/core/ApplicationServletRegistration.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationServletRegistration.java rename to core/src/main/java/org/apache/catalina/core/ApplicationServletRegistration.java diff --git a/src/main/java/org/apache/catalina/core/ApplicationSessionCookieConfig.java b/core/src/main/java/org/apache/catalina/core/ApplicationSessionCookieConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ApplicationSessionCookieConfig.java rename to core/src/main/java/org/apache/catalina/core/ApplicationSessionCookieConfig.java diff --git a/src/main/java/org/apache/catalina/core/AprLifecycleListener.java b/core/src/main/java/org/apache/catalina/core/AprLifecycleListener.java similarity index 100% rename from src/main/java/org/apache/catalina/core/AprLifecycleListener.java rename to core/src/main/java/org/apache/catalina/core/AprLifecycleListener.java diff --git a/src/main/java/org/apache/catalina/core/AsyncContextImpl.java b/core/src/main/java/org/apache/catalina/core/AsyncContextImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/core/AsyncContextImpl.java rename to core/src/main/java/org/apache/catalina/core/AsyncContextImpl.java diff --git a/src/main/java/org/apache/catalina/core/AsyncListenerWrapper.java b/core/src/main/java/org/apache/catalina/core/AsyncListenerWrapper.java similarity index 100% rename from src/main/java/org/apache/catalina/core/AsyncListenerWrapper.java rename to core/src/main/java/org/apache/catalina/core/AsyncListenerWrapper.java diff --git a/src/main/java/org/apache/catalina/core/Constants.java b/core/src/main/java/org/apache/catalina/core/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/core/Constants.java rename to core/src/main/java/org/apache/catalina/core/Constants.java diff --git a/src/main/java/org/apache/catalina/core/ContainerBase.java b/core/src/main/java/org/apache/catalina/core/ContainerBase.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ContainerBase.java rename to core/src/main/java/org/apache/catalina/core/ContainerBase.java diff --git a/src/main/java/org/apache/catalina/core/DefaultInstanceManager.java b/core/src/main/java/org/apache/catalina/core/DefaultInstanceManager.java similarity index 100% rename from src/main/java/org/apache/catalina/core/DefaultInstanceManager.java rename to core/src/main/java/org/apache/catalina/core/DefaultInstanceManager.java diff --git a/src/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java b/core/src/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java similarity index 100% rename from src/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java rename to core/src/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java diff --git a/src/main/java/org/apache/catalina/core/LocalStrings.properties b/core/src/main/java/org/apache/catalina/core/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/core/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/core/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/core/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/core/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/core/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/core/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/core/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/core/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/core/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/core/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/core/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/core/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/core/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/core/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/core/NamingContextListener.java b/core/src/main/java/org/apache/catalina/core/NamingContextListener.java similarity index 100% rename from src/main/java/org/apache/catalina/core/NamingContextListener.java rename to core/src/main/java/org/apache/catalina/core/NamingContextListener.java diff --git a/src/main/java/org/apache/catalina/core/RestrictedFilters.properties b/core/src/main/java/org/apache/catalina/core/RestrictedFilters.properties similarity index 100% rename from src/main/java/org/apache/catalina/core/RestrictedFilters.properties rename to core/src/main/java/org/apache/catalina/core/RestrictedFilters.properties diff --git a/src/main/java/org/apache/catalina/core/RestrictedListeners.properties b/core/src/main/java/org/apache/catalina/core/RestrictedListeners.properties similarity index 100% rename from src/main/java/org/apache/catalina/core/RestrictedListeners.properties rename to core/src/main/java/org/apache/catalina/core/RestrictedListeners.properties diff --git a/src/main/java/org/apache/catalina/core/RestrictedServlets.properties b/core/src/main/java/org/apache/catalina/core/RestrictedServlets.properties similarity index 100% rename from src/main/java/org/apache/catalina/core/RestrictedServlets.properties rename to core/src/main/java/org/apache/catalina/core/RestrictedServlets.properties diff --git a/src/main/java/org/apache/catalina/core/StandardContext.java b/core/src/main/java/org/apache/catalina/core/StandardContext.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardContext.java rename to core/src/main/java/org/apache/catalina/core/StandardContext.java diff --git a/src/main/java/org/apache/catalina/core/StandardContextValve.java b/core/src/main/java/org/apache/catalina/core/StandardContextValve.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardContextValve.java rename to core/src/main/java/org/apache/catalina/core/StandardContextValve.java diff --git a/src/main/java/org/apache/catalina/core/StandardEngine.java b/core/src/main/java/org/apache/catalina/core/StandardEngine.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardEngine.java rename to core/src/main/java/org/apache/catalina/core/StandardEngine.java diff --git a/src/main/java/org/apache/catalina/core/StandardEngineValve.java b/core/src/main/java/org/apache/catalina/core/StandardEngineValve.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardEngineValve.java rename to core/src/main/java/org/apache/catalina/core/StandardEngineValve.java diff --git a/src/main/java/org/apache/catalina/core/StandardHost.java b/core/src/main/java/org/apache/catalina/core/StandardHost.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardHost.java rename to core/src/main/java/org/apache/catalina/core/StandardHost.java diff --git a/src/main/java/org/apache/catalina/core/StandardHostValve.java b/core/src/main/java/org/apache/catalina/core/StandardHostValve.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardHostValve.java rename to core/src/main/java/org/apache/catalina/core/StandardHostValve.java diff --git a/src/main/java/org/apache/catalina/core/StandardPipeline.java b/core/src/main/java/org/apache/catalina/core/StandardPipeline.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardPipeline.java rename to core/src/main/java/org/apache/catalina/core/StandardPipeline.java diff --git a/src/main/java/org/apache/catalina/core/StandardServer.java b/core/src/main/java/org/apache/catalina/core/StandardServer.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardServer.java rename to core/src/main/java/org/apache/catalina/core/StandardServer.java diff --git a/src/main/java/org/apache/catalina/core/StandardService.java b/core/src/main/java/org/apache/catalina/core/StandardService.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardService.java rename to core/src/main/java/org/apache/catalina/core/StandardService.java diff --git a/src/main/java/org/apache/catalina/core/StandardThreadExecutor.java b/core/src/main/java/org/apache/catalina/core/StandardThreadExecutor.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardThreadExecutor.java rename to core/src/main/java/org/apache/catalina/core/StandardThreadExecutor.java diff --git a/src/main/java/org/apache/catalina/core/StandardWrapper.java b/core/src/main/java/org/apache/catalina/core/StandardWrapper.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardWrapper.java rename to core/src/main/java/org/apache/catalina/core/StandardWrapper.java diff --git a/src/main/java/org/apache/catalina/core/StandardWrapperFacade.java b/core/src/main/java/org/apache/catalina/core/StandardWrapperFacade.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardWrapperFacade.java rename to core/src/main/java/org/apache/catalina/core/StandardWrapperFacade.java diff --git a/src/main/java/org/apache/catalina/core/StandardWrapperValve.java b/core/src/main/java/org/apache/catalina/core/StandardWrapperValve.java similarity index 100% rename from src/main/java/org/apache/catalina/core/StandardWrapperValve.java rename to core/src/main/java/org/apache/catalina/core/StandardWrapperValve.java diff --git a/src/main/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java b/core/src/main/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java similarity index 100% rename from src/main/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java rename to core/src/main/java/org/apache/catalina/core/ThreadLocalLeakPreventionListener.java diff --git a/src/main/java/org/apache/catalina/core/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/core/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/core/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/core/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/deploy/LocalStrings.properties b/core/src/main/java/org/apache/catalina/deploy/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/deploy/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/deploy/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java b/core/src/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java rename to core/src/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java diff --git a/src/main/java/org/apache/catalina/deploy/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/deploy/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/deploy/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/deploy/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java b/core/src/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java rename to core/src/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java diff --git a/src/main/java/org/apache/catalina/filters/Constants.java b/core/src/main/java/org/apache/catalina/filters/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/Constants.java rename to core/src/main/java/org/apache/catalina/filters/Constants.java diff --git a/src/main/java/org/apache/catalina/filters/CorsFilter.java b/core/src/main/java/org/apache/catalina/filters/CorsFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/CorsFilter.java rename to core/src/main/java/org/apache/catalina/filters/CorsFilter.java diff --git a/src/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java b/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java rename to core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java diff --git a/src/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java b/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java rename to core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java diff --git a/src/main/java/org/apache/catalina/filters/ExpiresFilter.java b/core/src/main/java/org/apache/catalina/filters/ExpiresFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/ExpiresFilter.java rename to core/src/main/java/org/apache/catalina/filters/ExpiresFilter.java diff --git a/src/main/java/org/apache/catalina/filters/FailedRequestFilter.java b/core/src/main/java/org/apache/catalina/filters/FailedRequestFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/FailedRequestFilter.java rename to core/src/main/java/org/apache/catalina/filters/FailedRequestFilter.java diff --git a/src/main/java/org/apache/catalina/filters/FilterBase.java b/core/src/main/java/org/apache/catalina/filters/FilterBase.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/FilterBase.java rename to core/src/main/java/org/apache/catalina/filters/FilterBase.java diff --git a/src/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java b/core/src/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java rename to core/src/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java diff --git a/src/main/java/org/apache/catalina/filters/LocalStrings.properties b/core/src/main/java/org/apache/catalina/filters/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/filters/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/filters/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/filters/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/filters/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/filters/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/filters/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/filters/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/filters/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/filters/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/filters/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/filters/RemoteAddrFilter.java b/core/src/main/java/org/apache/catalina/filters/RemoteAddrFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/RemoteAddrFilter.java rename to core/src/main/java/org/apache/catalina/filters/RemoteAddrFilter.java diff --git a/src/main/java/org/apache/catalina/filters/RemoteHostFilter.java b/core/src/main/java/org/apache/catalina/filters/RemoteHostFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/RemoteHostFilter.java rename to core/src/main/java/org/apache/catalina/filters/RemoteHostFilter.java diff --git a/src/main/java/org/apache/catalina/filters/RemoteIpFilter.java b/core/src/main/java/org/apache/catalina/filters/RemoteIpFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/RemoteIpFilter.java rename to core/src/main/java/org/apache/catalina/filters/RemoteIpFilter.java diff --git a/src/main/java/org/apache/catalina/filters/RequestDumperFilter.java b/core/src/main/java/org/apache/catalina/filters/RequestDumperFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/RequestDumperFilter.java rename to core/src/main/java/org/apache/catalina/filters/RequestDumperFilter.java diff --git a/src/main/java/org/apache/catalina/filters/RequestFilter.java b/core/src/main/java/org/apache/catalina/filters/RequestFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/RequestFilter.java rename to core/src/main/java/org/apache/catalina/filters/RequestFilter.java diff --git a/src/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java b/core/src/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java rename to core/src/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java diff --git a/src/main/java/org/apache/catalina/filters/SetCharacterEncodingFilter.java b/core/src/main/java/org/apache/catalina/filters/SetCharacterEncodingFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/SetCharacterEncodingFilter.java rename to core/src/main/java/org/apache/catalina/filters/SetCharacterEncodingFilter.java diff --git a/src/main/java/org/apache/catalina/filters/WebdavFixFilter.java b/core/src/main/java/org/apache/catalina/filters/WebdavFixFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/filters/WebdavFixFilter.java rename to core/src/main/java/org/apache/catalina/filters/WebdavFixFilter.java diff --git a/src/main/java/org/apache/catalina/ha/CatalinaCluster.java b/core/src/main/java/org/apache/catalina/ha/CatalinaCluster.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/CatalinaCluster.java rename to core/src/main/java/org/apache/catalina/ha/CatalinaCluster.java diff --git a/src/main/java/org/apache/catalina/ha/ClusterDeployer.java b/core/src/main/java/org/apache/catalina/ha/ClusterDeployer.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/ClusterDeployer.java rename to core/src/main/java/org/apache/catalina/ha/ClusterDeployer.java diff --git a/src/main/java/org/apache/catalina/ha/ClusterListener.java b/core/src/main/java/org/apache/catalina/ha/ClusterListener.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/ClusterListener.java rename to core/src/main/java/org/apache/catalina/ha/ClusterListener.java diff --git a/src/main/java/org/apache/catalina/ha/ClusterManager.java b/core/src/main/java/org/apache/catalina/ha/ClusterManager.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/ClusterManager.java rename to core/src/main/java/org/apache/catalina/ha/ClusterManager.java diff --git a/src/main/java/org/apache/catalina/ha/ClusterMessage.java b/core/src/main/java/org/apache/catalina/ha/ClusterMessage.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/ClusterMessage.java rename to core/src/main/java/org/apache/catalina/ha/ClusterMessage.java diff --git a/src/main/java/org/apache/catalina/ha/ClusterMessageBase.java b/core/src/main/java/org/apache/catalina/ha/ClusterMessageBase.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/ClusterMessageBase.java rename to core/src/main/java/org/apache/catalina/ha/ClusterMessageBase.java diff --git a/src/main/java/org/apache/catalina/ha/ClusterRuleSet.java b/core/src/main/java/org/apache/catalina/ha/ClusterRuleSet.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/ClusterRuleSet.java rename to core/src/main/java/org/apache/catalina/ha/ClusterRuleSet.java diff --git a/src/main/java/org/apache/catalina/ha/ClusterSession.java b/core/src/main/java/org/apache/catalina/ha/ClusterSession.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/ClusterSession.java rename to core/src/main/java/org/apache/catalina/ha/ClusterSession.java diff --git a/src/main/java/org/apache/catalina/ha/ClusterValve.java b/core/src/main/java/org/apache/catalina/ha/ClusterValve.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/ClusterValve.java rename to core/src/main/java/org/apache/catalina/ha/ClusterValve.java diff --git a/src/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java b/core/src/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java rename to core/src/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java diff --git a/src/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java b/core/src/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java rename to core/src/main/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java diff --git a/src/main/java/org/apache/catalina/ha/authenticator/LocalStrings.properties b/core/src/main/java/org/apache/catalina/ha/authenticator/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/ha/authenticator/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/ha/authenticator/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/ha/authenticator/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/ha/authenticator/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/ha/authenticator/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/ha/authenticator/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/ha/backend/CollectedInfo.java b/core/src/main/java/org/apache/catalina/ha/backend/CollectedInfo.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/backend/CollectedInfo.java rename to core/src/main/java/org/apache/catalina/ha/backend/CollectedInfo.java diff --git a/src/main/java/org/apache/catalina/ha/backend/HeartbeatListener.java b/core/src/main/java/org/apache/catalina/ha/backend/HeartbeatListener.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/backend/HeartbeatListener.java rename to core/src/main/java/org/apache/catalina/ha/backend/HeartbeatListener.java diff --git a/src/main/java/org/apache/catalina/ha/backend/MultiCastSender.java b/core/src/main/java/org/apache/catalina/ha/backend/MultiCastSender.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/backend/MultiCastSender.java rename to core/src/main/java/org/apache/catalina/ha/backend/MultiCastSender.java diff --git a/src/main/java/org/apache/catalina/ha/backend/Proxy.java b/core/src/main/java/org/apache/catalina/ha/backend/Proxy.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/backend/Proxy.java rename to core/src/main/java/org/apache/catalina/ha/backend/Proxy.java diff --git a/src/main/java/org/apache/catalina/ha/backend/Sender.java b/core/src/main/java/org/apache/catalina/ha/backend/Sender.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/backend/Sender.java rename to core/src/main/java/org/apache/catalina/ha/backend/Sender.java diff --git a/src/main/java/org/apache/catalina/ha/backend/TcpSender.java b/core/src/main/java/org/apache/catalina/ha/backend/TcpSender.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/backend/TcpSender.java rename to core/src/main/java/org/apache/catalina/ha/backend/TcpSender.java diff --git a/src/main/java/org/apache/catalina/ha/context/LocalStrings.properties b/core/src/main/java/org/apache/catalina/ha/context/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/ha/context/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/ha/context/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/ha/context/ReplicatedContext.java b/core/src/main/java/org/apache/catalina/ha/context/ReplicatedContext.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/context/ReplicatedContext.java rename to core/src/main/java/org/apache/catalina/ha/context/ReplicatedContext.java diff --git a/src/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java b/core/src/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java rename to core/src/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java diff --git a/src/main/java/org/apache/catalina/ha/deploy/FileChangeListener.java b/core/src/main/java/org/apache/catalina/ha/deploy/FileChangeListener.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/deploy/FileChangeListener.java rename to core/src/main/java/org/apache/catalina/ha/deploy/FileChangeListener.java diff --git a/src/main/java/org/apache/catalina/ha/deploy/FileMessage.java b/core/src/main/java/org/apache/catalina/ha/deploy/FileMessage.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/deploy/FileMessage.java rename to core/src/main/java/org/apache/catalina/ha/deploy/FileMessage.java diff --git a/src/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java b/core/src/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java rename to core/src/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java diff --git a/src/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties b/core/src/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/ha/deploy/UndeployMessage.java b/core/src/main/java/org/apache/catalina/ha/deploy/UndeployMessage.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/deploy/UndeployMessage.java rename to core/src/main/java/org/apache/catalina/ha/deploy/UndeployMessage.java diff --git a/src/main/java/org/apache/catalina/ha/deploy/WarWatcher.java b/core/src/main/java/org/apache/catalina/ha/deploy/WarWatcher.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/deploy/WarWatcher.java rename to core/src/main/java/org/apache/catalina/ha/deploy/WarWatcher.java diff --git a/src/main/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/ha/deploy/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/ha/package.html b/core/src/main/java/org/apache/catalina/ha/package.html similarity index 100% rename from src/main/java/org/apache/catalina/ha/package.html rename to core/src/main/java/org/apache/catalina/ha/package.html diff --git a/src/main/java/org/apache/catalina/ha/session/BackupManager.java b/core/src/main/java/org/apache/catalina/ha/session/BackupManager.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/BackupManager.java rename to core/src/main/java/org/apache/catalina/ha/session/BackupManager.java diff --git a/src/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java b/core/src/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java rename to core/src/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java diff --git a/src/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java b/core/src/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java rename to core/src/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java diff --git a/src/main/java/org/apache/catalina/ha/session/DeltaManager.java b/core/src/main/java/org/apache/catalina/ha/session/DeltaManager.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/DeltaManager.java rename to core/src/main/java/org/apache/catalina/ha/session/DeltaManager.java diff --git a/src/main/java/org/apache/catalina/ha/session/DeltaRequest.java b/core/src/main/java/org/apache/catalina/ha/session/DeltaRequest.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/DeltaRequest.java rename to core/src/main/java/org/apache/catalina/ha/session/DeltaRequest.java diff --git a/src/main/java/org/apache/catalina/ha/session/DeltaSession.java b/core/src/main/java/org/apache/catalina/ha/session/DeltaSession.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/DeltaSession.java rename to core/src/main/java/org/apache/catalina/ha/session/DeltaSession.java diff --git a/src/main/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java b/core/src/main/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java rename to core/src/main/java/org/apache/catalina/ha/session/JvmRouteBinderValve.java diff --git a/src/main/java/org/apache/catalina/ha/session/LocalStrings.properties b/core/src/main/java/org/apache/catalina/ha/session/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/ha/session/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java b/core/src/main/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java rename to core/src/main/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java diff --git a/src/main/java/org/apache/catalina/ha/session/SessionMessage.java b/core/src/main/java/org/apache/catalina/ha/session/SessionMessage.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/SessionMessage.java rename to core/src/main/java/org/apache/catalina/ha/session/SessionMessage.java diff --git a/src/main/java/org/apache/catalina/ha/session/SessionMessageImpl.java b/core/src/main/java/org/apache/catalina/ha/session/SessionMessageImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/SessionMessageImpl.java rename to core/src/main/java/org/apache/catalina/ha/session/SessionMessageImpl.java diff --git a/src/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/ha/tcp/Constants.java b/core/src/main/java/org/apache/catalina/ha/tcp/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/tcp/Constants.java rename to core/src/main/java/org/apache/catalina/ha/tcp/Constants.java diff --git a/src/main/java/org/apache/catalina/ha/tcp/LocalStrings.properties b/core/src/main/java/org/apache/catalina/ha/tcp/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/ha/tcp/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/ha/tcp/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/ha/tcp/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/ha/tcp/ReplicationValve.java b/core/src/main/java/org/apache/catalina/ha/tcp/ReplicationValve.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/tcp/ReplicationValve.java rename to core/src/main/java/org/apache/catalina/ha/tcp/ReplicationValve.java diff --git a/src/main/java/org/apache/catalina/ha/tcp/SendMessageData.java b/core/src/main/java/org/apache/catalina/ha/tcp/SendMessageData.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/tcp/SendMessageData.java rename to core/src/main/java/org/apache/catalina/ha/tcp/SendMessageData.java diff --git a/src/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java b/core/src/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java similarity index 100% rename from src/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java rename to core/src/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java diff --git a/src/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/loader/Constants.java b/core/src/main/java/org/apache/catalina/loader/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/loader/Constants.java rename to core/src/main/java/org/apache/catalina/loader/Constants.java diff --git a/src/main/java/org/apache/catalina/loader/JdbcLeakPrevention.java b/core/src/main/java/org/apache/catalina/loader/JdbcLeakPrevention.java similarity index 100% rename from src/main/java/org/apache/catalina/loader/JdbcLeakPrevention.java rename to core/src/main/java/org/apache/catalina/loader/JdbcLeakPrevention.java diff --git a/src/main/java/org/apache/catalina/loader/LocalStrings.properties b/core/src/main/java/org/apache/catalina/loader/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/loader/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/loader/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/loader/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/loader/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/loader/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/loader/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/loader/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/loader/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/loader/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/loader/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/loader/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/loader/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/loader/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/loader/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/loader/ParallelWebappClassLoader.java b/core/src/main/java/org/apache/catalina/loader/ParallelWebappClassLoader.java similarity index 100% rename from src/main/java/org/apache/catalina/loader/ParallelWebappClassLoader.java rename to core/src/main/java/org/apache/catalina/loader/ParallelWebappClassLoader.java diff --git a/src/main/java/org/apache/catalina/loader/ResourceEntry.java b/core/src/main/java/org/apache/catalina/loader/ResourceEntry.java similarity index 100% rename from src/main/java/org/apache/catalina/loader/ResourceEntry.java rename to core/src/main/java/org/apache/catalina/loader/ResourceEntry.java diff --git a/src/main/java/org/apache/catalina/loader/WebappClassLoader.java b/core/src/main/java/org/apache/catalina/loader/WebappClassLoader.java similarity index 100% rename from src/main/java/org/apache/catalina/loader/WebappClassLoader.java rename to core/src/main/java/org/apache/catalina/loader/WebappClassLoader.java diff --git a/src/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java b/core/src/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java similarity index 100% rename from src/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java rename to core/src/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java diff --git a/src/main/java/org/apache/catalina/loader/WebappLoader.java b/core/src/main/java/org/apache/catalina/loader/WebappLoader.java similarity index 100% rename from src/main/java/org/apache/catalina/loader/WebappLoader.java rename to core/src/main/java/org/apache/catalina/loader/WebappLoader.java diff --git a/src/main/java/org/apache/catalina/loader/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/loader/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/loader/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/loader/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/manager/Constants.java b/core/src/main/java/org/apache/catalina/manager/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/Constants.java rename to core/src/main/java/org/apache/catalina/manager/Constants.java diff --git a/src/main/java/org/apache/catalina/manager/DummyProxySession.java b/core/src/main/java/org/apache/catalina/manager/DummyProxySession.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/DummyProxySession.java rename to core/src/main/java/org/apache/catalina/manager/DummyProxySession.java diff --git a/src/main/java/org/apache/catalina/manager/HTMLManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/HTMLManagerServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/HTMLManagerServlet.java rename to core/src/main/java/org/apache/catalina/manager/HTMLManagerServlet.java diff --git a/src/main/java/org/apache/catalina/manager/JMXProxyServlet.java b/core/src/main/java/org/apache/catalina/manager/JMXProxyServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/JMXProxyServlet.java rename to core/src/main/java/org/apache/catalina/manager/JMXProxyServlet.java diff --git a/src/main/java/org/apache/catalina/manager/JspHelper.java b/core/src/main/java/org/apache/catalina/manager/JspHelper.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/JspHelper.java rename to core/src/main/java/org/apache/catalina/manager/JspHelper.java diff --git a/src/main/java/org/apache/catalina/manager/LocalStrings.properties b/core/src/main/java/org/apache/catalina/manager/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/manager/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/manager/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/manager/LocalStrings_de.properties b/core/src/main/java/org/apache/catalina/manager/LocalStrings_de.properties similarity index 100% rename from src/main/java/org/apache/catalina/manager/LocalStrings_de.properties rename to core/src/main/java/org/apache/catalina/manager/LocalStrings_de.properties diff --git a/src/main/java/org/apache/catalina/manager/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/manager/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/manager/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/manager/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/manager/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/manager/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/manager/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/manager/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/manager/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/manager/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/manager/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/manager/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/manager/ManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/ManagerServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/ManagerServlet.java rename to core/src/main/java/org/apache/catalina/manager/ManagerServlet.java diff --git a/src/main/java/org/apache/catalina/manager/StatusManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/StatusManagerServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/StatusManagerServlet.java rename to core/src/main/java/org/apache/catalina/manager/StatusManagerServlet.java diff --git a/src/main/java/org/apache/catalina/manager/StatusTransformer.java b/core/src/main/java/org/apache/catalina/manager/StatusTransformer.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/StatusTransformer.java rename to core/src/main/java/org/apache/catalina/manager/StatusTransformer.java diff --git a/src/main/java/org/apache/catalina/manager/host/Constants.java b/core/src/main/java/org/apache/catalina/manager/host/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/host/Constants.java rename to core/src/main/java/org/apache/catalina/manager/host/Constants.java diff --git a/src/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java rename to core/src/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java diff --git a/src/main/java/org/apache/catalina/manager/host/HostManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/host/HostManagerServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/host/HostManagerServlet.java rename to core/src/main/java/org/apache/catalina/manager/host/HostManagerServlet.java diff --git a/src/main/java/org/apache/catalina/manager/host/LocalStrings.properties b/core/src/main/java/org/apache/catalina/manager/host/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/manager/host/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/manager/host/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/manager/util/BaseSessionComparator.java b/core/src/main/java/org/apache/catalina/manager/util/BaseSessionComparator.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/util/BaseSessionComparator.java rename to core/src/main/java/org/apache/catalina/manager/util/BaseSessionComparator.java diff --git a/src/main/java/org/apache/catalina/manager/util/SessionUtils.java b/core/src/main/java/org/apache/catalina/manager/util/SessionUtils.java similarity index 100% rename from src/main/java/org/apache/catalina/manager/util/SessionUtils.java rename to core/src/main/java/org/apache/catalina/manager/util/SessionUtils.java diff --git a/src/main/java/org/apache/catalina/mapper/Constants.java b/core/src/main/java/org/apache/catalina/mapper/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/mapper/Constants.java rename to core/src/main/java/org/apache/catalina/mapper/Constants.java diff --git a/src/main/java/org/apache/catalina/mapper/LocalStrings.properties b/core/src/main/java/org/apache/catalina/mapper/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/mapper/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/mapper/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/mapper/Mapper.java b/core/src/main/java/org/apache/catalina/mapper/Mapper.java similarity index 100% rename from src/main/java/org/apache/catalina/mapper/Mapper.java rename to core/src/main/java/org/apache/catalina/mapper/Mapper.java diff --git a/src/main/java/org/apache/catalina/mapper/MapperListener.java b/core/src/main/java/org/apache/catalina/mapper/MapperListener.java similarity index 100% rename from src/main/java/org/apache/catalina/mapper/MapperListener.java rename to core/src/main/java/org/apache/catalina/mapper/MapperListener.java diff --git a/src/main/java/org/apache/catalina/mapper/MappingData.java b/core/src/main/java/org/apache/catalina/mapper/MappingData.java similarity index 100% rename from src/main/java/org/apache/catalina/mapper/MappingData.java rename to core/src/main/java/org/apache/catalina/mapper/MappingData.java diff --git a/src/main/java/org/apache/catalina/mapper/WrapperMappingInfo.java b/core/src/main/java/org/apache/catalina/mapper/WrapperMappingInfo.java similarity index 100% rename from src/main/java/org/apache/catalina/mapper/WrapperMappingInfo.java rename to core/src/main/java/org/apache/catalina/mapper/WrapperMappingInfo.java diff --git a/src/main/java/org/apache/catalina/mapper/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/mapper/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/mapper/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/mapper/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java b/core/src/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/ClassNameMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ClassNameMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/ClassNameMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/ClassNameMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/ConnectorMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ConnectorMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/ConnectorMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/ConnectorMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/ContainerMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContainerMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/ContainerMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/ContainerMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/ContextMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContextMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/ContextMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/ContextMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java b/core/src/main/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java rename to core/src/main/java/org/apache/catalina/mbeans/GlobalResourcesLifecycleListener.java diff --git a/src/main/java/org/apache/catalina/mbeans/GroupMBean.java b/core/src/main/java/org/apache/catalina/mbeans/GroupMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/GroupMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/GroupMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java b/core/src/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java rename to core/src/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java diff --git a/src/main/java/org/apache/catalina/mbeans/LocalStrings.properties b/core/src/main/java/org/apache/catalina/mbeans/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/mbeans/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/mbeans/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/mbeans/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/mbeans/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/mbeans/MBeanDumper.java b/core/src/main/java/org/apache/catalina/mbeans/MBeanDumper.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/MBeanDumper.java rename to core/src/main/java/org/apache/catalina/mbeans/MBeanDumper.java diff --git a/src/main/java/org/apache/catalina/mbeans/MBeanFactory.java b/core/src/main/java/org/apache/catalina/mbeans/MBeanFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/MBeanFactory.java rename to core/src/main/java/org/apache/catalina/mbeans/MBeanFactory.java diff --git a/src/main/java/org/apache/catalina/mbeans/MBeanUtils.java b/core/src/main/java/org/apache/catalina/mbeans/MBeanUtils.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/MBeanUtils.java rename to core/src/main/java/org/apache/catalina/mbeans/MBeanUtils.java diff --git a/src/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java b/core/src/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java b/core/src/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/RoleMBean.java b/core/src/main/java/org/apache/catalina/mbeans/RoleMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/RoleMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/RoleMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/ServiceMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ServiceMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/ServiceMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/ServiceMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/UserMBean.java b/core/src/main/java/org/apache/catalina/mbeans/UserMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/UserMBean.java rename to core/src/main/java/org/apache/catalina/mbeans/UserMBean.java diff --git a/src/main/java/org/apache/catalina/mbeans/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/mbeans/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/mbeans/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/mbeans/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/realm/CombinedRealm.java b/core/src/main/java/org/apache/catalina/realm/CombinedRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/CombinedRealm.java rename to core/src/main/java/org/apache/catalina/realm/CombinedRealm.java diff --git a/src/main/java/org/apache/catalina/realm/DataSourceRealm.java b/core/src/main/java/org/apache/catalina/realm/DataSourceRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/DataSourceRealm.java rename to core/src/main/java/org/apache/catalina/realm/DataSourceRealm.java diff --git a/src/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java b/core/src/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java rename to core/src/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java diff --git a/src/main/java/org/apache/catalina/realm/GenericPrincipal.java b/core/src/main/java/org/apache/catalina/realm/GenericPrincipal.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/GenericPrincipal.java rename to core/src/main/java/org/apache/catalina/realm/GenericPrincipal.java diff --git a/src/main/java/org/apache/catalina/realm/JAASCallbackHandler.java b/core/src/main/java/org/apache/catalina/realm/JAASCallbackHandler.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/JAASCallbackHandler.java rename to core/src/main/java/org/apache/catalina/realm/JAASCallbackHandler.java diff --git a/src/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java b/core/src/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java rename to core/src/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java diff --git a/src/main/java/org/apache/catalina/realm/JAASRealm.java b/core/src/main/java/org/apache/catalina/realm/JAASRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/JAASRealm.java rename to core/src/main/java/org/apache/catalina/realm/JAASRealm.java diff --git a/src/main/java/org/apache/catalina/realm/JDBCRealm.java b/core/src/main/java/org/apache/catalina/realm/JDBCRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/JDBCRealm.java rename to core/src/main/java/org/apache/catalina/realm/JDBCRealm.java diff --git a/src/main/java/org/apache/catalina/realm/JNDIRealm.java b/core/src/main/java/org/apache/catalina/realm/JNDIRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/JNDIRealm.java rename to core/src/main/java/org/apache/catalina/realm/JNDIRealm.java diff --git a/src/main/java/org/apache/catalina/realm/LocalStrings.properties b/core/src/main/java/org/apache/catalina/realm/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/realm/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/realm/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/realm/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/realm/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/realm/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/realm/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/realm/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/realm/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/realm/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/realm/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/realm/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/realm/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/realm/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/realm/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/realm/LockOutRealm.java b/core/src/main/java/org/apache/catalina/realm/LockOutRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/LockOutRealm.java rename to core/src/main/java/org/apache/catalina/realm/LockOutRealm.java diff --git a/src/main/java/org/apache/catalina/realm/MemoryRealm.java b/core/src/main/java/org/apache/catalina/realm/MemoryRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/MemoryRealm.java rename to core/src/main/java/org/apache/catalina/realm/MemoryRealm.java diff --git a/src/main/java/org/apache/catalina/realm/MemoryRuleSet.java b/core/src/main/java/org/apache/catalina/realm/MemoryRuleSet.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/MemoryRuleSet.java rename to core/src/main/java/org/apache/catalina/realm/MemoryRuleSet.java diff --git a/src/main/java/org/apache/catalina/realm/MessageDigestCredentialHandler.java b/core/src/main/java/org/apache/catalina/realm/MessageDigestCredentialHandler.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/MessageDigestCredentialHandler.java rename to core/src/main/java/org/apache/catalina/realm/MessageDigestCredentialHandler.java diff --git a/src/main/java/org/apache/catalina/realm/NestedCredentialHandler.java b/core/src/main/java/org/apache/catalina/realm/NestedCredentialHandler.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/NestedCredentialHandler.java rename to core/src/main/java/org/apache/catalina/realm/NestedCredentialHandler.java diff --git a/src/main/java/org/apache/catalina/realm/NullRealm.java b/core/src/main/java/org/apache/catalina/realm/NullRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/NullRealm.java rename to core/src/main/java/org/apache/catalina/realm/NullRealm.java diff --git a/src/main/java/org/apache/catalina/realm/RealmBase.java b/core/src/main/java/org/apache/catalina/realm/RealmBase.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/RealmBase.java rename to core/src/main/java/org/apache/catalina/realm/RealmBase.java diff --git a/src/main/java/org/apache/catalina/realm/SecretKeyCredentialHandler.java b/core/src/main/java/org/apache/catalina/realm/SecretKeyCredentialHandler.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/SecretKeyCredentialHandler.java rename to core/src/main/java/org/apache/catalina/realm/SecretKeyCredentialHandler.java diff --git a/src/main/java/org/apache/catalina/realm/UserDatabaseRealm.java b/core/src/main/java/org/apache/catalina/realm/UserDatabaseRealm.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/UserDatabaseRealm.java rename to core/src/main/java/org/apache/catalina/realm/UserDatabaseRealm.java diff --git a/src/main/java/org/apache/catalina/realm/X509SubjectDnRetriever.java b/core/src/main/java/org/apache/catalina/realm/X509SubjectDnRetriever.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/X509SubjectDnRetriever.java rename to core/src/main/java/org/apache/catalina/realm/X509SubjectDnRetriever.java diff --git a/src/main/java/org/apache/catalina/realm/X509UsernameRetriever.java b/core/src/main/java/org/apache/catalina/realm/X509UsernameRetriever.java similarity index 100% rename from src/main/java/org/apache/catalina/realm/X509UsernameRetriever.java rename to core/src/main/java/org/apache/catalina/realm/X509UsernameRetriever.java diff --git a/src/main/java/org/apache/catalina/realm/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/realm/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/realm/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/realm/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/realm/package.html b/core/src/main/java/org/apache/catalina/realm/package.html similarity index 100% rename from src/main/java/org/apache/catalina/realm/package.html rename to core/src/main/java/org/apache/catalina/realm/package.html diff --git a/src/main/java/org/apache/catalina/security/Constants.java b/core/src/main/java/org/apache/catalina/security/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/security/Constants.java rename to core/src/main/java/org/apache/catalina/security/Constants.java diff --git a/src/main/java/org/apache/catalina/security/LocalStrings.properties b/core/src/main/java/org/apache/catalina/security/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/security/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/security/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/security/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/security/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/security/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/security/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/security/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/security/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/security/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/security/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/security/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/security/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/security/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/security/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/security/SecurityClassLoad.java b/core/src/main/java/org/apache/catalina/security/SecurityClassLoad.java similarity index 100% rename from src/main/java/org/apache/catalina/security/SecurityClassLoad.java rename to core/src/main/java/org/apache/catalina/security/SecurityClassLoad.java diff --git a/src/main/java/org/apache/catalina/security/SecurityConfig.java b/core/src/main/java/org/apache/catalina/security/SecurityConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/security/SecurityConfig.java rename to core/src/main/java/org/apache/catalina/security/SecurityConfig.java diff --git a/src/main/java/org/apache/catalina/security/SecurityListener.java b/core/src/main/java/org/apache/catalina/security/SecurityListener.java similarity index 100% rename from src/main/java/org/apache/catalina/security/SecurityListener.java rename to core/src/main/java/org/apache/catalina/security/SecurityListener.java diff --git a/src/main/java/org/apache/catalina/security/SecurityUtil.java b/core/src/main/java/org/apache/catalina/security/SecurityUtil.java similarity index 100% rename from src/main/java/org/apache/catalina/security/SecurityUtil.java rename to core/src/main/java/org/apache/catalina/security/SecurityUtil.java diff --git a/src/main/java/org/apache/catalina/servlets/CGIServlet.java b/core/src/main/java/org/apache/catalina/servlets/CGIServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/servlets/CGIServlet.java rename to core/src/main/java/org/apache/catalina/servlets/CGIServlet.java diff --git a/src/main/java/org/apache/catalina/servlets/Constants.java b/core/src/main/java/org/apache/catalina/servlets/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/servlets/Constants.java rename to core/src/main/java/org/apache/catalina/servlets/Constants.java diff --git a/src/main/java/org/apache/catalina/servlets/DefaultServlet.java b/core/src/main/java/org/apache/catalina/servlets/DefaultServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/servlets/DefaultServlet.java rename to core/src/main/java/org/apache/catalina/servlets/DefaultServlet.java diff --git a/src/main/java/org/apache/catalina/servlets/LocalStrings.properties b/core/src/main/java/org/apache/catalina/servlets/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/servlets/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/servlets/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/servlets/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/servlets/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/servlets/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/servlets/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/servlets/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/servlets/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/servlets/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/servlets/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/servlets/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/servlets/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/servlets/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/servlets/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/servlets/WebdavServlet.java b/core/src/main/java/org/apache/catalina/servlets/WebdavServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/servlets/WebdavServlet.java rename to core/src/main/java/org/apache/catalina/servlets/WebdavServlet.java diff --git a/src/main/java/org/apache/catalina/servlets/package.html b/core/src/main/java/org/apache/catalina/servlets/package.html similarity index 100% rename from src/main/java/org/apache/catalina/servlets/package.html rename to core/src/main/java/org/apache/catalina/servlets/package.html diff --git a/src/main/java/org/apache/catalina/session/Constants.java b/core/src/main/java/org/apache/catalina/session/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/session/Constants.java rename to core/src/main/java/org/apache/catalina/session/Constants.java diff --git a/src/main/java/org/apache/catalina/session/FileStore.java b/core/src/main/java/org/apache/catalina/session/FileStore.java similarity index 100% rename from src/main/java/org/apache/catalina/session/FileStore.java rename to core/src/main/java/org/apache/catalina/session/FileStore.java diff --git a/src/main/java/org/apache/catalina/session/JDBCStore.java b/core/src/main/java/org/apache/catalina/session/JDBCStore.java similarity index 100% rename from src/main/java/org/apache/catalina/session/JDBCStore.java rename to core/src/main/java/org/apache/catalina/session/JDBCStore.java diff --git a/src/main/java/org/apache/catalina/session/LocalStrings.properties b/core/src/main/java/org/apache/catalina/session/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/session/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/session/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/session/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/session/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/session/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/session/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/session/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/session/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/session/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/session/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/session/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/session/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/session/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/session/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/session/ManagerBase.java b/core/src/main/java/org/apache/catalina/session/ManagerBase.java similarity index 100% rename from src/main/java/org/apache/catalina/session/ManagerBase.java rename to core/src/main/java/org/apache/catalina/session/ManagerBase.java diff --git a/src/main/java/org/apache/catalina/session/PersistentManager.java b/core/src/main/java/org/apache/catalina/session/PersistentManager.java similarity index 100% rename from src/main/java/org/apache/catalina/session/PersistentManager.java rename to core/src/main/java/org/apache/catalina/session/PersistentManager.java diff --git a/src/main/java/org/apache/catalina/session/PersistentManagerBase.java b/core/src/main/java/org/apache/catalina/session/PersistentManagerBase.java similarity index 100% rename from src/main/java/org/apache/catalina/session/PersistentManagerBase.java rename to core/src/main/java/org/apache/catalina/session/PersistentManagerBase.java diff --git a/src/main/java/org/apache/catalina/session/StandardManager.java b/core/src/main/java/org/apache/catalina/session/StandardManager.java similarity index 100% rename from src/main/java/org/apache/catalina/session/StandardManager.java rename to core/src/main/java/org/apache/catalina/session/StandardManager.java diff --git a/src/main/java/org/apache/catalina/session/StandardSession.java b/core/src/main/java/org/apache/catalina/session/StandardSession.java similarity index 100% rename from src/main/java/org/apache/catalina/session/StandardSession.java rename to core/src/main/java/org/apache/catalina/session/StandardSession.java diff --git a/src/main/java/org/apache/catalina/session/StandardSessionFacade.java b/core/src/main/java/org/apache/catalina/session/StandardSessionFacade.java similarity index 100% rename from src/main/java/org/apache/catalina/session/StandardSessionFacade.java rename to core/src/main/java/org/apache/catalina/session/StandardSessionFacade.java diff --git a/src/main/java/org/apache/catalina/session/StoreBase.java b/core/src/main/java/org/apache/catalina/session/StoreBase.java similarity index 100% rename from src/main/java/org/apache/catalina/session/StoreBase.java rename to core/src/main/java/org/apache/catalina/session/StoreBase.java diff --git a/src/main/java/org/apache/catalina/session/TooManyActiveSessionsException.java b/core/src/main/java/org/apache/catalina/session/TooManyActiveSessionsException.java similarity index 100% rename from src/main/java/org/apache/catalina/session/TooManyActiveSessionsException.java rename to core/src/main/java/org/apache/catalina/session/TooManyActiveSessionsException.java diff --git a/src/main/java/org/apache/catalina/session/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/session/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/session/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/session/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/session/package.html b/core/src/main/java/org/apache/catalina/session/package.html similarity index 100% rename from src/main/java/org/apache/catalina/session/package.html rename to core/src/main/java/org/apache/catalina/session/package.html diff --git a/src/main/java/org/apache/catalina/ssi/ByteArrayServletOutputStream.java b/core/src/main/java/org/apache/catalina/ssi/ByteArrayServletOutputStream.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/ByteArrayServletOutputStream.java rename to core/src/main/java/org/apache/catalina/ssi/ByteArrayServletOutputStream.java diff --git a/src/main/java/org/apache/catalina/ssi/ExpressionParseTree.java b/core/src/main/java/org/apache/catalina/ssi/ExpressionParseTree.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/ExpressionParseTree.java rename to core/src/main/java/org/apache/catalina/ssi/ExpressionParseTree.java diff --git a/src/main/java/org/apache/catalina/ssi/ExpressionTokenizer.java b/core/src/main/java/org/apache/catalina/ssi/ExpressionTokenizer.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/ExpressionTokenizer.java rename to core/src/main/java/org/apache/catalina/ssi/ExpressionTokenizer.java diff --git a/src/main/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java b/core/src/main/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java rename to core/src/main/java/org/apache/catalina/ssi/ResponseIncludeWrapper.java diff --git a/src/main/java/org/apache/catalina/ssi/SSICommand.java b/core/src/main/java/org/apache/catalina/ssi/SSICommand.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSICommand.java rename to core/src/main/java/org/apache/catalina/ssi/SSICommand.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIConditional.java b/core/src/main/java/org/apache/catalina/ssi/SSIConditional.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIConditional.java rename to core/src/main/java/org/apache/catalina/ssi/SSIConditional.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIConditionalState.java b/core/src/main/java/org/apache/catalina/ssi/SSIConditionalState.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIConditionalState.java rename to core/src/main/java/org/apache/catalina/ssi/SSIConditionalState.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIConfig.java b/core/src/main/java/org/apache/catalina/ssi/SSIConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIConfig.java rename to core/src/main/java/org/apache/catalina/ssi/SSIConfig.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIEcho.java b/core/src/main/java/org/apache/catalina/ssi/SSIEcho.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIEcho.java rename to core/src/main/java/org/apache/catalina/ssi/SSIEcho.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIExec.java b/core/src/main/java/org/apache/catalina/ssi/SSIExec.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIExec.java rename to core/src/main/java/org/apache/catalina/ssi/SSIExec.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIExternalResolver.java b/core/src/main/java/org/apache/catalina/ssi/SSIExternalResolver.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIExternalResolver.java rename to core/src/main/java/org/apache/catalina/ssi/SSIExternalResolver.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIFilter.java b/core/src/main/java/org/apache/catalina/ssi/SSIFilter.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIFilter.java rename to core/src/main/java/org/apache/catalina/ssi/SSIFilter.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIFlastmod.java b/core/src/main/java/org/apache/catalina/ssi/SSIFlastmod.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIFlastmod.java rename to core/src/main/java/org/apache/catalina/ssi/SSIFlastmod.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIFsize.java b/core/src/main/java/org/apache/catalina/ssi/SSIFsize.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIFsize.java rename to core/src/main/java/org/apache/catalina/ssi/SSIFsize.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIInclude.java b/core/src/main/java/org/apache/catalina/ssi/SSIInclude.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIInclude.java rename to core/src/main/java/org/apache/catalina/ssi/SSIInclude.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIMediator.java b/core/src/main/java/org/apache/catalina/ssi/SSIMediator.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIMediator.java rename to core/src/main/java/org/apache/catalina/ssi/SSIMediator.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIPrintenv.java b/core/src/main/java/org/apache/catalina/ssi/SSIPrintenv.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIPrintenv.java rename to core/src/main/java/org/apache/catalina/ssi/SSIPrintenv.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIProcessor.java b/core/src/main/java/org/apache/catalina/ssi/SSIProcessor.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIProcessor.java rename to core/src/main/java/org/apache/catalina/ssi/SSIProcessor.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIServlet.java b/core/src/main/java/org/apache/catalina/ssi/SSIServlet.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIServlet.java rename to core/src/main/java/org/apache/catalina/ssi/SSIServlet.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java b/core/src/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java rename to core/src/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java b/core/src/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java rename to core/src/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java diff --git a/src/main/java/org/apache/catalina/ssi/SSISet.java b/core/src/main/java/org/apache/catalina/ssi/SSISet.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSISet.java rename to core/src/main/java/org/apache/catalina/ssi/SSISet.java diff --git a/src/main/java/org/apache/catalina/ssi/SSIStopProcessingException.java b/core/src/main/java/org/apache/catalina/ssi/SSIStopProcessingException.java similarity index 100% rename from src/main/java/org/apache/catalina/ssi/SSIStopProcessingException.java rename to core/src/main/java/org/apache/catalina/ssi/SSIStopProcessingException.java diff --git a/src/main/java/org/apache/catalina/ssi/package.html b/core/src/main/java/org/apache/catalina/ssi/package.html similarity index 100% rename from src/main/java/org/apache/catalina/ssi/package.html rename to core/src/main/java/org/apache/catalina/ssi/package.html diff --git a/src/main/java/org/apache/catalina/startup/Authenticators.properties b/core/src/main/java/org/apache/catalina/startup/Authenticators.properties similarity index 100% rename from src/main/java/org/apache/catalina/startup/Authenticators.properties rename to core/src/main/java/org/apache/catalina/startup/Authenticators.properties diff --git a/src/main/java/org/apache/catalina/startup/Bootstrap.java b/core/src/main/java/org/apache/catalina/startup/Bootstrap.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/Bootstrap.java rename to core/src/main/java/org/apache/catalina/startup/Bootstrap.java diff --git a/src/main/java/org/apache/catalina/startup/Catalina.java b/core/src/main/java/org/apache/catalina/startup/Catalina.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/Catalina.java rename to core/src/main/java/org/apache/catalina/startup/Catalina.java diff --git a/src/main/java/org/apache/catalina/startup/CatalinaProperties.java b/core/src/main/java/org/apache/catalina/startup/CatalinaProperties.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/CatalinaProperties.java rename to core/src/main/java/org/apache/catalina/startup/CatalinaProperties.java diff --git a/src/main/java/org/apache/catalina/startup/CertificateCreateRule.java b/core/src/main/java/org/apache/catalina/startup/CertificateCreateRule.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/CertificateCreateRule.java rename to core/src/main/java/org/apache/catalina/startup/CertificateCreateRule.java diff --git a/src/main/java/org/apache/catalina/startup/ClassLoaderFactory.java b/core/src/main/java/org/apache/catalina/startup/ClassLoaderFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/ClassLoaderFactory.java rename to core/src/main/java/org/apache/catalina/startup/ClassLoaderFactory.java diff --git a/src/main/java/org/apache/catalina/startup/ConnectorCreateRule.java b/core/src/main/java/org/apache/catalina/startup/ConnectorCreateRule.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/ConnectorCreateRule.java rename to core/src/main/java/org/apache/catalina/startup/ConnectorCreateRule.java diff --git a/src/main/java/org/apache/catalina/startup/Constants.java b/core/src/main/java/org/apache/catalina/startup/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/Constants.java rename to core/src/main/java/org/apache/catalina/startup/Constants.java diff --git a/src/main/java/org/apache/catalina/startup/ContextConfig.java b/core/src/main/java/org/apache/catalina/startup/ContextConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/ContextConfig.java rename to core/src/main/java/org/apache/catalina/startup/ContextConfig.java diff --git a/src/main/java/org/apache/catalina/startup/ContextRuleSet.java b/core/src/main/java/org/apache/catalina/startup/ContextRuleSet.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/ContextRuleSet.java rename to core/src/main/java/org/apache/catalina/startup/ContextRuleSet.java diff --git a/src/main/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java b/core/src/main/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java rename to core/src/main/java/org/apache/catalina/startup/CopyParentClassLoaderRule.java diff --git a/src/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java b/core/src/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java rename to core/src/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java diff --git a/src/main/java/org/apache/catalina/startup/EngineConfig.java b/core/src/main/java/org/apache/catalina/startup/EngineConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/EngineConfig.java rename to core/src/main/java/org/apache/catalina/startup/EngineConfig.java diff --git a/src/main/java/org/apache/catalina/startup/EngineRuleSet.java b/core/src/main/java/org/apache/catalina/startup/EngineRuleSet.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/EngineRuleSet.java rename to core/src/main/java/org/apache/catalina/startup/EngineRuleSet.java diff --git a/src/main/java/org/apache/catalina/startup/ExpandWar.java b/core/src/main/java/org/apache/catalina/startup/ExpandWar.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/ExpandWar.java rename to core/src/main/java/org/apache/catalina/startup/ExpandWar.java diff --git a/src/main/java/org/apache/catalina/startup/FailedContext.java b/core/src/main/java/org/apache/catalina/startup/FailedContext.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/FailedContext.java rename to core/src/main/java/org/apache/catalina/startup/FailedContext.java diff --git a/src/main/java/org/apache/catalina/startup/HomesUserDatabase.java b/core/src/main/java/org/apache/catalina/startup/HomesUserDatabase.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/HomesUserDatabase.java rename to core/src/main/java/org/apache/catalina/startup/HomesUserDatabase.java diff --git a/src/main/java/org/apache/catalina/startup/HostConfig.java b/core/src/main/java/org/apache/catalina/startup/HostConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/HostConfig.java rename to core/src/main/java/org/apache/catalina/startup/HostConfig.java diff --git a/src/main/java/org/apache/catalina/startup/HostRuleSet.java b/core/src/main/java/org/apache/catalina/startup/HostRuleSet.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/HostRuleSet.java rename to core/src/main/java/org/apache/catalina/startup/HostRuleSet.java diff --git a/src/main/java/org/apache/catalina/startup/LifecycleListenerRule.java b/core/src/main/java/org/apache/catalina/startup/LifecycleListenerRule.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/LifecycleListenerRule.java rename to core/src/main/java/org/apache/catalina/startup/LifecycleListenerRule.java diff --git a/src/main/java/org/apache/catalina/startup/LocalStrings.properties b/core/src/main/java/org/apache/catalina/startup/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/startup/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/startup/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/startup/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/startup/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/startup/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/startup/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/startup/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/startup/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/startup/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/startup/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/startup/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/startup/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/startup/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/startup/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/startup/NamingRuleSet.java b/core/src/main/java/org/apache/catalina/startup/NamingRuleSet.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/NamingRuleSet.java rename to core/src/main/java/org/apache/catalina/startup/NamingRuleSet.java diff --git a/src/main/java/org/apache/catalina/startup/PasswdUserDatabase.java b/core/src/main/java/org/apache/catalina/startup/PasswdUserDatabase.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/PasswdUserDatabase.java rename to core/src/main/java/org/apache/catalina/startup/PasswdUserDatabase.java diff --git a/src/main/java/org/apache/catalina/startup/RealmRuleSet.java b/core/src/main/java/org/apache/catalina/startup/RealmRuleSet.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/RealmRuleSet.java rename to core/src/main/java/org/apache/catalina/startup/RealmRuleSet.java diff --git a/src/main/java/org/apache/catalina/startup/SafeForkJoinWorkerThreadFactory.java b/core/src/main/java/org/apache/catalina/startup/SafeForkJoinWorkerThreadFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/SafeForkJoinWorkerThreadFactory.java rename to core/src/main/java/org/apache/catalina/startup/SafeForkJoinWorkerThreadFactory.java diff --git a/src/main/java/org/apache/catalina/startup/SetAllPropertiesRule.java b/core/src/main/java/org/apache/catalina/startup/SetAllPropertiesRule.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/SetAllPropertiesRule.java rename to core/src/main/java/org/apache/catalina/startup/SetAllPropertiesRule.java diff --git a/src/main/java/org/apache/catalina/startup/SetContextPropertiesRule.java b/core/src/main/java/org/apache/catalina/startup/SetContextPropertiesRule.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/SetContextPropertiesRule.java rename to core/src/main/java/org/apache/catalina/startup/SetContextPropertiesRule.java diff --git a/src/main/java/org/apache/catalina/startup/SetNextNamingRule.java b/core/src/main/java/org/apache/catalina/startup/SetNextNamingRule.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/SetNextNamingRule.java rename to core/src/main/java/org/apache/catalina/startup/SetNextNamingRule.java diff --git a/src/main/java/org/apache/catalina/startup/Tomcat.java b/core/src/main/java/org/apache/catalina/startup/Tomcat.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/Tomcat.java rename to core/src/main/java/org/apache/catalina/startup/Tomcat.java diff --git a/src/main/java/org/apache/catalina/startup/Tool.java b/core/src/main/java/org/apache/catalina/startup/Tool.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/Tool.java rename to core/src/main/java/org/apache/catalina/startup/Tool.java diff --git a/src/main/java/org/apache/catalina/startup/UserConfig.java b/core/src/main/java/org/apache/catalina/startup/UserConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/UserConfig.java rename to core/src/main/java/org/apache/catalina/startup/UserConfig.java diff --git a/src/main/java/org/apache/catalina/startup/UserDatabase.java b/core/src/main/java/org/apache/catalina/startup/UserDatabase.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/UserDatabase.java rename to core/src/main/java/org/apache/catalina/startup/UserDatabase.java diff --git a/src/main/java/org/apache/catalina/startup/VersionLoggerListener.java b/core/src/main/java/org/apache/catalina/startup/VersionLoggerListener.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/VersionLoggerListener.java rename to core/src/main/java/org/apache/catalina/startup/VersionLoggerListener.java diff --git a/src/main/java/org/apache/catalina/startup/WebAnnotationSet.java b/core/src/main/java/org/apache/catalina/startup/WebAnnotationSet.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/WebAnnotationSet.java rename to core/src/main/java/org/apache/catalina/startup/WebAnnotationSet.java diff --git a/src/main/java/org/apache/catalina/startup/WebappServiceLoader.java b/core/src/main/java/org/apache/catalina/startup/WebappServiceLoader.java similarity index 100% rename from src/main/java/org/apache/catalina/startup/WebappServiceLoader.java rename to core/src/main/java/org/apache/catalina/startup/WebappServiceLoader.java diff --git a/src/main/java/org/apache/catalina/startup/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/startup/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/startup/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/startup/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java b/core/src/main/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/ChannelSF.java b/core/src/main/java/org/apache/catalina/storeconfig/ChannelSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/ChannelSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/ChannelSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/ConnectorSF.java b/core/src/main/java/org/apache/catalina/storeconfig/ConnectorSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/ConnectorSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/ConnectorSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java b/core/src/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java rename to core/src/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java diff --git a/src/main/java/org/apache/catalina/storeconfig/Constants.java b/core/src/main/java/org/apache/catalina/storeconfig/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/Constants.java rename to core/src/main/java/org/apache/catalina/storeconfig/Constants.java diff --git a/src/main/java/org/apache/catalina/storeconfig/CredentialHandlerSF.java b/core/src/main/java/org/apache/catalina/storeconfig/CredentialHandlerSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/CredentialHandlerSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/CredentialHandlerSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/GlobalNamingResourcesSF.java b/core/src/main/java/org/apache/catalina/storeconfig/GlobalNamingResourcesSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/GlobalNamingResourcesSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/GlobalNamingResourcesSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/IStoreConfig.java b/core/src/main/java/org/apache/catalina/storeconfig/IStoreConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/IStoreConfig.java rename to core/src/main/java/org/apache/catalina/storeconfig/IStoreConfig.java diff --git a/src/main/java/org/apache/catalina/storeconfig/IStoreFactory.java b/core/src/main/java/org/apache/catalina/storeconfig/IStoreFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/IStoreFactory.java rename to core/src/main/java/org/apache/catalina/storeconfig/IStoreFactory.java diff --git a/src/main/java/org/apache/catalina/storeconfig/InterceptorSF.java b/core/src/main/java/org/apache/catalina/storeconfig/InterceptorSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/InterceptorSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/InterceptorSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/JarScannerSF.java b/core/src/main/java/org/apache/catalina/storeconfig/JarScannerSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/JarScannerSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/JarScannerSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/LoaderSF.java b/core/src/main/java/org/apache/catalina/storeconfig/LoaderSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/LoaderSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/LoaderSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/LocalStrings.properties b/core/src/main/java/org/apache/catalina/storeconfig/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/storeconfig/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/storeconfig/ManagerSF.java b/core/src/main/java/org/apache/catalina/storeconfig/ManagerSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/ManagerSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/ManagerSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/NamingResourcesSF.java b/core/src/main/java/org/apache/catalina/storeconfig/NamingResourcesSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/NamingResourcesSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/NamingResourcesSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/PersistentManagerSF.java b/core/src/main/java/org/apache/catalina/storeconfig/PersistentManagerSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/PersistentManagerSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/PersistentManagerSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/RealmSF.java b/core/src/main/java/org/apache/catalina/storeconfig/RealmSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/RealmSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/RealmSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java b/core/src/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/SenderSF.java b/core/src/main/java/org/apache/catalina/storeconfig/SenderSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/SenderSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/SenderSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StandardContextSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardContextSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StandardContextSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/StandardContextSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StandardHostSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardHostSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StandardHostSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/StandardHostSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StandardServerSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardServerSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StandardServerSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/StandardServerSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreAppender.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreAppender.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreAppender.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreAppender.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreConfig.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreConfig.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreConfig.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreDescription.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreDescription.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreDescription.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreDescription.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreFileMover.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreFileMover.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreFileMover.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreFileMover.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreLoader.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreLoader.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreLoader.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreLoader.java diff --git a/src/main/java/org/apache/catalina/storeconfig/StoreRegistry.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreRegistry.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/StoreRegistry.java rename to core/src/main/java/org/apache/catalina/storeconfig/StoreRegistry.java diff --git a/src/main/java/org/apache/catalina/storeconfig/WatchedResourceSF.java b/core/src/main/java/org/apache/catalina/storeconfig/WatchedResourceSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/WatchedResourceSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/WatchedResourceSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/WebResourceRootSF.java b/core/src/main/java/org/apache/catalina/storeconfig/WebResourceRootSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/WebResourceRootSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/WebResourceRootSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/WrapperLifecycleSF.java b/core/src/main/java/org/apache/catalina/storeconfig/WrapperLifecycleSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/WrapperLifecycleSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/WrapperLifecycleSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/WrapperListenerSF.java b/core/src/main/java/org/apache/catalina/storeconfig/WrapperListenerSF.java similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/WrapperListenerSF.java rename to core/src/main/java/org/apache/catalina/storeconfig/WrapperListenerSF.java diff --git a/src/main/java/org/apache/catalina/storeconfig/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/storeconfig/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/storeconfig/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/storeconfig/server-registry.xml b/core/src/main/java/org/apache/catalina/storeconfig/server-registry.xml similarity index 100% rename from src/main/java/org/apache/catalina/storeconfig/server-registry.xml rename to core/src/main/java/org/apache/catalina/storeconfig/server-registry.xml diff --git a/src/main/java/org/apache/catalina/tribes/ByteMessage.java b/core/src/main/java/org/apache/catalina/tribes/ByteMessage.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ByteMessage.java rename to core/src/main/java/org/apache/catalina/tribes/ByteMessage.java diff --git a/src/main/java/org/apache/catalina/tribes/Channel.java b/core/src/main/java/org/apache/catalina/tribes/Channel.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/Channel.java rename to core/src/main/java/org/apache/catalina/tribes/Channel.java diff --git a/src/main/java/org/apache/catalina/tribes/ChannelException.java b/core/src/main/java/org/apache/catalina/tribes/ChannelException.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ChannelException.java rename to core/src/main/java/org/apache/catalina/tribes/ChannelException.java diff --git a/src/main/java/org/apache/catalina/tribes/ChannelInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/ChannelInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ChannelInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/ChannelInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/ChannelListener.java b/core/src/main/java/org/apache/catalina/tribes/ChannelListener.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ChannelListener.java rename to core/src/main/java/org/apache/catalina/tribes/ChannelListener.java diff --git a/src/main/java/org/apache/catalina/tribes/ChannelMessage.java b/core/src/main/java/org/apache/catalina/tribes/ChannelMessage.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ChannelMessage.java rename to core/src/main/java/org/apache/catalina/tribes/ChannelMessage.java diff --git a/src/main/java/org/apache/catalina/tribes/ChannelReceiver.java b/core/src/main/java/org/apache/catalina/tribes/ChannelReceiver.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ChannelReceiver.java rename to core/src/main/java/org/apache/catalina/tribes/ChannelReceiver.java diff --git a/src/main/java/org/apache/catalina/tribes/ChannelSender.java b/core/src/main/java/org/apache/catalina/tribes/ChannelSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ChannelSender.java rename to core/src/main/java/org/apache/catalina/tribes/ChannelSender.java diff --git a/src/main/java/org/apache/catalina/tribes/ErrorHandler.java b/core/src/main/java/org/apache/catalina/tribes/ErrorHandler.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ErrorHandler.java rename to core/src/main/java/org/apache/catalina/tribes/ErrorHandler.java diff --git a/src/main/java/org/apache/catalina/tribes/Heartbeat.java b/core/src/main/java/org/apache/catalina/tribes/Heartbeat.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/Heartbeat.java rename to core/src/main/java/org/apache/catalina/tribes/Heartbeat.java diff --git a/src/main/java/org/apache/catalina/tribes/JmxChannel.java b/core/src/main/java/org/apache/catalina/tribes/JmxChannel.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/JmxChannel.java rename to core/src/main/java/org/apache/catalina/tribes/JmxChannel.java diff --git a/src/main/java/org/apache/catalina/tribes/ManagedChannel.java b/core/src/main/java/org/apache/catalina/tribes/ManagedChannel.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/ManagedChannel.java rename to core/src/main/java/org/apache/catalina/tribes/ManagedChannel.java diff --git a/src/main/java/org/apache/catalina/tribes/Member.java b/core/src/main/java/org/apache/catalina/tribes/Member.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/Member.java rename to core/src/main/java/org/apache/catalina/tribes/Member.java diff --git a/src/main/java/org/apache/catalina/tribes/MembershipListener.java b/core/src/main/java/org/apache/catalina/tribes/MembershipListener.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/MembershipListener.java rename to core/src/main/java/org/apache/catalina/tribes/MembershipListener.java diff --git a/src/main/java/org/apache/catalina/tribes/MembershipService.java b/core/src/main/java/org/apache/catalina/tribes/MembershipService.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/MembershipService.java rename to core/src/main/java/org/apache/catalina/tribes/MembershipService.java diff --git a/src/main/java/org/apache/catalina/tribes/MessageListener.java b/core/src/main/java/org/apache/catalina/tribes/MessageListener.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/MessageListener.java rename to core/src/main/java/org/apache/catalina/tribes/MessageListener.java diff --git a/src/main/java/org/apache/catalina/tribes/RemoteProcessException.java b/core/src/main/java/org/apache/catalina/tribes/RemoteProcessException.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/RemoteProcessException.java rename to core/src/main/java/org/apache/catalina/tribes/RemoteProcessException.java diff --git a/src/main/java/org/apache/catalina/tribes/UniqueId.java b/core/src/main/java/org/apache/catalina/tribes/UniqueId.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/UniqueId.java rename to core/src/main/java/org/apache/catalina/tribes/UniqueId.java diff --git a/src/main/java/org/apache/catalina/tribes/group/AbsoluteOrder.java b/core/src/main/java/org/apache/catalina/tribes/group/AbsoluteOrder.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/AbsoluteOrder.java rename to core/src/main/java/org/apache/catalina/tribes/group/AbsoluteOrder.java diff --git a/src/main/java/org/apache/catalina/tribes/group/ChannelCoordinator.java b/core/src/main/java/org/apache/catalina/tribes/group/ChannelCoordinator.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/ChannelCoordinator.java rename to core/src/main/java/org/apache/catalina/tribes/group/ChannelCoordinator.java diff --git a/src/main/java/org/apache/catalina/tribes/group/ChannelInterceptorBase.java b/core/src/main/java/org/apache/catalina/tribes/group/ChannelInterceptorBase.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/ChannelInterceptorBase.java rename to core/src/main/java/org/apache/catalina/tribes/group/ChannelInterceptorBase.java diff --git a/src/main/java/org/apache/catalina/tribes/group/ExtendedRpcCallback.java b/core/src/main/java/org/apache/catalina/tribes/group/ExtendedRpcCallback.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/ExtendedRpcCallback.java rename to core/src/main/java/org/apache/catalina/tribes/group/ExtendedRpcCallback.java diff --git a/src/main/java/org/apache/catalina/tribes/group/GroupChannel.java b/core/src/main/java/org/apache/catalina/tribes/group/GroupChannel.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/GroupChannel.java rename to core/src/main/java/org/apache/catalina/tribes/group/GroupChannel.java diff --git a/src/main/java/org/apache/catalina/tribes/group/GroupChannelMBean.java b/core/src/main/java/org/apache/catalina/tribes/group/GroupChannelMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/GroupChannelMBean.java rename to core/src/main/java/org/apache/catalina/tribes/group/GroupChannelMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/group/InterceptorPayload.java b/core/src/main/java/org/apache/catalina/tribes/group/InterceptorPayload.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/InterceptorPayload.java rename to core/src/main/java/org/apache/catalina/tribes/group/InterceptorPayload.java diff --git a/src/main/java/org/apache/catalina/tribes/group/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/group/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/group/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/group/Response.java b/core/src/main/java/org/apache/catalina/tribes/group/Response.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/Response.java rename to core/src/main/java/org/apache/catalina/tribes/group/Response.java diff --git a/src/main/java/org/apache/catalina/tribes/group/RpcCallback.java b/core/src/main/java/org/apache/catalina/tribes/group/RpcCallback.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/RpcCallback.java rename to core/src/main/java/org/apache/catalina/tribes/group/RpcCallback.java diff --git a/src/main/java/org/apache/catalina/tribes/group/RpcChannel.java b/core/src/main/java/org/apache/catalina/tribes/group/RpcChannel.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/RpcChannel.java rename to core/src/main/java/org/apache/catalina/tribes/group/RpcChannel.java diff --git a/src/main/java/org/apache/catalina/tribes/group/RpcMessage.java b/core/src/main/java/org/apache/catalina/tribes/group/RpcMessage.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/RpcMessage.java rename to core/src/main/java/org/apache/catalina/tribes/group/RpcMessage.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptorMBean.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptorMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptorMBean.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/DomainFilterInterceptorMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/FragmentationInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/FragmentationInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/FragmentationInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/FragmentationInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptorMBean.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptorMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptorMBean.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/MessageDispatchInterceptorMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/NonBlockingCoordinator.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/SimpleCoordinator.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptorMBean.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptorMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptorMBean.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/StaticMembershipInterceptorMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetectorMBean.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetectorMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetectorMBean.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetectorMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptorMBean.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptorMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptorMBean.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpPingInterceptorMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptorMBean.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptorMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptorMBean.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptorMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/group/interceptors/TwoPhaseCommitInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TwoPhaseCommitInterceptor.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/group/interceptors/TwoPhaseCommitInterceptor.java rename to core/src/main/java/org/apache/catalina/tribes/group/interceptors/TwoPhaseCommitInterceptor.java diff --git a/src/main/java/org/apache/catalina/tribes/io/BufferPool.java b/core/src/main/java/org/apache/catalina/tribes/io/BufferPool.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/BufferPool.java rename to core/src/main/java/org/apache/catalina/tribes/io/BufferPool.java diff --git a/src/main/java/org/apache/catalina/tribes/io/BufferPool15Impl.java b/core/src/main/java/org/apache/catalina/tribes/io/BufferPool15Impl.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/BufferPool15Impl.java rename to core/src/main/java/org/apache/catalina/tribes/io/BufferPool15Impl.java diff --git a/src/main/java/org/apache/catalina/tribes/io/ChannelData.java b/core/src/main/java/org/apache/catalina/tribes/io/ChannelData.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/ChannelData.java rename to core/src/main/java/org/apache/catalina/tribes/io/ChannelData.java diff --git a/src/main/java/org/apache/catalina/tribes/io/DirectByteArrayOutputStream.java b/core/src/main/java/org/apache/catalina/tribes/io/DirectByteArrayOutputStream.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/DirectByteArrayOutputStream.java rename to core/src/main/java/org/apache/catalina/tribes/io/DirectByteArrayOutputStream.java diff --git a/src/main/java/org/apache/catalina/tribes/io/ListenCallback.java b/core/src/main/java/org/apache/catalina/tribes/io/ListenCallback.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/ListenCallback.java rename to core/src/main/java/org/apache/catalina/tribes/io/ListenCallback.java diff --git a/src/main/java/org/apache/catalina/tribes/io/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/io/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/io/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/io/ObjectReader.java b/core/src/main/java/org/apache/catalina/tribes/io/ObjectReader.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/ObjectReader.java rename to core/src/main/java/org/apache/catalina/tribes/io/ObjectReader.java diff --git a/src/main/java/org/apache/catalina/tribes/io/ReplicationStream.java b/core/src/main/java/org/apache/catalina/tribes/io/ReplicationStream.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/ReplicationStream.java rename to core/src/main/java/org/apache/catalina/tribes/io/ReplicationStream.java diff --git a/src/main/java/org/apache/catalina/tribes/io/XByteBuffer.java b/core/src/main/java/org/apache/catalina/tribes/io/XByteBuffer.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/io/XByteBuffer.java rename to core/src/main/java/org/apache/catalina/tribes/io/XByteBuffer.java diff --git a/src/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java b/core/src/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java rename to core/src/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java diff --git a/src/main/java/org/apache/catalina/tribes/jmx/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/jmx/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/jmx/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/jmx/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/membership/Constants.java b/core/src/main/java/org/apache/catalina/tribes/membership/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/Constants.java rename to core/src/main/java/org/apache/catalina/tribes/membership/Constants.java diff --git a/src/main/java/org/apache/catalina/tribes/membership/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/membership/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/membership/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/membership/McastService.java b/core/src/main/java/org/apache/catalina/tribes/membership/McastService.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/McastService.java rename to core/src/main/java/org/apache/catalina/tribes/membership/McastService.java diff --git a/src/main/java/org/apache/catalina/tribes/membership/McastServiceImpl.java b/core/src/main/java/org/apache/catalina/tribes/membership/McastServiceImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/McastServiceImpl.java rename to core/src/main/java/org/apache/catalina/tribes/membership/McastServiceImpl.java diff --git a/src/main/java/org/apache/catalina/tribes/membership/McastServiceMBean.java b/core/src/main/java/org/apache/catalina/tribes/membership/McastServiceMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/McastServiceMBean.java rename to core/src/main/java/org/apache/catalina/tribes/membership/McastServiceMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/membership/MemberImpl.java b/core/src/main/java/org/apache/catalina/tribes/membership/MemberImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/MemberImpl.java rename to core/src/main/java/org/apache/catalina/tribes/membership/MemberImpl.java diff --git a/src/main/java/org/apache/catalina/tribes/membership/Membership.java b/core/src/main/java/org/apache/catalina/tribes/membership/Membership.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/Membership.java rename to core/src/main/java/org/apache/catalina/tribes/membership/Membership.java diff --git a/src/main/java/org/apache/catalina/tribes/membership/StaticMember.java b/core/src/main/java/org/apache/catalina/tribes/membership/StaticMember.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/StaticMember.java rename to core/src/main/java/org/apache/catalina/tribes/membership/StaticMember.java diff --git a/src/main/java/org/apache/catalina/tribes/membership/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/tribes/membership/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/tribes/membership/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/tribes/membership/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/tribes/package.html b/core/src/main/java/org/apache/catalina/tribes/package.html similarity index 100% rename from src/main/java/org/apache/catalina/tribes/package.html rename to core/src/main/java/org/apache/catalina/tribes/package.html diff --git a/src/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java b/core/src/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java rename to core/src/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java diff --git a/src/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java b/core/src/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java rename to core/src/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java diff --git a/src/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java b/core/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java rename to core/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java diff --git a/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMapEntry.java b/core/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMapEntry.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMapEntry.java rename to core/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMapEntry.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/AbstractRxTask.java b/core/src/main/java/org/apache/catalina/tribes/transport/AbstractRxTask.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/AbstractRxTask.java rename to core/src/main/java/org/apache/catalina/tribes/transport/AbstractRxTask.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/AbstractSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/AbstractSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/AbstractSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/AbstractSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/Constants.java b/core/src/main/java/org/apache/catalina/tribes/transport/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/Constants.java rename to core/src/main/java/org/apache/catalina/tribes/transport/Constants.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/DataSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/DataSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/DataSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/DataSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/transport/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/transport/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/tribes/transport/MultiPointSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/MultiPointSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/MultiPointSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/MultiPointSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/PooledSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/PooledSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/PooledSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/PooledSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/ReceiverBase.java b/core/src/main/java/org/apache/catalina/tribes/transport/ReceiverBase.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/ReceiverBase.java rename to core/src/main/java/org/apache/catalina/tribes/transport/ReceiverBase.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/ReplicationTransmitter.java b/core/src/main/java/org/apache/catalina/tribes/transport/ReplicationTransmitter.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/ReplicationTransmitter.java rename to core/src/main/java/org/apache/catalina/tribes/transport/ReplicationTransmitter.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java b/core/src/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java rename to core/src/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/SenderState.java b/core/src/main/java/org/apache/catalina/tribes/transport/SenderState.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/SenderState.java rename to core/src/main/java/org/apache/catalina/tribes/transport/SenderState.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java b/core/src/main/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java rename to core/src/main/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java b/core/src/main/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java rename to core/src/main/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/transport/nio/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java rename to core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiverMBean.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiverMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiverMBean.java rename to core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiverMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java rename to core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java rename to core/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java diff --git a/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSenderMBean.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSenderMBean.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSenderMBean.java rename to core/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSenderMBean.java diff --git a/src/main/java/org/apache/catalina/tribes/util/Arrays.java b/core/src/main/java/org/apache/catalina/tribes/util/Arrays.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/util/Arrays.java rename to core/src/main/java/org/apache/catalina/tribes/util/Arrays.java diff --git a/src/main/java/org/apache/catalina/tribes/util/ExceptionUtils.java b/core/src/main/java/org/apache/catalina/tribes/util/ExceptionUtils.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/util/ExceptionUtils.java rename to core/src/main/java/org/apache/catalina/tribes/util/ExceptionUtils.java diff --git a/src/main/java/org/apache/catalina/tribes/util/ExecutorFactory.java b/core/src/main/java/org/apache/catalina/tribes/util/ExecutorFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/util/ExecutorFactory.java rename to core/src/main/java/org/apache/catalina/tribes/util/ExecutorFactory.java diff --git a/src/main/java/org/apache/catalina/tribes/util/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/util/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/tribes/util/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/tribes/util/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/tribes/util/Logs.java b/core/src/main/java/org/apache/catalina/tribes/util/Logs.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/util/Logs.java rename to core/src/main/java/org/apache/catalina/tribes/util/Logs.java diff --git a/src/main/java/org/apache/catalina/tribes/util/StringManager.java b/core/src/main/java/org/apache/catalina/tribes/util/StringManager.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/util/StringManager.java rename to core/src/main/java/org/apache/catalina/tribes/util/StringManager.java diff --git a/src/main/java/org/apache/catalina/tribes/util/TcclThreadFactory.java b/core/src/main/java/org/apache/catalina/tribes/util/TcclThreadFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/util/TcclThreadFactory.java rename to core/src/main/java/org/apache/catalina/tribes/util/TcclThreadFactory.java diff --git a/src/main/java/org/apache/catalina/tribes/util/UUIDGenerator.java b/core/src/main/java/org/apache/catalina/tribes/util/UUIDGenerator.java similarity index 100% rename from src/main/java/org/apache/catalina/tribes/util/UUIDGenerator.java rename to core/src/main/java/org/apache/catalina/tribes/util/UUIDGenerator.java diff --git a/src/main/java/org/apache/catalina/users/AbstractGroup.java b/core/src/main/java/org/apache/catalina/users/AbstractGroup.java similarity index 100% rename from src/main/java/org/apache/catalina/users/AbstractGroup.java rename to core/src/main/java/org/apache/catalina/users/AbstractGroup.java diff --git a/src/main/java/org/apache/catalina/users/AbstractRole.java b/core/src/main/java/org/apache/catalina/users/AbstractRole.java similarity index 100% rename from src/main/java/org/apache/catalina/users/AbstractRole.java rename to core/src/main/java/org/apache/catalina/users/AbstractRole.java diff --git a/src/main/java/org/apache/catalina/users/AbstractUser.java b/core/src/main/java/org/apache/catalina/users/AbstractUser.java similarity index 100% rename from src/main/java/org/apache/catalina/users/AbstractUser.java rename to core/src/main/java/org/apache/catalina/users/AbstractUser.java diff --git a/src/main/java/org/apache/catalina/users/Constants.java b/core/src/main/java/org/apache/catalina/users/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/users/Constants.java rename to core/src/main/java/org/apache/catalina/users/Constants.java diff --git a/src/main/java/org/apache/catalina/users/LocalStrings.properties b/core/src/main/java/org/apache/catalina/users/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/users/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/users/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/users/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/users/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/users/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/users/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/users/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/users/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/users/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/users/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/users/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/users/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/users/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/users/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/users/MemoryGroup.java b/core/src/main/java/org/apache/catalina/users/MemoryGroup.java similarity index 100% rename from src/main/java/org/apache/catalina/users/MemoryGroup.java rename to core/src/main/java/org/apache/catalina/users/MemoryGroup.java diff --git a/src/main/java/org/apache/catalina/users/MemoryRole.java b/core/src/main/java/org/apache/catalina/users/MemoryRole.java similarity index 100% rename from src/main/java/org/apache/catalina/users/MemoryRole.java rename to core/src/main/java/org/apache/catalina/users/MemoryRole.java diff --git a/src/main/java/org/apache/catalina/users/MemoryUser.java b/core/src/main/java/org/apache/catalina/users/MemoryUser.java similarity index 100% rename from src/main/java/org/apache/catalina/users/MemoryUser.java rename to core/src/main/java/org/apache/catalina/users/MemoryUser.java diff --git a/src/main/java/org/apache/catalina/users/MemoryUserDatabase.java b/core/src/main/java/org/apache/catalina/users/MemoryUserDatabase.java similarity index 100% rename from src/main/java/org/apache/catalina/users/MemoryUserDatabase.java rename to core/src/main/java/org/apache/catalina/users/MemoryUserDatabase.java diff --git a/src/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java b/core/src/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java rename to core/src/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java diff --git a/src/main/java/org/apache/catalina/users/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/users/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/users/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/users/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/util/CharsetMapper.java b/core/src/main/java/org/apache/catalina/util/CharsetMapper.java similarity index 100% rename from src/main/java/org/apache/catalina/util/CharsetMapper.java rename to core/src/main/java/org/apache/catalina/util/CharsetMapper.java diff --git a/src/main/java/org/apache/catalina/util/CharsetMapperDefault.properties b/core/src/main/java/org/apache/catalina/util/CharsetMapperDefault.properties similarity index 100% rename from src/main/java/org/apache/catalina/util/CharsetMapperDefault.properties rename to core/src/main/java/org/apache/catalina/util/CharsetMapperDefault.properties diff --git a/src/main/java/org/apache/catalina/util/ConcurrentDateFormat.java b/core/src/main/java/org/apache/catalina/util/ConcurrentDateFormat.java similarity index 100% rename from src/main/java/org/apache/catalina/util/ConcurrentDateFormat.java rename to core/src/main/java/org/apache/catalina/util/ConcurrentDateFormat.java diff --git a/src/main/java/org/apache/catalina/util/ContextName.java b/core/src/main/java/org/apache/catalina/util/ContextName.java similarity index 100% rename from src/main/java/org/apache/catalina/util/ContextName.java rename to core/src/main/java/org/apache/catalina/util/ContextName.java diff --git a/src/main/java/org/apache/catalina/util/CustomObjectInputStream.java b/core/src/main/java/org/apache/catalina/util/CustomObjectInputStream.java similarity index 100% rename from src/main/java/org/apache/catalina/util/CustomObjectInputStream.java rename to core/src/main/java/org/apache/catalina/util/CustomObjectInputStream.java diff --git a/src/main/java/org/apache/catalina/util/DOMWriter.java b/core/src/main/java/org/apache/catalina/util/DOMWriter.java similarity index 100% rename from src/main/java/org/apache/catalina/util/DOMWriter.java rename to core/src/main/java/org/apache/catalina/util/DOMWriter.java diff --git a/src/main/java/org/apache/catalina/util/Extension.java b/core/src/main/java/org/apache/catalina/util/Extension.java similarity index 100% rename from src/main/java/org/apache/catalina/util/Extension.java rename to core/src/main/java/org/apache/catalina/util/Extension.java diff --git a/src/main/java/org/apache/catalina/util/ExtensionValidator.java b/core/src/main/java/org/apache/catalina/util/ExtensionValidator.java similarity index 100% rename from src/main/java/org/apache/catalina/util/ExtensionValidator.java rename to core/src/main/java/org/apache/catalina/util/ExtensionValidator.java diff --git a/src/main/java/org/apache/catalina/util/IOTools.java b/core/src/main/java/org/apache/catalina/util/IOTools.java similarity index 100% rename from src/main/java/org/apache/catalina/util/IOTools.java rename to core/src/main/java/org/apache/catalina/util/IOTools.java diff --git a/src/main/java/org/apache/catalina/util/Introspection.java b/core/src/main/java/org/apache/catalina/util/Introspection.java similarity index 100% rename from src/main/java/org/apache/catalina/util/Introspection.java rename to core/src/main/java/org/apache/catalina/util/Introspection.java diff --git a/src/main/java/org/apache/catalina/util/LifecycleBase.java b/core/src/main/java/org/apache/catalina/util/LifecycleBase.java similarity index 100% rename from src/main/java/org/apache/catalina/util/LifecycleBase.java rename to core/src/main/java/org/apache/catalina/util/LifecycleBase.java diff --git a/src/main/java/org/apache/catalina/util/LifecycleMBeanBase.java b/core/src/main/java/org/apache/catalina/util/LifecycleMBeanBase.java similarity index 100% rename from src/main/java/org/apache/catalina/util/LifecycleMBeanBase.java rename to core/src/main/java/org/apache/catalina/util/LifecycleMBeanBase.java diff --git a/src/main/java/org/apache/catalina/util/LocalStrings.properties b/core/src/main/java/org/apache/catalina/util/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/util/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/util/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/util/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/util/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/util/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/util/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/util/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/util/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/util/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/util/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/util/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/util/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/util/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/util/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/util/ManifestResource.java b/core/src/main/java/org/apache/catalina/util/ManifestResource.java similarity index 100% rename from src/main/java/org/apache/catalina/util/ManifestResource.java rename to core/src/main/java/org/apache/catalina/util/ManifestResource.java diff --git a/src/main/java/org/apache/catalina/util/ParameterMap.java b/core/src/main/java/org/apache/catalina/util/ParameterMap.java similarity index 100% rename from src/main/java/org/apache/catalina/util/ParameterMap.java rename to core/src/main/java/org/apache/catalina/util/ParameterMap.java diff --git a/src/main/java/org/apache/catalina/util/RequestUtil.java b/core/src/main/java/org/apache/catalina/util/RequestUtil.java similarity index 100% rename from src/main/java/org/apache/catalina/util/RequestUtil.java rename to core/src/main/java/org/apache/catalina/util/RequestUtil.java diff --git a/src/main/java/org/apache/catalina/util/ResourceSet.java b/core/src/main/java/org/apache/catalina/util/ResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/util/ResourceSet.java rename to core/src/main/java/org/apache/catalina/util/ResourceSet.java diff --git a/src/main/java/org/apache/catalina/util/ServerInfo.java b/core/src/main/java/org/apache/catalina/util/ServerInfo.java similarity index 100% rename from src/main/java/org/apache/catalina/util/ServerInfo.java rename to core/src/main/java/org/apache/catalina/util/ServerInfo.java diff --git a/src/main/java/org/apache/catalina/util/ServerInfo.properties b/core/src/main/java/org/apache/catalina/util/ServerInfo.properties similarity index 100% rename from src/main/java/org/apache/catalina/util/ServerInfo.properties rename to core/src/main/java/org/apache/catalina/util/ServerInfo.properties diff --git a/src/main/java/org/apache/catalina/util/SessionConfig.java b/core/src/main/java/org/apache/catalina/util/SessionConfig.java similarity index 100% rename from src/main/java/org/apache/catalina/util/SessionConfig.java rename to core/src/main/java/org/apache/catalina/util/SessionConfig.java diff --git a/src/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java b/core/src/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java similarity index 100% rename from src/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java rename to core/src/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java diff --git a/src/main/java/org/apache/catalina/util/StandardSessionIdGenerator.java b/core/src/main/java/org/apache/catalina/util/StandardSessionIdGenerator.java similarity index 100% rename from src/main/java/org/apache/catalina/util/StandardSessionIdGenerator.java rename to core/src/main/java/org/apache/catalina/util/StandardSessionIdGenerator.java diff --git a/src/main/java/org/apache/catalina/util/Strftime.java b/core/src/main/java/org/apache/catalina/util/Strftime.java similarity index 100% rename from src/main/java/org/apache/catalina/util/Strftime.java rename to core/src/main/java/org/apache/catalina/util/Strftime.java diff --git a/src/main/java/org/apache/catalina/util/ToStringUtil.java b/core/src/main/java/org/apache/catalina/util/ToStringUtil.java similarity index 100% rename from src/main/java/org/apache/catalina/util/ToStringUtil.java rename to core/src/main/java/org/apache/catalina/util/ToStringUtil.java diff --git a/src/main/java/org/apache/catalina/util/TomcatCSS.java b/core/src/main/java/org/apache/catalina/util/TomcatCSS.java similarity index 100% rename from src/main/java/org/apache/catalina/util/TomcatCSS.java rename to core/src/main/java/org/apache/catalina/util/TomcatCSS.java diff --git a/src/main/java/org/apache/catalina/util/URLEncoder.java b/core/src/main/java/org/apache/catalina/util/URLEncoder.java similarity index 100% rename from src/main/java/org/apache/catalina/util/URLEncoder.java rename to core/src/main/java/org/apache/catalina/util/URLEncoder.java diff --git a/src/main/java/org/apache/catalina/util/XMLWriter.java b/core/src/main/java/org/apache/catalina/util/XMLWriter.java similarity index 100% rename from src/main/java/org/apache/catalina/util/XMLWriter.java rename to core/src/main/java/org/apache/catalina/util/XMLWriter.java diff --git a/src/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java b/core/src/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java rename to core/src/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java diff --git a/src/main/java/org/apache/catalina/valves/AccessLogValve.java b/core/src/main/java/org/apache/catalina/valves/AccessLogValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/AccessLogValve.java rename to core/src/main/java/org/apache/catalina/valves/AccessLogValve.java diff --git a/src/main/java/org/apache/catalina/valves/Constants.java b/core/src/main/java/org/apache/catalina/valves/Constants.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/Constants.java rename to core/src/main/java/org/apache/catalina/valves/Constants.java diff --git a/src/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java b/core/src/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java rename to core/src/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java diff --git a/src/main/java/org/apache/catalina/valves/ErrorReportValve.java b/core/src/main/java/org/apache/catalina/valves/ErrorReportValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/ErrorReportValve.java rename to core/src/main/java/org/apache/catalina/valves/ErrorReportValve.java diff --git a/src/main/java/org/apache/catalina/valves/ExtendedAccessLogValve.java b/core/src/main/java/org/apache/catalina/valves/ExtendedAccessLogValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/ExtendedAccessLogValve.java rename to core/src/main/java/org/apache/catalina/valves/ExtendedAccessLogValve.java diff --git a/src/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java b/core/src/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java rename to core/src/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java diff --git a/src/main/java/org/apache/catalina/valves/LocalStrings.properties b/core/src/main/java/org/apache/catalina/valves/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/valves/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/valves/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/valves/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/valves/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/catalina/valves/LocalStrings_es.properties rename to core/src/main/java/org/apache/catalina/valves/LocalStrings_es.properties diff --git a/src/main/java/org/apache/catalina/valves/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/valves/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/catalina/valves/LocalStrings_fr.properties rename to core/src/main/java/org/apache/catalina/valves/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/catalina/valves/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/valves/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/catalina/valves/LocalStrings_ja.properties rename to core/src/main/java/org/apache/catalina/valves/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/catalina/valves/PersistentValve.java b/core/src/main/java/org/apache/catalina/valves/PersistentValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/PersistentValve.java rename to core/src/main/java/org/apache/catalina/valves/PersistentValve.java diff --git a/src/main/java/org/apache/catalina/valves/RemoteAddrValve.java b/core/src/main/java/org/apache/catalina/valves/RemoteAddrValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/RemoteAddrValve.java rename to core/src/main/java/org/apache/catalina/valves/RemoteAddrValve.java diff --git a/src/main/java/org/apache/catalina/valves/RemoteHostValve.java b/core/src/main/java/org/apache/catalina/valves/RemoteHostValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/RemoteHostValve.java rename to core/src/main/java/org/apache/catalina/valves/RemoteHostValve.java diff --git a/src/main/java/org/apache/catalina/valves/RemoteIpValve.java b/core/src/main/java/org/apache/catalina/valves/RemoteIpValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/RemoteIpValve.java rename to core/src/main/java/org/apache/catalina/valves/RemoteIpValve.java diff --git a/src/main/java/org/apache/catalina/valves/RequestFilterValve.java b/core/src/main/java/org/apache/catalina/valves/RequestFilterValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/RequestFilterValve.java rename to core/src/main/java/org/apache/catalina/valves/RequestFilterValve.java diff --git a/src/main/java/org/apache/catalina/valves/SSLValve.java b/core/src/main/java/org/apache/catalina/valves/SSLValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/SSLValve.java rename to core/src/main/java/org/apache/catalina/valves/SSLValve.java diff --git a/src/main/java/org/apache/catalina/valves/SemaphoreValve.java b/core/src/main/java/org/apache/catalina/valves/SemaphoreValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/SemaphoreValve.java rename to core/src/main/java/org/apache/catalina/valves/SemaphoreValve.java diff --git a/src/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java b/core/src/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java rename to core/src/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java diff --git a/src/main/java/org/apache/catalina/valves/ValveBase.java b/core/src/main/java/org/apache/catalina/valves/ValveBase.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/ValveBase.java rename to core/src/main/java/org/apache/catalina/valves/ValveBase.java diff --git a/src/main/java/org/apache/catalina/valves/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/valves/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/valves/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/valves/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/valves/package.html b/core/src/main/java/org/apache/catalina/valves/package.html similarity index 100% rename from src/main/java/org/apache/catalina/valves/package.html rename to core/src/main/java/org/apache/catalina/valves/package.html diff --git a/src/main/java/org/apache/catalina/valves/rewrite/Resolver.java b/core/src/main/java/org/apache/catalina/valves/rewrite/Resolver.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/rewrite/Resolver.java rename to core/src/main/java/org/apache/catalina/valves/rewrite/Resolver.java diff --git a/src/main/java/org/apache/catalina/valves/rewrite/ResolverImpl.java b/core/src/main/java/org/apache/catalina/valves/rewrite/ResolverImpl.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/rewrite/ResolverImpl.java rename to core/src/main/java/org/apache/catalina/valves/rewrite/ResolverImpl.java diff --git a/src/main/java/org/apache/catalina/valves/rewrite/RewriteCond.java b/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteCond.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/rewrite/RewriteCond.java rename to core/src/main/java/org/apache/catalina/valves/rewrite/RewriteCond.java diff --git a/src/main/java/org/apache/catalina/valves/rewrite/RewriteMap.java b/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteMap.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/rewrite/RewriteMap.java rename to core/src/main/java/org/apache/catalina/valves/rewrite/RewriteMap.java diff --git a/src/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java b/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java rename to core/src/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java diff --git a/src/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java b/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java rename to core/src/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java diff --git a/src/main/java/org/apache/catalina/valves/rewrite/Substitution.java b/core/src/main/java/org/apache/catalina/valves/rewrite/Substitution.java similarity index 100% rename from src/main/java/org/apache/catalina/valves/rewrite/Substitution.java rename to core/src/main/java/org/apache/catalina/valves/rewrite/Substitution.java diff --git a/src/main/java/org/apache/catalina/valves/rewrite/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/valves/rewrite/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/valves/rewrite/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/valves/rewrite/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/webresources/AbstractArchiveResource.java b/core/src/main/java/org/apache/catalina/webresources/AbstractArchiveResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/AbstractArchiveResource.java rename to core/src/main/java/org/apache/catalina/webresources/AbstractArchiveResource.java diff --git a/src/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/AbstractResource.java b/core/src/main/java/org/apache/catalina/webresources/AbstractResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/AbstractResource.java rename to core/src/main/java/org/apache/catalina/webresources/AbstractResource.java diff --git a/src/main/java/org/apache/catalina/webresources/AbstractResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/AbstractResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/AbstractResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/AbstractResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResource.java b/core/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResource.java rename to core/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResource.java diff --git a/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/Cache.java b/core/src/main/java/org/apache/catalina/webresources/Cache.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/Cache.java rename to core/src/main/java/org/apache/catalina/webresources/Cache.java diff --git a/src/main/java/org/apache/catalina/webresources/CachedResource.java b/core/src/main/java/org/apache/catalina/webresources/CachedResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/CachedResource.java rename to core/src/main/java/org/apache/catalina/webresources/CachedResource.java diff --git a/src/main/java/org/apache/catalina/webresources/ClasspathURLStreamHandler.java b/core/src/main/java/org/apache/catalina/webresources/ClasspathURLStreamHandler.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/ClasspathURLStreamHandler.java rename to core/src/main/java/org/apache/catalina/webresources/ClasspathURLStreamHandler.java diff --git a/src/main/java/org/apache/catalina/webresources/DirResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/DirResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/DirResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/DirResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/EmptyResource.java b/core/src/main/java/org/apache/catalina/webresources/EmptyResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/EmptyResource.java rename to core/src/main/java/org/apache/catalina/webresources/EmptyResource.java diff --git a/src/main/java/org/apache/catalina/webresources/EmptyResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/EmptyResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/EmptyResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/EmptyResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/FileResource.java b/core/src/main/java/org/apache/catalina/webresources/FileResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/FileResource.java rename to core/src/main/java/org/apache/catalina/webresources/FileResource.java diff --git a/src/main/java/org/apache/catalina/webresources/FileResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/FileResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/FileResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/FileResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/JarResource.java b/core/src/main/java/org/apache/catalina/webresources/JarResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/JarResource.java rename to core/src/main/java/org/apache/catalina/webresources/JarResource.java diff --git a/src/main/java/org/apache/catalina/webresources/JarResourceRoot.java b/core/src/main/java/org/apache/catalina/webresources/JarResourceRoot.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/JarResourceRoot.java rename to core/src/main/java/org/apache/catalina/webresources/JarResourceRoot.java diff --git a/src/main/java/org/apache/catalina/webresources/JarResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/JarResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/JarResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/JarResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/JarWarResource.java b/core/src/main/java/org/apache/catalina/webresources/JarWarResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/JarWarResource.java rename to core/src/main/java/org/apache/catalina/webresources/JarWarResource.java diff --git a/src/main/java/org/apache/catalina/webresources/JarWarResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/JarWarResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/JarWarResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/JarWarResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/LocalStrings.properties b/core/src/main/java/org/apache/catalina/webresources/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/catalina/webresources/LocalStrings.properties rename to core/src/main/java/org/apache/catalina/webresources/LocalStrings.properties diff --git a/src/main/java/org/apache/catalina/webresources/StandardRoot.java b/core/src/main/java/org/apache/catalina/webresources/StandardRoot.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/StandardRoot.java rename to core/src/main/java/org/apache/catalina/webresources/StandardRoot.java diff --git a/src/main/java/org/apache/catalina/webresources/TomcatURLStreamHandlerFactory.java b/core/src/main/java/org/apache/catalina/webresources/TomcatURLStreamHandlerFactory.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/TomcatURLStreamHandlerFactory.java rename to core/src/main/java/org/apache/catalina/webresources/TomcatURLStreamHandlerFactory.java diff --git a/src/main/java/org/apache/catalina/webresources/TrackedInputStream.java b/core/src/main/java/org/apache/catalina/webresources/TrackedInputStream.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/TrackedInputStream.java rename to core/src/main/java/org/apache/catalina/webresources/TrackedInputStream.java diff --git a/src/main/java/org/apache/catalina/webresources/VirtualResource.java b/core/src/main/java/org/apache/catalina/webresources/VirtualResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/VirtualResource.java rename to core/src/main/java/org/apache/catalina/webresources/VirtualResource.java diff --git a/src/main/java/org/apache/catalina/webresources/WarResource.java b/core/src/main/java/org/apache/catalina/webresources/WarResource.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/WarResource.java rename to core/src/main/java/org/apache/catalina/webresources/WarResource.java diff --git a/src/main/java/org/apache/catalina/webresources/WarResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/WarResourceSet.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/WarResourceSet.java rename to core/src/main/java/org/apache/catalina/webresources/WarResourceSet.java diff --git a/src/main/java/org/apache/catalina/webresources/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/webresources/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/catalina/webresources/mbeans-descriptors.xml rename to core/src/main/java/org/apache/catalina/webresources/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/catalina/webresources/war/Handler.java b/core/src/main/java/org/apache/catalina/webresources/war/Handler.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/war/Handler.java rename to core/src/main/java/org/apache/catalina/webresources/war/Handler.java diff --git a/src/main/java/org/apache/catalina/webresources/war/WarURLConnection.java b/core/src/main/java/org/apache/catalina/webresources/war/WarURLConnection.java similarity index 100% rename from src/main/java/org/apache/catalina/webresources/war/WarURLConnection.java rename to core/src/main/java/org/apache/catalina/webresources/war/WarURLConnection.java diff --git a/src/main/java/org/apache/coyote/AbstractProcessor.java b/core/src/main/java/org/apache/coyote/AbstractProcessor.java similarity index 100% rename from src/main/java/org/apache/coyote/AbstractProcessor.java rename to core/src/main/java/org/apache/coyote/AbstractProcessor.java diff --git a/src/main/java/org/apache/coyote/AbstractProcessorLight.java b/core/src/main/java/org/apache/coyote/AbstractProcessorLight.java similarity index 100% rename from src/main/java/org/apache/coyote/AbstractProcessorLight.java rename to core/src/main/java/org/apache/coyote/AbstractProcessorLight.java diff --git a/src/main/java/org/apache/coyote/AbstractProtocol.java b/core/src/main/java/org/apache/coyote/AbstractProtocol.java similarity index 100% rename from src/main/java/org/apache/coyote/AbstractProtocol.java rename to core/src/main/java/org/apache/coyote/AbstractProtocol.java diff --git a/src/main/java/org/apache/coyote/ActionCode.java b/core/src/main/java/org/apache/coyote/ActionCode.java similarity index 100% rename from src/main/java/org/apache/coyote/ActionCode.java rename to core/src/main/java/org/apache/coyote/ActionCode.java diff --git a/src/main/java/org/apache/coyote/ActionHook.java b/core/src/main/java/org/apache/coyote/ActionHook.java similarity index 100% rename from src/main/java/org/apache/coyote/ActionHook.java rename to core/src/main/java/org/apache/coyote/ActionHook.java diff --git a/src/main/java/org/apache/coyote/Adapter.java b/core/src/main/java/org/apache/coyote/Adapter.java similarity index 100% rename from src/main/java/org/apache/coyote/Adapter.java rename to core/src/main/java/org/apache/coyote/Adapter.java diff --git a/src/main/java/org/apache/coyote/AsyncContextCallback.java b/core/src/main/java/org/apache/coyote/AsyncContextCallback.java similarity index 100% rename from src/main/java/org/apache/coyote/AsyncContextCallback.java rename to core/src/main/java/org/apache/coyote/AsyncContextCallback.java diff --git a/src/main/java/org/apache/coyote/AsyncStateMachine.java b/core/src/main/java/org/apache/coyote/AsyncStateMachine.java similarity index 100% rename from src/main/java/org/apache/coyote/AsyncStateMachine.java rename to core/src/main/java/org/apache/coyote/AsyncStateMachine.java diff --git a/src/main/java/org/apache/coyote/CloseNowException.java b/core/src/main/java/org/apache/coyote/CloseNowException.java similarity index 100% rename from src/main/java/org/apache/coyote/CloseNowException.java rename to core/src/main/java/org/apache/coyote/CloseNowException.java diff --git a/src/main/java/org/apache/coyote/Constants.java b/core/src/main/java/org/apache/coyote/Constants.java similarity index 100% rename from src/main/java/org/apache/coyote/Constants.java rename to core/src/main/java/org/apache/coyote/Constants.java diff --git a/src/main/java/org/apache/coyote/ContainerThreadMarker.java b/core/src/main/java/org/apache/coyote/ContainerThreadMarker.java similarity index 100% rename from src/main/java/org/apache/coyote/ContainerThreadMarker.java rename to core/src/main/java/org/apache/coyote/ContainerThreadMarker.java diff --git a/src/main/java/org/apache/coyote/ErrorState.java b/core/src/main/java/org/apache/coyote/ErrorState.java similarity index 100% rename from src/main/java/org/apache/coyote/ErrorState.java rename to core/src/main/java/org/apache/coyote/ErrorState.java diff --git a/src/main/java/org/apache/coyote/InputBuffer.java b/core/src/main/java/org/apache/coyote/InputBuffer.java similarity index 100% rename from src/main/java/org/apache/coyote/InputBuffer.java rename to core/src/main/java/org/apache/coyote/InputBuffer.java diff --git a/src/main/java/org/apache/coyote/LocalStrings.properties b/core/src/main/java/org/apache/coyote/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/coyote/LocalStrings.properties rename to core/src/main/java/org/apache/coyote/LocalStrings.properties diff --git a/src/main/java/org/apache/coyote/LocalStrings_es.properties b/core/src/main/java/org/apache/coyote/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/coyote/LocalStrings_es.properties rename to core/src/main/java/org/apache/coyote/LocalStrings_es.properties diff --git a/src/main/java/org/apache/coyote/OutputBuffer.java b/core/src/main/java/org/apache/coyote/OutputBuffer.java similarity index 100% rename from src/main/java/org/apache/coyote/OutputBuffer.java rename to core/src/main/java/org/apache/coyote/OutputBuffer.java diff --git a/src/main/java/org/apache/coyote/Processor.java b/core/src/main/java/org/apache/coyote/Processor.java similarity index 100% rename from src/main/java/org/apache/coyote/Processor.java rename to core/src/main/java/org/apache/coyote/Processor.java diff --git a/src/main/java/org/apache/coyote/ProtocolException.java b/core/src/main/java/org/apache/coyote/ProtocolException.java similarity index 100% rename from src/main/java/org/apache/coyote/ProtocolException.java rename to core/src/main/java/org/apache/coyote/ProtocolException.java diff --git a/src/main/java/org/apache/coyote/ProtocolHandler.java b/core/src/main/java/org/apache/coyote/ProtocolHandler.java similarity index 100% rename from src/main/java/org/apache/coyote/ProtocolHandler.java rename to core/src/main/java/org/apache/coyote/ProtocolHandler.java diff --git a/src/main/java/org/apache/coyote/Request.java b/core/src/main/java/org/apache/coyote/Request.java similarity index 100% rename from src/main/java/org/apache/coyote/Request.java rename to core/src/main/java/org/apache/coyote/Request.java diff --git a/src/main/java/org/apache/coyote/RequestGroupInfo.java b/core/src/main/java/org/apache/coyote/RequestGroupInfo.java similarity index 100% rename from src/main/java/org/apache/coyote/RequestGroupInfo.java rename to core/src/main/java/org/apache/coyote/RequestGroupInfo.java diff --git a/src/main/java/org/apache/coyote/RequestInfo.java b/core/src/main/java/org/apache/coyote/RequestInfo.java similarity index 100% rename from src/main/java/org/apache/coyote/RequestInfo.java rename to core/src/main/java/org/apache/coyote/RequestInfo.java diff --git a/src/main/java/org/apache/coyote/Response.java b/core/src/main/java/org/apache/coyote/Response.java similarity index 100% rename from src/main/java/org/apache/coyote/Response.java rename to core/src/main/java/org/apache/coyote/Response.java diff --git a/src/main/java/org/apache/coyote/UpgradeProtocol.java b/core/src/main/java/org/apache/coyote/UpgradeProtocol.java similarity index 100% rename from src/main/java/org/apache/coyote/UpgradeProtocol.java rename to core/src/main/java/org/apache/coyote/UpgradeProtocol.java diff --git a/src/main/java/org/apache/coyote/UpgradeToken.java b/core/src/main/java/org/apache/coyote/UpgradeToken.java similarity index 100% rename from src/main/java/org/apache/coyote/UpgradeToken.java rename to core/src/main/java/org/apache/coyote/UpgradeToken.java diff --git a/src/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java b/core/src/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java similarity index 100% rename from src/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java rename to core/src/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java diff --git a/src/main/java/org/apache/coyote/ajp/AjpAprProtocol.java b/core/src/main/java/org/apache/coyote/ajp/AjpAprProtocol.java similarity index 100% rename from src/main/java/org/apache/coyote/ajp/AjpAprProtocol.java rename to core/src/main/java/org/apache/coyote/ajp/AjpAprProtocol.java diff --git a/src/main/java/org/apache/coyote/ajp/AjpMessage.java b/core/src/main/java/org/apache/coyote/ajp/AjpMessage.java similarity index 100% rename from src/main/java/org/apache/coyote/ajp/AjpMessage.java rename to core/src/main/java/org/apache/coyote/ajp/AjpMessage.java diff --git a/src/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java b/core/src/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java similarity index 100% rename from src/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java rename to core/src/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java diff --git a/src/main/java/org/apache/coyote/ajp/AjpNioProtocol.java b/core/src/main/java/org/apache/coyote/ajp/AjpNioProtocol.java similarity index 100% rename from src/main/java/org/apache/coyote/ajp/AjpNioProtocol.java rename to core/src/main/java/org/apache/coyote/ajp/AjpNioProtocol.java diff --git a/src/main/java/org/apache/coyote/ajp/AjpProcessor.java b/core/src/main/java/org/apache/coyote/ajp/AjpProcessor.java similarity index 100% rename from src/main/java/org/apache/coyote/ajp/AjpProcessor.java rename to core/src/main/java/org/apache/coyote/ajp/AjpProcessor.java diff --git a/src/main/java/org/apache/coyote/ajp/Constants.java b/core/src/main/java/org/apache/coyote/ajp/Constants.java similarity index 100% rename from src/main/java/org/apache/coyote/ajp/Constants.java rename to core/src/main/java/org/apache/coyote/ajp/Constants.java diff --git a/src/main/java/org/apache/coyote/ajp/LocalStrings.properties b/core/src/main/java/org/apache/coyote/ajp/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/coyote/ajp/LocalStrings.properties rename to core/src/main/java/org/apache/coyote/ajp/LocalStrings.properties diff --git a/src/main/java/org/apache/coyote/ajp/LocalStrings_es.properties b/core/src/main/java/org/apache/coyote/ajp/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/coyote/ajp/LocalStrings_es.properties rename to core/src/main/java/org/apache/coyote/ajp/LocalStrings_es.properties diff --git a/src/main/java/org/apache/coyote/http11/AbstractHttp11JsseProtocol.java b/core/src/main/java/org/apache/coyote/http11/AbstractHttp11JsseProtocol.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/AbstractHttp11JsseProtocol.java rename to core/src/main/java/org/apache/coyote/http11/AbstractHttp11JsseProtocol.java diff --git a/src/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java b/core/src/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java rename to core/src/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java diff --git a/src/main/java/org/apache/coyote/http11/Constants.java b/core/src/main/java/org/apache/coyote/http11/Constants.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/Constants.java rename to core/src/main/java/org/apache/coyote/http11/Constants.java diff --git a/src/main/java/org/apache/coyote/http11/HeadersTooLargeException.java b/core/src/main/java/org/apache/coyote/http11/HeadersTooLargeException.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/HeadersTooLargeException.java rename to core/src/main/java/org/apache/coyote/http11/HeadersTooLargeException.java diff --git a/src/main/java/org/apache/coyote/http11/Http11AprProtocol.java b/core/src/main/java/org/apache/coyote/http11/Http11AprProtocol.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/Http11AprProtocol.java rename to core/src/main/java/org/apache/coyote/http11/Http11AprProtocol.java diff --git a/src/main/java/org/apache/coyote/http11/Http11InputBuffer.java b/core/src/main/java/org/apache/coyote/http11/Http11InputBuffer.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/Http11InputBuffer.java rename to core/src/main/java/org/apache/coyote/http11/Http11InputBuffer.java diff --git a/src/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java b/core/src/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java rename to core/src/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java diff --git a/src/main/java/org/apache/coyote/http11/Http11NioProtocol.java b/core/src/main/java/org/apache/coyote/http11/Http11NioProtocol.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/Http11NioProtocol.java rename to core/src/main/java/org/apache/coyote/http11/Http11NioProtocol.java diff --git a/src/main/java/org/apache/coyote/http11/Http11OutputBuffer.java b/core/src/main/java/org/apache/coyote/http11/Http11OutputBuffer.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/Http11OutputBuffer.java rename to core/src/main/java/org/apache/coyote/http11/Http11OutputBuffer.java diff --git a/src/main/java/org/apache/coyote/http11/Http11Processor.java b/core/src/main/java/org/apache/coyote/http11/Http11Processor.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/Http11Processor.java rename to core/src/main/java/org/apache/coyote/http11/Http11Processor.java diff --git a/src/main/java/org/apache/coyote/http11/InputFilter.java b/core/src/main/java/org/apache/coyote/http11/InputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/InputFilter.java rename to core/src/main/java/org/apache/coyote/http11/InputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/LocalStrings.properties b/core/src/main/java/org/apache/coyote/http11/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/coyote/http11/LocalStrings.properties rename to core/src/main/java/org/apache/coyote/http11/LocalStrings.properties diff --git a/src/main/java/org/apache/coyote/http11/LocalStrings_es.properties b/core/src/main/java/org/apache/coyote/http11/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/coyote/http11/LocalStrings_es.properties rename to core/src/main/java/org/apache/coyote/http11/LocalStrings_es.properties diff --git a/src/main/java/org/apache/coyote/http11/LocalStrings_fr.properties b/core/src/main/java/org/apache/coyote/http11/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/coyote/http11/LocalStrings_fr.properties rename to core/src/main/java/org/apache/coyote/http11/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/coyote/http11/LocalStrings_ja.properties b/core/src/main/java/org/apache/coyote/http11/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/coyote/http11/LocalStrings_ja.properties rename to core/src/main/java/org/apache/coyote/http11/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/coyote/http11/OutputFilter.java b/core/src/main/java/org/apache/coyote/http11/OutputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/OutputFilter.java rename to core/src/main/java/org/apache/coyote/http11/OutputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/BufferedInputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/BufferedInputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/BufferedInputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/BufferedInputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/IdentityInputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/IdentityInputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/IdentityInputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/IdentityInputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/LocalStrings.properties b/core/src/main/java/org/apache/coyote/http11/filters/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/LocalStrings.properties rename to core/src/main/java/org/apache/coyote/http11/filters/LocalStrings.properties diff --git a/src/main/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/VoidInputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/VoidInputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/VoidInputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/VoidInputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java rename to core/src/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java diff --git a/src/main/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java b/core/src/main/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java rename to core/src/main/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java diff --git a/src/main/java/org/apache/coyote/http11/upgrade/LocalStrings.properties b/core/src/main/java/org/apache/coyote/http11/upgrade/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/coyote/http11/upgrade/LocalStrings.properties rename to core/src/main/java/org/apache/coyote/http11/upgrade/LocalStrings.properties diff --git a/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorBase.java b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorBase.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorBase.java rename to core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorBase.java diff --git a/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java rename to core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorExternal.java diff --git a/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java rename to core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeProcessorInternal.java diff --git a/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java rename to core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java diff --git a/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java similarity index 100% rename from src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java rename to core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java diff --git a/src/main/java/org/apache/coyote/http2/AbstractStream.java b/core/src/main/java/org/apache/coyote/http2/AbstractStream.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/AbstractStream.java rename to core/src/main/java/org/apache/coyote/http2/AbstractStream.java diff --git a/src/main/java/org/apache/coyote/http2/ByteUtil.java b/core/src/main/java/org/apache/coyote/http2/ByteUtil.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/ByteUtil.java rename to core/src/main/java/org/apache/coyote/http2/ByteUtil.java diff --git a/src/main/java/org/apache/coyote/http2/ConnectionException.java b/core/src/main/java/org/apache/coyote/http2/ConnectionException.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/ConnectionException.java rename to core/src/main/java/org/apache/coyote/http2/ConnectionException.java diff --git a/src/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java b/core/src/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java rename to core/src/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java diff --git a/src/main/java/org/apache/coyote/http2/ConnectionSettingsLocal.java b/core/src/main/java/org/apache/coyote/http2/ConnectionSettingsLocal.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/ConnectionSettingsLocal.java rename to core/src/main/java/org/apache/coyote/http2/ConnectionSettingsLocal.java diff --git a/src/main/java/org/apache/coyote/http2/ConnectionSettingsRemote.java b/core/src/main/java/org/apache/coyote/http2/ConnectionSettingsRemote.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/ConnectionSettingsRemote.java rename to core/src/main/java/org/apache/coyote/http2/ConnectionSettingsRemote.java diff --git a/src/main/java/org/apache/coyote/http2/Constants.java b/core/src/main/java/org/apache/coyote/http2/Constants.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Constants.java rename to core/src/main/java/org/apache/coyote/http2/Constants.java diff --git a/src/main/java/org/apache/coyote/http2/Flags.java b/core/src/main/java/org/apache/coyote/http2/Flags.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Flags.java rename to core/src/main/java/org/apache/coyote/http2/Flags.java diff --git a/src/main/java/org/apache/coyote/http2/FrameType.java b/core/src/main/java/org/apache/coyote/http2/FrameType.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/FrameType.java rename to core/src/main/java/org/apache/coyote/http2/FrameType.java diff --git a/src/main/java/org/apache/coyote/http2/HPackHuffman.java b/core/src/main/java/org/apache/coyote/http2/HPackHuffman.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/HPackHuffman.java rename to core/src/main/java/org/apache/coyote/http2/HPackHuffman.java diff --git a/src/main/java/org/apache/coyote/http2/HeaderSink.java b/core/src/main/java/org/apache/coyote/http2/HeaderSink.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/HeaderSink.java rename to core/src/main/java/org/apache/coyote/http2/HeaderSink.java diff --git a/src/main/java/org/apache/coyote/http2/Hpack.java b/core/src/main/java/org/apache/coyote/http2/Hpack.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Hpack.java rename to core/src/main/java/org/apache/coyote/http2/Hpack.java diff --git a/src/main/java/org/apache/coyote/http2/HpackDecoder.java b/core/src/main/java/org/apache/coyote/http2/HpackDecoder.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/HpackDecoder.java rename to core/src/main/java/org/apache/coyote/http2/HpackDecoder.java diff --git a/src/main/java/org/apache/coyote/http2/HpackEncoder.java b/core/src/main/java/org/apache/coyote/http2/HpackEncoder.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/HpackEncoder.java rename to core/src/main/java/org/apache/coyote/http2/HpackEncoder.java diff --git a/src/main/java/org/apache/coyote/http2/HpackException.java b/core/src/main/java/org/apache/coyote/http2/HpackException.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/HpackException.java rename to core/src/main/java/org/apache/coyote/http2/HpackException.java diff --git a/src/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java b/core/src/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java rename to core/src/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java diff --git a/src/main/java/org/apache/coyote/http2/Http2Error.java b/core/src/main/java/org/apache/coyote/http2/Http2Error.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Http2Error.java rename to core/src/main/java/org/apache/coyote/http2/Http2Error.java diff --git a/src/main/java/org/apache/coyote/http2/Http2Exception.java b/core/src/main/java/org/apache/coyote/http2/Http2Exception.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Http2Exception.java rename to core/src/main/java/org/apache/coyote/http2/Http2Exception.java diff --git a/src/main/java/org/apache/coyote/http2/Http2Parser.java b/core/src/main/java/org/apache/coyote/http2/Http2Parser.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Http2Parser.java rename to core/src/main/java/org/apache/coyote/http2/Http2Parser.java diff --git a/src/main/java/org/apache/coyote/http2/Http2Protocol.java b/core/src/main/java/org/apache/coyote/http2/Http2Protocol.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Http2Protocol.java rename to core/src/main/java/org/apache/coyote/http2/Http2Protocol.java diff --git a/src/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/core/src/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java rename to core/src/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java diff --git a/src/main/java/org/apache/coyote/http2/LocalStrings.properties b/core/src/main/java/org/apache/coyote/http2/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/coyote/http2/LocalStrings.properties rename to core/src/main/java/org/apache/coyote/http2/LocalStrings.properties diff --git a/src/main/java/org/apache/coyote/http2/Setting.java b/core/src/main/java/org/apache/coyote/http2/Setting.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Setting.java rename to core/src/main/java/org/apache/coyote/http2/Setting.java diff --git a/src/main/java/org/apache/coyote/http2/Stream.java b/core/src/main/java/org/apache/coyote/http2/Stream.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/Stream.java rename to core/src/main/java/org/apache/coyote/http2/Stream.java diff --git a/src/main/java/org/apache/coyote/http2/StreamException.java b/core/src/main/java/org/apache/coyote/http2/StreamException.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/StreamException.java rename to core/src/main/java/org/apache/coyote/http2/StreamException.java diff --git a/src/main/java/org/apache/coyote/http2/StreamProcessor.java b/core/src/main/java/org/apache/coyote/http2/StreamProcessor.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/StreamProcessor.java rename to core/src/main/java/org/apache/coyote/http2/StreamProcessor.java diff --git a/src/main/java/org/apache/coyote/http2/StreamRunnable.java b/core/src/main/java/org/apache/coyote/http2/StreamRunnable.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/StreamRunnable.java rename to core/src/main/java/org/apache/coyote/http2/StreamRunnable.java diff --git a/src/main/java/org/apache/coyote/http2/StreamStateMachine.java b/core/src/main/java/org/apache/coyote/http2/StreamStateMachine.java similarity index 100% rename from src/main/java/org/apache/coyote/http2/StreamStateMachine.java rename to core/src/main/java/org/apache/coyote/http2/StreamStateMachine.java diff --git a/src/main/java/org/apache/el/ExpressionFactoryImpl.java b/core/src/main/java/org/apache/el/ExpressionFactoryImpl.java similarity index 100% rename from src/main/java/org/apache/el/ExpressionFactoryImpl.java rename to core/src/main/java/org/apache/el/ExpressionFactoryImpl.java diff --git a/src/main/java/org/apache/el/Messages.properties b/core/src/main/java/org/apache/el/Messages.properties similarity index 100% rename from src/main/java/org/apache/el/Messages.properties rename to core/src/main/java/org/apache/el/Messages.properties diff --git a/src/main/java/org/apache/el/Messages_es.properties b/core/src/main/java/org/apache/el/Messages_es.properties similarity index 100% rename from src/main/java/org/apache/el/Messages_es.properties rename to core/src/main/java/org/apache/el/Messages_es.properties diff --git a/src/main/java/org/apache/el/MethodExpressionImpl.java b/core/src/main/java/org/apache/el/MethodExpressionImpl.java similarity index 100% rename from src/main/java/org/apache/el/MethodExpressionImpl.java rename to core/src/main/java/org/apache/el/MethodExpressionImpl.java diff --git a/src/main/java/org/apache/el/MethodExpressionLiteral.java b/core/src/main/java/org/apache/el/MethodExpressionLiteral.java similarity index 100% rename from src/main/java/org/apache/el/MethodExpressionLiteral.java rename to core/src/main/java/org/apache/el/MethodExpressionLiteral.java diff --git a/src/main/java/org/apache/el/ValueExpressionImpl.java b/core/src/main/java/org/apache/el/ValueExpressionImpl.java similarity index 100% rename from src/main/java/org/apache/el/ValueExpressionImpl.java rename to core/src/main/java/org/apache/el/ValueExpressionImpl.java diff --git a/src/main/java/org/apache/el/ValueExpressionLiteral.java b/core/src/main/java/org/apache/el/ValueExpressionLiteral.java similarity index 100% rename from src/main/java/org/apache/el/ValueExpressionLiteral.java rename to core/src/main/java/org/apache/el/ValueExpressionLiteral.java diff --git a/src/main/java/org/apache/el/lang/ELArithmetic.java b/core/src/main/java/org/apache/el/lang/ELArithmetic.java similarity index 100% rename from src/main/java/org/apache/el/lang/ELArithmetic.java rename to core/src/main/java/org/apache/el/lang/ELArithmetic.java diff --git a/src/main/java/org/apache/el/lang/ELSupport.java b/core/src/main/java/org/apache/el/lang/ELSupport.java similarity index 100% rename from src/main/java/org/apache/el/lang/ELSupport.java rename to core/src/main/java/org/apache/el/lang/ELSupport.java diff --git a/src/main/java/org/apache/el/lang/EvaluationContext.java b/core/src/main/java/org/apache/el/lang/EvaluationContext.java similarity index 100% rename from src/main/java/org/apache/el/lang/EvaluationContext.java rename to core/src/main/java/org/apache/el/lang/EvaluationContext.java diff --git a/src/main/java/org/apache/el/lang/ExpressionBuilder.java b/core/src/main/java/org/apache/el/lang/ExpressionBuilder.java similarity index 100% rename from src/main/java/org/apache/el/lang/ExpressionBuilder.java rename to core/src/main/java/org/apache/el/lang/ExpressionBuilder.java diff --git a/src/main/java/org/apache/el/lang/FunctionMapperFactory.java b/core/src/main/java/org/apache/el/lang/FunctionMapperFactory.java similarity index 100% rename from src/main/java/org/apache/el/lang/FunctionMapperFactory.java rename to core/src/main/java/org/apache/el/lang/FunctionMapperFactory.java diff --git a/src/main/java/org/apache/el/lang/FunctionMapperImpl.java b/core/src/main/java/org/apache/el/lang/FunctionMapperImpl.java similarity index 100% rename from src/main/java/org/apache/el/lang/FunctionMapperImpl.java rename to core/src/main/java/org/apache/el/lang/FunctionMapperImpl.java diff --git a/src/main/java/org/apache/el/lang/VariableMapperFactory.java b/core/src/main/java/org/apache/el/lang/VariableMapperFactory.java similarity index 100% rename from src/main/java/org/apache/el/lang/VariableMapperFactory.java rename to core/src/main/java/org/apache/el/lang/VariableMapperFactory.java diff --git a/src/main/java/org/apache/el/lang/VariableMapperImpl.java b/core/src/main/java/org/apache/el/lang/VariableMapperImpl.java similarity index 100% rename from src/main/java/org/apache/el/lang/VariableMapperImpl.java rename to core/src/main/java/org/apache/el/lang/VariableMapperImpl.java diff --git a/src/main/java/org/apache/el/parser/ArithmeticNode.java b/core/src/main/java/org/apache/el/parser/ArithmeticNode.java similarity index 100% rename from src/main/java/org/apache/el/parser/ArithmeticNode.java rename to core/src/main/java/org/apache/el/parser/ArithmeticNode.java diff --git a/src/main/java/org/apache/el/parser/AstAnd.java b/core/src/main/java/org/apache/el/parser/AstAnd.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstAnd.java rename to core/src/main/java/org/apache/el/parser/AstAnd.java diff --git a/src/main/java/org/apache/el/parser/AstAssign.java b/core/src/main/java/org/apache/el/parser/AstAssign.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstAssign.java rename to core/src/main/java/org/apache/el/parser/AstAssign.java diff --git a/src/main/java/org/apache/el/parser/AstBracketSuffix.java b/core/src/main/java/org/apache/el/parser/AstBracketSuffix.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstBracketSuffix.java rename to core/src/main/java/org/apache/el/parser/AstBracketSuffix.java diff --git a/src/main/java/org/apache/el/parser/AstChoice.java b/core/src/main/java/org/apache/el/parser/AstChoice.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstChoice.java rename to core/src/main/java/org/apache/el/parser/AstChoice.java diff --git a/src/main/java/org/apache/el/parser/AstCompositeExpression.java b/core/src/main/java/org/apache/el/parser/AstCompositeExpression.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstCompositeExpression.java rename to core/src/main/java/org/apache/el/parser/AstCompositeExpression.java diff --git a/src/main/java/org/apache/el/parser/AstConcatenation.java b/core/src/main/java/org/apache/el/parser/AstConcatenation.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstConcatenation.java rename to core/src/main/java/org/apache/el/parser/AstConcatenation.java diff --git a/src/main/java/org/apache/el/parser/AstDeferredExpression.java b/core/src/main/java/org/apache/el/parser/AstDeferredExpression.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstDeferredExpression.java rename to core/src/main/java/org/apache/el/parser/AstDeferredExpression.java diff --git a/src/main/java/org/apache/el/parser/AstDiv.java b/core/src/main/java/org/apache/el/parser/AstDiv.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstDiv.java rename to core/src/main/java/org/apache/el/parser/AstDiv.java diff --git a/src/main/java/org/apache/el/parser/AstDotSuffix.java b/core/src/main/java/org/apache/el/parser/AstDotSuffix.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstDotSuffix.java rename to core/src/main/java/org/apache/el/parser/AstDotSuffix.java diff --git a/src/main/java/org/apache/el/parser/AstDynamicExpression.java b/core/src/main/java/org/apache/el/parser/AstDynamicExpression.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstDynamicExpression.java rename to core/src/main/java/org/apache/el/parser/AstDynamicExpression.java diff --git a/src/main/java/org/apache/el/parser/AstEmpty.java b/core/src/main/java/org/apache/el/parser/AstEmpty.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstEmpty.java rename to core/src/main/java/org/apache/el/parser/AstEmpty.java diff --git a/src/main/java/org/apache/el/parser/AstEqual.java b/core/src/main/java/org/apache/el/parser/AstEqual.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstEqual.java rename to core/src/main/java/org/apache/el/parser/AstEqual.java diff --git a/src/main/java/org/apache/el/parser/AstFalse.java b/core/src/main/java/org/apache/el/parser/AstFalse.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstFalse.java rename to core/src/main/java/org/apache/el/parser/AstFalse.java diff --git a/src/main/java/org/apache/el/parser/AstFloatingPoint.java b/core/src/main/java/org/apache/el/parser/AstFloatingPoint.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstFloatingPoint.java rename to core/src/main/java/org/apache/el/parser/AstFloatingPoint.java diff --git a/src/main/java/org/apache/el/parser/AstFunction.java b/core/src/main/java/org/apache/el/parser/AstFunction.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstFunction.java rename to core/src/main/java/org/apache/el/parser/AstFunction.java diff --git a/src/main/java/org/apache/el/parser/AstGreaterThan.java b/core/src/main/java/org/apache/el/parser/AstGreaterThan.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstGreaterThan.java rename to core/src/main/java/org/apache/el/parser/AstGreaterThan.java diff --git a/src/main/java/org/apache/el/parser/AstGreaterThanEqual.java b/core/src/main/java/org/apache/el/parser/AstGreaterThanEqual.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstGreaterThanEqual.java rename to core/src/main/java/org/apache/el/parser/AstGreaterThanEqual.java diff --git a/src/main/java/org/apache/el/parser/AstIdentifier.java b/core/src/main/java/org/apache/el/parser/AstIdentifier.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstIdentifier.java rename to core/src/main/java/org/apache/el/parser/AstIdentifier.java diff --git a/src/main/java/org/apache/el/parser/AstInteger.java b/core/src/main/java/org/apache/el/parser/AstInteger.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstInteger.java rename to core/src/main/java/org/apache/el/parser/AstInteger.java diff --git a/src/main/java/org/apache/el/parser/AstLambdaExpression.java b/core/src/main/java/org/apache/el/parser/AstLambdaExpression.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstLambdaExpression.java rename to core/src/main/java/org/apache/el/parser/AstLambdaExpression.java diff --git a/src/main/java/org/apache/el/parser/AstLambdaParameters.java b/core/src/main/java/org/apache/el/parser/AstLambdaParameters.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstLambdaParameters.java rename to core/src/main/java/org/apache/el/parser/AstLambdaParameters.java diff --git a/src/main/java/org/apache/el/parser/AstLessThan.java b/core/src/main/java/org/apache/el/parser/AstLessThan.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstLessThan.java rename to core/src/main/java/org/apache/el/parser/AstLessThan.java diff --git a/src/main/java/org/apache/el/parser/AstLessThanEqual.java b/core/src/main/java/org/apache/el/parser/AstLessThanEqual.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstLessThanEqual.java rename to core/src/main/java/org/apache/el/parser/AstLessThanEqual.java diff --git a/src/main/java/org/apache/el/parser/AstListData.java b/core/src/main/java/org/apache/el/parser/AstListData.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstListData.java rename to core/src/main/java/org/apache/el/parser/AstListData.java diff --git a/src/main/java/org/apache/el/parser/AstLiteralExpression.java b/core/src/main/java/org/apache/el/parser/AstLiteralExpression.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstLiteralExpression.java rename to core/src/main/java/org/apache/el/parser/AstLiteralExpression.java diff --git a/src/main/java/org/apache/el/parser/AstMapData.java b/core/src/main/java/org/apache/el/parser/AstMapData.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstMapData.java rename to core/src/main/java/org/apache/el/parser/AstMapData.java diff --git a/src/main/java/org/apache/el/parser/AstMapEntry.java b/core/src/main/java/org/apache/el/parser/AstMapEntry.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstMapEntry.java rename to core/src/main/java/org/apache/el/parser/AstMapEntry.java diff --git a/src/main/java/org/apache/el/parser/AstMethodParameters.java b/core/src/main/java/org/apache/el/parser/AstMethodParameters.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstMethodParameters.java rename to core/src/main/java/org/apache/el/parser/AstMethodParameters.java diff --git a/src/main/java/org/apache/el/parser/AstMinus.java b/core/src/main/java/org/apache/el/parser/AstMinus.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstMinus.java rename to core/src/main/java/org/apache/el/parser/AstMinus.java diff --git a/src/main/java/org/apache/el/parser/AstMod.java b/core/src/main/java/org/apache/el/parser/AstMod.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstMod.java rename to core/src/main/java/org/apache/el/parser/AstMod.java diff --git a/src/main/java/org/apache/el/parser/AstMult.java b/core/src/main/java/org/apache/el/parser/AstMult.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstMult.java rename to core/src/main/java/org/apache/el/parser/AstMult.java diff --git a/src/main/java/org/apache/el/parser/AstNegative.java b/core/src/main/java/org/apache/el/parser/AstNegative.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstNegative.java rename to core/src/main/java/org/apache/el/parser/AstNegative.java diff --git a/src/main/java/org/apache/el/parser/AstNot.java b/core/src/main/java/org/apache/el/parser/AstNot.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstNot.java rename to core/src/main/java/org/apache/el/parser/AstNot.java diff --git a/src/main/java/org/apache/el/parser/AstNotEqual.java b/core/src/main/java/org/apache/el/parser/AstNotEqual.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstNotEqual.java rename to core/src/main/java/org/apache/el/parser/AstNotEqual.java diff --git a/src/main/java/org/apache/el/parser/AstNull.java b/core/src/main/java/org/apache/el/parser/AstNull.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstNull.java rename to core/src/main/java/org/apache/el/parser/AstNull.java diff --git a/src/main/java/org/apache/el/parser/AstOr.java b/core/src/main/java/org/apache/el/parser/AstOr.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstOr.java rename to core/src/main/java/org/apache/el/parser/AstOr.java diff --git a/src/main/java/org/apache/el/parser/AstPlus.java b/core/src/main/java/org/apache/el/parser/AstPlus.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstPlus.java rename to core/src/main/java/org/apache/el/parser/AstPlus.java diff --git a/src/main/java/org/apache/el/parser/AstSemicolon.java b/core/src/main/java/org/apache/el/parser/AstSemicolon.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstSemicolon.java rename to core/src/main/java/org/apache/el/parser/AstSemicolon.java diff --git a/src/main/java/org/apache/el/parser/AstSetData.java b/core/src/main/java/org/apache/el/parser/AstSetData.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstSetData.java rename to core/src/main/java/org/apache/el/parser/AstSetData.java diff --git a/src/main/java/org/apache/el/parser/AstString.java b/core/src/main/java/org/apache/el/parser/AstString.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstString.java rename to core/src/main/java/org/apache/el/parser/AstString.java diff --git a/src/main/java/org/apache/el/parser/AstTrue.java b/core/src/main/java/org/apache/el/parser/AstTrue.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstTrue.java rename to core/src/main/java/org/apache/el/parser/AstTrue.java diff --git a/src/main/java/org/apache/el/parser/AstValue.java b/core/src/main/java/org/apache/el/parser/AstValue.java similarity index 100% rename from src/main/java/org/apache/el/parser/AstValue.java rename to core/src/main/java/org/apache/el/parser/AstValue.java diff --git a/src/main/java/org/apache/el/parser/BooleanNode.java b/core/src/main/java/org/apache/el/parser/BooleanNode.java similarity index 100% rename from src/main/java/org/apache/el/parser/BooleanNode.java rename to core/src/main/java/org/apache/el/parser/BooleanNode.java diff --git a/src/main/java/org/apache/el/parser/ELParser.html b/core/src/main/java/org/apache/el/parser/ELParser.html similarity index 100% rename from src/main/java/org/apache/el/parser/ELParser.html rename to core/src/main/java/org/apache/el/parser/ELParser.html diff --git a/src/main/java/org/apache/el/parser/ELParser.java b/core/src/main/java/org/apache/el/parser/ELParser.java similarity index 100% rename from src/main/java/org/apache/el/parser/ELParser.java rename to core/src/main/java/org/apache/el/parser/ELParser.java diff --git a/src/main/java/org/apache/el/parser/ELParser.jjt b/core/src/main/java/org/apache/el/parser/ELParser.jjt similarity index 100% rename from src/main/java/org/apache/el/parser/ELParser.jjt rename to core/src/main/java/org/apache/el/parser/ELParser.jjt diff --git a/src/main/java/org/apache/el/parser/ELParserConstants.java b/core/src/main/java/org/apache/el/parser/ELParserConstants.java similarity index 100% rename from src/main/java/org/apache/el/parser/ELParserConstants.java rename to core/src/main/java/org/apache/el/parser/ELParserConstants.java diff --git a/src/main/java/org/apache/el/parser/ELParserTokenManager.java b/core/src/main/java/org/apache/el/parser/ELParserTokenManager.java similarity index 100% rename from src/main/java/org/apache/el/parser/ELParserTokenManager.java rename to core/src/main/java/org/apache/el/parser/ELParserTokenManager.java diff --git a/src/main/java/org/apache/el/parser/ELParserTreeConstants.java b/core/src/main/java/org/apache/el/parser/ELParserTreeConstants.java similarity index 100% rename from src/main/java/org/apache/el/parser/ELParserTreeConstants.java rename to core/src/main/java/org/apache/el/parser/ELParserTreeConstants.java diff --git a/src/main/java/org/apache/el/parser/JJTELParserState.java b/core/src/main/java/org/apache/el/parser/JJTELParserState.java similarity index 100% rename from src/main/java/org/apache/el/parser/JJTELParserState.java rename to core/src/main/java/org/apache/el/parser/JJTELParserState.java diff --git a/src/main/java/org/apache/el/parser/Node.java b/core/src/main/java/org/apache/el/parser/Node.java similarity index 100% rename from src/main/java/org/apache/el/parser/Node.java rename to core/src/main/java/org/apache/el/parser/Node.java diff --git a/src/main/java/org/apache/el/parser/NodeVisitor.java b/core/src/main/java/org/apache/el/parser/NodeVisitor.java similarity index 100% rename from src/main/java/org/apache/el/parser/NodeVisitor.java rename to core/src/main/java/org/apache/el/parser/NodeVisitor.java diff --git a/src/main/java/org/apache/el/parser/ParseException.java b/core/src/main/java/org/apache/el/parser/ParseException.java similarity index 100% rename from src/main/java/org/apache/el/parser/ParseException.java rename to core/src/main/java/org/apache/el/parser/ParseException.java diff --git a/src/main/java/org/apache/el/parser/SimpleCharStream.java b/core/src/main/java/org/apache/el/parser/SimpleCharStream.java similarity index 100% rename from src/main/java/org/apache/el/parser/SimpleCharStream.java rename to core/src/main/java/org/apache/el/parser/SimpleCharStream.java diff --git a/src/main/java/org/apache/el/parser/SimpleNode.java b/core/src/main/java/org/apache/el/parser/SimpleNode.java similarity index 100% rename from src/main/java/org/apache/el/parser/SimpleNode.java rename to core/src/main/java/org/apache/el/parser/SimpleNode.java diff --git a/src/main/java/org/apache/el/parser/Token.java b/core/src/main/java/org/apache/el/parser/Token.java similarity index 100% rename from src/main/java/org/apache/el/parser/Token.java rename to core/src/main/java/org/apache/el/parser/Token.java diff --git a/src/main/java/org/apache/el/parser/TokenMgrError.java b/core/src/main/java/org/apache/el/parser/TokenMgrError.java similarity index 100% rename from src/main/java/org/apache/el/parser/TokenMgrError.java rename to core/src/main/java/org/apache/el/parser/TokenMgrError.java diff --git a/src/main/java/org/apache/el/stream/Optional.java b/core/src/main/java/org/apache/el/stream/Optional.java similarity index 100% rename from src/main/java/org/apache/el/stream/Optional.java rename to core/src/main/java/org/apache/el/stream/Optional.java diff --git a/src/main/java/org/apache/el/stream/Stream.java b/core/src/main/java/org/apache/el/stream/Stream.java similarity index 100% rename from src/main/java/org/apache/el/stream/Stream.java rename to core/src/main/java/org/apache/el/stream/Stream.java diff --git a/src/main/java/org/apache/el/stream/StreamELResolverImpl.java b/core/src/main/java/org/apache/el/stream/StreamELResolverImpl.java similarity index 100% rename from src/main/java/org/apache/el/stream/StreamELResolverImpl.java rename to core/src/main/java/org/apache/el/stream/StreamELResolverImpl.java diff --git a/src/main/java/org/apache/el/util/ConcurrentCache.java b/core/src/main/java/org/apache/el/util/ConcurrentCache.java similarity index 100% rename from src/main/java/org/apache/el/util/ConcurrentCache.java rename to core/src/main/java/org/apache/el/util/ConcurrentCache.java diff --git a/src/main/java/org/apache/el/util/MessageFactory.java b/core/src/main/java/org/apache/el/util/MessageFactory.java similarity index 100% rename from src/main/java/org/apache/el/util/MessageFactory.java rename to core/src/main/java/org/apache/el/util/MessageFactory.java diff --git a/src/main/java/org/apache/el/util/ReflectionUtil.java b/core/src/main/java/org/apache/el/util/ReflectionUtil.java similarity index 100% rename from src/main/java/org/apache/el/util/ReflectionUtil.java rename to core/src/main/java/org/apache/el/util/ReflectionUtil.java diff --git a/src/main/java/org/apache/el/util/Validation.java b/core/src/main/java/org/apache/el/util/Validation.java similarity index 100% rename from src/main/java/org/apache/el/util/Validation.java rename to core/src/main/java/org/apache/el/util/Validation.java diff --git a/src/main/java/org/apache/jasper/Constants.java b/core/src/main/java/org/apache/jasper/Constants.java similarity index 100% rename from src/main/java/org/apache/jasper/Constants.java rename to core/src/main/java/org/apache/jasper/Constants.java diff --git a/src/main/java/org/apache/jasper/EmbeddedServletOptions.java b/core/src/main/java/org/apache/jasper/EmbeddedServletOptions.java similarity index 100% rename from src/main/java/org/apache/jasper/EmbeddedServletOptions.java rename to core/src/main/java/org/apache/jasper/EmbeddedServletOptions.java diff --git a/src/main/java/org/apache/jasper/JasperException.java b/core/src/main/java/org/apache/jasper/JasperException.java similarity index 100% rename from src/main/java/org/apache/jasper/JasperException.java rename to core/src/main/java/org/apache/jasper/JasperException.java diff --git a/src/main/java/org/apache/jasper/JspC.java b/core/src/main/java/org/apache/jasper/JspC.java similarity index 100% rename from src/main/java/org/apache/jasper/JspC.java rename to core/src/main/java/org/apache/jasper/JspC.java diff --git a/src/main/java/org/apache/jasper/JspCompilationContext.java b/core/src/main/java/org/apache/jasper/JspCompilationContext.java similarity index 100% rename from src/main/java/org/apache/jasper/JspCompilationContext.java rename to core/src/main/java/org/apache/jasper/JspCompilationContext.java diff --git a/src/main/java/org/apache/jasper/Options.java b/core/src/main/java/org/apache/jasper/Options.java similarity index 100% rename from src/main/java/org/apache/jasper/Options.java rename to core/src/main/java/org/apache/jasper/Options.java diff --git a/src/main/java/org/apache/jasper/compiler/AntCompiler.java b/core/src/main/java/org/apache/jasper/compiler/AntCompiler.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/AntCompiler.java rename to core/src/main/java/org/apache/jasper/compiler/AntCompiler.java diff --git a/src/main/java/org/apache/jasper/compiler/AttributeParser.java b/core/src/main/java/org/apache/jasper/compiler/AttributeParser.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/AttributeParser.java rename to core/src/main/java/org/apache/jasper/compiler/AttributeParser.java diff --git a/src/main/java/org/apache/jasper/compiler/BeanRepository.java b/core/src/main/java/org/apache/jasper/compiler/BeanRepository.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/BeanRepository.java rename to core/src/main/java/org/apache/jasper/compiler/BeanRepository.java diff --git a/src/main/java/org/apache/jasper/compiler/Collector.java b/core/src/main/java/org/apache/jasper/compiler/Collector.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/Collector.java rename to core/src/main/java/org/apache/jasper/compiler/Collector.java diff --git a/src/main/java/org/apache/jasper/compiler/Compiler.java b/core/src/main/java/org/apache/jasper/compiler/Compiler.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/Compiler.java rename to core/src/main/java/org/apache/jasper/compiler/Compiler.java diff --git a/src/main/java/org/apache/jasper/compiler/DefaultErrorHandler.java b/core/src/main/java/org/apache/jasper/compiler/DefaultErrorHandler.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/DefaultErrorHandler.java rename to core/src/main/java/org/apache/jasper/compiler/DefaultErrorHandler.java diff --git a/src/main/java/org/apache/jasper/compiler/ELFunctionMapper.java b/core/src/main/java/org/apache/jasper/compiler/ELFunctionMapper.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ELFunctionMapper.java rename to core/src/main/java/org/apache/jasper/compiler/ELFunctionMapper.java diff --git a/src/main/java/org/apache/jasper/compiler/ELInterpreter.java b/core/src/main/java/org/apache/jasper/compiler/ELInterpreter.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ELInterpreter.java rename to core/src/main/java/org/apache/jasper/compiler/ELInterpreter.java diff --git a/src/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java b/core/src/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java rename to core/src/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java diff --git a/src/main/java/org/apache/jasper/compiler/ELNode.java b/core/src/main/java/org/apache/jasper/compiler/ELNode.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ELNode.java rename to core/src/main/java/org/apache/jasper/compiler/ELNode.java diff --git a/src/main/java/org/apache/jasper/compiler/ELParser.java b/core/src/main/java/org/apache/jasper/compiler/ELParser.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ELParser.java rename to core/src/main/java/org/apache/jasper/compiler/ELParser.java diff --git a/src/main/java/org/apache/jasper/compiler/EncodingDetector.java b/core/src/main/java/org/apache/jasper/compiler/EncodingDetector.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/EncodingDetector.java rename to core/src/main/java/org/apache/jasper/compiler/EncodingDetector.java diff --git a/src/main/java/org/apache/jasper/compiler/ErrorDispatcher.java b/core/src/main/java/org/apache/jasper/compiler/ErrorDispatcher.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ErrorDispatcher.java rename to core/src/main/java/org/apache/jasper/compiler/ErrorDispatcher.java diff --git a/src/main/java/org/apache/jasper/compiler/ErrorHandler.java b/core/src/main/java/org/apache/jasper/compiler/ErrorHandler.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ErrorHandler.java rename to core/src/main/java/org/apache/jasper/compiler/ErrorHandler.java diff --git a/src/main/java/org/apache/jasper/compiler/Generator.java b/core/src/main/java/org/apache/jasper/compiler/Generator.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/Generator.java rename to core/src/main/java/org/apache/jasper/compiler/Generator.java diff --git a/src/main/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java b/core/src/main/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java rename to core/src/main/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java diff --git a/src/main/java/org/apache/jasper/compiler/JDTCompiler.java b/core/src/main/java/org/apache/jasper/compiler/JDTCompiler.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JDTCompiler.java rename to core/src/main/java/org/apache/jasper/compiler/JDTCompiler.java diff --git a/src/main/java/org/apache/jasper/compiler/JarScannerFactory.java b/core/src/main/java/org/apache/jasper/compiler/JarScannerFactory.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JarScannerFactory.java rename to core/src/main/java/org/apache/jasper/compiler/JarScannerFactory.java diff --git a/src/main/java/org/apache/jasper/compiler/JasperTagInfo.java b/core/src/main/java/org/apache/jasper/compiler/JasperTagInfo.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JasperTagInfo.java rename to core/src/main/java/org/apache/jasper/compiler/JasperTagInfo.java diff --git a/src/main/java/org/apache/jasper/compiler/JavacErrorDetail.java b/core/src/main/java/org/apache/jasper/compiler/JavacErrorDetail.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JavacErrorDetail.java rename to core/src/main/java/org/apache/jasper/compiler/JavacErrorDetail.java diff --git a/src/main/java/org/apache/jasper/compiler/JspConfig.java b/core/src/main/java/org/apache/jasper/compiler/JspConfig.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JspConfig.java rename to core/src/main/java/org/apache/jasper/compiler/JspConfig.java diff --git a/src/main/java/org/apache/jasper/compiler/JspDocumentParser.java b/core/src/main/java/org/apache/jasper/compiler/JspDocumentParser.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JspDocumentParser.java rename to core/src/main/java/org/apache/jasper/compiler/JspDocumentParser.java diff --git a/src/main/java/org/apache/jasper/compiler/JspReader.java b/core/src/main/java/org/apache/jasper/compiler/JspReader.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JspReader.java rename to core/src/main/java/org/apache/jasper/compiler/JspReader.java diff --git a/src/main/java/org/apache/jasper/compiler/JspRuntimeContext.java b/core/src/main/java/org/apache/jasper/compiler/JspRuntimeContext.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JspRuntimeContext.java rename to core/src/main/java/org/apache/jasper/compiler/JspRuntimeContext.java diff --git a/src/main/java/org/apache/jasper/compiler/JspUtil.java b/core/src/main/java/org/apache/jasper/compiler/JspUtil.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/JspUtil.java rename to core/src/main/java/org/apache/jasper/compiler/JspUtil.java diff --git a/src/main/java/org/apache/jasper/compiler/Localizer.java b/core/src/main/java/org/apache/jasper/compiler/Localizer.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/Localizer.java rename to core/src/main/java/org/apache/jasper/compiler/Localizer.java diff --git a/src/main/java/org/apache/jasper/compiler/Mark.java b/core/src/main/java/org/apache/jasper/compiler/Mark.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/Mark.java rename to core/src/main/java/org/apache/jasper/compiler/Mark.java diff --git a/src/main/java/org/apache/jasper/compiler/Node.java b/core/src/main/java/org/apache/jasper/compiler/Node.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/Node.java rename to core/src/main/java/org/apache/jasper/compiler/Node.java diff --git a/src/main/java/org/apache/jasper/compiler/PageDataImpl.java b/core/src/main/java/org/apache/jasper/compiler/PageDataImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/PageDataImpl.java rename to core/src/main/java/org/apache/jasper/compiler/PageDataImpl.java diff --git a/src/main/java/org/apache/jasper/compiler/PageInfo.java b/core/src/main/java/org/apache/jasper/compiler/PageInfo.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/PageInfo.java rename to core/src/main/java/org/apache/jasper/compiler/PageInfo.java diff --git a/src/main/java/org/apache/jasper/compiler/Parser.java b/core/src/main/java/org/apache/jasper/compiler/Parser.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/Parser.java rename to core/src/main/java/org/apache/jasper/compiler/Parser.java diff --git a/src/main/java/org/apache/jasper/compiler/ParserController.java b/core/src/main/java/org/apache/jasper/compiler/ParserController.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ParserController.java rename to core/src/main/java/org/apache/jasper/compiler/ParserController.java diff --git a/src/main/java/org/apache/jasper/compiler/ScriptingVariabler.java b/core/src/main/java/org/apache/jasper/compiler/ScriptingVariabler.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ScriptingVariabler.java rename to core/src/main/java/org/apache/jasper/compiler/ScriptingVariabler.java diff --git a/src/main/java/org/apache/jasper/compiler/ServletWriter.java b/core/src/main/java/org/apache/jasper/compiler/ServletWriter.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/ServletWriter.java rename to core/src/main/java/org/apache/jasper/compiler/ServletWriter.java diff --git a/src/main/java/org/apache/jasper/compiler/SmapGenerator.java b/core/src/main/java/org/apache/jasper/compiler/SmapGenerator.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/SmapGenerator.java rename to core/src/main/java/org/apache/jasper/compiler/SmapGenerator.java diff --git a/src/main/java/org/apache/jasper/compiler/SmapStratum.java b/core/src/main/java/org/apache/jasper/compiler/SmapStratum.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/SmapStratum.java rename to core/src/main/java/org/apache/jasper/compiler/SmapStratum.java diff --git a/src/main/java/org/apache/jasper/compiler/SmapUtil.java b/core/src/main/java/org/apache/jasper/compiler/SmapUtil.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/SmapUtil.java rename to core/src/main/java/org/apache/jasper/compiler/SmapUtil.java diff --git a/src/main/java/org/apache/jasper/compiler/TagConstants.java b/core/src/main/java/org/apache/jasper/compiler/TagConstants.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/TagConstants.java rename to core/src/main/java/org/apache/jasper/compiler/TagConstants.java diff --git a/src/main/java/org/apache/jasper/compiler/TagFileProcessor.java b/core/src/main/java/org/apache/jasper/compiler/TagFileProcessor.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/TagFileProcessor.java rename to core/src/main/java/org/apache/jasper/compiler/TagFileProcessor.java diff --git a/src/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java b/core/src/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java rename to core/src/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java diff --git a/src/main/java/org/apache/jasper/compiler/TagPluginManager.java b/core/src/main/java/org/apache/jasper/compiler/TagPluginManager.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/TagPluginManager.java rename to core/src/main/java/org/apache/jasper/compiler/TagPluginManager.java diff --git a/src/main/java/org/apache/jasper/compiler/TextOptimizer.java b/core/src/main/java/org/apache/jasper/compiler/TextOptimizer.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/TextOptimizer.java rename to core/src/main/java/org/apache/jasper/compiler/TextOptimizer.java diff --git a/src/main/java/org/apache/jasper/compiler/TldCache.java b/core/src/main/java/org/apache/jasper/compiler/TldCache.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/TldCache.java rename to core/src/main/java/org/apache/jasper/compiler/TldCache.java diff --git a/src/main/java/org/apache/jasper/compiler/Validator.java b/core/src/main/java/org/apache/jasper/compiler/Validator.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/Validator.java rename to core/src/main/java/org/apache/jasper/compiler/Validator.java diff --git a/src/main/java/org/apache/jasper/compiler/tagplugin/TagPlugin.java b/core/src/main/java/org/apache/jasper/compiler/tagplugin/TagPlugin.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/tagplugin/TagPlugin.java rename to core/src/main/java/org/apache/jasper/compiler/tagplugin/TagPlugin.java diff --git a/src/main/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java b/core/src/main/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java similarity index 100% rename from src/main/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java rename to core/src/main/java/org/apache/jasper/compiler/tagplugin/TagPluginContext.java diff --git a/src/main/java/org/apache/jasper/el/ELContextImpl.java b/core/src/main/java/org/apache/jasper/el/ELContextImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/el/ELContextImpl.java rename to core/src/main/java/org/apache/jasper/el/ELContextImpl.java diff --git a/src/main/java/org/apache/jasper/el/ELContextWrapper.java b/core/src/main/java/org/apache/jasper/el/ELContextWrapper.java similarity index 100% rename from src/main/java/org/apache/jasper/el/ELContextWrapper.java rename to core/src/main/java/org/apache/jasper/el/ELContextWrapper.java diff --git a/src/main/java/org/apache/jasper/el/ELResolverImpl.java b/core/src/main/java/org/apache/jasper/el/ELResolverImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/el/ELResolverImpl.java rename to core/src/main/java/org/apache/jasper/el/ELResolverImpl.java diff --git a/src/main/java/org/apache/jasper/el/ExpressionEvaluatorImpl.java b/core/src/main/java/org/apache/jasper/el/ExpressionEvaluatorImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/el/ExpressionEvaluatorImpl.java rename to core/src/main/java/org/apache/jasper/el/ExpressionEvaluatorImpl.java diff --git a/src/main/java/org/apache/jasper/el/ExpressionImpl.java b/core/src/main/java/org/apache/jasper/el/ExpressionImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/el/ExpressionImpl.java rename to core/src/main/java/org/apache/jasper/el/ExpressionImpl.java diff --git a/src/main/java/org/apache/jasper/el/FunctionMapperImpl.java b/core/src/main/java/org/apache/jasper/el/FunctionMapperImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/el/FunctionMapperImpl.java rename to core/src/main/java/org/apache/jasper/el/FunctionMapperImpl.java diff --git a/src/main/java/org/apache/jasper/el/JasperELResolver.java b/core/src/main/java/org/apache/jasper/el/JasperELResolver.java similarity index 100% rename from src/main/java/org/apache/jasper/el/JasperELResolver.java rename to core/src/main/java/org/apache/jasper/el/JasperELResolver.java diff --git a/src/main/java/org/apache/jasper/el/JspELException.java b/core/src/main/java/org/apache/jasper/el/JspELException.java similarity index 100% rename from src/main/java/org/apache/jasper/el/JspELException.java rename to core/src/main/java/org/apache/jasper/el/JspELException.java diff --git a/src/main/java/org/apache/jasper/el/JspMethodExpression.java b/core/src/main/java/org/apache/jasper/el/JspMethodExpression.java similarity index 100% rename from src/main/java/org/apache/jasper/el/JspMethodExpression.java rename to core/src/main/java/org/apache/jasper/el/JspMethodExpression.java diff --git a/src/main/java/org/apache/jasper/el/JspMethodNotFoundException.java b/core/src/main/java/org/apache/jasper/el/JspMethodNotFoundException.java similarity index 100% rename from src/main/java/org/apache/jasper/el/JspMethodNotFoundException.java rename to core/src/main/java/org/apache/jasper/el/JspMethodNotFoundException.java diff --git a/src/main/java/org/apache/jasper/el/JspPropertyNotFoundException.java b/core/src/main/java/org/apache/jasper/el/JspPropertyNotFoundException.java similarity index 100% rename from src/main/java/org/apache/jasper/el/JspPropertyNotFoundException.java rename to core/src/main/java/org/apache/jasper/el/JspPropertyNotFoundException.java diff --git a/src/main/java/org/apache/jasper/el/JspPropertyNotWritableException.java b/core/src/main/java/org/apache/jasper/el/JspPropertyNotWritableException.java similarity index 100% rename from src/main/java/org/apache/jasper/el/JspPropertyNotWritableException.java rename to core/src/main/java/org/apache/jasper/el/JspPropertyNotWritableException.java diff --git a/src/main/java/org/apache/jasper/el/JspValueExpression.java b/core/src/main/java/org/apache/jasper/el/JspValueExpression.java similarity index 100% rename from src/main/java/org/apache/jasper/el/JspValueExpression.java rename to core/src/main/java/org/apache/jasper/el/JspValueExpression.java diff --git a/src/main/java/org/apache/jasper/el/VariableResolverImpl.java b/core/src/main/java/org/apache/jasper/el/VariableResolverImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/el/VariableResolverImpl.java rename to core/src/main/java/org/apache/jasper/el/VariableResolverImpl.java diff --git a/src/main/java/org/apache/jasper/resources/LocalStrings.properties b/core/src/main/java/org/apache/jasper/resources/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/jasper/resources/LocalStrings.properties rename to core/src/main/java/org/apache/jasper/resources/LocalStrings.properties diff --git a/src/main/java/org/apache/jasper/resources/LocalStrings_es.properties b/core/src/main/java/org/apache/jasper/resources/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/jasper/resources/LocalStrings_es.properties rename to core/src/main/java/org/apache/jasper/resources/LocalStrings_es.properties diff --git a/src/main/java/org/apache/jasper/resources/LocalStrings_fr.properties b/core/src/main/java/org/apache/jasper/resources/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/jasper/resources/LocalStrings_fr.properties rename to core/src/main/java/org/apache/jasper/resources/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/jasper/resources/LocalStrings_ja.properties b/core/src/main/java/org/apache/jasper/resources/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/jasper/resources/LocalStrings_ja.properties rename to core/src/main/java/org/apache/jasper/resources/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/jasper/runtime/BodyContentImpl.java b/core/src/main/java/org/apache/jasper/runtime/BodyContentImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/BodyContentImpl.java rename to core/src/main/java/org/apache/jasper/runtime/BodyContentImpl.java diff --git a/src/main/java/org/apache/jasper/runtime/ExceptionUtils.java b/core/src/main/java/org/apache/jasper/runtime/ExceptionUtils.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/ExceptionUtils.java rename to core/src/main/java/org/apache/jasper/runtime/ExceptionUtils.java diff --git a/src/main/java/org/apache/jasper/runtime/HttpJspBase.java b/core/src/main/java/org/apache/jasper/runtime/HttpJspBase.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/HttpJspBase.java rename to core/src/main/java/org/apache/jasper/runtime/HttpJspBase.java diff --git a/src/main/java/org/apache/jasper/runtime/InstanceManagerFactory.java b/core/src/main/java/org/apache/jasper/runtime/InstanceManagerFactory.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/InstanceManagerFactory.java rename to core/src/main/java/org/apache/jasper/runtime/InstanceManagerFactory.java diff --git a/src/main/java/org/apache/jasper/runtime/JspApplicationContextImpl.java b/core/src/main/java/org/apache/jasper/runtime/JspApplicationContextImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/JspApplicationContextImpl.java rename to core/src/main/java/org/apache/jasper/runtime/JspApplicationContextImpl.java diff --git a/src/main/java/org/apache/jasper/runtime/JspContextWrapper.java b/core/src/main/java/org/apache/jasper/runtime/JspContextWrapper.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/JspContextWrapper.java rename to core/src/main/java/org/apache/jasper/runtime/JspContextWrapper.java diff --git a/src/main/java/org/apache/jasper/runtime/JspFactoryImpl.java b/core/src/main/java/org/apache/jasper/runtime/JspFactoryImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/JspFactoryImpl.java rename to core/src/main/java/org/apache/jasper/runtime/JspFactoryImpl.java diff --git a/src/main/java/org/apache/jasper/runtime/JspFragmentHelper.java b/core/src/main/java/org/apache/jasper/runtime/JspFragmentHelper.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/JspFragmentHelper.java rename to core/src/main/java/org/apache/jasper/runtime/JspFragmentHelper.java diff --git a/src/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java b/core/src/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java rename to core/src/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java diff --git a/src/main/java/org/apache/jasper/runtime/JspSourceDependent.java b/core/src/main/java/org/apache/jasper/runtime/JspSourceDependent.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/JspSourceDependent.java rename to core/src/main/java/org/apache/jasper/runtime/JspSourceDependent.java diff --git a/src/main/java/org/apache/jasper/runtime/JspSourceImports.java b/core/src/main/java/org/apache/jasper/runtime/JspSourceImports.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/JspSourceImports.java rename to core/src/main/java/org/apache/jasper/runtime/JspSourceImports.java diff --git a/src/main/java/org/apache/jasper/runtime/JspWriterImpl.java b/core/src/main/java/org/apache/jasper/runtime/JspWriterImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/JspWriterImpl.java rename to core/src/main/java/org/apache/jasper/runtime/JspWriterImpl.java diff --git a/src/main/java/org/apache/jasper/runtime/PageContextImpl.java b/core/src/main/java/org/apache/jasper/runtime/PageContextImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/PageContextImpl.java rename to core/src/main/java/org/apache/jasper/runtime/PageContextImpl.java diff --git a/src/main/java/org/apache/jasper/runtime/ProtectedFunctionMapper.java b/core/src/main/java/org/apache/jasper/runtime/ProtectedFunctionMapper.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/ProtectedFunctionMapper.java rename to core/src/main/java/org/apache/jasper/runtime/ProtectedFunctionMapper.java diff --git a/src/main/java/org/apache/jasper/runtime/ServletResponseWrapperInclude.java b/core/src/main/java/org/apache/jasper/runtime/ServletResponseWrapperInclude.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/ServletResponseWrapperInclude.java rename to core/src/main/java/org/apache/jasper/runtime/ServletResponseWrapperInclude.java diff --git a/src/main/java/org/apache/jasper/runtime/TagHandlerPool.java b/core/src/main/java/org/apache/jasper/runtime/TagHandlerPool.java similarity index 100% rename from src/main/java/org/apache/jasper/runtime/TagHandlerPool.java rename to core/src/main/java/org/apache/jasper/runtime/TagHandlerPool.java diff --git a/src/main/java/org/apache/jasper/security/SecurityClassLoad.java b/core/src/main/java/org/apache/jasper/security/SecurityClassLoad.java similarity index 100% rename from src/main/java/org/apache/jasper/security/SecurityClassLoad.java rename to core/src/main/java/org/apache/jasper/security/SecurityClassLoad.java diff --git a/src/main/java/org/apache/jasper/security/SecurityUtil.java b/core/src/main/java/org/apache/jasper/security/SecurityUtil.java similarity index 100% rename from src/main/java/org/apache/jasper/security/SecurityUtil.java rename to core/src/main/java/org/apache/jasper/security/SecurityUtil.java diff --git a/src/main/java/org/apache/jasper/servlet/JasperInitializer.java b/core/src/main/java/org/apache/jasper/servlet/JasperInitializer.java similarity index 100% rename from src/main/java/org/apache/jasper/servlet/JasperInitializer.java rename to core/src/main/java/org/apache/jasper/servlet/JasperInitializer.java diff --git a/src/main/java/org/apache/jasper/servlet/JasperLoader.java b/core/src/main/java/org/apache/jasper/servlet/JasperLoader.java similarity index 100% rename from src/main/java/org/apache/jasper/servlet/JasperLoader.java rename to core/src/main/java/org/apache/jasper/servlet/JasperLoader.java diff --git a/src/main/java/org/apache/jasper/servlet/JspCServletContext.java b/core/src/main/java/org/apache/jasper/servlet/JspCServletContext.java similarity index 100% rename from src/main/java/org/apache/jasper/servlet/JspCServletContext.java rename to core/src/main/java/org/apache/jasper/servlet/JspCServletContext.java diff --git a/src/main/java/org/apache/jasper/servlet/JspServlet.java b/core/src/main/java/org/apache/jasper/servlet/JspServlet.java similarity index 100% rename from src/main/java/org/apache/jasper/servlet/JspServlet.java rename to core/src/main/java/org/apache/jasper/servlet/JspServlet.java diff --git a/src/main/java/org/apache/jasper/servlet/JspServletWrapper.java b/core/src/main/java/org/apache/jasper/servlet/JspServletWrapper.java similarity index 100% rename from src/main/java/org/apache/jasper/servlet/JspServletWrapper.java rename to core/src/main/java/org/apache/jasper/servlet/JspServletWrapper.java diff --git a/src/main/java/org/apache/jasper/servlet/TldPreScanned.java b/core/src/main/java/org/apache/jasper/servlet/TldPreScanned.java similarity index 100% rename from src/main/java/org/apache/jasper/servlet/TldPreScanned.java rename to core/src/main/java/org/apache/jasper/servlet/TldPreScanned.java diff --git a/src/main/java/org/apache/jasper/servlet/TldScanner.java b/core/src/main/java/org/apache/jasper/servlet/TldScanner.java similarity index 100% rename from src/main/java/org/apache/jasper/servlet/TldScanner.java rename to core/src/main/java/org/apache/jasper/servlet/TldScanner.java diff --git a/src/main/java/org/apache/jasper/servlet/mbeans-descriptors.xml b/core/src/main/java/org/apache/jasper/servlet/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/jasper/servlet/mbeans-descriptors.xml rename to core/src/main/java/org/apache/jasper/servlet/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/Util.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/Util.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/Util.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/Util.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Catch.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Catch.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Catch.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Catch.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Choose.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Choose.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Choose.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Choose.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/ForEach.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/ForTokens.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/ForTokens.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/ForTokens.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/ForTokens.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/If.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/If.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/If.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/If.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Import.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Import.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Import.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Import.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Otherwise.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Otherwise.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Otherwise.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Otherwise.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Out.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Out.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Out.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Out.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Param.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Param.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Param.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Param.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Redirect.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Redirect.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Redirect.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Redirect.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Remove.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Remove.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Remove.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Remove.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Set.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Set.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Set.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Set.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/Url.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Url.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/Url.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/Url.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/core/When.java b/core/src/main/java/org/apache/jasper/tagplugins/jstl/core/When.java similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/core/When.java rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/core/When.java diff --git a/src/main/java/org/apache/jasper/tagplugins/jstl/tagPlugins.xml b/core/src/main/java/org/apache/jasper/tagplugins/jstl/tagPlugins.xml similarity index 100% rename from src/main/java/org/apache/jasper/tagplugins/jstl/tagPlugins.xml rename to core/src/main/java/org/apache/jasper/tagplugins/jstl/tagPlugins.xml diff --git a/src/main/java/org/apache/jasper/util/FastRemovalDequeue.java b/core/src/main/java/org/apache/jasper/util/FastRemovalDequeue.java similarity index 100% rename from src/main/java/org/apache/jasper/util/FastRemovalDequeue.java rename to core/src/main/java/org/apache/jasper/util/FastRemovalDequeue.java diff --git a/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java b/core/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java similarity index 100% rename from src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java rename to core/src/main/java/org/apache/jasper/util/UniqueAttributesImpl.java diff --git a/src/main/java/org/apache/juli/AsyncFileHandler.java b/core/src/main/java/org/apache/juli/AsyncFileHandler.java similarity index 100% rename from src/main/java/org/apache/juli/AsyncFileHandler.java rename to core/src/main/java/org/apache/juli/AsyncFileHandler.java diff --git a/src/main/java/org/apache/juli/ClassLoaderLogManager.java b/core/src/main/java/org/apache/juli/ClassLoaderLogManager.java similarity index 100% rename from src/main/java/org/apache/juli/ClassLoaderLogManager.java rename to core/src/main/java/org/apache/juli/ClassLoaderLogManager.java diff --git a/src/main/java/org/apache/juli/DateFormatCache.java b/core/src/main/java/org/apache/juli/DateFormatCache.java similarity index 100% rename from src/main/java/org/apache/juli/DateFormatCache.java rename to core/src/main/java/org/apache/juli/DateFormatCache.java diff --git a/src/main/java/org/apache/juli/FileHandler.java b/core/src/main/java/org/apache/juli/FileHandler.java similarity index 100% rename from src/main/java/org/apache/juli/FileHandler.java rename to core/src/main/java/org/apache/juli/FileHandler.java diff --git a/src/main/java/org/apache/juli/JdkLoggerFormatter.java b/core/src/main/java/org/apache/juli/JdkLoggerFormatter.java similarity index 100% rename from src/main/java/org/apache/juli/JdkLoggerFormatter.java rename to core/src/main/java/org/apache/juli/JdkLoggerFormatter.java diff --git a/src/main/java/org/apache/juli/OneLineFormatter.java b/core/src/main/java/org/apache/juli/OneLineFormatter.java similarity index 100% rename from src/main/java/org/apache/juli/OneLineFormatter.java rename to core/src/main/java/org/apache/juli/OneLineFormatter.java diff --git a/src/main/java/org/apache/juli/VerbatimFormatter.java b/core/src/main/java/org/apache/juli/VerbatimFormatter.java similarity index 100% rename from src/main/java/org/apache/juli/VerbatimFormatter.java rename to core/src/main/java/org/apache/juli/VerbatimFormatter.java diff --git a/src/main/java/org/apache/juli/WebappProperties.java b/core/src/main/java/org/apache/juli/WebappProperties.java similarity index 100% rename from src/main/java/org/apache/juli/WebappProperties.java rename to core/src/main/java/org/apache/juli/WebappProperties.java diff --git a/src/main/java/org/apache/juli/logging/DirectJDKLog.java b/core/src/main/java/org/apache/juli/logging/DirectJDKLog.java similarity index 100% rename from src/main/java/org/apache/juli/logging/DirectJDKLog.java rename to core/src/main/java/org/apache/juli/logging/DirectJDKLog.java diff --git a/src/main/java/org/apache/juli/logging/Log.java b/core/src/main/java/org/apache/juli/logging/Log.java similarity index 100% rename from src/main/java/org/apache/juli/logging/Log.java rename to core/src/main/java/org/apache/juli/logging/Log.java diff --git a/src/main/java/org/apache/juli/logging/LogConfigurationException.java b/core/src/main/java/org/apache/juli/logging/LogConfigurationException.java similarity index 100% rename from src/main/java/org/apache/juli/logging/LogConfigurationException.java rename to core/src/main/java/org/apache/juli/logging/LogConfigurationException.java diff --git a/src/main/java/org/apache/juli/logging/LogFactory.java b/core/src/main/java/org/apache/juli/logging/LogFactory.java similarity index 100% rename from src/main/java/org/apache/juli/logging/LogFactory.java rename to core/src/main/java/org/apache/juli/logging/LogFactory.java diff --git a/src/main/java/org/apache/juli/logging/package.html b/core/src/main/java/org/apache/juli/logging/package.html similarity index 100% rename from src/main/java/org/apache/juli/logging/package.html rename to core/src/main/java/org/apache/juli/logging/package.html diff --git a/src/main/java/org/apache/naming/AbstractRef.java b/core/src/main/java/org/apache/naming/AbstractRef.java similarity index 100% rename from src/main/java/org/apache/naming/AbstractRef.java rename to core/src/main/java/org/apache/naming/AbstractRef.java diff --git a/src/main/java/org/apache/naming/ContextAccessController.java b/core/src/main/java/org/apache/naming/ContextAccessController.java similarity index 100% rename from src/main/java/org/apache/naming/ContextAccessController.java rename to core/src/main/java/org/apache/naming/ContextAccessController.java diff --git a/src/main/java/org/apache/naming/ContextBindings.java b/core/src/main/java/org/apache/naming/ContextBindings.java similarity index 100% rename from src/main/java/org/apache/naming/ContextBindings.java rename to core/src/main/java/org/apache/naming/ContextBindings.java diff --git a/src/main/java/org/apache/naming/EjbRef.java b/core/src/main/java/org/apache/naming/EjbRef.java similarity index 100% rename from src/main/java/org/apache/naming/EjbRef.java rename to core/src/main/java/org/apache/naming/EjbRef.java diff --git a/src/main/java/org/apache/naming/HandlerRef.java b/core/src/main/java/org/apache/naming/HandlerRef.java similarity index 100% rename from src/main/java/org/apache/naming/HandlerRef.java rename to core/src/main/java/org/apache/naming/HandlerRef.java diff --git a/src/main/java/org/apache/naming/LocalStrings.properties b/core/src/main/java/org/apache/naming/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/naming/LocalStrings.properties rename to core/src/main/java/org/apache/naming/LocalStrings.properties diff --git a/src/main/java/org/apache/naming/LocalStrings_es.properties b/core/src/main/java/org/apache/naming/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/naming/LocalStrings_es.properties rename to core/src/main/java/org/apache/naming/LocalStrings_es.properties diff --git a/src/main/java/org/apache/naming/LocalStrings_fr.properties b/core/src/main/java/org/apache/naming/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/naming/LocalStrings_fr.properties rename to core/src/main/java/org/apache/naming/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/naming/LocalStrings_ja.properties b/core/src/main/java/org/apache/naming/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/naming/LocalStrings_ja.properties rename to core/src/main/java/org/apache/naming/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/naming/NameParserImpl.java b/core/src/main/java/org/apache/naming/NameParserImpl.java similarity index 100% rename from src/main/java/org/apache/naming/NameParserImpl.java rename to core/src/main/java/org/apache/naming/NameParserImpl.java diff --git a/src/main/java/org/apache/naming/NamingContext.java b/core/src/main/java/org/apache/naming/NamingContext.java similarity index 100% rename from src/main/java/org/apache/naming/NamingContext.java rename to core/src/main/java/org/apache/naming/NamingContext.java diff --git a/src/main/java/org/apache/naming/NamingContextBindingsEnumeration.java b/core/src/main/java/org/apache/naming/NamingContextBindingsEnumeration.java similarity index 100% rename from src/main/java/org/apache/naming/NamingContextBindingsEnumeration.java rename to core/src/main/java/org/apache/naming/NamingContextBindingsEnumeration.java diff --git a/src/main/java/org/apache/naming/NamingContextEnumeration.java b/core/src/main/java/org/apache/naming/NamingContextEnumeration.java similarity index 100% rename from src/main/java/org/apache/naming/NamingContextEnumeration.java rename to core/src/main/java/org/apache/naming/NamingContextEnumeration.java diff --git a/src/main/java/org/apache/naming/NamingEntry.java b/core/src/main/java/org/apache/naming/NamingEntry.java similarity index 100% rename from src/main/java/org/apache/naming/NamingEntry.java rename to core/src/main/java/org/apache/naming/NamingEntry.java diff --git a/src/main/java/org/apache/naming/ResourceEnvRef.java b/core/src/main/java/org/apache/naming/ResourceEnvRef.java similarity index 100% rename from src/main/java/org/apache/naming/ResourceEnvRef.java rename to core/src/main/java/org/apache/naming/ResourceEnvRef.java diff --git a/src/main/java/org/apache/naming/ResourceLinkRef.java b/core/src/main/java/org/apache/naming/ResourceLinkRef.java similarity index 100% rename from src/main/java/org/apache/naming/ResourceLinkRef.java rename to core/src/main/java/org/apache/naming/ResourceLinkRef.java diff --git a/src/main/java/org/apache/naming/ResourceRef.java b/core/src/main/java/org/apache/naming/ResourceRef.java similarity index 100% rename from src/main/java/org/apache/naming/ResourceRef.java rename to core/src/main/java/org/apache/naming/ResourceRef.java diff --git a/src/main/java/org/apache/naming/SelectorContext.java b/core/src/main/java/org/apache/naming/SelectorContext.java similarity index 100% rename from src/main/java/org/apache/naming/SelectorContext.java rename to core/src/main/java/org/apache/naming/SelectorContext.java diff --git a/src/main/java/org/apache/naming/ServiceRef.java b/core/src/main/java/org/apache/naming/ServiceRef.java similarity index 100% rename from src/main/java/org/apache/naming/ServiceRef.java rename to core/src/main/java/org/apache/naming/ServiceRef.java diff --git a/src/main/java/org/apache/naming/StringManager.java b/core/src/main/java/org/apache/naming/StringManager.java similarity index 100% rename from src/main/java/org/apache/naming/StringManager.java rename to core/src/main/java/org/apache/naming/StringManager.java diff --git a/src/main/java/org/apache/naming/TransactionRef.java b/core/src/main/java/org/apache/naming/TransactionRef.java similarity index 100% rename from src/main/java/org/apache/naming/TransactionRef.java rename to core/src/main/java/org/apache/naming/TransactionRef.java diff --git a/src/main/java/org/apache/naming/factory/BeanFactory.java b/core/src/main/java/org/apache/naming/factory/BeanFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/BeanFactory.java rename to core/src/main/java/org/apache/naming/factory/BeanFactory.java diff --git a/src/main/java/org/apache/naming/factory/Constants.java b/core/src/main/java/org/apache/naming/factory/Constants.java similarity index 100% rename from src/main/java/org/apache/naming/factory/Constants.java rename to core/src/main/java/org/apache/naming/factory/Constants.java diff --git a/src/main/java/org/apache/naming/factory/DataSourceLinkFactory.java b/core/src/main/java/org/apache/naming/factory/DataSourceLinkFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/DataSourceLinkFactory.java rename to core/src/main/java/org/apache/naming/factory/DataSourceLinkFactory.java diff --git a/src/main/java/org/apache/naming/factory/EjbFactory.java b/core/src/main/java/org/apache/naming/factory/EjbFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/EjbFactory.java rename to core/src/main/java/org/apache/naming/factory/EjbFactory.java diff --git a/src/main/java/org/apache/naming/factory/FactoryBase.java b/core/src/main/java/org/apache/naming/factory/FactoryBase.java similarity index 100% rename from src/main/java/org/apache/naming/factory/FactoryBase.java rename to core/src/main/java/org/apache/naming/factory/FactoryBase.java diff --git a/src/main/java/org/apache/naming/factory/LocalStrings.properties b/core/src/main/java/org/apache/naming/factory/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/naming/factory/LocalStrings.properties rename to core/src/main/java/org/apache/naming/factory/LocalStrings.properties diff --git a/src/main/java/org/apache/naming/factory/MailSessionFactory.java b/core/src/main/java/org/apache/naming/factory/MailSessionFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/MailSessionFactory.java rename to core/src/main/java/org/apache/naming/factory/MailSessionFactory.java diff --git a/src/main/java/org/apache/naming/factory/OpenEjbFactory.java b/core/src/main/java/org/apache/naming/factory/OpenEjbFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/OpenEjbFactory.java rename to core/src/main/java/org/apache/naming/factory/OpenEjbFactory.java diff --git a/src/main/java/org/apache/naming/factory/ResourceEnvFactory.java b/core/src/main/java/org/apache/naming/factory/ResourceEnvFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/ResourceEnvFactory.java rename to core/src/main/java/org/apache/naming/factory/ResourceEnvFactory.java diff --git a/src/main/java/org/apache/naming/factory/ResourceFactory.java b/core/src/main/java/org/apache/naming/factory/ResourceFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/ResourceFactory.java rename to core/src/main/java/org/apache/naming/factory/ResourceFactory.java diff --git a/src/main/java/org/apache/naming/factory/ResourceLinkFactory.java b/core/src/main/java/org/apache/naming/factory/ResourceLinkFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/ResourceLinkFactory.java rename to core/src/main/java/org/apache/naming/factory/ResourceLinkFactory.java diff --git a/src/main/java/org/apache/naming/factory/SendMailFactory.java b/core/src/main/java/org/apache/naming/factory/SendMailFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/SendMailFactory.java rename to core/src/main/java/org/apache/naming/factory/SendMailFactory.java diff --git a/src/main/java/org/apache/naming/factory/TransactionFactory.java b/core/src/main/java/org/apache/naming/factory/TransactionFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/TransactionFactory.java rename to core/src/main/java/org/apache/naming/factory/TransactionFactory.java diff --git a/src/main/java/org/apache/naming/factory/package.html b/core/src/main/java/org/apache/naming/factory/package.html similarity index 100% rename from src/main/java/org/apache/naming/factory/package.html rename to core/src/main/java/org/apache/naming/factory/package.html diff --git a/src/main/java/org/apache/naming/factory/webservices/ServiceProxy.java b/core/src/main/java/org/apache/naming/factory/webservices/ServiceProxy.java similarity index 100% rename from src/main/java/org/apache/naming/factory/webservices/ServiceProxy.java rename to core/src/main/java/org/apache/naming/factory/webservices/ServiceProxy.java diff --git a/src/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java b/core/src/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java similarity index 100% rename from src/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java rename to core/src/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java diff --git a/src/main/java/org/apache/naming/java/javaURLContextFactory.java b/core/src/main/java/org/apache/naming/java/javaURLContextFactory.java similarity index 100% rename from src/main/java/org/apache/naming/java/javaURLContextFactory.java rename to core/src/main/java/org/apache/naming/java/javaURLContextFactory.java diff --git a/src/main/java/org/apache/naming/java/package.html b/core/src/main/java/org/apache/naming/java/package.html similarity index 100% rename from src/main/java/org/apache/naming/java/package.html rename to core/src/main/java/org/apache/naming/java/package.html diff --git a/src/main/java/org/apache/naming/package.html b/core/src/main/java/org/apache/naming/package.html similarity index 100% rename from src/main/java/org/apache/naming/package.html rename to core/src/main/java/org/apache/naming/package.html diff --git a/src/main/java/org/apache/tomcat/ContextBind.java b/core/src/main/java/org/apache/tomcat/ContextBind.java similarity index 100% rename from src/main/java/org/apache/tomcat/ContextBind.java rename to core/src/main/java/org/apache/tomcat/ContextBind.java diff --git a/src/main/java/org/apache/tomcat/InstanceManager.java b/core/src/main/java/org/apache/tomcat/InstanceManager.java similarity index 100% rename from src/main/java/org/apache/tomcat/InstanceManager.java rename to core/src/main/java/org/apache/tomcat/InstanceManager.java diff --git a/src/main/java/org/apache/tomcat/InstanceManagerBindings.java b/core/src/main/java/org/apache/tomcat/InstanceManagerBindings.java similarity index 100% rename from src/main/java/org/apache/tomcat/InstanceManagerBindings.java rename to core/src/main/java/org/apache/tomcat/InstanceManagerBindings.java diff --git a/src/main/java/org/apache/tomcat/InstrumentableClassLoader.java b/core/src/main/java/org/apache/tomcat/InstrumentableClassLoader.java similarity index 100% rename from src/main/java/org/apache/tomcat/InstrumentableClassLoader.java rename to core/src/main/java/org/apache/tomcat/InstrumentableClassLoader.java diff --git a/src/main/java/org/apache/tomcat/Jar.java b/core/src/main/java/org/apache/tomcat/Jar.java similarity index 100% rename from src/main/java/org/apache/tomcat/Jar.java rename to core/src/main/java/org/apache/tomcat/Jar.java diff --git a/src/main/java/org/apache/tomcat/JarScanFilter.java b/core/src/main/java/org/apache/tomcat/JarScanFilter.java similarity index 100% rename from src/main/java/org/apache/tomcat/JarScanFilter.java rename to core/src/main/java/org/apache/tomcat/JarScanFilter.java diff --git a/src/main/java/org/apache/tomcat/JarScanType.java b/core/src/main/java/org/apache/tomcat/JarScanType.java similarity index 100% rename from src/main/java/org/apache/tomcat/JarScanType.java rename to core/src/main/java/org/apache/tomcat/JarScanType.java diff --git a/src/main/java/org/apache/tomcat/JarScanner.java b/core/src/main/java/org/apache/tomcat/JarScanner.java similarity index 100% rename from src/main/java/org/apache/tomcat/JarScanner.java rename to core/src/main/java/org/apache/tomcat/JarScanner.java diff --git a/src/main/java/org/apache/tomcat/JarScannerCallback.java b/core/src/main/java/org/apache/tomcat/JarScannerCallback.java similarity index 100% rename from src/main/java/org/apache/tomcat/JarScannerCallback.java rename to core/src/main/java/org/apache/tomcat/JarScannerCallback.java diff --git a/src/main/java/org/apache/tomcat/PeriodicEventListener.java b/core/src/main/java/org/apache/tomcat/PeriodicEventListener.java similarity index 100% rename from src/main/java/org/apache/tomcat/PeriodicEventListener.java rename to core/src/main/java/org/apache/tomcat/PeriodicEventListener.java diff --git a/src/main/java/org/apache/tomcat/SimpleInstanceManager.java b/core/src/main/java/org/apache/tomcat/SimpleInstanceManager.java similarity index 100% rename from src/main/java/org/apache/tomcat/SimpleInstanceManager.java rename to core/src/main/java/org/apache/tomcat/SimpleInstanceManager.java diff --git a/src/main/java/org/apache/tomcat/buildutil/CheckEol.java b/core/src/main/java/org/apache/tomcat/buildutil/CheckEol.java similarity index 100% rename from src/main/java/org/apache/tomcat/buildutil/CheckEol.java rename to core/src/main/java/org/apache/tomcat/buildutil/CheckEol.java diff --git a/src/main/java/org/apache/tomcat/buildutil/SignCode.java b/core/src/main/java/org/apache/tomcat/buildutil/SignCode.java similarity index 100% rename from src/main/java/org/apache/tomcat/buildutil/SignCode.java rename to core/src/main/java/org/apache/tomcat/buildutil/SignCode.java diff --git a/src/main/java/org/apache/tomcat/buildutil/Txt2Html.java b/core/src/main/java/org/apache/tomcat/buildutil/Txt2Html.java similarity index 100% rename from src/main/java/org/apache/tomcat/buildutil/Txt2Html.java rename to core/src/main/java/org/apache/tomcat/buildutil/Txt2Html.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/AbandonedTrace.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/AbandonedTrace.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/AbandonedTrace.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/AbandonedTrace.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceMXBean.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceMXBean.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceMXBean.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceMXBean.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/ConnectionFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/ConnectionFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/ConnectionFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/ConnectionFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/Constants.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/Constants.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/Constants.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DataSourceConnectionFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DataSourceConnectionFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DataSourceConnectionFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DataSourceConnectionFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingCallableStatement.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingCallableStatement.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingCallableStatement.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingCallableStatement.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingConnection.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingConnection.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingConnection.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingConnection.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingPreparedStatement.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingPreparedStatement.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingPreparedStatement.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingPreparedStatement.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DriverConnectionFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DriverConnectionFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DriverConnectionFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DriverConnectionFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/DriverManagerConnectionFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DriverManagerConnectionFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/DriverManagerConnectionFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DriverManagerConnectionFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/LifetimeExceededException.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/LifetimeExceededException.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/LifetimeExceededException.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/LifetimeExceededException.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableCallableStatement.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableCallableStatement.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableCallableStatement.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableCallableStatement.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionMXBean.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionMXBean.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionMXBean.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionMXBean.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolablePreparedStatement.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolablePreparedStatement.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolablePreparedStatement.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolablePreparedStatement.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDriver.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDriver.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDriver.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDriver.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/SwallowedExceptionLogger.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/SwallowedExceptionLogger.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/SwallowedExceptionLogger.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/SwallowedExceptionLogger.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/Utils.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/Utils.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/Utils.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/Utils.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/ConnectionImpl.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/ConnectionImpl.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/ConnectionImpl.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/ConnectionImpl.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PooledConnectionImpl.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PooledConnectionImpl.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PooledConnectionImpl.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PooledConnectionImpl.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/package-info.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/package-info.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/package-info.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/CPDSConnectionFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSource.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSourceFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSourceFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSourceFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/InstanceKeyDataSourceFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/KeyedCPDSConnectionFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/KeyedCPDSConnectionFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/KeyedCPDSConnectionFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/KeyedCPDSConnectionFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSource.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSource.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSource.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSource.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSourceFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSourceFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSourceFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PerUserPoolDataSourceFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PoolKey.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PoolKey.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PoolKey.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PoolKey.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionAndInfo.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionAndInfo.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionAndInfo.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionAndInfo.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionManager.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionManager.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionManager.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/PooledConnectionManager.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSource.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSource.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSource.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSource.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSourceFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSourceFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSourceFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/SharedPoolDataSourceFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/UserPassKey.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/UserPassKey.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/UserPassKey.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/UserPassKey.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/package-info.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/package-info.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/datasources/package-info.java diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/overview.html b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/overview.html similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/overview.html rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/overview.html diff --git a/src/main/java/org/apache/tomcat/dbcp/dbcp2/package-info.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/dbcp2/package-info.java rename to core/src/main/java/org/apache/tomcat/dbcp/dbcp2/package-info.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/BaseObject.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseObject.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/BaseObject.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseObject.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/BaseObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseObjectPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/BaseObjectPool.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseObjectPool.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedPooledObjectFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedPooledObjectFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/KeyedPooledObjectFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedPooledObjectFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectFactory.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectFactory.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectState.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectState.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectState.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObjectState.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/SwallowedExceptionListener.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/SwallowedExceptionListener.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/SwallowedExceptionListener.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/SwallowedExceptionListener.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/TrackedUse.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/TrackedUse.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/TrackedUse.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/TrackedUse.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/UsageTracking.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/UsageTracking.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/UsageTracking.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/UsageTracking.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultEvictionPolicy.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultEvictionPolicy.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultEvictionPolicy.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultEvictionPolicy.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfo.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfo.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfo.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfo.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionConfig.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionConfig.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionConfig.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionPolicy.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionPolicy.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionPolicy.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionPolicy.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolConfig.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolConfig.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolConfig.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/PoolImplUtils.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/PoolImplUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/PoolImplUtils.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/PoolImplUtils.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/PooledSoftReference.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/PooledSoftReference.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/PooledSoftReference.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/PooledSoftReference.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/impl/package.html b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/impl/package.html rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/package.html diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/overview.html b/core/src/main/java/org/apache/tomcat/dbcp/pool2/overview.html similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/overview.html rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/overview.html diff --git a/src/main/java/org/apache/tomcat/dbcp/pool2/package.html b/core/src/main/java/org/apache/tomcat/dbcp/pool2/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/dbcp/pool2/package.html rename to core/src/main/java/org/apache/tomcat/dbcp/pool2/package.html diff --git a/src/main/java/org/apache/tomcat/jni/Address.java b/core/src/main/java/org/apache/tomcat/jni/Address.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Address.java rename to core/src/main/java/org/apache/tomcat/jni/Address.java diff --git a/src/main/java/org/apache/tomcat/jni/BIOCallback.java b/core/src/main/java/org/apache/tomcat/jni/BIOCallback.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/BIOCallback.java rename to core/src/main/java/org/apache/tomcat/jni/BIOCallback.java diff --git a/src/main/java/org/apache/tomcat/jni/Buffer.java b/core/src/main/java/org/apache/tomcat/jni/Buffer.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Buffer.java rename to core/src/main/java/org/apache/tomcat/jni/Buffer.java diff --git a/src/main/java/org/apache/tomcat/jni/CertificateVerifier.java b/core/src/main/java/org/apache/tomcat/jni/CertificateVerifier.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/CertificateVerifier.java rename to core/src/main/java/org/apache/tomcat/jni/CertificateVerifier.java diff --git a/src/main/java/org/apache/tomcat/jni/Directory.java b/core/src/main/java/org/apache/tomcat/jni/Directory.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Directory.java rename to core/src/main/java/org/apache/tomcat/jni/Directory.java diff --git a/src/main/java/org/apache/tomcat/jni/Error.java b/core/src/main/java/org/apache/tomcat/jni/Error.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Error.java rename to core/src/main/java/org/apache/tomcat/jni/Error.java diff --git a/src/main/java/org/apache/tomcat/jni/File.java b/core/src/main/java/org/apache/tomcat/jni/File.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/File.java rename to core/src/main/java/org/apache/tomcat/jni/File.java diff --git a/src/main/java/org/apache/tomcat/jni/FileInfo.java b/core/src/main/java/org/apache/tomcat/jni/FileInfo.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/FileInfo.java rename to core/src/main/java/org/apache/tomcat/jni/FileInfo.java diff --git a/src/main/java/org/apache/tomcat/jni/Global.java b/core/src/main/java/org/apache/tomcat/jni/Global.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Global.java rename to core/src/main/java/org/apache/tomcat/jni/Global.java diff --git a/src/main/java/org/apache/tomcat/jni/Library.java b/core/src/main/java/org/apache/tomcat/jni/Library.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Library.java rename to core/src/main/java/org/apache/tomcat/jni/Library.java diff --git a/src/main/java/org/apache/tomcat/jni/LibraryNotFoundError.java b/core/src/main/java/org/apache/tomcat/jni/LibraryNotFoundError.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/LibraryNotFoundError.java rename to core/src/main/java/org/apache/tomcat/jni/LibraryNotFoundError.java diff --git a/src/main/java/org/apache/tomcat/jni/Local.java b/core/src/main/java/org/apache/tomcat/jni/Local.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Local.java rename to core/src/main/java/org/apache/tomcat/jni/Local.java diff --git a/src/main/java/org/apache/tomcat/jni/Lock.java b/core/src/main/java/org/apache/tomcat/jni/Lock.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Lock.java rename to core/src/main/java/org/apache/tomcat/jni/Lock.java diff --git a/src/main/java/org/apache/tomcat/jni/Mmap.java b/core/src/main/java/org/apache/tomcat/jni/Mmap.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Mmap.java rename to core/src/main/java/org/apache/tomcat/jni/Mmap.java diff --git a/src/main/java/org/apache/tomcat/jni/Multicast.java b/core/src/main/java/org/apache/tomcat/jni/Multicast.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Multicast.java rename to core/src/main/java/org/apache/tomcat/jni/Multicast.java diff --git a/src/main/java/org/apache/tomcat/jni/OS.java b/core/src/main/java/org/apache/tomcat/jni/OS.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/OS.java rename to core/src/main/java/org/apache/tomcat/jni/OS.java diff --git a/src/main/java/org/apache/tomcat/jni/PasswordCallback.java b/core/src/main/java/org/apache/tomcat/jni/PasswordCallback.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/PasswordCallback.java rename to core/src/main/java/org/apache/tomcat/jni/PasswordCallback.java diff --git a/src/main/java/org/apache/tomcat/jni/Poll.java b/core/src/main/java/org/apache/tomcat/jni/Poll.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Poll.java rename to core/src/main/java/org/apache/tomcat/jni/Poll.java diff --git a/src/main/java/org/apache/tomcat/jni/Pool.java b/core/src/main/java/org/apache/tomcat/jni/Pool.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Pool.java rename to core/src/main/java/org/apache/tomcat/jni/Pool.java diff --git a/src/main/java/org/apache/tomcat/jni/PoolCallback.java b/core/src/main/java/org/apache/tomcat/jni/PoolCallback.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/PoolCallback.java rename to core/src/main/java/org/apache/tomcat/jni/PoolCallback.java diff --git a/src/main/java/org/apache/tomcat/jni/Proc.java b/core/src/main/java/org/apache/tomcat/jni/Proc.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Proc.java rename to core/src/main/java/org/apache/tomcat/jni/Proc.java diff --git a/src/main/java/org/apache/tomcat/jni/ProcErrorCallback.java b/core/src/main/java/org/apache/tomcat/jni/ProcErrorCallback.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/ProcErrorCallback.java rename to core/src/main/java/org/apache/tomcat/jni/ProcErrorCallback.java diff --git a/src/main/java/org/apache/tomcat/jni/Procattr.java b/core/src/main/java/org/apache/tomcat/jni/Procattr.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Procattr.java rename to core/src/main/java/org/apache/tomcat/jni/Procattr.java diff --git a/src/main/java/org/apache/tomcat/jni/Registry.java b/core/src/main/java/org/apache/tomcat/jni/Registry.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Registry.java rename to core/src/main/java/org/apache/tomcat/jni/Registry.java diff --git a/src/main/java/org/apache/tomcat/jni/SSL.java b/core/src/main/java/org/apache/tomcat/jni/SSL.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/SSL.java rename to core/src/main/java/org/apache/tomcat/jni/SSL.java diff --git a/src/main/java/org/apache/tomcat/jni/SSLContext.java b/core/src/main/java/org/apache/tomcat/jni/SSLContext.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/SSLContext.java rename to core/src/main/java/org/apache/tomcat/jni/SSLContext.java diff --git a/src/main/java/org/apache/tomcat/jni/SSLSocket.java b/core/src/main/java/org/apache/tomcat/jni/SSLSocket.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/SSLSocket.java rename to core/src/main/java/org/apache/tomcat/jni/SSLSocket.java diff --git a/src/main/java/org/apache/tomcat/jni/Shm.java b/core/src/main/java/org/apache/tomcat/jni/Shm.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Shm.java rename to core/src/main/java/org/apache/tomcat/jni/Shm.java diff --git a/src/main/java/org/apache/tomcat/jni/Sockaddr.java b/core/src/main/java/org/apache/tomcat/jni/Sockaddr.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Sockaddr.java rename to core/src/main/java/org/apache/tomcat/jni/Sockaddr.java diff --git a/src/main/java/org/apache/tomcat/jni/Socket.java b/core/src/main/java/org/apache/tomcat/jni/Socket.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Socket.java rename to core/src/main/java/org/apache/tomcat/jni/Socket.java diff --git a/src/main/java/org/apache/tomcat/jni/Status.java b/core/src/main/java/org/apache/tomcat/jni/Status.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Status.java rename to core/src/main/java/org/apache/tomcat/jni/Status.java diff --git a/src/main/java/org/apache/tomcat/jni/Stdlib.java b/core/src/main/java/org/apache/tomcat/jni/Stdlib.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Stdlib.java rename to core/src/main/java/org/apache/tomcat/jni/Stdlib.java diff --git a/src/main/java/org/apache/tomcat/jni/Thread.java b/core/src/main/java/org/apache/tomcat/jni/Thread.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Thread.java rename to core/src/main/java/org/apache/tomcat/jni/Thread.java diff --git a/src/main/java/org/apache/tomcat/jni/Time.java b/core/src/main/java/org/apache/tomcat/jni/Time.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/Time.java rename to core/src/main/java/org/apache/tomcat/jni/Time.java diff --git a/src/main/java/org/apache/tomcat/jni/User.java b/core/src/main/java/org/apache/tomcat/jni/User.java similarity index 100% rename from src/main/java/org/apache/tomcat/jni/User.java rename to core/src/main/java/org/apache/tomcat/jni/User.java diff --git a/src/main/java/org/apache/tomcat/util/Diagnostics.java b/core/src/main/java/org/apache/tomcat/util/Diagnostics.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/Diagnostics.java rename to core/src/main/java/org/apache/tomcat/util/Diagnostics.java diff --git a/src/main/java/org/apache/tomcat/util/ExceptionUtils.java b/core/src/main/java/org/apache/tomcat/util/ExceptionUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/ExceptionUtils.java rename to core/src/main/java/org/apache/tomcat/util/ExceptionUtils.java diff --git a/src/main/java/org/apache/tomcat/util/IntrospectionUtils.java b/core/src/main/java/org/apache/tomcat/util/IntrospectionUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/IntrospectionUtils.java rename to core/src/main/java/org/apache/tomcat/util/IntrospectionUtils.java diff --git a/src/main/java/org/apache/tomcat/util/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/bcel/Const.java b/core/src/main/java/org/apache/tomcat/util/bcel/Const.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/Const.java rename to core/src/main/java/org/apache/tomcat/util/bcel/Const.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationElementValue.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationElementValue.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationElementValue.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationElementValue.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationEntry.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationEntry.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationEntry.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/AnnotationEntry.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/Annotations.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/Annotations.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/Annotations.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/Annotations.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ArrayElementValue.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ArrayElementValue.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ArrayElementValue.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ArrayElementValue.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassElementValue.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassElementValue.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ClassElementValue.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassElementValue.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassFormatException.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassFormatException.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ClassFormatException.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassFormatException.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ClassParser.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/Constant.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/Constant.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/Constant.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/Constant.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantClass.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantClass.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantClass.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantClass.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantDouble.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantDouble.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantDouble.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantDouble.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantFloat.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantFloat.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantFloat.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantFloat.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantInteger.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantInteger.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantInteger.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantInteger.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantLong.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantLong.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantLong.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantLong.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantPool.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantPool.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantPool.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantUtf8.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantUtf8.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantUtf8.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ConstantUtf8.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ElementValue.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ElementValue.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ElementValue.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ElementValue.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/ElementValuePair.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/ElementValuePair.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/ElementValuePair.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/ElementValuePair.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/EnumElementValue.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/EnumElementValue.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/EnumElementValue.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/EnumElementValue.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/JavaClass.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/SimpleElementValue.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/SimpleElementValue.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/SimpleElementValue.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/SimpleElementValue.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/Utility.java b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/Utility.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/Utility.java rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/Utility.java diff --git a/src/main/java/org/apache/tomcat/util/bcel/classfile/package.html b/core/src/main/java/org/apache/tomcat/util/bcel/classfile/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/classfile/package.html rename to core/src/main/java/org/apache/tomcat/util/bcel/classfile/package.html diff --git a/src/main/java/org/apache/tomcat/util/bcel/package.html b/core/src/main/java/org/apache/tomcat/util/bcel/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/bcel/package.html rename to core/src/main/java/org/apache/tomcat/util/bcel/package.html diff --git a/src/main/java/org/apache/tomcat/util/buf/Ascii.java b/core/src/main/java/org/apache/tomcat/util/buf/Ascii.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/Ascii.java rename to core/src/main/java/org/apache/tomcat/util/buf/Ascii.java diff --git a/src/main/java/org/apache/tomcat/util/buf/B2CConverter.java b/core/src/main/java/org/apache/tomcat/util/buf/B2CConverter.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/B2CConverter.java rename to core/src/main/java/org/apache/tomcat/util/buf/B2CConverter.java diff --git a/src/main/java/org/apache/tomcat/util/buf/ByteBufferHolder.java b/core/src/main/java/org/apache/tomcat/util/buf/ByteBufferHolder.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/ByteBufferHolder.java rename to core/src/main/java/org/apache/tomcat/util/buf/ByteBufferHolder.java diff --git a/src/main/java/org/apache/tomcat/util/buf/ByteBufferUtils.java b/core/src/main/java/org/apache/tomcat/util/buf/ByteBufferUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/ByteBufferUtils.java rename to core/src/main/java/org/apache/tomcat/util/buf/ByteBufferUtils.java diff --git a/src/main/java/org/apache/tomcat/util/buf/ByteChunk.java b/core/src/main/java/org/apache/tomcat/util/buf/ByteChunk.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/ByteChunk.java rename to core/src/main/java/org/apache/tomcat/util/buf/ByteChunk.java diff --git a/src/main/java/org/apache/tomcat/util/buf/C2BConverter.java b/core/src/main/java/org/apache/tomcat/util/buf/C2BConverter.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/C2BConverter.java rename to core/src/main/java/org/apache/tomcat/util/buf/C2BConverter.java diff --git a/src/main/java/org/apache/tomcat/util/buf/CharChunk.java b/core/src/main/java/org/apache/tomcat/util/buf/CharChunk.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/CharChunk.java rename to core/src/main/java/org/apache/tomcat/util/buf/CharChunk.java diff --git a/src/main/java/org/apache/tomcat/util/buf/HexUtils.java b/core/src/main/java/org/apache/tomcat/util/buf/HexUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/HexUtils.java rename to core/src/main/java/org/apache/tomcat/util/buf/HexUtils.java diff --git a/src/main/java/org/apache/tomcat/util/buf/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/buf/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/buf/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/buf/LocalStrings_es.properties b/core/src/main/java/org/apache/tomcat/util/buf/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/LocalStrings_es.properties rename to core/src/main/java/org/apache/tomcat/util/buf/LocalStrings_es.properties diff --git a/src/main/java/org/apache/tomcat/util/buf/MessageBytes.java b/core/src/main/java/org/apache/tomcat/util/buf/MessageBytes.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/MessageBytes.java rename to core/src/main/java/org/apache/tomcat/util/buf/MessageBytes.java diff --git a/src/main/java/org/apache/tomcat/util/buf/StringCache.java b/core/src/main/java/org/apache/tomcat/util/buf/StringCache.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/StringCache.java rename to core/src/main/java/org/apache/tomcat/util/buf/StringCache.java diff --git a/src/main/java/org/apache/tomcat/util/buf/StringUtils.java b/core/src/main/java/org/apache/tomcat/util/buf/StringUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/StringUtils.java rename to core/src/main/java/org/apache/tomcat/util/buf/StringUtils.java diff --git a/src/main/java/org/apache/tomcat/util/buf/UDecoder.java b/core/src/main/java/org/apache/tomcat/util/buf/UDecoder.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/UDecoder.java rename to core/src/main/java/org/apache/tomcat/util/buf/UDecoder.java diff --git a/src/main/java/org/apache/tomcat/util/buf/UEncoder.java b/core/src/main/java/org/apache/tomcat/util/buf/UEncoder.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/UEncoder.java rename to core/src/main/java/org/apache/tomcat/util/buf/UEncoder.java diff --git a/src/main/java/org/apache/tomcat/util/buf/UriUtil.java b/core/src/main/java/org/apache/tomcat/util/buf/UriUtil.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/UriUtil.java rename to core/src/main/java/org/apache/tomcat/util/buf/UriUtil.java diff --git a/src/main/java/org/apache/tomcat/util/buf/Utf8Decoder.java b/core/src/main/java/org/apache/tomcat/util/buf/Utf8Decoder.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/Utf8Decoder.java rename to core/src/main/java/org/apache/tomcat/util/buf/Utf8Decoder.java diff --git a/src/main/java/org/apache/tomcat/util/buf/Utf8Encoder.java b/core/src/main/java/org/apache/tomcat/util/buf/Utf8Encoder.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/Utf8Encoder.java rename to core/src/main/java/org/apache/tomcat/util/buf/Utf8Encoder.java diff --git a/src/main/java/org/apache/tomcat/util/buf/package.html b/core/src/main/java/org/apache/tomcat/util/buf/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/buf/package.html rename to core/src/main/java/org/apache/tomcat/util/buf/package.html diff --git a/src/main/java/org/apache/tomcat/util/codec/binary/Base64.java b/core/src/main/java/org/apache/tomcat/util/codec/binary/Base64.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/codec/binary/Base64.java rename to core/src/main/java/org/apache/tomcat/util/codec/binary/Base64.java diff --git a/src/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java b/core/src/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java rename to core/src/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java diff --git a/src/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java b/core/src/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java rename to core/src/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java diff --git a/src/main/java/org/apache/tomcat/util/codec/binary/package.html b/core/src/main/java/org/apache/tomcat/util/codec/binary/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/codec/binary/package.html rename to core/src/main/java/org/apache/tomcat/util/codec/binary/package.html diff --git a/src/main/java/org/apache/tomcat/util/collections/CaseInsensitiveKeyMap.java b/core/src/main/java/org/apache/tomcat/util/collections/CaseInsensitiveKeyMap.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/collections/CaseInsensitiveKeyMap.java rename to core/src/main/java/org/apache/tomcat/util/collections/CaseInsensitiveKeyMap.java diff --git a/src/main/java/org/apache/tomcat/util/collections/ConcurrentCache.java b/core/src/main/java/org/apache/tomcat/util/collections/ConcurrentCache.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/collections/ConcurrentCache.java rename to core/src/main/java/org/apache/tomcat/util/collections/ConcurrentCache.java diff --git a/src/main/java/org/apache/tomcat/util/collections/ManagedConcurrentWeakHashMap.java b/core/src/main/java/org/apache/tomcat/util/collections/ManagedConcurrentWeakHashMap.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/collections/ManagedConcurrentWeakHashMap.java rename to core/src/main/java/org/apache/tomcat/util/collections/ManagedConcurrentWeakHashMap.java diff --git a/src/main/java/org/apache/tomcat/util/collections/SynchronizedQueue.java b/core/src/main/java/org/apache/tomcat/util/collections/SynchronizedQueue.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/collections/SynchronizedQueue.java rename to core/src/main/java/org/apache/tomcat/util/collections/SynchronizedQueue.java diff --git a/src/main/java/org/apache/tomcat/util/collections/SynchronizedStack.java b/core/src/main/java/org/apache/tomcat/util/collections/SynchronizedStack.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/collections/SynchronizedStack.java rename to core/src/main/java/org/apache/tomcat/util/collections/SynchronizedStack.java diff --git a/src/main/java/org/apache/tomcat/util/compat/Jre9Compat.java b/core/src/main/java/org/apache/tomcat/util/compat/Jre9Compat.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/compat/Jre9Compat.java rename to core/src/main/java/org/apache/tomcat/util/compat/Jre9Compat.java diff --git a/src/main/java/org/apache/tomcat/util/compat/JreCompat.java b/core/src/main/java/org/apache/tomcat/util/compat/JreCompat.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/compat/JreCompat.java rename to core/src/main/java/org/apache/tomcat/util/compat/JreCompat.java diff --git a/src/main/java/org/apache/tomcat/util/compat/JreVendor.java b/core/src/main/java/org/apache/tomcat/util/compat/JreVendor.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/compat/JreVendor.java rename to core/src/main/java/org/apache/tomcat/util/compat/JreVendor.java diff --git a/src/main/java/org/apache/tomcat/util/compat/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/compat/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/compat/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/compat/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/descriptor/Constants.java b/core/src/main/java/org/apache/tomcat/util/descriptor/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/Constants.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/Constants.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/DigesterFactory.java b/core/src/main/java/org/apache/tomcat/util/descriptor/DigesterFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/DigesterFactory.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/DigesterFactory.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/InputSourceUtil.java b/core/src/main/java/org/apache/tomcat/util/descriptor/InputSourceUtil.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/InputSourceUtil.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/InputSourceUtil.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java b/core/src/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/descriptor/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/descriptor/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/descriptor/LocalStrings_es.properties b/core/src/main/java/org/apache/tomcat/util/descriptor/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/LocalStrings_es.properties rename to core/src/main/java/org/apache/tomcat/util/descriptor/LocalStrings_es.properties diff --git a/src/main/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java b/core/src/main/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/XmlErrorHandler.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/XmlIdentifiers.java b/core/src/main/java/org/apache/tomcat/util/descriptor/XmlIdentifiers.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/XmlIdentifiers.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/XmlIdentifiers.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/TagFileXml.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TagFileXml.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/TagFileXml.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/TagFileXml.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/TagXml.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TagXml.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/TagXml.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/TagXml.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/TaglibXml.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TaglibXml.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/TaglibXml.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/TaglibXml.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/TldParser.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldParser.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/TldParser.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldParser.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/ValidatorXml.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/ValidatorXml.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/ValidatorXml.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/ValidatorXml.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/tld/package-info.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/tld/package-info.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/tld/package-info.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/Constants.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/Constants.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/Constants.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/Injectable.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/Injectable.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/Injectable.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/Injectable.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/InjectionTarget.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/InjectionTarget.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/InjectionTarget.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/InjectionTarget.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/JspConfigDescriptorImpl.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/JspConfigDescriptorImpl.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/JspConfigDescriptorImpl.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/JspConfigDescriptorImpl.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroup.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroup.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroup.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroup.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroupDescriptorImpl.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroupDescriptorImpl.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroupDescriptorImpl.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/JspPropertyGroupDescriptorImpl.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings_es.properties b/core/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings_es.properties rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings_es.properties diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/MultipartDef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/MultipartDef.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/MultipartDef.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/MultipartDef.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/NamingResources.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/NamingResources.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/NamingResources.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/NamingResources.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/SessionConfig.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SessionConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/SessionConfig.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/SessionConfig.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/TaglibDescriptorImpl.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/TaglibDescriptorImpl.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/TaglibDescriptorImpl.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/TaglibDescriptorImpl.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/WebXmlParser.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebXmlParser.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/WebXmlParser.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/WebXmlParser.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/XmlEncodingBase.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/XmlEncodingBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/XmlEncodingBase.java rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/XmlEncodingBase.java diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/mbeans-descriptors.xml b/core/src/main/java/org/apache/tomcat/util/descriptor/web/mbeans-descriptors.xml similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/mbeans-descriptors.xml rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/mbeans-descriptors.xml diff --git a/src/main/java/org/apache/tomcat/util/descriptor/web/package.html b/core/src/main/java/org/apache/tomcat/util/descriptor/web/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/descriptor/web/package.html rename to core/src/main/java/org/apache/tomcat/util/descriptor/web/package.html diff --git a/src/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java b/core/src/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java rename to core/src/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java diff --git a/src/main/java/org/apache/tomcat/util/digester/ArrayStack.java b/core/src/main/java/org/apache/tomcat/util/digester/ArrayStack.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/ArrayStack.java rename to core/src/main/java/org/apache/tomcat/util/digester/ArrayStack.java diff --git a/src/main/java/org/apache/tomcat/util/digester/CallMethodRule.java b/core/src/main/java/org/apache/tomcat/util/digester/CallMethodRule.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/CallMethodRule.java rename to core/src/main/java/org/apache/tomcat/util/digester/CallMethodRule.java diff --git a/src/main/java/org/apache/tomcat/util/digester/CallParamRule.java b/core/src/main/java/org/apache/tomcat/util/digester/CallParamRule.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/CallParamRule.java rename to core/src/main/java/org/apache/tomcat/util/digester/CallParamRule.java diff --git a/src/main/java/org/apache/tomcat/util/digester/Digester.java b/core/src/main/java/org/apache/tomcat/util/digester/Digester.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/Digester.java rename to core/src/main/java/org/apache/tomcat/util/digester/Digester.java diff --git a/src/main/java/org/apache/tomcat/util/digester/DocumentProperties.java b/core/src/main/java/org/apache/tomcat/util/digester/DocumentProperties.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/DocumentProperties.java rename to core/src/main/java/org/apache/tomcat/util/digester/DocumentProperties.java diff --git a/src/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java b/core/src/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java rename to core/src/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java diff --git a/src/main/java/org/apache/tomcat/util/digester/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/digester/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/digester/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java b/core/src/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java rename to core/src/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java diff --git a/src/main/java/org/apache/tomcat/util/digester/ObjectCreationFactory.java b/core/src/main/java/org/apache/tomcat/util/digester/ObjectCreationFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/ObjectCreationFactory.java rename to core/src/main/java/org/apache/tomcat/util/digester/ObjectCreationFactory.java diff --git a/src/main/java/org/apache/tomcat/util/digester/Rule.java b/core/src/main/java/org/apache/tomcat/util/digester/Rule.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/Rule.java rename to core/src/main/java/org/apache/tomcat/util/digester/Rule.java diff --git a/src/main/java/org/apache/tomcat/util/digester/RuleSet.java b/core/src/main/java/org/apache/tomcat/util/digester/RuleSet.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/RuleSet.java rename to core/src/main/java/org/apache/tomcat/util/digester/RuleSet.java diff --git a/src/main/java/org/apache/tomcat/util/digester/RuleSetBase.java b/core/src/main/java/org/apache/tomcat/util/digester/RuleSetBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/RuleSetBase.java rename to core/src/main/java/org/apache/tomcat/util/digester/RuleSetBase.java diff --git a/src/main/java/org/apache/tomcat/util/digester/Rules.java b/core/src/main/java/org/apache/tomcat/util/digester/Rules.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/Rules.java rename to core/src/main/java/org/apache/tomcat/util/digester/Rules.java diff --git a/src/main/java/org/apache/tomcat/util/digester/RulesBase.java b/core/src/main/java/org/apache/tomcat/util/digester/RulesBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/RulesBase.java rename to core/src/main/java/org/apache/tomcat/util/digester/RulesBase.java diff --git a/src/main/java/org/apache/tomcat/util/digester/SetNextRule.java b/core/src/main/java/org/apache/tomcat/util/digester/SetNextRule.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/SetNextRule.java rename to core/src/main/java/org/apache/tomcat/util/digester/SetNextRule.java diff --git a/src/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java b/core/src/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java rename to core/src/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java diff --git a/src/main/java/org/apache/tomcat/util/digester/package.html b/core/src/main/java/org/apache/tomcat/util/digester/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/digester/package.html rename to core/src/main/java/org/apache/tomcat/util/digester/package.html diff --git a/src/main/java/org/apache/tomcat/util/file/ConfigFileLoader.java b/core/src/main/java/org/apache/tomcat/util/file/ConfigFileLoader.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/file/ConfigFileLoader.java rename to core/src/main/java/org/apache/tomcat/util/file/ConfigFileLoader.java diff --git a/src/main/java/org/apache/tomcat/util/file/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/file/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/file/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/file/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/file/Matcher.java b/core/src/main/java/org/apache/tomcat/util/file/Matcher.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/file/Matcher.java rename to core/src/main/java/org/apache/tomcat/util/file/Matcher.java diff --git a/src/main/java/org/apache/tomcat/util/file/package.html b/core/src/main/java/org/apache/tomcat/util/file/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/file/package.html rename to core/src/main/java/org/apache/tomcat/util/file/package.html diff --git a/src/main/java/org/apache/tomcat/util/http/CookieProcessor.java b/core/src/main/java/org/apache/tomcat/util/http/CookieProcessor.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/CookieProcessor.java rename to core/src/main/java/org/apache/tomcat/util/http/CookieProcessor.java diff --git a/src/main/java/org/apache/tomcat/util/http/CookieProcessorBase.java b/core/src/main/java/org/apache/tomcat/util/http/CookieProcessorBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/CookieProcessorBase.java rename to core/src/main/java/org/apache/tomcat/util/http/CookieProcessorBase.java diff --git a/src/main/java/org/apache/tomcat/util/http/FastHttpDateFormat.java b/core/src/main/java/org/apache/tomcat/util/http/FastHttpDateFormat.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/FastHttpDateFormat.java rename to core/src/main/java/org/apache/tomcat/util/http/FastHttpDateFormat.java diff --git a/src/main/java/org/apache/tomcat/util/http/LegacyCookieProcessor.java b/core/src/main/java/org/apache/tomcat/util/http/LegacyCookieProcessor.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/LegacyCookieProcessor.java rename to core/src/main/java/org/apache/tomcat/util/http/LegacyCookieProcessor.java diff --git a/src/main/java/org/apache/tomcat/util/http/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/http/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/http/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/http/MimeHeaders.java b/core/src/main/java/org/apache/tomcat/util/http/MimeHeaders.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/MimeHeaders.java rename to core/src/main/java/org/apache/tomcat/util/http/MimeHeaders.java diff --git a/src/main/java/org/apache/tomcat/util/http/Parameters.java b/core/src/main/java/org/apache/tomcat/util/http/Parameters.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/Parameters.java rename to core/src/main/java/org/apache/tomcat/util/http/Parameters.java diff --git a/src/main/java/org/apache/tomcat/util/http/RequestUtil.java b/core/src/main/java/org/apache/tomcat/util/http/RequestUtil.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/RequestUtil.java rename to core/src/main/java/org/apache/tomcat/util/http/RequestUtil.java diff --git a/src/main/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java b/core/src/main/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java rename to core/src/main/java/org/apache/tomcat/util/http/Rfc6265CookieProcessor.java diff --git a/src/main/java/org/apache/tomcat/util/http/ServerCookie.java b/core/src/main/java/org/apache/tomcat/util/http/ServerCookie.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/ServerCookie.java rename to core/src/main/java/org/apache/tomcat/util/http/ServerCookie.java diff --git a/src/main/java/org/apache/tomcat/util/http/ServerCookies.java b/core/src/main/java/org/apache/tomcat/util/http/ServerCookies.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/ServerCookies.java rename to core/src/main/java/org/apache/tomcat/util/http/ServerCookies.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/ByteArrayOutputStream.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/DeferredFileOutputStream.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileItem.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItem.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileItem.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItem.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemFactory.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileItemFactory.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemFactory.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeaders.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeaders.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeaders.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeaders.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeadersSupport.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeadersSupport.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeadersSupport.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemHeadersSupport.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemIterator.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemIterator.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileItemIterator.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemIterator.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemStream.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemStream.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileItemStream.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileItemStream.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileUpload.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileUpload.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileUpload.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileUpload.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileUploadBase.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileUploadBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileUploadBase.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileUploadBase.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileUploadException.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileUploadException.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileUploadException.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileUploadException.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/FileUtils.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/FileUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/FileUtils.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/FileUtils.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/IOUtils.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/IOUtils.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/IOUtils.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/IOUtils.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/InvalidFileNameException.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/InvalidFileNameException.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/InvalidFileNameException.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/InvalidFileNameException.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/ParameterParser.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/ParameterParser.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/ParameterParser.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/ParameterParser.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/ProgressListener.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/ProgressListener.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/ProgressListener.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/ProgressListener.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/RequestContext.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/RequestContext.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/RequestContext.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/RequestContext.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/ThresholdingOutputStream.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/UploadContext.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/UploadContext.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/UploadContext.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/UploadContext.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItem.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItem.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItem.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItem.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItemFactory.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItemFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItemFactory.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/disk/DiskFileItemFactory.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/disk/package-info.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/disk/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/disk/package-info.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/disk/package-info.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/package-info.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/package-info.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/package-info.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletFileUpload.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletFileUpload.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletFileUpload.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletFileUpload.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletRequestContext.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletRequestContext.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletRequestContext.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/ServletRequestContext.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/package-info.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/servlet/package-info.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/servlet/package-info.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/Closeable.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/Closeable.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/Closeable.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/Closeable.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/FileItemHeadersImpl.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/FileItemHeadersImpl.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/FileItemHeadersImpl.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/FileItemHeadersImpl.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/LimitedInputStream.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/LimitedInputStream.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/LimitedInputStream.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/LimitedInputStream.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/Streams.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/Streams.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/Streams.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/Streams.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/MimeUtility.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/MimeUtility.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/MimeUtility.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/MimeUtility.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/ParseException.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/ParseException.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/ParseException.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/ParseException.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/QuotedPrintableDecoder.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/QuotedPrintableDecoder.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/QuotedPrintableDecoder.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/QuotedPrintableDecoder.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/package-info.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/package-info.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/mime/package-info.java diff --git a/src/main/java/org/apache/tomcat/util/http/fileupload/util/package-info.java b/core/src/main/java/org/apache/tomcat/util/http/fileupload/util/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/fileupload/util/package-info.java rename to core/src/main/java/org/apache/tomcat/util/http/fileupload/util/package-info.java diff --git a/src/main/java/org/apache/tomcat/util/http/package.html b/core/src/main/java/org/apache/tomcat/util/http/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/package.html rename to core/src/main/java/org/apache/tomcat/util/http/package.html diff --git a/src/main/java/org/apache/tomcat/util/http/parser/AcceptLanguage.java b/core/src/main/java/org/apache/tomcat/util/http/parser/AcceptLanguage.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/AcceptLanguage.java rename to core/src/main/java/org/apache/tomcat/util/http/parser/AcceptLanguage.java diff --git a/src/main/java/org/apache/tomcat/util/http/parser/Authorization.java b/core/src/main/java/org/apache/tomcat/util/http/parser/Authorization.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/Authorization.java rename to core/src/main/java/org/apache/tomcat/util/http/parser/Authorization.java diff --git a/src/main/java/org/apache/tomcat/util/http/parser/Cookie.java b/core/src/main/java/org/apache/tomcat/util/http/parser/Cookie.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/Cookie.java rename to core/src/main/java/org/apache/tomcat/util/http/parser/Cookie.java diff --git a/src/main/java/org/apache/tomcat/util/http/parser/Host.java b/core/src/main/java/org/apache/tomcat/util/http/parser/Host.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/Host.java rename to core/src/main/java/org/apache/tomcat/util/http/parser/Host.java diff --git a/src/main/java/org/apache/tomcat/util/http/parser/HttpParser.java b/core/src/main/java/org/apache/tomcat/util/http/parser/HttpParser.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/HttpParser.java rename to core/src/main/java/org/apache/tomcat/util/http/parser/HttpParser.java diff --git a/src/main/java/org/apache/tomcat/util/http/parser/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/http/parser/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/http/parser/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/http/parser/MediaType.java b/core/src/main/java/org/apache/tomcat/util/http/parser/MediaType.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/MediaType.java rename to core/src/main/java/org/apache/tomcat/util/http/parser/MediaType.java diff --git a/src/main/java/org/apache/tomcat/util/http/parser/MediaTypeCache.java b/core/src/main/java/org/apache/tomcat/util/http/parser/MediaTypeCache.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/MediaTypeCache.java rename to core/src/main/java/org/apache/tomcat/util/http/parser/MediaTypeCache.java diff --git a/src/main/java/org/apache/tomcat/util/http/parser/SkipResult.java b/core/src/main/java/org/apache/tomcat/util/http/parser/SkipResult.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/http/parser/SkipResult.java rename to core/src/main/java/org/apache/tomcat/util/http/parser/SkipResult.java diff --git a/src/main/java/org/apache/tomcat/util/log/CaptureLog.java b/core/src/main/java/org/apache/tomcat/util/log/CaptureLog.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/log/CaptureLog.java rename to core/src/main/java/org/apache/tomcat/util/log/CaptureLog.java diff --git a/src/main/java/org/apache/tomcat/util/log/SystemLogHandler.java b/core/src/main/java/org/apache/tomcat/util/log/SystemLogHandler.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/log/SystemLogHandler.java rename to core/src/main/java/org/apache/tomcat/util/log/SystemLogHandler.java diff --git a/src/main/java/org/apache/tomcat/util/log/UserDataHelper.java b/core/src/main/java/org/apache/tomcat/util/log/UserDataHelper.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/log/UserDataHelper.java rename to core/src/main/java/org/apache/tomcat/util/log/UserDataHelper.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/AttributeInfo.java b/core/src/main/java/org/apache/tomcat/util/modeler/AttributeInfo.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/AttributeInfo.java rename to core/src/main/java/org/apache/tomcat/util/modeler/AttributeInfo.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/BaseAttributeFilter.java b/core/src/main/java/org/apache/tomcat/util/modeler/BaseAttributeFilter.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/BaseAttributeFilter.java rename to core/src/main/java/org/apache/tomcat/util/modeler/BaseAttributeFilter.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/BaseModelMBean.java b/core/src/main/java/org/apache/tomcat/util/modeler/BaseModelMBean.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/BaseModelMBean.java rename to core/src/main/java/org/apache/tomcat/util/modeler/BaseModelMBean.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/BaseNotificationBroadcaster.java b/core/src/main/java/org/apache/tomcat/util/modeler/BaseNotificationBroadcaster.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/BaseNotificationBroadcaster.java rename to core/src/main/java/org/apache/tomcat/util/modeler/BaseNotificationBroadcaster.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/FeatureInfo.java b/core/src/main/java/org/apache/tomcat/util/modeler/FeatureInfo.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/FeatureInfo.java rename to core/src/main/java/org/apache/tomcat/util/modeler/FeatureInfo.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/ManagedBean.java b/core/src/main/java/org/apache/tomcat/util/modeler/ManagedBean.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/ManagedBean.java rename to core/src/main/java/org/apache/tomcat/util/modeler/ManagedBean.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/NotificationInfo.java b/core/src/main/java/org/apache/tomcat/util/modeler/NotificationInfo.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/NotificationInfo.java rename to core/src/main/java/org/apache/tomcat/util/modeler/NotificationInfo.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/OperationInfo.java b/core/src/main/java/org/apache/tomcat/util/modeler/OperationInfo.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/OperationInfo.java rename to core/src/main/java/org/apache/tomcat/util/modeler/OperationInfo.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/ParameterInfo.java b/core/src/main/java/org/apache/tomcat/util/modeler/ParameterInfo.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/ParameterInfo.java rename to core/src/main/java/org/apache/tomcat/util/modeler/ParameterInfo.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/Registry.java b/core/src/main/java/org/apache/tomcat/util/modeler/Registry.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/Registry.java rename to core/src/main/java/org/apache/tomcat/util/modeler/Registry.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/RegistryMBean.java b/core/src/main/java/org/apache/tomcat/util/modeler/RegistryMBean.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/RegistryMBean.java rename to core/src/main/java/org/apache/tomcat/util/modeler/RegistryMBean.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/Util.java b/core/src/main/java/org/apache/tomcat/util/modeler/Util.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/Util.java rename to core/src/main/java/org/apache/tomcat/util/modeler/Util.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/mbeans-descriptors.dtd b/core/src/main/java/org/apache/tomcat/util/modeler/mbeans-descriptors.dtd similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/mbeans-descriptors.dtd rename to core/src/main/java/org/apache/tomcat/util/modeler/mbeans-descriptors.dtd diff --git a/src/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsDigesterSource.java b/core/src/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsDigesterSource.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsDigesterSource.java rename to core/src/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsDigesterSource.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java b/core/src/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java rename to core/src/main/java/org/apache/tomcat/util/modeler/modules/MbeansDescriptorsIntrospectionSource.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/modules/ModelerSource.java b/core/src/main/java/org/apache/tomcat/util/modeler/modules/ModelerSource.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/modules/ModelerSource.java rename to core/src/main/java/org/apache/tomcat/util/modeler/modules/ModelerSource.java diff --git a/src/main/java/org/apache/tomcat/util/modeler/modules/package.html b/core/src/main/java/org/apache/tomcat/util/modeler/modules/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/modules/package.html rename to core/src/main/java/org/apache/tomcat/util/modeler/modules/package.html diff --git a/src/main/java/org/apache/tomcat/util/modeler/package.html b/core/src/main/java/org/apache/tomcat/util/modeler/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/modeler/package.html rename to core/src/main/java/org/apache/tomcat/util/modeler/package.html diff --git a/src/main/java/org/apache/tomcat/util/net/AbstractEndpoint.java b/core/src/main/java/org/apache/tomcat/util/net/AbstractEndpoint.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/AbstractEndpoint.java rename to core/src/main/java/org/apache/tomcat/util/net/AbstractEndpoint.java diff --git a/src/main/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java b/core/src/main/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java rename to core/src/main/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java diff --git a/src/main/java/org/apache/tomcat/util/net/Acceptor.java b/core/src/main/java/org/apache/tomcat/util/net/Acceptor.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/Acceptor.java rename to core/src/main/java/org/apache/tomcat/util/net/Acceptor.java diff --git a/src/main/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java b/core/src/main/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java rename to core/src/main/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java diff --git a/src/main/java/org/apache/tomcat/util/net/AprEndpoint.java b/core/src/main/java/org/apache/tomcat/util/net/AprEndpoint.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/AprEndpoint.java rename to core/src/main/java/org/apache/tomcat/util/net/AprEndpoint.java diff --git a/src/main/java/org/apache/tomcat/util/net/AprSSLSupport.java b/core/src/main/java/org/apache/tomcat/util/net/AprSSLSupport.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/AprSSLSupport.java rename to core/src/main/java/org/apache/tomcat/util/net/AprSSLSupport.java diff --git a/src/main/java/org/apache/tomcat/util/net/Constants.java b/core/src/main/java/org/apache/tomcat/util/net/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/Constants.java rename to core/src/main/java/org/apache/tomcat/util/net/Constants.java diff --git a/src/main/java/org/apache/tomcat/util/net/DispatchType.java b/core/src/main/java/org/apache/tomcat/util/net/DispatchType.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/DispatchType.java rename to core/src/main/java/org/apache/tomcat/util/net/DispatchType.java diff --git a/src/main/java/org/apache/tomcat/util/net/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/net/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/net/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/net/LocalStrings_es.properties b/core/src/main/java/org/apache/tomcat/util/net/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/LocalStrings_es.properties rename to core/src/main/java/org/apache/tomcat/util/net/LocalStrings_es.properties diff --git a/src/main/java/org/apache/tomcat/util/net/LocalStrings_fr.properties b/core/src/main/java/org/apache/tomcat/util/net/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/LocalStrings_fr.properties rename to core/src/main/java/org/apache/tomcat/util/net/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/tomcat/util/net/LocalStrings_ja.properties b/core/src/main/java/org/apache/tomcat/util/net/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/LocalStrings_ja.properties rename to core/src/main/java/org/apache/tomcat/util/net/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/tomcat/util/net/Nio2Channel.java b/core/src/main/java/org/apache/tomcat/util/net/Nio2Channel.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/Nio2Channel.java rename to core/src/main/java/org/apache/tomcat/util/net/Nio2Channel.java diff --git a/src/main/java/org/apache/tomcat/util/net/Nio2Endpoint.java b/core/src/main/java/org/apache/tomcat/util/net/Nio2Endpoint.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/Nio2Endpoint.java rename to core/src/main/java/org/apache/tomcat/util/net/Nio2Endpoint.java diff --git a/src/main/java/org/apache/tomcat/util/net/NioBlockingSelector.java b/core/src/main/java/org/apache/tomcat/util/net/NioBlockingSelector.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/NioBlockingSelector.java rename to core/src/main/java/org/apache/tomcat/util/net/NioBlockingSelector.java diff --git a/src/main/java/org/apache/tomcat/util/net/NioChannel.java b/core/src/main/java/org/apache/tomcat/util/net/NioChannel.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/NioChannel.java rename to core/src/main/java/org/apache/tomcat/util/net/NioChannel.java diff --git a/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java b/core/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/NioEndpoint.java rename to core/src/main/java/org/apache/tomcat/util/net/NioEndpoint.java diff --git a/src/main/java/org/apache/tomcat/util/net/NioSelectorPool.java b/core/src/main/java/org/apache/tomcat/util/net/NioSelectorPool.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/NioSelectorPool.java rename to core/src/main/java/org/apache/tomcat/util/net/NioSelectorPool.java diff --git a/src/main/java/org/apache/tomcat/util/net/SSLContext.java b/core/src/main/java/org/apache/tomcat/util/net/SSLContext.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SSLContext.java rename to core/src/main/java/org/apache/tomcat/util/net/SSLContext.java diff --git a/src/main/java/org/apache/tomcat/util/net/SSLHostConfig.java b/core/src/main/java/org/apache/tomcat/util/net/SSLHostConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SSLHostConfig.java rename to core/src/main/java/org/apache/tomcat/util/net/SSLHostConfig.java diff --git a/src/main/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java b/core/src/main/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java rename to core/src/main/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java diff --git a/src/main/java/org/apache/tomcat/util/net/SSLImplementation.java b/core/src/main/java/org/apache/tomcat/util/net/SSLImplementation.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SSLImplementation.java rename to core/src/main/java/org/apache/tomcat/util/net/SSLImplementation.java diff --git a/src/main/java/org/apache/tomcat/util/net/SSLSessionManager.java b/core/src/main/java/org/apache/tomcat/util/net/SSLSessionManager.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SSLSessionManager.java rename to core/src/main/java/org/apache/tomcat/util/net/SSLSessionManager.java diff --git a/src/main/java/org/apache/tomcat/util/net/SSLSupport.java b/core/src/main/java/org/apache/tomcat/util/net/SSLSupport.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SSLSupport.java rename to core/src/main/java/org/apache/tomcat/util/net/SSLSupport.java diff --git a/src/main/java/org/apache/tomcat/util/net/SSLUtil.java b/core/src/main/java/org/apache/tomcat/util/net/SSLUtil.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SSLUtil.java rename to core/src/main/java/org/apache/tomcat/util/net/SSLUtil.java diff --git a/src/main/java/org/apache/tomcat/util/net/SSLUtilBase.java b/core/src/main/java/org/apache/tomcat/util/net/SSLUtilBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SSLUtilBase.java rename to core/src/main/java/org/apache/tomcat/util/net/SSLUtilBase.java diff --git a/src/main/java/org/apache/tomcat/util/net/SecureNio2Channel.java b/core/src/main/java/org/apache/tomcat/util/net/SecureNio2Channel.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SecureNio2Channel.java rename to core/src/main/java/org/apache/tomcat/util/net/SecureNio2Channel.java diff --git a/src/main/java/org/apache/tomcat/util/net/SecureNioChannel.java b/core/src/main/java/org/apache/tomcat/util/net/SecureNioChannel.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SecureNioChannel.java rename to core/src/main/java/org/apache/tomcat/util/net/SecureNioChannel.java diff --git a/src/main/java/org/apache/tomcat/util/net/SendfileDataBase.java b/core/src/main/java/org/apache/tomcat/util/net/SendfileDataBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SendfileDataBase.java rename to core/src/main/java/org/apache/tomcat/util/net/SendfileDataBase.java diff --git a/src/main/java/org/apache/tomcat/util/net/SendfileKeepAliveState.java b/core/src/main/java/org/apache/tomcat/util/net/SendfileKeepAliveState.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SendfileKeepAliveState.java rename to core/src/main/java/org/apache/tomcat/util/net/SendfileKeepAliveState.java diff --git a/src/main/java/org/apache/tomcat/util/net/SendfileState.java b/core/src/main/java/org/apache/tomcat/util/net/SendfileState.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SendfileState.java rename to core/src/main/java/org/apache/tomcat/util/net/SendfileState.java diff --git a/src/main/java/org/apache/tomcat/util/net/SocketBufferHandler.java b/core/src/main/java/org/apache/tomcat/util/net/SocketBufferHandler.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SocketBufferHandler.java rename to core/src/main/java/org/apache/tomcat/util/net/SocketBufferHandler.java diff --git a/src/main/java/org/apache/tomcat/util/net/SocketEvent.java b/core/src/main/java/org/apache/tomcat/util/net/SocketEvent.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SocketEvent.java rename to core/src/main/java/org/apache/tomcat/util/net/SocketEvent.java diff --git a/src/main/java/org/apache/tomcat/util/net/SocketProcessorBase.java b/core/src/main/java/org/apache/tomcat/util/net/SocketProcessorBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SocketProcessorBase.java rename to core/src/main/java/org/apache/tomcat/util/net/SocketProcessorBase.java diff --git a/src/main/java/org/apache/tomcat/util/net/SocketProperties.java b/core/src/main/java/org/apache/tomcat/util/net/SocketProperties.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SocketProperties.java rename to core/src/main/java/org/apache/tomcat/util/net/SocketProperties.java diff --git a/src/main/java/org/apache/tomcat/util/net/SocketWrapperBase.java b/core/src/main/java/org/apache/tomcat/util/net/SocketWrapperBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/SocketWrapperBase.java rename to core/src/main/java/org/apache/tomcat/util/net/SocketWrapperBase.java diff --git a/src/main/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java b/core/src/main/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java rename to core/src/main/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java b/core/src/main/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java rename to core/src/main/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/JSSEKeyManager.java b/core/src/main/java/org/apache/tomcat/util/net/jsse/JSSEKeyManager.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/JSSEKeyManager.java rename to core/src/main/java/org/apache/tomcat/util/net/jsse/JSSEKeyManager.java diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/JSSESSLContext.java b/core/src/main/java/org/apache/tomcat/util/net/jsse/JSSESSLContext.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/JSSESSLContext.java rename to core/src/main/java/org/apache/tomcat/util/net/jsse/JSSESSLContext.java diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/JSSESupport.java b/core/src/main/java/org/apache/tomcat/util/net/jsse/JSSESupport.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/JSSESupport.java rename to core/src/main/java/org/apache/tomcat/util/net/jsse/JSSESupport.java diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/JSSEUtil.java b/core/src/main/java/org/apache/tomcat/util/net/jsse/JSSEUtil.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/JSSEUtil.java rename to core/src/main/java/org/apache/tomcat/util/net/jsse/JSSEUtil.java diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_es.properties b/core/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_es.properties rename to core/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_es.properties diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_fr.properties b/core/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_fr.properties rename to core/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_ja.properties b/core/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_ja.properties rename to core/src/main/java/org/apache/tomcat/util/net/jsse/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/tomcat/util/net/jsse/PEMFile.java b/core/src/main/java/org/apache/tomcat/util/net/jsse/PEMFile.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/jsse/PEMFile.java rename to core/src/main/java/org/apache/tomcat/util/net/jsse/PEMFile.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/net/openssl/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLContext.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLImplementation.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLImplementation.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLImplementation.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLImplementation.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLKeyManager.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLKeyManager.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLKeyManager.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLKeyManager.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLProtocols.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLProtocols.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLProtocols.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLProtocols.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionContext.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionContext.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionContext.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionContext.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionStats.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionStats.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionStats.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLSessionStats.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLUtil.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLUtil.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLUtil.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLUtil.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLX509Certificate.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLX509Certificate.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLX509Certificate.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLX509Certificate.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Authentication.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Authentication.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Authentication.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Authentication.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Cipher.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Cipher.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Cipher.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Cipher.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Encryption.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Encryption.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Encryption.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Encryption.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/EncryptionLevel.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/EncryptionLevel.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/EncryptionLevel.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/EncryptionLevel.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/KeyExchange.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/KeyExchange.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/KeyExchange.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/KeyExchange.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/MessageDigest.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/MessageDigest.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/MessageDigest.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/MessageDigest.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/OpenSSLCipherConfigurationParser.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/OpenSSLCipherConfigurationParser.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/OpenSSLCipherConfigurationParser.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/OpenSSLCipherConfigurationParser.java diff --git a/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Protocol.java b/core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Protocol.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Protocol.java rename to core/src/main/java/org/apache/tomcat/util/net/openssl/ciphers/Protocol.java diff --git a/src/main/java/org/apache/tomcat/util/res/StringManager.java b/core/src/main/java/org/apache/tomcat/util/res/StringManager.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/res/StringManager.java rename to core/src/main/java/org/apache/tomcat/util/res/StringManager.java diff --git a/src/main/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java b/core/src/main/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java rename to core/src/main/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java diff --git a/src/main/java/org/apache/tomcat/util/scan/Constants.java b/core/src/main/java/org/apache/tomcat/util/scan/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/Constants.java rename to core/src/main/java/org/apache/tomcat/util/scan/Constants.java diff --git a/src/main/java/org/apache/tomcat/util/scan/JarFactory.java b/core/src/main/java/org/apache/tomcat/util/scan/JarFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/JarFactory.java rename to core/src/main/java/org/apache/tomcat/util/scan/JarFactory.java diff --git a/src/main/java/org/apache/tomcat/util/scan/JarFileUrlJar.java b/core/src/main/java/org/apache/tomcat/util/scan/JarFileUrlJar.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/JarFileUrlJar.java rename to core/src/main/java/org/apache/tomcat/util/scan/JarFileUrlJar.java diff --git a/src/main/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java b/core/src/main/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java rename to core/src/main/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java diff --git a/src/main/java/org/apache/tomcat/util/scan/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/scan/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/scan/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/scan/NonClosingJarInputStream.java b/core/src/main/java/org/apache/tomcat/util/scan/NonClosingJarInputStream.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/NonClosingJarInputStream.java rename to core/src/main/java/org/apache/tomcat/util/scan/NonClosingJarInputStream.java diff --git a/src/main/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java b/core/src/main/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java rename to core/src/main/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java diff --git a/src/main/java/org/apache/tomcat/util/scan/StandardJarScanner.java b/core/src/main/java/org/apache/tomcat/util/scan/StandardJarScanner.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/StandardJarScanner.java rename to core/src/main/java/org/apache/tomcat/util/scan/StandardJarScanner.java diff --git a/src/main/java/org/apache/tomcat/util/scan/UrlJar.java b/core/src/main/java/org/apache/tomcat/util/scan/UrlJar.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/UrlJar.java rename to core/src/main/java/org/apache/tomcat/util/scan/UrlJar.java diff --git a/src/main/java/org/apache/tomcat/util/scan/package.html b/core/src/main/java/org/apache/tomcat/util/scan/package.html similarity index 100% rename from src/main/java/org/apache/tomcat/util/scan/package.html rename to core/src/main/java/org/apache/tomcat/util/scan/package.html diff --git a/src/main/java/org/apache/tomcat/util/security/ConcurrentMessageDigest.java b/core/src/main/java/org/apache/tomcat/util/security/ConcurrentMessageDigest.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/security/ConcurrentMessageDigest.java rename to core/src/main/java/org/apache/tomcat/util/security/ConcurrentMessageDigest.java diff --git a/src/main/java/org/apache/tomcat/util/security/MD5Encoder.java b/core/src/main/java/org/apache/tomcat/util/security/MD5Encoder.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/security/MD5Encoder.java rename to core/src/main/java/org/apache/tomcat/util/security/MD5Encoder.java diff --git a/src/main/java/org/apache/tomcat/util/security/PermissionCheck.java b/core/src/main/java/org/apache/tomcat/util/security/PermissionCheck.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/security/PermissionCheck.java rename to core/src/main/java/org/apache/tomcat/util/security/PermissionCheck.java diff --git a/src/main/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java b/core/src/main/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java rename to core/src/main/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java diff --git a/src/main/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java b/core/src/main/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java rename to core/src/main/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java diff --git a/src/main/java/org/apache/tomcat/util/threads/Constants.java b/core/src/main/java/org/apache/tomcat/util/threads/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/Constants.java rename to core/src/main/java/org/apache/tomcat/util/threads/Constants.java diff --git a/src/main/java/org/apache/tomcat/util/threads/InlineExecutorService.java b/core/src/main/java/org/apache/tomcat/util/threads/InlineExecutorService.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/InlineExecutorService.java rename to core/src/main/java/org/apache/tomcat/util/threads/InlineExecutorService.java diff --git a/src/main/java/org/apache/tomcat/util/threads/LimitLatch.java b/core/src/main/java/org/apache/tomcat/util/threads/LimitLatch.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/LimitLatch.java rename to core/src/main/java/org/apache/tomcat/util/threads/LimitLatch.java diff --git a/src/main/java/org/apache/tomcat/util/threads/ResizableExecutor.java b/core/src/main/java/org/apache/tomcat/util/threads/ResizableExecutor.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/ResizableExecutor.java rename to core/src/main/java/org/apache/tomcat/util/threads/ResizableExecutor.java diff --git a/src/main/java/org/apache/tomcat/util/threads/StopPooledThreadException.java b/core/src/main/java/org/apache/tomcat/util/threads/StopPooledThreadException.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/StopPooledThreadException.java rename to core/src/main/java/org/apache/tomcat/util/threads/StopPooledThreadException.java diff --git a/src/main/java/org/apache/tomcat/util/threads/TaskQueue.java b/core/src/main/java/org/apache/tomcat/util/threads/TaskQueue.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/TaskQueue.java rename to core/src/main/java/org/apache/tomcat/util/threads/TaskQueue.java diff --git a/src/main/java/org/apache/tomcat/util/threads/TaskThread.java b/core/src/main/java/org/apache/tomcat/util/threads/TaskThread.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/TaskThread.java rename to core/src/main/java/org/apache/tomcat/util/threads/TaskThread.java diff --git a/src/main/java/org/apache/tomcat/util/threads/TaskThreadFactory.java b/core/src/main/java/org/apache/tomcat/util/threads/TaskThreadFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/TaskThreadFactory.java rename to core/src/main/java/org/apache/tomcat/util/threads/TaskThreadFactory.java diff --git a/src/main/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java b/core/src/main/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java rename to core/src/main/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java diff --git a/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/res/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_es.properties b/core/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_es.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_es.properties rename to core/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_es.properties diff --git a/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_fr.properties b/core/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_fr.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_fr.properties rename to core/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_fr.properties diff --git a/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_ja.properties b/core/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_ja.properties similarity index 100% rename from src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_ja.properties rename to core/src/main/java/org/apache/tomcat/util/threads/res/LocalStrings_ja.properties diff --git a/src/main/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java b/core/src/main/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java rename to core/src/main/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java diff --git a/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java b/core/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java rename to core/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapper.java diff --git a/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java b/core/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java rename to core/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperNonSecure.java diff --git a/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java b/core/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java rename to core/src/main/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java diff --git a/src/main/java/org/apache/tomcat/websocket/BackgroundProcess.java b/core/src/main/java/org/apache/tomcat/websocket/BackgroundProcess.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/BackgroundProcess.java rename to core/src/main/java/org/apache/tomcat/websocket/BackgroundProcess.java diff --git a/src/main/java/org/apache/tomcat/websocket/BackgroundProcessManager.java b/core/src/main/java/org/apache/tomcat/websocket/BackgroundProcessManager.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/BackgroundProcessManager.java rename to core/src/main/java/org/apache/tomcat/websocket/BackgroundProcessManager.java diff --git a/src/main/java/org/apache/tomcat/websocket/Constants.java b/core/src/main/java/org/apache/tomcat/websocket/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/Constants.java rename to core/src/main/java/org/apache/tomcat/websocket/Constants.java diff --git a/src/main/java/org/apache/tomcat/websocket/DecoderEntry.java b/core/src/main/java/org/apache/tomcat/websocket/DecoderEntry.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/DecoderEntry.java rename to core/src/main/java/org/apache/tomcat/websocket/DecoderEntry.java diff --git a/src/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java b/core/src/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java rename to core/src/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java diff --git a/src/main/java/org/apache/tomcat/websocket/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/websocket/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/websocket/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/websocket/MessageHandlerResult.java b/core/src/main/java/org/apache/tomcat/websocket/MessageHandlerResult.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/MessageHandlerResult.java rename to core/src/main/java/org/apache/tomcat/websocket/MessageHandlerResult.java diff --git a/src/main/java/org/apache/tomcat/websocket/MessageHandlerResultType.java b/core/src/main/java/org/apache/tomcat/websocket/MessageHandlerResultType.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/MessageHandlerResultType.java rename to core/src/main/java/org/apache/tomcat/websocket/MessageHandlerResultType.java diff --git a/src/main/java/org/apache/tomcat/websocket/MessagePart.java b/core/src/main/java/org/apache/tomcat/websocket/MessagePart.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/MessagePart.java rename to core/src/main/java/org/apache/tomcat/websocket/MessagePart.java diff --git a/src/main/java/org/apache/tomcat/websocket/PerMessageDeflate.java b/core/src/main/java/org/apache/tomcat/websocket/PerMessageDeflate.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/PerMessageDeflate.java rename to core/src/main/java/org/apache/tomcat/websocket/PerMessageDeflate.java diff --git a/src/main/java/org/apache/tomcat/websocket/ReadBufferOverflowException.java b/core/src/main/java/org/apache/tomcat/websocket/ReadBufferOverflowException.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/ReadBufferOverflowException.java rename to core/src/main/java/org/apache/tomcat/websocket/ReadBufferOverflowException.java diff --git a/src/main/java/org/apache/tomcat/websocket/Transformation.java b/core/src/main/java/org/apache/tomcat/websocket/Transformation.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/Transformation.java rename to core/src/main/java/org/apache/tomcat/websocket/Transformation.java diff --git a/src/main/java/org/apache/tomcat/websocket/TransformationFactory.java b/core/src/main/java/org/apache/tomcat/websocket/TransformationFactory.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/TransformationFactory.java rename to core/src/main/java/org/apache/tomcat/websocket/TransformationFactory.java diff --git a/src/main/java/org/apache/tomcat/websocket/TransformationResult.java b/core/src/main/java/org/apache/tomcat/websocket/TransformationResult.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/TransformationResult.java rename to core/src/main/java/org/apache/tomcat/websocket/TransformationResult.java diff --git a/src/main/java/org/apache/tomcat/websocket/Util.java b/core/src/main/java/org/apache/tomcat/websocket/Util.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/Util.java rename to core/src/main/java/org/apache/tomcat/websocket/Util.java diff --git a/src/main/java/org/apache/tomcat/websocket/WrappedMessageHandler.java b/core/src/main/java/org/apache/tomcat/websocket/WrappedMessageHandler.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WrappedMessageHandler.java rename to core/src/main/java/org/apache/tomcat/websocket/WrappedMessageHandler.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsContainerProvider.java b/core/src/main/java/org/apache/tomcat/websocket/WsContainerProvider.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsContainerProvider.java rename to core/src/main/java/org/apache/tomcat/websocket/WsContainerProvider.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsExtension.java b/core/src/main/java/org/apache/tomcat/websocket/WsExtension.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsExtension.java rename to core/src/main/java/org/apache/tomcat/websocket/WsExtension.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsExtensionParameter.java b/core/src/main/java/org/apache/tomcat/websocket/WsExtensionParameter.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsExtensionParameter.java rename to core/src/main/java/org/apache/tomcat/websocket/WsExtensionParameter.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsFrameBase.java b/core/src/main/java/org/apache/tomcat/websocket/WsFrameBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsFrameBase.java rename to core/src/main/java/org/apache/tomcat/websocket/WsFrameBase.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsFrameClient.java b/core/src/main/java/org/apache/tomcat/websocket/WsFrameClient.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsFrameClient.java rename to core/src/main/java/org/apache/tomcat/websocket/WsFrameClient.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsHandshakeResponse.java b/core/src/main/java/org/apache/tomcat/websocket/WsHandshakeResponse.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsHandshakeResponse.java rename to core/src/main/java/org/apache/tomcat/websocket/WsHandshakeResponse.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsIOException.java b/core/src/main/java/org/apache/tomcat/websocket/WsIOException.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsIOException.java rename to core/src/main/java/org/apache/tomcat/websocket/WsIOException.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsPongMessage.java b/core/src/main/java/org/apache/tomcat/websocket/WsPongMessage.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsPongMessage.java rename to core/src/main/java/org/apache/tomcat/websocket/WsPongMessage.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointAsync.java b/core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointAsync.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointAsync.java rename to core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointAsync.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java b/core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java rename to core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBasic.java b/core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBasic.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBasic.java rename to core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointBasic.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java b/core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java rename to core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java b/core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java rename to core/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsSession.java b/core/src/main/java/org/apache/tomcat/websocket/WsSession.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsSession.java rename to core/src/main/java/org/apache/tomcat/websocket/WsSession.java diff --git a/src/main/java/org/apache/tomcat/websocket/WsWebSocketContainer.java b/core/src/main/java/org/apache/tomcat/websocket/WsWebSocketContainer.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/WsWebSocketContainer.java rename to core/src/main/java/org/apache/tomcat/websocket/WsWebSocketContainer.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/Constants.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/Constants.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/Constants.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/PojoPathParam.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/PojoPathParam.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/PojoPathParam.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/PojoPathParam.java diff --git a/src/main/java/org/apache/tomcat/websocket/pojo/package-info.java b/core/src/main/java/org/apache/tomcat/websocket/pojo/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/pojo/package-info.java rename to core/src/main/java/org/apache/tomcat/websocket/pojo/package-info.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/Constants.java b/core/src/main/java/org/apache/tomcat/websocket/server/Constants.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/Constants.java rename to core/src/main/java/org/apache/tomcat/websocket/server/Constants.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/DefaultServerEndpointConfigurator.java b/core/src/main/java/org/apache/tomcat/websocket/server/DefaultServerEndpointConfigurator.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/DefaultServerEndpointConfigurator.java rename to core/src/main/java/org/apache/tomcat/websocket/server/DefaultServerEndpointConfigurator.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/websocket/server/LocalStrings.properties similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/LocalStrings.properties rename to core/src/main/java/org/apache/tomcat/websocket/server/LocalStrings.properties diff --git a/src/main/java/org/apache/tomcat/websocket/server/UpgradeUtil.java b/core/src/main/java/org/apache/tomcat/websocket/server/UpgradeUtil.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/UpgradeUtil.java rename to core/src/main/java/org/apache/tomcat/websocket/server/UpgradeUtil.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/UriTemplate.java b/core/src/main/java/org/apache/tomcat/websocket/server/UriTemplate.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/UriTemplate.java rename to core/src/main/java/org/apache/tomcat/websocket/server/UriTemplate.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsContextListener.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsContextListener.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsContextListener.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsContextListener.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsFilter.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsFilter.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsFilter.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsFilter.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsFrameServer.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsFrameServer.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsFrameServer.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsFrameServer.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsHandshakeRequest.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsMappingResult.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsMappingResult.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsMappingResult.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsMappingResult.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsPerSessionServerEndpointConfig.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsPerSessionServerEndpointConfig.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsPerSessionServerEndpointConfig.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsPerSessionServerEndpointConfig.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsSci.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsSci.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsSci.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsSci.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsServerContainer.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsServerContainer.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsServerContainer.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsServerContainer.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsSessionListener.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsSessionListener.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsSessionListener.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsSessionListener.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/WsWriteTimeout.java b/core/src/main/java/org/apache/tomcat/websocket/server/WsWriteTimeout.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/WsWriteTimeout.java rename to core/src/main/java/org/apache/tomcat/websocket/server/WsWriteTimeout.java diff --git a/src/main/java/org/apache/tomcat/websocket/server/package-info.java b/core/src/main/java/org/apache/tomcat/websocket/server/package-info.java similarity index 100% rename from src/main/java/org/apache/tomcat/websocket/server/package-info.java rename to core/src/main/java/org/apache/tomcat/websocket/server/package-info.java diff --git a/core/tomcat-core.iml b/core/tomcat-core.iml new file mode 100644 index 0000000..841f038 --- /dev/null +++ b/core/tomcat-core.iml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 08f913b..2caaae8 100755 --- a/pom.xml +++ b/pom.xml @@ -2,12 +2,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.apache tomcat 9.0.0.M21 - jar - + pom Tomcat-9.0.0.M21 http://maven.apache.org @@ -19,10 +17,14 @@ ${maven.build.timestamp} + + transport + core + all + tomcat - org.apache.maven.plugins diff --git a/transport/pom.xml b/transport/pom.xml new file mode 100644 index 0000000..4238df5 --- /dev/null +++ b/transport/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + + tomcat + org.apache + 9.0.0.M21 + + tomcat-transport + jar + tomcat-transport + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + ${project.artifactId} + + diff --git a/transport/tomcat-transport.iml b/transport/tomcat-transport.iml new file mode 100644 index 0000000..cf42eba --- /dev/null +++ b/transport/tomcat-transport.iml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 48c1b7ecf508aab90331897b2d81f8c89ea4c087 Mon Sep 17 00:00:00 2001 From: apple Date: Wed, 31 Jan 2018 16:58:32 +0800 Subject: [PATCH 2/5] 1 --- .gitignore | 6 +- output/LICENSE | 0 output/NOTICE | 2 +- output/RELEASE-NOTES | 5 +- output/RUNNING.txt | 6 + output/bin/bootstrap.jar | Bin 34481 -> 34782 bytes output/bin/catalina-tasks.xml | 0 output/bin/catalina.bat | 32 +- output/bin/catalina.sh | 33 + output/bin/ciphers.bat | 58 + output/bin/ciphers.sh | 60 + output/bin/commons-daemon-native.tar.gz | Bin 204944 -> 207125 bytes output/bin/commons-daemon.jar | Bin 24283 -> 25145 bytes output/bin/configtest.bat | 0 output/bin/configtest.sh | 0 output/bin/daemon.sh | 24 + output/bin/digest.bat | 0 output/bin/digest.sh | 0 output/bin/setclasspath.bat | 13 +- output/bin/setclasspath.sh | 17 +- output/bin/shutdown.bat | 0 output/bin/shutdown.sh | 0 output/bin/startup.bat | 0 output/bin/startup.sh | 0 output/bin/tomcat-juli.jar | Bin 41137 -> 45650 bytes output/bin/tomcat-native.tar.gz | Bin 399836 -> 405109 bytes output/bin/tool-wrapper.bat | 22 +- output/bin/tool-wrapper.sh | 21 + output/bin/version.bat | 0 output/bin/version.sh | 0 output/conf/catalina.policy | 23 +- output/conf/catalina.properties | 0 output/conf/context.xml | 1 + output/conf/jaspic-providers.xml | 0 output/conf/jaspic-providers.xsd | 6 +- output/conf/logging.properties | 4 + output/conf/server.xml | 6 +- output/conf/tomcat-users.xml | 0 output/conf/tomcat-users.xsd | 0 output/conf/web.xml | 37 +- output/lib/annotations-api.jar | Bin 0 -> 12400 bytes output/lib/catalina-ant.jar | Bin 0 -> 54233 bytes output/lib/catalina-ha.jar | Bin 0 -> 119167 bytes output/lib/catalina-storeconfig.jar | Bin 0 -> 74952 bytes output/lib/catalina-tribes.jar | Bin 0 -> 287744 bytes output/lib/catalina.jar | Bin 0 -> 1613883 bytes output/lib/ecj-4.6.3.jar | Bin 0 -> 2450404 bytes output/lib/el-api.jar | Bin 0 -> 81744 bytes output/lib/jasper-el.jar | Bin 0 -> 163921 bytes output/lib/jasper.jar | Bin 0 -> 547537 bytes output/lib/jaspic-api.jar | Bin 0 -> 26870 bytes output/lib/jsp-api.jar | Bin 0 -> 61763 bytes output/lib/servlet-api.jar | Bin 0 -> 278030 bytes output/lib/tomcat-api.jar | Bin 0 -> 10679 bytes output/lib/tomcat-coyote.jar | Bin 0 -> 810946 bytes output/lib/tomcat-dbcp.jar | Bin 0 -> 270830 bytes output/lib/tomcat-i18n-es.jar | Bin 0 -> 65452 bytes output/lib/tomcat-i18n-fr.jar | Bin 0 -> 39391 bytes output/lib/tomcat-i18n-ja.jar | Bin 0 -> 42274 bytes output/lib/tomcat-jdbc.jar | Bin 0 -> 144946 bytes output/lib/tomcat-jni.jar | Bin 0 -> 34540 bytes output/lib/tomcat-util-scan.jar | Bin 0 -> 205826 bytes output/lib/tomcat-util.jar | Bin 0 -> 137481 bytes output/lib/tomcat-websocket.jar | Bin 0 -> 224846 bytes output/lib/websocket-api.jar | Bin 0 -> 36829 bytes output/temp/safeToDelete.tmp | 0 output/webapps/ROOT/RELEASE-NOTES.txt | 173 +++ output/webapps/ROOT/WEB-INF/web.xml | 30 + output/webapps/ROOT/asf-logo-wide.svg | 295 ++++ output/webapps/ROOT/bg-button.png | Bin 0 -> 713 bytes output/webapps/ROOT/bg-middle.png | Bin 0 -> 1918 bytes output/webapps/ROOT/bg-nav.png | Bin 0 -> 1401 bytes output/webapps/ROOT/bg-upper.png | Bin 0 -> 3103 bytes output/webapps/ROOT/favicon.ico | Bin 0 -> 21630 bytes output/webapps/ROOT/index.jsp | 223 +++ output/webapps/ROOT/tomcat-power.gif | Bin 0 -> 2376 bytes output/webapps/ROOT/tomcat.css | 351 +++++ output/webapps/ROOT/tomcat.gif | Bin 0 -> 2066 bytes output/webapps/ROOT/tomcat.png | Bin 0 -> 5103 bytes output/webapps/ROOT/tomcat.svg | 967 ++++++++++++ output/webapps/docs/BUILDING.txt | 2 +- output/webapps/docs/RELEASE-NOTES.txt | 5 +- output/webapps/docs/RUNNING.txt | 6 + output/webapps/docs/WEB-INF/web.xml | 0 output/webapps/docs/aio.html | 8 +- output/webapps/docs/api/index.html | 0 output/webapps/docs/appdev/build.xml.txt | 0 output/webapps/docs/appdev/deployment.html | 8 +- output/webapps/docs/appdev/index.html | 8 +- output/webapps/docs/appdev/installation.html | 10 +- output/webapps/docs/appdev/introduction.html | 13 +- output/webapps/docs/appdev/processes.html | 8 +- output/webapps/docs/appdev/sample/build.xml | 0 .../docs/appdev/sample/docs/README.txt | 0 output/webapps/docs/appdev/sample/index.html | 0 output/webapps/docs/appdev/sample/sample.war | Bin .../appdev/sample/src/mypackage/Hello.java | 0 .../docs/appdev/sample/web/WEB-INF/web.xml | 0 .../webapps/docs/appdev/sample/web/hello.jsp | 0 .../docs/appdev/sample/web/images/tomcat.gif | Bin .../webapps/docs/appdev/sample/web/index.html | 0 output/webapps/docs/appdev/source.html | 8 +- output/webapps/docs/appdev/web.xml.txt | 0 output/webapps/docs/apr.html | 8 +- output/webapps/docs/architecture/index.html | 8 +- .../webapps/docs/architecture/overview.html | 8 +- .../docs/architecture/requestProcess.html | 8 +- .../requestProcess/authentication-process.png | Bin .../requestProcess/request-process.png | Bin output/webapps/docs/architecture/startup.html | 8 +- .../architecture/startup/serverStartup.pdf | Bin .../architecture/startup/serverStartup.txt | 0 output/webapps/docs/balancer-howto.html | 8 +- output/webapps/docs/building.html | 8 +- output/webapps/docs/cgi-howto.html | 26 +- output/webapps/docs/changelog.html | 1373 ++++++++++++++++- output/webapps/docs/class-loader-howto.html | 23 +- output/webapps/docs/cluster-howto.html | 28 +- output/webapps/docs/comments.html | 8 +- output/webapps/docs/config/ajp.html | 8 +- .../docs/config/automatic-deployment.html | 8 +- .../webapps/docs/config/cluster-channel.html | 8 +- .../webapps/docs/config/cluster-deployer.html | 8 +- .../docs/config/cluster-interceptor.html | 10 +- .../webapps/docs/config/cluster-listener.html | 8 +- .../webapps/docs/config/cluster-manager.html | 8 +- .../docs/config/cluster-membership.html | 8 +- .../webapps/docs/config/cluster-receiver.html | 8 +- .../webapps/docs/config/cluster-sender.html | 8 +- output/webapps/docs/config/cluster-valve.html | 8 +- output/webapps/docs/config/cluster.html | 18 +- output/webapps/docs/config/context.html | 49 +- .../webapps/docs/config/cookie-processor.html | 8 +- .../docs/config/credentialhandler.html | 8 +- output/webapps/docs/config/engine.html | 8 +- output/webapps/docs/config/executor.html | 8 +- output/webapps/docs/config/filter.html | 51 +- .../webapps/docs/config/globalresources.html | 10 +- output/webapps/docs/config/host.html | 22 +- output/webapps/docs/config/http.html | 31 +- output/webapps/docs/config/http2.html | 52 +- output/webapps/docs/config/index.html | 8 +- .../webapps/docs/config/jar-scan-filter.html | 12 +- output/webapps/docs/config/jar-scanner.html | 10 +- output/webapps/docs/config/jaspic.html | 8 +- output/webapps/docs/config/listeners.html | 10 +- output/webapps/docs/config/loader.html | 12 +- output/webapps/docs/config/manager.html | 12 +- output/webapps/docs/config/realm.html | 12 +- output/webapps/docs/config/resources.html | 36 +- output/webapps/docs/config/server.html | 8 +- output/webapps/docs/config/service.html | 8 +- .../docs/config/sessionidgenerator.html | 8 +- output/webapps/docs/config/systemprops.html | 30 +- output/webapps/docs/config/valve.html | 133 +- output/webapps/docs/connectors.html | 8 +- output/webapps/docs/default-servlet.html | 26 +- output/webapps/docs/deployer-howto.html | 8 +- output/webapps/docs/developers.html | 8 +- output/webapps/docs/elapi/index.html | 0 output/webapps/docs/extras.html | 8 +- .../webapps/docs/funcspecs/fs-admin-apps.html | 8 +- .../docs/funcspecs/fs-admin-objects.html | 8 +- .../docs/funcspecs/fs-admin-opers.html | 8 +- output/webapps/docs/funcspecs/fs-default.html | 8 +- .../webapps/docs/funcspecs/fs-jdbc-realm.html | 8 +- .../webapps/docs/funcspecs/fs-jndi-realm.html | 8 +- .../docs/funcspecs/fs-memory-realm.html | 8 +- output/webapps/docs/funcspecs/index.html | 8 +- .../webapps/docs/funcspecs/mbean-names.html | 8 +- output/webapps/docs/html-manager-howto.html | 8 +- output/webapps/docs/images/add.gif | Bin output/webapps/docs/images/asf-logo.svg | 16 + output/webapps/docs/images/code.gif | Bin output/webapps/docs/images/cors-flowchart.png | Bin output/webapps/docs/images/design.gif | Bin .../webapps/docs/images/docs-stylesheet.css | 0 output/webapps/docs/images/docs.gif | Bin output/webapps/docs/images/fix.gif | Bin .../docs/images/fonts/OpenSans400.woff | Bin .../docs/images/fonts/OpenSans400italic.woff | Bin .../docs/images/fonts/OpenSans600.woff | Bin .../docs/images/fonts/OpenSans600italic.woff | Bin .../docs/images/fonts/OpenSans700.woff | Bin .../docs/images/fonts/OpenSans700italic.woff | Bin output/webapps/docs/images/fonts/fonts.css | 0 output/webapps/docs/images/tomcat.gif | Bin output/webapps/docs/images/tomcat.png | Bin output/webapps/docs/images/update.gif | Bin output/webapps/docs/images/void.gif | Bin output/webapps/docs/index.html | 18 +- output/webapps/docs/introduction.html | 12 +- output/webapps/docs/jasper-howto.html | 27 +- output/webapps/docs/jdbc-pool.html | 8 +- .../docs/jndi-datasource-examples-howto.html | 8 +- output/webapps/docs/jndi-resources-howto.html | 8 +- output/webapps/docs/jspapi/index.html | 0 output/webapps/docs/logging.html | 14 +- output/webapps/docs/manager-howto.html | 67 +- output/webapps/docs/maven-jars.html | 8 +- .../docs/mbeans-descriptors-howto.html | 13 +- output/webapps/docs/mbeans-descriptors.dtd | 247 +++ output/webapps/docs/monitoring.html | 8 +- output/webapps/docs/proxy-howto.html | 8 +- output/webapps/docs/realm-howto.html | 8 +- output/webapps/docs/rewrite.html | 8 +- output/webapps/docs/security-howto.html | 34 +- .../webapps/docs/security-manager-howto.html | 31 +- output/webapps/docs/servletapi/index.html | 0 output/webapps/docs/setup.html | 43 +- output/webapps/docs/ssi-howto.html | 8 +- output/webapps/docs/ssl-howto.html | 118 +- output/webapps/docs/tribes/developers.html | 8 +- output/webapps/docs/tribes/faq.html | 8 +- output/webapps/docs/tribes/interceptors.html | 8 +- output/webapps/docs/tribes/introduction.html | 8 +- output/webapps/docs/tribes/membership.html | 8 +- output/webapps/docs/tribes/setup.html | 8 +- output/webapps/docs/tribes/status.html | 8 +- output/webapps/docs/tribes/transport.html | 8 +- .../webapps/docs/virtual-hosting-howto.html | 8 +- output/webapps/docs/web-socket-howto.html | 16 +- output/webapps/docs/websocketapi/index.html | 0 output/webapps/docs/windows-auth-howto.html | 10 +- .../webapps/docs/windows-service-howto.html | 37 +- .../WEB-INF/classes/CookieExample.class | Bin .../WEB-INF/classes/CookieExample.java | 0 .../WEB-INF/classes/HelloWorldExample.class | Bin .../WEB-INF/classes/HelloWorldExample.java | 0 .../WEB-INF/classes/LocalStrings.properties | 0 .../classes/LocalStrings_en.properties | 0 .../classes/LocalStrings_es.properties | 1 + .../classes/LocalStrings_fr.properties | 0 .../classes/LocalStrings_pt.properties | 0 .../classes/RequestHeaderExample.class | Bin .../WEB-INF/classes/RequestHeaderExample.java | 0 .../WEB-INF/classes/RequestInfoExample.class | Bin .../WEB-INF/classes/RequestInfoExample.java | 0 .../WEB-INF/classes/RequestParamExample.class | Bin .../WEB-INF/classes/RequestParamExample.java | 0 .../WEB-INF/classes/ServletToJsp.class | Bin .../WEB-INF/classes/ServletToJsp.java | 0 .../WEB-INF/classes/SessionExample.class | Bin .../WEB-INF/classes/SessionExample.java | 0 .../WEB-INF/classes/async/Async0$1.class | Bin .../WEB-INF/classes/async/Async0.class | Bin .../WEB-INF/classes/async/Async0.java | 0 .../WEB-INF/classes/async/Async1$1.class | Bin .../WEB-INF/classes/async/Async1.class | Bin .../WEB-INF/classes/async/Async1.java | 0 .../WEB-INF/classes/async/Async2$1.class | Bin .../WEB-INF/classes/async/Async2.class | Bin .../WEB-INF/classes/async/Async2.java | 0 .../WEB-INF/classes/async/Async3.class | Bin .../WEB-INF/classes/async/Async3.java | 0 .../async/AsyncStockContextListener.java | 44 + .../classes/async/AsyncStockServlet.class | Bin 4759 -> 5244 bytes .../classes/async/AsyncStockServlet.java | 53 +- .../classes/async/Stockticker$Stock.class | Bin 2596 -> 2596 bytes .../async/Stockticker$TickListener.class | Bin 282 -> 307 bytes .../WEB-INF/classes/async/Stockticker.class | Bin 3219 -> 3437 bytes .../WEB-INF/classes/async/Stockticker.java | 23 +- .../WEB-INF/classes/cal/Entries.class | Bin .../examples/WEB-INF/classes/cal/Entries.java | 0 .../examples/WEB-INF/classes/cal/Entry.class | Bin .../examples/WEB-INF/classes/cal/Entry.java | 0 .../WEB-INF/classes/cal/JspCalendar.class | Bin .../WEB-INF/classes/cal/JspCalendar.java | 0 .../WEB-INF/classes/cal/TableBean.class | Bin .../WEB-INF/classes/cal/TableBean.java | 0 .../WEB-INF/classes/checkbox/CheckTest.class | Bin .../WEB-INF/classes/checkbox/CheckTest.java | 0 .../classes/colors/ColorGameBean.class | Bin .../WEB-INF/classes/colors/ColorGameBean.java | 0 .../CompressionFilter.class | Bin 5080 -> 5040 bytes .../compressionFilters/CompressionFilter.java | 27 +- .../CompressionFilterTestServlet.class | Bin .../CompressionFilterTestServlet.java | 0 .../CompressionResponseStream.class | Bin .../CompressionResponseStream.java | 0 .../CompressionServletResponseWrapper.class | Bin 5381 -> 5311 bytes .../CompressionServletResponseWrapper.java | 15 +- .../WEB-INF/classes/dates/JspCalendar.class | Bin .../WEB-INF/classes/dates/JspCalendar.java | 0 .../WEB-INF/classes/error/Smart.class | Bin .../examples/WEB-INF/classes/error/Smart.java | 0 .../classes/examples/ExampleTagBase.class | Bin .../classes/examples/ExampleTagBase.java | 0 .../WEB-INF/classes/examples/FooTag.class | Bin .../WEB-INF/classes/examples/FooTag.java | 0 .../classes/examples/FooTagExtraInfo.class | Bin .../classes/examples/FooTagExtraInfo.java | 0 .../WEB-INF/classes/examples/LogTag.class | Bin .../WEB-INF/classes/examples/LogTag.java | 0 .../WEB-INF/classes/examples/ShowSource.class | Bin .../WEB-INF/classes/examples/ShowSource.java | 0 .../WEB-INF/classes/examples/ValuesTag.class | Bin .../WEB-INF/classes/examples/ValuesTag.java | 0 .../classes/filters/ExampleFilter.class | Bin .../classes/filters/ExampleFilter.java | 2 +- .../classes/http2/SimpleImagePush.class | Bin .../classes/http2/SimpleImagePush.java | 0 .../classes/jsp2/examples/BookBean.class | Bin .../classes/jsp2/examples/BookBean.java | 0 .../classes/jsp2/examples/FooBean.class | Bin .../classes/jsp2/examples/FooBean.java | 0 .../classes/jsp2/examples/ValuesBean.class | Bin .../classes/jsp2/examples/ValuesBean.java | 0 .../classes/jsp2/examples/el/Functions.class | Bin .../classes/jsp2/examples/el/Functions.java | 0 .../simpletag/EchoAttributesTag.class | Bin 1898 -> 1913 bytes .../examples/simpletag/EchoAttributesTag.java | 5 +- .../simpletag/FindBookSimpleTag.class | Bin .../examples/simpletag/FindBookSimpleTag.java | 0 .../simpletag/HelloWorldSimpleTag.class | Bin .../simpletag/HelloWorldSimpleTag.java | 0 .../examples/simpletag/RepeatSimpleTag.class | Bin .../examples/simpletag/RepeatSimpleTag.java | 0 .../examples/simpletag/ShuffleSimpleTag.class | Bin .../examples/simpletag/ShuffleSimpleTag.java | 0 .../examples/simpletag/TileSimpleTag.class | Bin .../examples/simpletag/TileSimpleTag.java | 0 .../classes/listeners/ContextListener.class | Bin .../classes/listeners/ContextListener.java | 0 .../classes/listeners/SessionListener.class | Bin .../classes/listeners/SessionListener.java | 0 .../classes/nonblocking/ByteCounter$1.class | Bin .../ByteCounter$CounterListener.class | Bin .../classes/nonblocking/ByteCounter.class | Bin .../classes/nonblocking/ByteCounter.java | 0 .../classes/nonblocking/NumberWriter$1.class | Bin .../NumberWriter$NumberWriterListener.class | Bin .../classes/nonblocking/NumberWriter.class | Bin .../classes/nonblocking/NumberWriter.java | 0 .../WEB-INF/classes/num/NumberGuessBean.class | Bin .../WEB-INF/classes/num/NumberGuessBean.java | 0 .../WEB-INF/classes/sessions/DummyCart.class | Bin .../WEB-INF/classes/sessions/DummyCart.java | 0 .../classes/trailers/ResponseTrailers.java | 68 + .../WEB-INF/classes/util/CookieFilter.class | Bin .../WEB-INF/classes/util/CookieFilter.java | 0 .../WEB-INF/classes/util/HTMLFilter.class | Bin .../WEB-INF/classes/util/HTMLFilter.java | 5 +- .../classes/validators/DebugValidator.class | Bin .../classes/validators/DebugValidator.java | 2 +- .../classes/websocket/ExamplesConfig.class | Bin .../classes/websocket/ExamplesConfig.java | 0 .../websocket/chat/ChatAnnotation.class | Bin .../websocket/chat/ChatAnnotation.java | 0 .../websocket/drawboard/Client$1.class | Bin .../classes/websocket/drawboard/Client.class | Bin .../classes/websocket/drawboard/Client.java | 0 .../DrawMessage$ParseException.class | Bin .../websocket/drawboard/DrawMessage.class | Bin .../websocket/drawboard/DrawMessage.java | 0 .../drawboard/DrawboardContextListener.class | Bin .../drawboard/DrawboardContextListener.java | 0 .../drawboard/DrawboardEndpoint$1.class | Bin .../drawboard/DrawboardEndpoint$2.class | Bin .../drawboard/DrawboardEndpoint$3$1.class | Bin .../drawboard/DrawboardEndpoint$3.class | Bin .../drawboard/DrawboardEndpoint.class | Bin .../drawboard/DrawboardEndpoint.java | 0 .../websocket/drawboard/Room$1$1.class | Bin .../classes/websocket/drawboard/Room$1.class | Bin .../classes/websocket/drawboard/Room$2.class | Bin .../drawboard/Room$MessageType.class | Bin .../websocket/drawboard/Room$Player.class | Bin .../classes/websocket/drawboard/Room.class | Bin .../classes/websocket/drawboard/Room.java | 0 .../wsmessages/AbstractWebsocketMessage.class | Bin .../wsmessages/AbstractWebsocketMessage.java | 0 .../wsmessages/BinaryWebsocketMessage.class | Bin .../wsmessages/BinaryWebsocketMessage.java | 0 .../wsmessages/CloseWebsocketMessage.class | Bin .../wsmessages/CloseWebsocketMessage.java | 0 .../wsmessages/StringWebsocketMessage.class | Bin .../wsmessages/StringWebsocketMessage.java | 0 .../websocket/echo/EchoAnnotation.class | Bin .../websocket/echo/EchoAnnotation.java | 0 .../echo/EchoAsyncAnnotation$1.class | Bin .../EchoAsyncAnnotation$CompletedFuture.class | Bin .../websocket/echo/EchoAsyncAnnotation.class | Bin .../websocket/echo/EchoAsyncAnnotation.java | 0 .../websocket/echo/EchoEndpoint$1.class | Bin ...choEndpoint$EchoMessageHandlerBinary.class | Bin .../EchoEndpoint$EchoMessageHandlerText.class | Bin .../classes/websocket/echo/EchoEndpoint.class | Bin .../classes/websocket/echo/EchoEndpoint.java | 0 .../websocket/echo/EchoStreamAnnotation.class | Bin .../websocket/echo/EchoStreamAnnotation.java | 0 .../classes/websocket/echo/servers.json | 0 .../classes/websocket/snake/Direction.class | Bin .../classes/websocket/snake/Direction.java | 0 .../classes/websocket/snake/Location$1.class | Bin .../classes/websocket/snake/Location.class | Bin .../classes/websocket/snake/Location.java | 0 .../classes/websocket/snake/Snake.class | Bin .../classes/websocket/snake/Snake.java | 0 .../websocket/snake/SnakeAnnotation.class | Bin .../websocket/snake/SnakeAnnotation.java | 0 .../websocket/snake/SnakeTimer$1.class | Bin .../classes/websocket/snake/SnakeTimer.class | Bin .../classes/websocket/snake/SnakeTimer.java | 0 .../examples/WEB-INF/jsp/applet/Clock2.java | 12 +- .../examples/WEB-INF/jsp/debug-taglib.tld | 0 .../examples/WEB-INF/jsp/example-taglib.tld | 0 .../WEB-INF/jsp2/jsp2-example-taglib.tld | 0 .../lib/taglibs-standard-impl-1.2.5.jar | Bin .../lib/taglibs-standard-spec-1.2.5.jar | Bin .../examples/WEB-INF/tags/displayProducts.tag | 0 .../examples/WEB-INF/tags/helloWorld.tag | 0 .../webapps/examples/WEB-INF/tags/panel.tag | 0 output/webapps/examples/WEB-INF/web.xml | 39 +- output/webapps/examples/index.html | 0 output/webapps/examples/jsp/async/async1.jsp | 0 .../examples/jsp/async/async1.jsp.html | 0 output/webapps/examples/jsp/async/async3.jsp | 0 .../examples/jsp/async/async3.jsp.html | 0 output/webapps/examples/jsp/async/index.jsp | 0 .../webapps/examples/jsp/async/index.jsp.html | 0 .../examples/jsp/cal/Entries.java.html | 0 .../webapps/examples/jsp/cal/Entry.java.html | 0 .../examples/jsp/cal/JspCalendar.java.html | 0 .../examples/jsp/cal/TableBean.java.html | 0 output/webapps/examples/jsp/cal/cal1.jsp | 0 output/webapps/examples/jsp/cal/cal1.jsp.html | 0 output/webapps/examples/jsp/cal/cal2.jsp | 0 output/webapps/examples/jsp/cal/cal2.jsp.html | 0 output/webapps/examples/jsp/cal/calendar.html | 0 output/webapps/examples/jsp/cal/login.html | 0 .../examples/jsp/checkbox/CheckTest.html | 0 .../webapps/examples/jsp/checkbox/check.html | 0 .../examples/jsp/checkbox/checkresult.jsp | 0 .../jsp/checkbox/checkresult.jsp.html | 0 .../examples/jsp/checkbox/cresult.html | 0 .../examples/jsp/colors/ColorGameBean.html | 0 output/webapps/examples/jsp/colors/clr.html | 0 .../webapps/examples/jsp/colors/colors.html | 0 output/webapps/examples/jsp/colors/colrs.jsp | 0 .../examples/jsp/colors/colrs.jsp.html | 0 output/webapps/examples/jsp/dates/date.html | 0 output/webapps/examples/jsp/dates/date.jsp | 0 .../webapps/examples/jsp/dates/date.jsp.html | 0 output/webapps/examples/jsp/error/er.html | 0 output/webapps/examples/jsp/error/err.jsp | 0 .../webapps/examples/jsp/error/err.jsp.html | 0 output/webapps/examples/jsp/error/error.html | 0 .../webapps/examples/jsp/error/errorpge.jsp | 0 .../examples/jsp/error/errorpge.jsp.html | 0 .../webapps/examples/jsp/forward/forward.jsp | 0 .../examples/jsp/forward/forward.jsp.html | 0 output/webapps/examples/jsp/forward/fwd.html | 0 output/webapps/examples/jsp/forward/one.jsp | 0 .../webapps/examples/jsp/forward/one.jsp.html | 0 output/webapps/examples/jsp/forward/two.html | 0 output/webapps/examples/jsp/images/code.gif | Bin .../webapps/examples/jsp/images/execute.gif | Bin output/webapps/examples/jsp/images/return.gif | Bin output/webapps/examples/jsp/include/foo.html | 0 output/webapps/examples/jsp/include/foo.jsp | 0 .../webapps/examples/jsp/include/foo.jsp.html | 0 output/webapps/examples/jsp/include/inc.html | 0 .../webapps/examples/jsp/include/include.jsp | 0 .../examples/jsp/include/include.jsp.html | 0 output/webapps/examples/jsp/index.html | 0 .../examples/jsp/jsp2/el/Functions.java.html | 0 .../examples/jsp/jsp2/el/ValuesBean.java.html | 0 .../examples/jsp/jsp2/el/ValuesTag.java.html | 0 .../jsp/jsp2/el/basic-arithmetic.html | 0 .../examples/jsp/jsp2/el/basic-arithmetic.jsp | 0 .../jsp/jsp2/el/basic-arithmetic.jsp.html | 0 .../jsp/jsp2/el/basic-comparisons.html | 0 .../jsp/jsp2/el/basic-comparisons.jsp | 0 .../jsp/jsp2/el/basic-comparisons.jsp.html | 0 .../examples/jsp/jsp2/el/composite.html | 0 .../examples/jsp/jsp2/el/composite.jsp | 0 .../examples/jsp/jsp2/el/composite.jsp.html | 0 .../examples/jsp/jsp2/el/functions.html | 0 .../examples/jsp/jsp2/el/functions.jsp | 0 .../examples/jsp/jsp2/el/functions.jsp.html | 0 .../jsp/jsp2/el/implicit-objects.html | 0 .../examples/jsp/jsp2/el/implicit-objects.jsp | 0 .../jsp/jsp2/el/implicit-objects.jsp.html | 0 .../jsp/jsp2/jspattribute/FooBean.java.html | 0 .../HelloWorldSimpleTag.java.html | 0 .../jspattribute/ShuffleSimpleTag.java.html | 0 .../jsp2/jspattribute/TileSimpleTag.java.html | 0 .../jsp/jsp2/jspattribute/jspattribute.html | 0 .../jsp/jsp2/jspattribute/jspattribute.jsp | 0 .../jsp2/jspattribute/jspattribute.jsp.html | 0 .../jsp/jsp2/jspattribute/shuffle.html | 0 .../jsp/jsp2/jspattribute/shuffle.jsp | 0 .../jsp/jsp2/jspattribute/shuffle.jsp.html | 0 .../webapps/examples/jsp/jsp2/jspx/basic.html | 0 .../webapps/examples/jsp/jsp2/jspx/basic.jspx | 0 .../examples/jsp/jsp2/jspx/basic.jspx.html | 0 .../examples/jsp/jsp2/jspx/svgexample.html | 0 .../examples/jsp/jsp2/jspx/textRotate.html | 0 .../examples/jsp/jsp2/jspx/textRotate.jpg | Bin .../examples/jsp/jsp2/jspx/textRotate.jspx | 0 .../jsp/jsp2/jspx/textRotate.jspx.html | 0 .../jsp/jsp2/misc/EchoAttributesTag.java.html | 5 +- .../webapps/examples/jsp/jsp2/misc/coda.jspf | 0 .../examples/jsp/jsp2/misc/coda.jspf.html | 0 .../examples/jsp/jsp2/misc/config.html | 0 .../webapps/examples/jsp/jsp2/misc/config.jsp | 0 .../examples/jsp/jsp2/misc/config.jsp.html | 0 .../examples/jsp/jsp2/misc/dynamicattrs.html | 0 .../examples/jsp/jsp2/misc/dynamicattrs.jsp | 0 .../jsp/jsp2/misc/dynamicattrs.jsp.html | 0 .../examples/jsp/jsp2/misc/prelude.jspf | 0 .../examples/jsp/jsp2/misc/prelude.jspf.html | 0 .../jsp/jsp2/simpletag/BookBean.java.html | 0 .../simpletag/FindBookSimpleTag.java.html | 0 .../jsp/jsp2/simpletag/Functions.java.html | 0 .../simpletag/HelloWorldSimpleTag.java.html | 0 .../jsp2/simpletag/RepeatSimpleTag.java.html | 0 .../examples/jsp/jsp2/simpletag/book.html | 0 .../examples/jsp/jsp2/simpletag/book.jsp | 0 .../examples/jsp/jsp2/simpletag/book.jsp.html | 0 .../examples/jsp/jsp2/simpletag/hello.html | 0 .../examples/jsp/jsp2/simpletag/hello.jsp | 0 .../jsp/jsp2/simpletag/hello.jsp.html | 0 .../examples/jsp/jsp2/simpletag/repeat.html | 0 .../examples/jsp/jsp2/simpletag/repeat.jsp | 0 .../jsp/jsp2/simpletag/repeat.jsp.html | 0 .../jsp2/tagfiles/displayProducts.tag.html | 0 .../examples/jsp/jsp2/tagfiles/hello.html | 0 .../examples/jsp/jsp2/tagfiles/hello.jsp | 0 .../examples/jsp/jsp2/tagfiles/hello.jsp.html | 0 .../jsp/jsp2/tagfiles/helloWorld.tag.html | 0 .../examples/jsp/jsp2/tagfiles/panel.html | 0 .../examples/jsp/jsp2/tagfiles/panel.jsp | 0 .../examples/jsp/jsp2/tagfiles/panel.jsp.html | 0 .../examples/jsp/jsp2/tagfiles/panel.tag.html | 0 .../examples/jsp/jsp2/tagfiles/products.html | 0 .../examples/jsp/jsp2/tagfiles/products.jsp | 0 .../jsp/jsp2/tagfiles/products.jsp.html | 0 .../jsp/jsptoserv/ServletToJsp.java.html | 0 .../webapps/examples/jsp/jsptoserv/hello.jsp | 0 .../examples/jsp/jsptoserv/hello.jsp.html | 0 .../examples/jsp/jsptoserv/jsptoservlet.jsp | 0 .../jsp/jsptoserv/jsptoservlet.jsp.html | 0 .../webapps/examples/jsp/jsptoserv/jts.html | 0 output/webapps/examples/jsp/num/numguess.html | 0 output/webapps/examples/jsp/num/numguess.jsp | 0 .../examples/jsp/num/numguess.jsp.html | 0 .../examples/jsp/plugin/applet/Clock2.class | Bin .../examples/jsp/plugin/applet/Clock2.java | 0 .../webapps/examples/jsp/plugin/plugin.html | 0 output/webapps/examples/jsp/plugin/plugin.jsp | 0 .../examples/jsp/plugin/plugin.jsp.html | 0 .../examples/jsp/security/protected/error.jsp | 0 .../jsp/security/protected/error.jsp.html | 0 .../examples/jsp/security/protected/index.jsp | 0 .../jsp/security/protected/index.jsp.html | 0 .../examples/jsp/security/protected/login.jsp | 0 .../jsp/security/protected/login.jsp.html | 0 .../examples/jsp/sessions/DummyCart.html | 0 .../webapps/examples/jsp/sessions/carts.html | 0 .../webapps/examples/jsp/sessions/carts.jsp | 0 .../examples/jsp/sessions/carts.jsp.html | 0 output/webapps/examples/jsp/sessions/crt.html | 0 .../webapps/examples/jsp/simpletag/foo.html | 0 output/webapps/examples/jsp/simpletag/foo.jsp | 0 .../examples/jsp/simpletag/foo.jsp.html | 0 output/webapps/examples/jsp/snp/snoop.html | 0 output/webapps/examples/jsp/snp/snoop.jsp | 0 .../webapps/examples/jsp/snp/snoop.jsp.html | 0 output/webapps/examples/jsp/source.jsp | 0 output/webapps/examples/jsp/source.jsp.html | 0 .../examples/jsp/tagplugin/choose.html | 0 .../webapps/examples/jsp/tagplugin/choose.jsp | 0 .../examples/jsp/tagplugin/choose.jsp.html | 0 .../examples/jsp/tagplugin/foreach.html | 0 .../examples/jsp/tagplugin/foreach.jsp | 0 .../examples/jsp/tagplugin/foreach.jsp.html | 0 .../webapps/examples/jsp/tagplugin/howto.html | 0 output/webapps/examples/jsp/tagplugin/if.html | 0 output/webapps/examples/jsp/tagplugin/if.jsp | 0 .../examples/jsp/tagplugin/if.jsp.html | 0 .../webapps/examples/jsp/tagplugin/notes.html | 0 output/webapps/examples/jsp/xml/xml.html | 0 output/webapps/examples/jsp/xml/xml.jsp | 0 output/webapps/examples/jsp/xml/xml.jsp.html | 0 output/webapps/examples/servlets/cookies.html | 0 .../webapps/examples/servlets/helloworld.html | 0 .../webapps/examples/servlets/images/code.gif | Bin .../examples/servlets/images/execute.gif | Bin .../examples/servlets/images/return.gif | Bin output/webapps/examples/servlets/index.html | 11 + .../servlets/nonblocking/bytecounter.html | 0 .../webapps/examples/servlets/reqheaders.html | 0 output/webapps/examples/servlets/reqinfo.html | 0 .../webapps/examples/servlets/reqparams.html | 0 .../webapps/examples/servlets/sessions.html | 0 output/webapps/examples/websocket/chat.xhtml | 0 .../examples/websocket/drawboard.xhtml | 0 output/webapps/examples/websocket/echo.xhtml | 0 output/webapps/examples/websocket/index.xhtml | 0 output/webapps/examples/websocket/snake.xhtml | 0 .../webapps/host-manager/META-INF/context.xml | 1 + .../webapps/host-manager/WEB-INF/jsp/401.jsp | 0 .../webapps/host-manager/WEB-INF/jsp/403.jsp | 0 .../webapps/host-manager/WEB-INF/jsp/404.jsp | 0 output/webapps/host-manager/WEB-INF/web.xml | 16 +- .../webapps/host-manager/images/asf-logo.svg | 16 + output/webapps/host-manager/images/tomcat.gif | Bin output/webapps/host-manager/index.jsp | 0 output/webapps/host-manager/manager.xml | 0 output/webapps/manager/META-INF/context.xml | 1 + output/webapps/manager/WEB-INF/jsp/401.jsp | 0 output/webapps/manager/WEB-INF/jsp/403.jsp | 0 output/webapps/manager/WEB-INF/jsp/404.jsp | 0 .../manager/WEB-INF/jsp/connectorCerts.jsp | 92 ++ .../manager/WEB-INF/jsp/connectorCiphers.jsp | 10 +- .../WEB-INF/jsp/connectorTrustedCerts.jsp | 92 ++ .../manager/WEB-INF/jsp/sessionDetail.jsp | 2 +- .../manager/WEB-INF/jsp/sessionsList.jsp | 10 +- output/webapps/manager/WEB-INF/web.xml | 16 +- output/webapps/manager/images/asf-logo.svg | 16 + output/webapps/manager/images/tomcat.gif | Bin output/webapps/manager/index.jsp | 0 output/webapps/manager/status.xsd | 0 output/webapps/manager/xform.xsl | 0 pom.xml | 8 +- 627 files changed, 5572 insertions(+), 672 deletions(-) mode change 100755 => 100644 output/LICENSE mode change 100755 => 100644 output/NOTICE mode change 100755 => 100644 output/RELEASE-NOTES mode change 100755 => 100644 output/RUNNING.txt mode change 100755 => 100644 output/bin/bootstrap.jar mode change 100755 => 100644 output/bin/catalina-tasks.xml mode change 100755 => 100644 output/bin/catalina.bat mode change 100755 => 100644 output/bin/catalina.sh create mode 100644 output/bin/ciphers.bat create mode 100644 output/bin/ciphers.sh mode change 100755 => 100644 output/bin/commons-daemon-native.tar.gz mode change 100755 => 100644 output/bin/commons-daemon.jar mode change 100755 => 100644 output/bin/configtest.bat mode change 100755 => 100644 output/bin/configtest.sh mode change 100755 => 100644 output/bin/daemon.sh mode change 100755 => 100644 output/bin/digest.bat mode change 100755 => 100644 output/bin/digest.sh mode change 100755 => 100644 output/bin/setclasspath.bat mode change 100755 => 100644 output/bin/setclasspath.sh mode change 100755 => 100644 output/bin/shutdown.bat mode change 100755 => 100644 output/bin/shutdown.sh mode change 100755 => 100644 output/bin/startup.bat mode change 100755 => 100644 output/bin/startup.sh mode change 100755 => 100644 output/bin/tomcat-juli.jar mode change 100755 => 100644 output/bin/tomcat-native.tar.gz mode change 100755 => 100644 output/bin/tool-wrapper.bat mode change 100755 => 100644 output/bin/tool-wrapper.sh mode change 100755 => 100644 output/bin/version.bat mode change 100755 => 100644 output/bin/version.sh mode change 100755 => 100644 output/conf/catalina.policy mode change 100755 => 100644 output/conf/catalina.properties mode change 100755 => 100644 output/conf/context.xml mode change 100755 => 100644 output/conf/jaspic-providers.xml mode change 100755 => 100644 output/conf/jaspic-providers.xsd mode change 100755 => 100644 output/conf/logging.properties mode change 100755 => 100644 output/conf/server.xml mode change 100755 => 100644 output/conf/tomcat-users.xml mode change 100755 => 100644 output/conf/tomcat-users.xsd mode change 100755 => 100644 output/conf/web.xml mode change 100755 => 100644 output/temp/safeToDelete.tmp create mode 100644 output/webapps/ROOT/RELEASE-NOTES.txt create mode 100644 output/webapps/ROOT/WEB-INF/web.xml create mode 100644 output/webapps/ROOT/asf-logo-wide.svg create mode 100644 output/webapps/ROOT/bg-button.png create mode 100644 output/webapps/ROOT/bg-middle.png create mode 100644 output/webapps/ROOT/bg-nav.png create mode 100644 output/webapps/ROOT/bg-upper.png create mode 100644 output/webapps/ROOT/favicon.ico create mode 100644 output/webapps/ROOT/index.jsp create mode 100644 output/webapps/ROOT/tomcat-power.gif create mode 100644 output/webapps/ROOT/tomcat.css create mode 100644 output/webapps/ROOT/tomcat.gif create mode 100644 output/webapps/ROOT/tomcat.png create mode 100644 output/webapps/ROOT/tomcat.svg mode change 100755 => 100644 output/webapps/docs/BUILDING.txt mode change 100755 => 100644 output/webapps/docs/RELEASE-NOTES.txt mode change 100755 => 100644 output/webapps/docs/RUNNING.txt mode change 100755 => 100644 output/webapps/docs/WEB-INF/web.xml mode change 100755 => 100644 output/webapps/docs/aio.html mode change 100755 => 100644 output/webapps/docs/api/index.html mode change 100755 => 100644 output/webapps/docs/appdev/build.xml.txt mode change 100755 => 100644 output/webapps/docs/appdev/deployment.html mode change 100755 => 100644 output/webapps/docs/appdev/index.html mode change 100755 => 100644 output/webapps/docs/appdev/installation.html mode change 100755 => 100644 output/webapps/docs/appdev/introduction.html mode change 100755 => 100644 output/webapps/docs/appdev/processes.html mode change 100755 => 100644 output/webapps/docs/appdev/sample/build.xml mode change 100755 => 100644 output/webapps/docs/appdev/sample/docs/README.txt mode change 100755 => 100644 output/webapps/docs/appdev/sample/index.html mode change 100755 => 100644 output/webapps/docs/appdev/sample/sample.war mode change 100755 => 100644 output/webapps/docs/appdev/sample/src/mypackage/Hello.java mode change 100755 => 100644 output/webapps/docs/appdev/sample/web/WEB-INF/web.xml mode change 100755 => 100644 output/webapps/docs/appdev/sample/web/hello.jsp mode change 100755 => 100644 output/webapps/docs/appdev/sample/web/images/tomcat.gif mode change 100755 => 100644 output/webapps/docs/appdev/sample/web/index.html mode change 100755 => 100644 output/webapps/docs/appdev/source.html mode change 100755 => 100644 output/webapps/docs/appdev/web.xml.txt mode change 100755 => 100644 output/webapps/docs/apr.html mode change 100755 => 100644 output/webapps/docs/architecture/index.html mode change 100755 => 100644 output/webapps/docs/architecture/overview.html mode change 100755 => 100644 output/webapps/docs/architecture/requestProcess.html mode change 100755 => 100644 output/webapps/docs/architecture/requestProcess/authentication-process.png mode change 100755 => 100644 output/webapps/docs/architecture/requestProcess/request-process.png mode change 100755 => 100644 output/webapps/docs/architecture/startup.html mode change 100755 => 100644 output/webapps/docs/architecture/startup/serverStartup.pdf mode change 100755 => 100644 output/webapps/docs/architecture/startup/serverStartup.txt mode change 100755 => 100644 output/webapps/docs/balancer-howto.html mode change 100755 => 100644 output/webapps/docs/building.html mode change 100755 => 100644 output/webapps/docs/cgi-howto.html mode change 100755 => 100644 output/webapps/docs/changelog.html mode change 100755 => 100644 output/webapps/docs/class-loader-howto.html mode change 100755 => 100644 output/webapps/docs/cluster-howto.html mode change 100755 => 100644 output/webapps/docs/comments.html mode change 100755 => 100644 output/webapps/docs/config/ajp.html mode change 100755 => 100644 output/webapps/docs/config/automatic-deployment.html mode change 100755 => 100644 output/webapps/docs/config/cluster-channel.html mode change 100755 => 100644 output/webapps/docs/config/cluster-deployer.html mode change 100755 => 100644 output/webapps/docs/config/cluster-interceptor.html mode change 100755 => 100644 output/webapps/docs/config/cluster-listener.html mode change 100755 => 100644 output/webapps/docs/config/cluster-manager.html mode change 100755 => 100644 output/webapps/docs/config/cluster-membership.html mode change 100755 => 100644 output/webapps/docs/config/cluster-receiver.html mode change 100755 => 100644 output/webapps/docs/config/cluster-sender.html mode change 100755 => 100644 output/webapps/docs/config/cluster-valve.html mode change 100755 => 100644 output/webapps/docs/config/cluster.html mode change 100755 => 100644 output/webapps/docs/config/context.html mode change 100755 => 100644 output/webapps/docs/config/cookie-processor.html mode change 100755 => 100644 output/webapps/docs/config/credentialhandler.html mode change 100755 => 100644 output/webapps/docs/config/engine.html mode change 100755 => 100644 output/webapps/docs/config/executor.html mode change 100755 => 100644 output/webapps/docs/config/filter.html mode change 100755 => 100644 output/webapps/docs/config/globalresources.html mode change 100755 => 100644 output/webapps/docs/config/host.html mode change 100755 => 100644 output/webapps/docs/config/http.html mode change 100755 => 100644 output/webapps/docs/config/http2.html mode change 100755 => 100644 output/webapps/docs/config/index.html mode change 100755 => 100644 output/webapps/docs/config/jar-scan-filter.html mode change 100755 => 100644 output/webapps/docs/config/jar-scanner.html mode change 100755 => 100644 output/webapps/docs/config/jaspic.html mode change 100755 => 100644 output/webapps/docs/config/listeners.html mode change 100755 => 100644 output/webapps/docs/config/loader.html mode change 100755 => 100644 output/webapps/docs/config/manager.html mode change 100755 => 100644 output/webapps/docs/config/realm.html mode change 100755 => 100644 output/webapps/docs/config/resources.html mode change 100755 => 100644 output/webapps/docs/config/server.html mode change 100755 => 100644 output/webapps/docs/config/service.html mode change 100755 => 100644 output/webapps/docs/config/sessionidgenerator.html mode change 100755 => 100644 output/webapps/docs/config/systemprops.html mode change 100755 => 100644 output/webapps/docs/config/valve.html mode change 100755 => 100644 output/webapps/docs/connectors.html mode change 100755 => 100644 output/webapps/docs/default-servlet.html mode change 100755 => 100644 output/webapps/docs/deployer-howto.html mode change 100755 => 100644 output/webapps/docs/developers.html mode change 100755 => 100644 output/webapps/docs/elapi/index.html mode change 100755 => 100644 output/webapps/docs/extras.html mode change 100755 => 100644 output/webapps/docs/funcspecs/fs-admin-apps.html mode change 100755 => 100644 output/webapps/docs/funcspecs/fs-admin-objects.html mode change 100755 => 100644 output/webapps/docs/funcspecs/fs-admin-opers.html mode change 100755 => 100644 output/webapps/docs/funcspecs/fs-default.html mode change 100755 => 100644 output/webapps/docs/funcspecs/fs-jdbc-realm.html mode change 100755 => 100644 output/webapps/docs/funcspecs/fs-jndi-realm.html mode change 100755 => 100644 output/webapps/docs/funcspecs/fs-memory-realm.html mode change 100755 => 100644 output/webapps/docs/funcspecs/index.html mode change 100755 => 100644 output/webapps/docs/funcspecs/mbean-names.html mode change 100755 => 100644 output/webapps/docs/html-manager-howto.html mode change 100755 => 100644 output/webapps/docs/images/add.gif mode change 100755 => 100644 output/webapps/docs/images/asf-logo.svg mode change 100755 => 100644 output/webapps/docs/images/code.gif mode change 100755 => 100644 output/webapps/docs/images/cors-flowchart.png mode change 100755 => 100644 output/webapps/docs/images/design.gif mode change 100755 => 100644 output/webapps/docs/images/docs-stylesheet.css mode change 100755 => 100644 output/webapps/docs/images/docs.gif mode change 100755 => 100644 output/webapps/docs/images/fix.gif mode change 100755 => 100644 output/webapps/docs/images/fonts/OpenSans400.woff mode change 100755 => 100644 output/webapps/docs/images/fonts/OpenSans400italic.woff mode change 100755 => 100644 output/webapps/docs/images/fonts/OpenSans600.woff mode change 100755 => 100644 output/webapps/docs/images/fonts/OpenSans600italic.woff mode change 100755 => 100644 output/webapps/docs/images/fonts/OpenSans700.woff mode change 100755 => 100644 output/webapps/docs/images/fonts/OpenSans700italic.woff mode change 100755 => 100644 output/webapps/docs/images/fonts/fonts.css mode change 100755 => 100644 output/webapps/docs/images/tomcat.gif mode change 100755 => 100644 output/webapps/docs/images/tomcat.png mode change 100755 => 100644 output/webapps/docs/images/update.gif mode change 100755 => 100644 output/webapps/docs/images/void.gif mode change 100755 => 100644 output/webapps/docs/index.html mode change 100755 => 100644 output/webapps/docs/introduction.html mode change 100755 => 100644 output/webapps/docs/jasper-howto.html mode change 100755 => 100644 output/webapps/docs/jdbc-pool.html mode change 100755 => 100644 output/webapps/docs/jndi-datasource-examples-howto.html mode change 100755 => 100644 output/webapps/docs/jndi-resources-howto.html mode change 100755 => 100644 output/webapps/docs/jspapi/index.html mode change 100755 => 100644 output/webapps/docs/logging.html mode change 100755 => 100644 output/webapps/docs/manager-howto.html mode change 100755 => 100644 output/webapps/docs/maven-jars.html mode change 100755 => 100644 output/webapps/docs/mbeans-descriptors-howto.html create mode 100644 output/webapps/docs/mbeans-descriptors.dtd mode change 100755 => 100644 output/webapps/docs/monitoring.html mode change 100755 => 100644 output/webapps/docs/proxy-howto.html mode change 100755 => 100644 output/webapps/docs/realm-howto.html mode change 100755 => 100644 output/webapps/docs/rewrite.html mode change 100755 => 100644 output/webapps/docs/security-howto.html mode change 100755 => 100644 output/webapps/docs/security-manager-howto.html mode change 100755 => 100644 output/webapps/docs/servletapi/index.html mode change 100755 => 100644 output/webapps/docs/setup.html mode change 100755 => 100644 output/webapps/docs/ssi-howto.html mode change 100755 => 100644 output/webapps/docs/ssl-howto.html mode change 100755 => 100644 output/webapps/docs/tribes/developers.html mode change 100755 => 100644 output/webapps/docs/tribes/faq.html mode change 100755 => 100644 output/webapps/docs/tribes/interceptors.html mode change 100755 => 100644 output/webapps/docs/tribes/introduction.html mode change 100755 => 100644 output/webapps/docs/tribes/membership.html mode change 100755 => 100644 output/webapps/docs/tribes/setup.html mode change 100755 => 100644 output/webapps/docs/tribes/status.html mode change 100755 => 100644 output/webapps/docs/tribes/transport.html mode change 100755 => 100644 output/webapps/docs/virtual-hosting-howto.html mode change 100755 => 100644 output/webapps/docs/web-socket-howto.html mode change 100755 => 100644 output/webapps/docs/websocketapi/index.html mode change 100755 => 100644 output/webapps/docs/windows-auth-howto.html mode change 100755 => 100644 output/webapps/docs/windows-service-howto.html mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/CookieExample.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/CookieExample.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/HelloWorldExample.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/HelloWorldExample.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/LocalStrings.properties mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/LocalStrings_en.properties mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/LocalStrings_es.properties mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/RequestHeaderExample.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/RequestHeaderExample.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/RequestInfoExample.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/RequestInfoExample.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/RequestParamExample.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/RequestParamExample.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/ServletToJsp.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/ServletToJsp.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/SessionExample.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/SessionExample.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async0$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async0.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async0.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async1$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async1.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async2$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async2.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async2.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async3.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Async3.java create mode 100644 output/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Stockticker$TickListener.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Stockticker.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/async/Stockticker.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/cal/Entries.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/cal/Entries.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/cal/Entry.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/cal/Entry.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/cal/JspCalendar.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/cal/JspCalendar.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/cal/TableBean.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/cal/TableBean.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/dates/JspCalendar.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/dates/JspCalendar.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/error/Smart.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/error/Smart.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/FooTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/FooTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/LogTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/LogTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/ShowSource.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/ShowSource.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/ValuesTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/examples/ValuesTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/listeners/ContextListener.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/listeners/ContextListener.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/listeners/SessionListener.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/listeners/SessionListener.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/sessions/DummyCart.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/sessions/DummyCart.java create mode 100644 output/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/util/CookieFilter.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/util/CookieFilter.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/util/HTMLFilter.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/util/HTMLFilter.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/validators/DebugValidator.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/validators/DebugValidator.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/echo/servers.json mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/Location.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/Location.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class mode change 100755 => 100644 output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/jsp/applet/Clock2.java mode change 100755 => 100644 output/webapps/examples/WEB-INF/jsp/debug-taglib.tld mode change 100755 => 100644 output/webapps/examples/WEB-INF/jsp/example-taglib.tld mode change 100755 => 100644 output/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld mode change 100755 => 100644 output/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar mode change 100755 => 100644 output/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar mode change 100755 => 100644 output/webapps/examples/WEB-INF/tags/displayProducts.tag mode change 100755 => 100644 output/webapps/examples/WEB-INF/tags/helloWorld.tag mode change 100755 => 100644 output/webapps/examples/WEB-INF/tags/panel.tag mode change 100755 => 100644 output/webapps/examples/WEB-INF/web.xml mode change 100755 => 100644 output/webapps/examples/index.html mode change 100755 => 100644 output/webapps/examples/jsp/async/async1.jsp mode change 100755 => 100644 output/webapps/examples/jsp/async/async1.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/async/async3.jsp mode change 100755 => 100644 output/webapps/examples/jsp/async/async3.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/async/index.jsp mode change 100755 => 100644 output/webapps/examples/jsp/async/index.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/cal/Entries.java.html mode change 100755 => 100644 output/webapps/examples/jsp/cal/Entry.java.html mode change 100755 => 100644 output/webapps/examples/jsp/cal/JspCalendar.java.html mode change 100755 => 100644 output/webapps/examples/jsp/cal/TableBean.java.html mode change 100755 => 100644 output/webapps/examples/jsp/cal/cal1.jsp mode change 100755 => 100644 output/webapps/examples/jsp/cal/cal1.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/cal/cal2.jsp mode change 100755 => 100644 output/webapps/examples/jsp/cal/cal2.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/cal/calendar.html mode change 100755 => 100644 output/webapps/examples/jsp/cal/login.html mode change 100755 => 100644 output/webapps/examples/jsp/checkbox/CheckTest.html mode change 100755 => 100644 output/webapps/examples/jsp/checkbox/check.html mode change 100755 => 100644 output/webapps/examples/jsp/checkbox/checkresult.jsp mode change 100755 => 100644 output/webapps/examples/jsp/checkbox/checkresult.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/checkbox/cresult.html mode change 100755 => 100644 output/webapps/examples/jsp/colors/ColorGameBean.html mode change 100755 => 100644 output/webapps/examples/jsp/colors/clr.html mode change 100755 => 100644 output/webapps/examples/jsp/colors/colors.html mode change 100755 => 100644 output/webapps/examples/jsp/colors/colrs.jsp mode change 100755 => 100644 output/webapps/examples/jsp/colors/colrs.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/dates/date.html mode change 100755 => 100644 output/webapps/examples/jsp/dates/date.jsp mode change 100755 => 100644 output/webapps/examples/jsp/dates/date.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/error/er.html mode change 100755 => 100644 output/webapps/examples/jsp/error/err.jsp mode change 100755 => 100644 output/webapps/examples/jsp/error/err.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/error/error.html mode change 100755 => 100644 output/webapps/examples/jsp/error/errorpge.jsp mode change 100755 => 100644 output/webapps/examples/jsp/error/errorpge.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/forward/forward.jsp mode change 100755 => 100644 output/webapps/examples/jsp/forward/forward.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/forward/fwd.html mode change 100755 => 100644 output/webapps/examples/jsp/forward/one.jsp mode change 100755 => 100644 output/webapps/examples/jsp/forward/one.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/forward/two.html mode change 100755 => 100644 output/webapps/examples/jsp/images/code.gif mode change 100755 => 100644 output/webapps/examples/jsp/images/execute.gif mode change 100755 => 100644 output/webapps/examples/jsp/images/return.gif mode change 100755 => 100644 output/webapps/examples/jsp/include/foo.html mode change 100755 => 100644 output/webapps/examples/jsp/include/foo.jsp mode change 100755 => 100644 output/webapps/examples/jsp/include/foo.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/include/inc.html mode change 100755 => 100644 output/webapps/examples/jsp/include/include.jsp mode change 100755 => 100644 output/webapps/examples/jsp/include/include.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/index.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/Functions.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/ValuesBean.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/ValuesTag.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/basic-arithmetic.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/basic-comparisons.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/composite.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/composite.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/composite.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/functions.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/functions.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/functions.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/implicit-objects.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/implicit-objects.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/shuffle.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspx/basic.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspx/basic.jspx mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspx/basic.jspx.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspx/svgexample.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspx/textRotate.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspx/textRotate.jpg mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspx/textRotate.jspx mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/coda.jspf mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/coda.jspf.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/config.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/config.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/config.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/dynamicattrs.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/prelude.jspf mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/misc/prelude.jspf.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/Functions.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/book.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/book.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/book.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/hello.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/hello.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/repeat.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/repeat.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/hello.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/hello.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/panel.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/panel.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/products.html mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/products.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html mode change 100755 => 100644 output/webapps/examples/jsp/jsptoserv/hello.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsptoserv/hello.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp mode change 100755 => 100644 output/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/jsptoserv/jts.html mode change 100755 => 100644 output/webapps/examples/jsp/num/numguess.html mode change 100755 => 100644 output/webapps/examples/jsp/num/numguess.jsp mode change 100755 => 100644 output/webapps/examples/jsp/num/numguess.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/plugin/applet/Clock2.class mode change 100755 => 100644 output/webapps/examples/jsp/plugin/applet/Clock2.java mode change 100755 => 100644 output/webapps/examples/jsp/plugin/plugin.html mode change 100755 => 100644 output/webapps/examples/jsp/plugin/plugin.jsp mode change 100755 => 100644 output/webapps/examples/jsp/plugin/plugin.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/security/protected/error.jsp mode change 100755 => 100644 output/webapps/examples/jsp/security/protected/error.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/security/protected/index.jsp mode change 100755 => 100644 output/webapps/examples/jsp/security/protected/index.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/security/protected/login.jsp mode change 100755 => 100644 output/webapps/examples/jsp/security/protected/login.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/sessions/DummyCart.html mode change 100755 => 100644 output/webapps/examples/jsp/sessions/carts.html mode change 100755 => 100644 output/webapps/examples/jsp/sessions/carts.jsp mode change 100755 => 100644 output/webapps/examples/jsp/sessions/carts.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/sessions/crt.html mode change 100755 => 100644 output/webapps/examples/jsp/simpletag/foo.html mode change 100755 => 100644 output/webapps/examples/jsp/simpletag/foo.jsp mode change 100755 => 100644 output/webapps/examples/jsp/simpletag/foo.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/snp/snoop.html mode change 100755 => 100644 output/webapps/examples/jsp/snp/snoop.jsp mode change 100755 => 100644 output/webapps/examples/jsp/snp/snoop.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/source.jsp mode change 100755 => 100644 output/webapps/examples/jsp/source.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/choose.html mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/choose.jsp mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/choose.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/foreach.html mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/foreach.jsp mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/foreach.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/howto.html mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/if.html mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/if.jsp mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/if.jsp.html mode change 100755 => 100644 output/webapps/examples/jsp/tagplugin/notes.html mode change 100755 => 100644 output/webapps/examples/jsp/xml/xml.html mode change 100755 => 100644 output/webapps/examples/jsp/xml/xml.jsp mode change 100755 => 100644 output/webapps/examples/jsp/xml/xml.jsp.html mode change 100755 => 100644 output/webapps/examples/servlets/cookies.html mode change 100755 => 100644 output/webapps/examples/servlets/helloworld.html mode change 100755 => 100644 output/webapps/examples/servlets/images/code.gif mode change 100755 => 100644 output/webapps/examples/servlets/images/execute.gif mode change 100755 => 100644 output/webapps/examples/servlets/images/return.gif mode change 100755 => 100644 output/webapps/examples/servlets/index.html mode change 100755 => 100644 output/webapps/examples/servlets/nonblocking/bytecounter.html mode change 100755 => 100644 output/webapps/examples/servlets/reqheaders.html mode change 100755 => 100644 output/webapps/examples/servlets/reqinfo.html mode change 100755 => 100644 output/webapps/examples/servlets/reqparams.html mode change 100755 => 100644 output/webapps/examples/servlets/sessions.html mode change 100755 => 100644 output/webapps/examples/websocket/chat.xhtml mode change 100755 => 100644 output/webapps/examples/websocket/drawboard.xhtml mode change 100755 => 100644 output/webapps/examples/websocket/echo.xhtml mode change 100755 => 100644 output/webapps/examples/websocket/index.xhtml mode change 100755 => 100644 output/webapps/examples/websocket/snake.xhtml mode change 100755 => 100644 output/webapps/host-manager/META-INF/context.xml mode change 100755 => 100644 output/webapps/host-manager/WEB-INF/jsp/401.jsp mode change 100755 => 100644 output/webapps/host-manager/WEB-INF/jsp/403.jsp mode change 100755 => 100644 output/webapps/host-manager/WEB-INF/jsp/404.jsp mode change 100755 => 100644 output/webapps/host-manager/WEB-INF/web.xml mode change 100755 => 100644 output/webapps/host-manager/images/asf-logo.svg mode change 100755 => 100644 output/webapps/host-manager/images/tomcat.gif mode change 100755 => 100644 output/webapps/host-manager/index.jsp mode change 100755 => 100644 output/webapps/host-manager/manager.xml mode change 100755 => 100644 output/webapps/manager/META-INF/context.xml mode change 100755 => 100644 output/webapps/manager/WEB-INF/jsp/401.jsp mode change 100755 => 100644 output/webapps/manager/WEB-INF/jsp/403.jsp mode change 100755 => 100644 output/webapps/manager/WEB-INF/jsp/404.jsp create mode 100644 output/webapps/manager/WEB-INF/jsp/connectorCerts.jsp mode change 100755 => 100644 output/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp create mode 100644 output/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp mode change 100755 => 100644 output/webapps/manager/WEB-INF/jsp/sessionDetail.jsp mode change 100755 => 100644 output/webapps/manager/WEB-INF/jsp/sessionsList.jsp mode change 100755 => 100644 output/webapps/manager/WEB-INF/web.xml mode change 100755 => 100644 output/webapps/manager/images/asf-logo.svg mode change 100755 => 100644 output/webapps/manager/images/tomcat.gif mode change 100755 => 100644 output/webapps/manager/index.jsp mode change 100755 => 100644 output/webapps/manager/status.xsd mode change 100755 => 100644 output/webapps/manager/xform.xsl diff --git a/.gitignore b/.gitignore index 4c5f5f5..ae8efad 100755 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ *.class */target/* .idea/* -output/logs/* -output/work/* -output/webapps/* +*/output/logs/* +*/output/work/* +*/output/webapps/* bestsign-sdk-logs diff --git a/output/LICENSE b/output/LICENSE old mode 100755 new mode 100644 diff --git a/output/NOTICE b/output/NOTICE old mode 100755 new mode 100644 index 1c2a208..d359afa --- a/output/NOTICE +++ b/output/NOTICE @@ -1,5 +1,5 @@ Apache Tomcat -Copyright 1999-2017 The Apache Software Foundation +Copyright 1999-2018 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). diff --git a/output/RELEASE-NOTES b/output/RELEASE-NOTES old mode 100755 new mode 100644 index aaef689..0782607 --- a/output/RELEASE-NOTES +++ b/output/RELEASE-NOTES @@ -16,7 +16,7 @@ ================================================================================ - Apache Tomcat Version 9.0.0.M21 + Apache Tomcat Version 9.0.4 Release Notes @@ -93,7 +93,8 @@ 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. For Java 9+ use the upgradeable modules feature. +feature. The default configuration defines JARs located in "endorsed" as endorsed. +For Java 9+ use the upgradeable modules feature. ================================================================ diff --git a/output/RUNNING.txt b/output/RUNNING.txt old mode 100755 new mode 100644 index d38796a..654d7af --- a/output/RUNNING.txt +++ b/output/RUNNING.txt @@ -272,6 +272,12 @@ In CATALINA_HOME: * 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 diff --git a/output/bin/bootstrap.jar b/output/bin/bootstrap.jar old mode 100755 new mode 100644 index bc1eba9c50a1178b2c5a2ac1bd0dc897dd8e733f..05a2a63869242783e1d06db1c9140b6896dca617 GIT binary patch delta 18445 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 delta 18024 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 diff --git a/output/bin/catalina-tasks.xml b/output/bin/catalina-tasks.xml old mode 100755 new mode 100644 diff --git a/output/bin/catalina.bat b/output/bin/catalina.bat old mode 100755 new mode 100644 index 1a40a34..99ef006 --- a/output/bin/catalina.bat +++ b/output/bin/catalina.bat @@ -63,6 +63,13 @@ 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 @@ -215,6 +222,23 @@ 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.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%" @@ -331,17 +355,17 @@ goto setArgs rem Execute Java with the applicable properties if not "%JPDA%" == "" goto doJpda if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity -%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% +%_EXECJAVA% %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% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -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% +%_EXECJAVA% %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% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% +%_EXECJAVA% %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% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -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% +%_EXECJAVA% %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/output/bin/catalina.sh b/output/bin/catalina.sh old mode 100755 new mode 100644 index e37a8b9..9e50e77 --- a/output/bin/catalina.sh +++ b/output/bin/catalina.sh @@ -58,6 +58,13 @@ # 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". # @@ -233,6 +240,7 @@ if $cygwin; then CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"` CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"` CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"` fi if [ -z "$JSSE_OPTS" ] ; then @@ -264,6 +272,18 @@ if [ -z "$UMASK" ]; then 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 + # Uncomment the following line to make the umask available when using the # org.apache.catalina.security.SecurityListener #JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`" @@ -280,6 +300,11 @@ 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.rmi/sun.rmi.transport=ALL-UNNAMED" +export JDK_JAVA_OPTIONS + # ----- Execute The Requested Command ----------------------------------------- # Bugzilla 37848: only output this if we have a TTY @@ -327,6 +352,7 @@ if [ "$1" = "debug" ] ; then fi shift exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ -classpath "$CLASSPATH" \ -sourcepath "$CATALINA_HOME"/../../java \ -Djava.security.manager \ @@ -337,6 +363,7 @@ if [ "$1" = "debug" ] ; then org.apache.catalina.startup.Bootstrap "$@" start else exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ -classpath "$CLASSPATH" \ -sourcepath "$CATALINA_HOME"/../../java \ -Dcatalina.base="$CATALINA_BASE" \ @@ -355,6 +382,7 @@ elif [ "$1" = "run" ]; then fi shift eval exec "\"$_RUNJAVA\"" "\"$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\"" \ @@ -364,6 +392,7 @@ elif [ "$1" = "run" ]; then org.apache.catalina.startup.Bootstrap "$@" start else eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ -classpath "\"$CLASSPATH\"" \ -Dcatalina.base="\"$CATALINA_BASE\"" \ -Dcatalina.home="\"$CATALINA_HOME\"" \ @@ -421,6 +450,7 @@ elif [ "$1" = "start" ] ; then fi shift eval $_NOHUP "\"$_RUNJAVA\"" "\"$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\"" \ @@ -432,6 +462,7 @@ elif [ "$1" = "start" ] ; then else eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ -classpath "\"$CLASSPATH\"" \ -Dcatalina.base="\"$CATALINA_BASE\"" \ -Dcatalina.home="\"$CATALINA_HOME\"" \ @@ -484,6 +515,7 @@ elif [ "$1" = "stop" ] ; then fi eval "\"$_RUNJAVA\"" $JAVA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ -classpath "\"$CLASSPATH\"" \ -Dcatalina.base="\"$CATALINA_BASE\"" \ -Dcatalina.home="\"$CATALINA_HOME\"" \ @@ -570,6 +602,7 @@ elif [ "$1" = "stop" ] ; then 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\"" \ diff --git a/output/bin/ciphers.bat b/output/bin/ciphers.bat new file mode 100644 index 0000000..914181b --- /dev/null +++ b/output/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/output/bin/ciphers.sh b/output/bin/ciphers.sh new file mode 100644 index 0000000..d4a87b5 --- /dev/null +++ b/output/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/output/bin/commons-daemon-native.tar.gz b/output/bin/commons-daemon-native.tar.gz old mode 100755 new mode 100644 index 6d2591898da80076cf67a3fc68ff6825f6aef57c..39cfff5983a1f7f7719725a3464e9cf577b5d052 GIT binary patch literal 207125 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 EU--S5A{0*`T%lmG0ATtPifB>J?3sgnj4c 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�#`(dFM~?P}LEztGSgIft8-xa! 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 dNgYwZ$4x3o>D8**d1(`d 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 U>1Mi_{&mv-0hdbI7yx(=04ESo+W-In diff --git a/output/bin/commons-daemon.jar b/output/bin/commons-daemon.jar old mode 100755 new mode 100644 index 2b6b9c62f79a63e96f158d484311575fc8d82b47..173f67f1a4aac760e8b41f5aabf7a1951e83f8e6 GIT binary patch delta 19079 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 \(.*\)$'` + 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 @@ -172,6 +181,18 @@ if [ "$cygwin" = "false" ]; then fi 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 + # ----- Execute The Requested Command ----------------------------------------- case "$1" in run ) @@ -186,6 +207,7 @@ case "$1" in -errfile "&2" \ -classpath "$CLASSPATH" \ "$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" \ @@ -202,6 +224,7 @@ case "$1" in -errfile "&1" \ -classpath "$CLASSPATH" \ "$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" \ @@ -213,6 +236,7 @@ case "$1" in -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" \ diff --git a/output/bin/digest.bat b/output/bin/digest.bat old mode 100755 new mode 100644 diff --git a/output/bin/digest.sh b/output/bin/digest.sh old mode 100755 new mode 100644 diff --git a/output/bin/setclasspath.bat b/output/bin/setclasspath.bat old mode 100755 new mode 100644 index 4cf6659..f67464a --- a/output/bin/setclasspath.bat +++ b/output/bin/setclasspath.bat @@ -15,8 +15,9 @@ 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 and ensure any provided -rem settings are valid and consistent with the selected start-up options. +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 @@ -64,6 +65,14 @@ 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 diff --git a/output/bin/setclasspath.sh b/output/bin/setclasspath.sh old mode 100755 new mode 100644 index ee8deb3..5232b8e --- a/output/bin/setclasspath.sh +++ b/output/bin/setclasspath.sh @@ -16,8 +16,9 @@ # limitations under the License. # ----------------------------------------------------------------------------- -# Set JAVA_HOME or JRE_HOME if not already set and ensure any provided -# settings are valid and consistent with the selected start-up options. +# 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 @@ -76,6 +77,16 @@ if [ "$1" = "debug" ] ; then 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 @@ -84,4 +95,4 @@ if [ "$os400" != "true" ]; then if [ -z "$_RUNJDB" ]; then _RUNJDB="$JAVA_HOME"/bin/jdb fi -fi \ No newline at end of file +fi diff --git a/output/bin/shutdown.bat b/output/bin/shutdown.bat old mode 100755 new mode 100644 diff --git a/output/bin/shutdown.sh b/output/bin/shutdown.sh old mode 100755 new mode 100644 diff --git a/output/bin/startup.bat b/output/bin/startup.bat old mode 100755 new mode 100644 diff --git a/output/bin/startup.sh b/output/bin/startup.sh old mode 100755 new mode 100644 diff --git a/output/bin/tomcat-juli.jar b/output/bin/tomcat-juli.jar old mode 100755 new mode 100644 index 80da70ca09017b62c02a80b913e377ec75c43f70..a0fd2195d637236ce9121c763093d08dc93caeac GIT binary patch delta 32847 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 z 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

QY2v(pLL

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�jScC9QXmDSG?f_h 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 z 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ξ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%0A#bLx15b}nW-DM?Z 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 S`#%MU0Zd}CgSil*KIDJFAtbK= diff --git a/output/bin/tool-wrapper.bat b/output/bin/tool-wrapper.bat old mode 100755 new mode 100644 index 64f38a0..94de4fe --- a/output/bin/tool-wrapper.bat +++ b/output/bin/tool-wrapper.bat @@ -31,6 +31,13 @@ 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 @@ -76,6 +83,19 @@ set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_HOME%\bin\ 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 @@ -85,6 +105,6 @@ shift goto setArgs :doneSetArgs -%_RUNJAVA% %JAVA_OPTS% %TOOL_OPTS% -classpath "%CLASSPATH%" -Dcatalina.home="%CATALINA_HOME%" org.apache.catalina.startup.Tool %CMD_LINE_ARGS% +%_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/output/bin/tool-wrapper.sh b/output/bin/tool-wrapper.sh old mode 100755 new mode 100644 index 0262051..99dd209 --- a/output/bin/tool-wrapper.sh +++ b/output/bin/tool-wrapper.sh @@ -32,6 +32,13 @@ # 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. @@ -120,6 +127,19 @@ if $cygwin; then JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"` CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"` CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + 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" @@ -127,6 +147,7 @@ JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLog # ----- Execute The Requested Command ----------------------------------------- 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/output/bin/version.bat b/output/bin/version.bat old mode 100755 new mode 100644 diff --git a/output/bin/version.sh b/output/bin/version.sh old mode 100755 new mode 100644 diff --git a/output/conf/catalina.policy b/output/conf/catalina.policy old mode 100755 new mode 100644 index e22fc97..ca48178 --- a/output/conf/catalina.policy +++ b/output/conf/catalina.policy @@ -72,7 +72,7 @@ grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" { permission java.io.FilePermission "${catalina.base}${file.separator}logs", "read, write"; permission java.io.FilePermission - "${catalina.base}${file.separator}logs${file.separator}*", "read, write"; + "${catalina.base}${file.separator}logs${file.separator}*", "read, write, delete"; permission java.lang.RuntimePermission "shutdownHooks"; permission java.lang.RuntimePermission "getClassLoader"; @@ -193,8 +193,9 @@ grant { // The Manager application needs access to the following packages to support the -// session display functionality. These settings support the following -// configurations: +// 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 @@ -204,6 +205,7 @@ grant codeBase "file:${catalina.base}/webapps/manager/-" { 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"; @@ -211,8 +213,23 @@ grant codeBase "file:${catalina.home}/webapps/manager/-" { 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. diff --git a/output/conf/catalina.properties b/output/conf/catalina.properties old mode 100755 new mode 100644 diff --git a/output/conf/context.xml b/output/conf/context.xml old mode 100755 new mode 100644 index 64de61f..4f6fc0c --- a/output/conf/context.xml +++ b/output/conf/context.xml @@ -21,6 +21,7 @@ WEB-INF/web.xml + WEB-INF/tomcat-web.xml ${catalina.base}/conf/web.xml diff --git a/output/conf/jaspic-providers.xml b/output/conf/jaspic-providers.xml old mode 100755 new mode 100644 diff --git a/output/conf/jaspic-providers.xsd b/output/conf/jaspic-providers.xsd old mode 100755 new mode 100644 index 73a87aa..1004a11 --- a/output/conf/jaspic-providers.xsd +++ b/output/conf/jaspic-providers.xsd @@ -35,9 +35,9 @@ - - - + + + diff --git a/output/conf/logging.properties b/output/conf/logging.properties old mode 100755 new mode 100644 index a2ad9c2..39edff6 --- a/output/conf/logging.properties +++ b/output/conf/logging.properties @@ -25,18 +25,22 @@ handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.jul 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.maxDays = 90 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.maxDays = 90 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.maxDays = 90 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.maxDays = 90 java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter diff --git a/output/conf/server.xml b/output/conf/server.xml old mode 100755 new mode 100644 index 3bb2db4..fce8922 --- a/output/conf/server.xml +++ b/output/conf/server.xml @@ -66,9 +66,9 @@ APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 --> - + redirectPort="8443" /> - + + + + + + @@ -232,8 +237,14 @@ - - + + + + + + + + @@ -335,6 +346,11 @@ + + + + + @@ -347,6 +363,15 @@ + + + + + + + + + @@ -2875,7 +2900,7 @@ otf - application/x-font-otf + font/otf @@ -3914,11 +3939,11 @@ ttc - application/x-font-ttf + font/collection ttf - application/x-font-ttf + font/ttf ttl @@ -4307,7 +4332,7 @@ woff - application/x-font-woff + font/woff woff2 diff --git a/output/lib/annotations-api.jar b/output/lib/annotations-api.jar index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..376c2642e477c04b97565759d51b17f4d2026087 100644 GIT binary patch literal 12400 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 literal 0 HcmV?d00001 diff --git a/output/lib/catalina-ha.jar b/output/lib/catalina-ha.jar index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f9ffd5f5bb1a933b56176b65f47fb86c71c34710 100644 GIT binary patch literal 119167 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 literal 0 HcmV?d00001 diff --git a/output/lib/catalina-storeconfig.jar b/output/lib/catalina-storeconfig.jar index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2810c15b9873c42e571de1eb6bc10be2539e6a47 100644 GIT binary patch literal 74952 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�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

T1yjl>yE_c3aT_e)6TdF*EF7Jmdn$;6z~a3z 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 U?yDeZ5BTxi2(Io3@QnugKS4I(!vFvP literal 0 HcmV?d00001 diff --git a/output/lib/catalina-tribes.jar b/output/lib/catalina-tribes.jar index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..67fd70fd119a4475395483e667948a9183d75032 100644 GIT binary patch literal 287744 zcmb4q19W9uwstDEZQH6i728h5KCx}vX2nj$uGqGXidixL+}F2X-`ivS)&0&Ghhxrl z_VhQ`Tw7iW1QZ$w2oeZLJ&Rcy=r0c_AW$F~5oG~730YBww-F#9`9Db^fz&=oTU=L* zIzGrlJ^=xte!TxLsf>WEgs6y;GQEswP;3o!4Nee9yvEqdkJMdB+lDVgfm|J~DdmgZZmw_|bbDY85X1q*C zEW=n~_tYO#h!Jr-S8Bi8Hd<-H!KuGXaZ*KP3A}*4FJ>DDN3pOC;pP+woG(1T2^%U? zw)zneP4N9wULYXle^U+UhrBlSrVRh0Q2jRwm_I4>ZS@V!jQ>LT?^^ytb$=}NC!wLf zqrN4;TK_K`|GqTN|A)iT9$;YX@E68^|0|;3Gn(4lINAP&o&LXJ2Ut5A+Z!6&I@;L( z?o#l7zZSseH`hV%dtP%Z*WWOc|DM^(*vi1z-oXs;J4O5lJvstx0l$--?Dv=8Xs>VW zU~6OV_!}vx{@W!CeyhpGEtWsDsh^i7TF4K4K@9HJCQ6;T9Gd3jle1C3n8fx^D+fWU?sp)AfW3u%t(>Vf(4f_RP&huzCKaZJ!I*7&-dH`z^eFOqee(v_LprhR zV_bzmNdv8Irb%f5wXfc{pX~EO`9+S7Ic8X_bAT2iusX>itfsw*b^`0}?i|zYs>u6o zMsNBy>mX`39_92pUMy|fpkeF>FMjj&nk4qlR3%G6#QZmdU)T%;T+V4Q=Pi6qB3sFs zty%nN6RP4ZJ%|z)2WXR@8kqWMqL<81m}cq}71}qF>VQKCEHfb~E?Wi}v+41#n%11l z@0^c@s3QDzEke=4N?Q1O%_f;;jySzVaG9%tkt{P4v(jzLz1RDQh2Gn`&?Yz~j){kz zh3YkK%!L>uZ>JG z4x%T=7L1}N*BI!dS-`Tqn=)-`o?w4$MpLa(2i2P)nO#9pd&H$e7<{26V9a|Fmy zGX>H(jkJQYpr*Plh}4CIR4N>^P%{+ZBJAaNR|Vn050@y(O3+k&RQfFx$xQXwyl2W5o?luCxXtK6sph!F`tPLVqlD69#-o~evbGspx9l{uBt zu#()HL+y>uA|}qC^2gYmi_`JFGHb*OtMvpSZ#{iC1e~#9SSuqOa?ho2 zQ+;uC0VPDNdZ&7kkzloO6>yM3>q+%PFxOR6RggshK`NP<*aDgKdIlFa{r>*2{M`n4DbR%! z)l)r4i5dUkralr2%hbqIV*rJ@gLqd0OKzBhX15%9V)!9F@R!!*2_Ne=fFQfO4!L8y z*P)qk_Yu6^7sJ>yLCUlI6D)&-t42?gar=%Cjn2OA=Cbas4R*o0y zmX5+%YjKznvhZRm4L)j#`hfYBX6&p}f~DRm)qYhJ5)h$hF)@RXd~T_edGcpdFwsGk z;GgE}hg}bEl=q}vh$S0V2Rai7%(Ue@2uhj;Ag{-my6YWNgDvfBfFs8-#~V+{Nlw-5 zTyE5+>$K41Sw$sx(n3zn1;&QZgwOGc*il| zs6zr5L#?<~qfyqSSxALYBCMDyc2ECgm^t0wawkHwHj5#LXT+C-YQDt2x%(0Ec(ex?pH947@Wgo%g{aiyY6CGyr z7#Zq^Tb-79trBU`7D5#vGTe6`{~Ep~%PVH^Igv+1iv2`|u!&ebAnS>0PJxS8 zV|+|l8JU$ut1BDL3~IfDengO5**s8Tn$SRbT_9C7-J?r#_By^<|Cj{qybqH<&q$eleSA)xE@wVQLF-3#mpOH>=#-^+d+vnczZhlW!nZx{(T1 z?ekeYp`22M$%3{-?{*z+23_eT^ppvHop4HuBXo2e-N|VqtaryzL(e9Js$cN(w{E3F z27;frS^@fJ>lytqi&wmgbEjA=Y)MVh<$BL{NSnp4U@;5vEYW-tRZE(|ceW1VVvgy8 z?273!RUTHnDnlqNj28VI`Nb5aMxK_?BvpdxCMC+%x5yr6p7;jK71`6ZuaDCDnx7A7 zx~lDWh@Q=+ssoDlK^wNHpb7EnM(VDg7|-AAr=A)5CF5$xo9VqPAYkYO#(6^)@% zULT;mN2*Qb^HGZeqR~((XejR%PQMA*L_}s^Ko?13l~YY7g;Sp zEBW(5Zv(m3xPEonNIwa0diU}$jGZi_^SP5m)5J(s0E!m!J=rs}7b>P=qm>Uw9o6odU@19`inj8Fe-N`GyAs+mPjc}m4~@WRxhGb^(h=)O?LRbcdHz)FdW>Bgr{f1%2NWT$c~Uq z0xl_6+04;~>QhLO(5)EHpz8=KQ%sRC?m!TL6!(qU`dR(f%y)3)!;TSA?p>!J+b1O+ zI6J?fcst4&vYv6KEj}l+c}m_S#k{dxaZHcCpKjcn=J|jp2AFD^RMoWi8=W0Plrbg{K_b>;Cp#(m`ggapy7&4h_vqE7r9iqw04~_ zUwY8W%kA}gWS=F-CtZ$ky*xBaN~Zb1lX0y%k;VUe)FV`U0+kXVqh) zw`%Q4%p$H$_+TcWaNn0}n}lK$sIqr-BQQt1A6r$J+XI5=4(6uD0+STmv=dd}Hcr=@ zl_U)HHX`MT0uHa8#R#b+8xQ;6>ShYD1IeIg1;a-uMG*jR+hx7g{v@I51X3r1=F~jf${8i= zv}vi2PnhAEH}4byvuKn0S-fvUqQjC1K_)!#UClLgM~mj+L_dt<^EBw#wh`w9kXDX9 zOb|KIWcs^|hG}(wrrjIF-w_25#7=t42fVKNfY*Hg6`~Mv{iA0C*jST_>N{CFy2<=c zAM_8Lk)@<9_XpsvTfMLblY|M~1YSYVLsLKsWl|0!6(L|GePGvSKkKRex?0(tMQpft9WIcrHM3aL+Gi7Le;)Q#VmgK$A+|}K$T!xlt~JtduhhGC*Dju2?mVJW z=0MA!L&`r>W=(EaAr@^MN2EKM_zrKFcA6_4hFG+<%p)Ef5EadF2mPs%S?D;1n1P0x zx?SfgGLB`LEVwVcw_)5^=hh4I2myPoKw~zI{bhY7xQf$Z`I*(14)>JHAhdERD!qsS z+n;>>XrSN=rMQ8p0K*e1t^h*R43%B3e(Fh2ig24p9dwmnG7Cq!9%#P4d}rGGD?0SV zHjj|a0c;hSqn%*8=6t17aF}#c(0bKVyoACV0qQiZ-IE^>6xBAE2$eqU8BuKSVKJMC zjfFDN>_);W#OVG#;r_rqVW(X#Kr`V+37ET{PZU)y^ppym(qSb)AFNO~DZ^Bf*LWGVZ>QBM^#MO;4 zddzde>Lq5xf(j_pvI8krk-c=Htr&c}R=TpCdXM3OV(1=zzU@+gmZ)PD9F~oHnlOZ4zfEJ>&{OxCAWau zp{d@riBIA}krNK*Q*O9USCQ7Etigz{P=61Ka+=CFr;mV8g9QR&`o9ImpLkpKtAmmX z>YH;sIlvuT^4tD`WHm4V7*wG?zEKl;UQm;sE(j=`Vi@2~$Xm)uu{MWf>Ni1G3H0kdW0i6w{-U7v>| zM#e^!Le+u`qo;X3D0C_1Od$&z7Z;KskQsk4`^ghm5HqKK8P8a7VE9LK~SyHzJ;IJM|cQf7+I z-N8&Ln6|!vcJg zJyqLefc~pNGtKd4t;NnuCn&437xd`yWoAaUKifF6yg^{tK=4Tx`lh4HINiez@C7G< z3-zlg{|ys7UvOgo9s>@04kRq!Z0^C6UaD1r{6i zXih`yM?7rWL{QbDynHDmS0DTwsGH8ReC&~G5L;H|YO$__aB~iZamg+JU?f~r^?4&i zKy#=RHvOnEOQYEXt}Z00PEWX4vy??dl72=C99ynBxwn`1M)h?j*LcwoOY6|6du*L) zg~FlyT}7OdgDRU>WfFVcfo=gFJFi+OOH?z;6Ye+yS7Exu=&{P3H=|lD?t1;{AbIIY zM1>c_Aczw;SrVQfX2vgxZgL*Wov-yFHrxygBqIr3Cp>ObQhaq~W~!`@Ug6Os!s$U1 zPTZUzdr;@O55U4&FR+tVWK97UsU?K_B!V>YFP}7Ju(_{_JO@Wa?c(_M=n(E3T@5~M z6vu5Jub23|2FQycOJxjX^Oen1?+$HAa}VY*0xq= z_9OUCm{eJ0^$G`5QkYf34Wezmco8W@*#+(F9x+?o^1DGl!y#grnpB{g?b&oJL;$H z`EIGM&!LM7J?rhz-%Y7CiDBcx72CKc`6H~uem|i{I5jBZ6z+4)9W+8uxmRf^QJtX` zWqc(r0LhZ`a6dZJa5Z5l)>6qw{8m%Lt$Unlze79IpzP9f=5SSKV;RYGu(BO7O;;1z zFM#n)yQ;~9y{DNQV3GHY@ry?=$)iFfP&W%HUJ*x1#-{=8F-D}ZDRX+;w8;0r3~&C} za{?FZ9Ygv+h%Fxlk>&rY$Un=W@~HLf7gXNaA~uPqJk*hAEX|OaRMk`JnlMc^MM;`i z^~CwU7LF>d)obazYp@p-7(U+^K`ptpSj1rtK?Qr(!TZeT)RUK&+gAwRrlqFKm7c1g zV6ed+9KQzD5-K~Y1qFMKZ}Kp-4Lz~(CWJ}EWYwo}d{GSqL1KP4pg+&tBQ)5ClTTG& z6MXw`JX#G>yxQ={vPle&?uP6Nll=%J#VEW(5@$~(WRWAu_!;dlG&@WeP3K^gIUh9y zLHLgy)>UkF3MfyrV-;se{A}(HcbBJ=s8?I#*1ptBgKne0J|vQAVwZd@qgt_bI$7|dlFUd)o$c%yPt3e<3i}iOIExm(H@O&3jg)e&1{J$u#2-e*tw!lY#48c?a zq}17){Z#@imLE-=bq49~mh_y$uGm>zssY(+{k#G9S6y2|Jj@T6a0VJkWIw_((6rYMqeo7$i<=a+ITuEol(ZlsHZ;-SdQxMZ)84b&S@F^gl?MnR z$W~UF%52HNlr8=B=gIRfN*8Z17(I*@QZNpbpM@I|oe2X?Pj9oBRnvGg(VL-2nzA(*0eu1K1n;BaOit5y zZ!aHD;4ZYxBin-B8h8q>OlC^A)b(a-f56Dr8skM?U!Ch%7Lg|WWHW=HwQ*QAQ$s7} zQmR%0)vIAEd9}Pufj#%FMX(?Rl~QkH*QZIOPbXv1L=yzncgUWI zy(E3*L*OkpjhPxYlbRNZEG8-RW|hTlN8|IF(-guFK9qZAD@gHcDcElJ6L4aRmZS`m zJu)O7dYQ0Fy5(MuS1Hic>mn4B!)JYx7{Sg01_R22FAo=?q)N`sYX(0F$B|cA3#9AE zoeV&-qSgk8q5?_xHo`Z5_8?s5&jFALLY1{( zLpbj<)AWCKwDa+TaP&2XIicW?vx7mW3@$ch%`RBAc{`939s~C$Fv@F!x6-_R+V^ex z?8n1WgFd8k-v+#}oG%o2r*38-)g{jr2`Zg(BT}NyuDfotHVOfFX0|h6=MZFN)dL7+Ek&u^OlOq(f+BJw;;t z9!mgcO4rhvSbF98UXmc|Jd+~urK9WI%%upYb?)=x#?Ums^sxKtHlg$3+OIIRv>#e= zLK`6c4cj_k@NZSO+lZ;Jts-?Ua_}}Trh)JN4-35Uv@{g54D~1DlNm9;_`5O1qVs`4 z+y?C4Gz}T`v4BxhjRp(`^fC>Kx?nLQQe|zy>!2o#)kmr$A3-syQ@4RYLS11`Pf%;C~oq|2b$;GPXAQr}?53hh>2U5WVO|tD6a%J=ma`Y8W;+ zu%pP4ktNz)%dn_>WA%d_oBC{iZ9zOJ3}9yxQfy6W4}WcKe0zI*0k(~BKoG-^=FOx; zHRDijw&X7+pJOf5>*FF6vrCM1Ccj=j#+UPCU!N!!T)rgDsu3LKVwQb5gRNTk0p)R0 zNLNQFh88)QDHU|;Bfd@(R&UCL^{}K1GVswzyR;UT=&`Fh@32zN3}K-nHA-o#tKz~j zItm}9Z>eIZvf_(eA@utEiC?(Jac(TluYUNai8PC%*>|5Kx$jd$xLie~b6!4UevzjJ zLC;q{wUsR_lDA4eHQ+%fx1|`zwf;THnf@;^k_vYr$b>bSVhCvZHBv%##hk-A7o9x1 z_Yl5Bnn>74>46K`>kA{KpahU78$BUeJAt=4i9Zu7?J8#U3^>c}2DoYxGLlKzHlo6} z8d!=W#+vfqf~VdZBVUM*)|026uJ_hZhB(h@9)oi!Ye#Lly-$fg5KO1+UtAnaSHzZW_x} z76s=+NUhgVHP9d?36S(wX!SM_Ft8Ub^R_pTFpxFT$@7*_Fi|wG>44~={1j{cn%URx z==EMuF}H`zE($IRP7aQ!XY@(4zYExasTx><9Gv|x*zu1%$g_JJ`0ycu-G?!0elLoo zmFwR|md3H;vb~ImfrC~O-|FjMegGjW+IM4EuRU-pix5)V9a^EFFRIiEgbBE@!~aiF zC;ldadpaH2i8uQ8;OPNj8~%#8i`YhVhYH@9zIU4>AAglE_&NLlx;K2?eI?@ORe-4s zjxIW@FF|@O@UkXM?qX4 z%EJcvkHua_-}>X=gVEoV7!^M%3(WKp55&y=7>I~YC(y`+>CL^(Ow+OA(wTi;ShB(K zHL!-XR1*6F(yA?y_^s9SkP(ef-x?0(B!QBJ9UIOQUf%H88c32mvo#U}| z@8(-O2@T)UHnPq+=c;z!mM{0Odj3aJ`cY5>0sm17BtFbQ@q0i1>vp)6;_64=gP0|g zxg?9-nkY|sZ|~&0z`#T37aJd3R=GynL%((N$tqK&HOUZSwN&{H`YITapi7L%WN~!= zlhg)_sk6yMGw zJ1WGpk%oBkZEJi+H|0T8g!%=4N&P;Vw2kYykrzC)Y5TFaQ)39+IP_}Vv89lEs!eWi z8vRAdoNQ+|{z6V_ABj6giCp3hp_FrwS3^zowBQ$~lw%)(!LAH{7E4?r%AH2H(T4iC zmdill^o$z5oJoI}`J5C9I!bkQIy>B$Ak&F)pmz99QaUi+fGk%(mKtx|Ww)X%ezino zc5n`TUFZe0MEbtia&nuxANCxSWzq7OF${W^?PozJ+EFd7slWqktSFebwzlm(Wv|jk z`>?rNH*&_K1m#|Pv=U(FfQ#UY82+(VzkFXXUo#;geH2yHMpm7vW@zPY5p^Y3s1;}i z3#~<0k;RrWJCG`>_Nqs?aT{}Q7;B66d|RcH_4(WLZm-ihe~3#&ZlAzANYmI!2Xmjg z9_ll&T!A(L^#s+dU;(q4O2Ybrn1#}iVhP<{!1R4L24N0Uif@1^9+L7pya5>gJMiCK ziU$Y?qUghwPClOhp{@RhOZ{=u?C*U~P*mqfwZrT?_;tYnm-HDCx^cRcG>=O`{ATma zOMgFe^!(Zu8euE9uhPP?D9y;kJ8kj#3bgtQZZ1x)*rD!Te7Lr8no-~tY0FCfPW-Jz zqRC_nmAadSqMiA37JV^9PxZjUfSm^PD$wBb$+-D)supCv`>AY^bmT9^(5#%tiNNK} z5ZzEl$kdS*jxud`^fPWyK@fo`^xQCXc{gs?c}KzM!@m@_KPm!ZdvXuOM?Sb( zH<9#**hSa@vS z!DFgt>Dy62C;iObI1tbsL*`^L@Z@DI2Fs(&?d(&K>(hkpuRdm%eem`0q64uxElIu) zTh0E7zJA?r6wDbP#nxM40qk($^N?3ern0M-LA1LN#hLFoM`9CFu03rProQYe6iiD6 zCj(2cE{fX3yRqvn=E}Fo6H9dONc&aLO-QvN(_ctZLQ|2tWj|k8K?-#~)Du5bMcE!< z_J}U#*1R~!RgDofvg}8_Z-~`*2_pSf`OeWx*CF2g4yQ?!*(3CM<^EX~?wop^rd`UC zf|ck~wt^XA)-&ru%r2uqFPeUJ$9%tLO5F(_PH$}CmsI?44`r4YTC7bGZF-?6>;Ao8 zEqM^ikKZ3;Lqc-Du_x_V3G~40APn+cFEJGl$>Sv_30D@!HAMYPSKzd7x*lb+)S}O>KEN{3bMA#zjqAoW z(_cyuItU7LKzGw5=hUi^+NVaRqu<76N**sFYPY8Q{8qC!Y|#8!p}N`sD|$qM-X;6F zdV7Qi`o*qae~7D*9b60@9}!)EoI-6gpCHCQRKKawa#ztUk62IzZ1&k!zwW=H?GLxJ zPGf2;{ctyok6QX48nQpT<-dnoQe@2^z*6MG@T?XZn!wMXc$$ignwUu8F#D?3geCYC zmZ13Z6QAUgJQb<6LxO|D`K#TJPnfw`-;xN)9N~9(4{A~AeiCyFF67{iYF&l>0WP~1 zI8<|4zh0TwnjZ8`Y%aJ~llN6LWcGCa434deK2ZDvO5X5|jy({{j#O;Hpak>Ncftxb z*(VyOl=n9x;u!$v22(eL%8P-vxB5MZKuYvad;TTK{2}&X6qj1vhsa7Fb?fu*qfOD+ z%Er-H-rmOW;{@gZ&UpXa_l#SWUHyU>{7xh*oi87~y@nne?$49F`52g%}zPd1N`HFw@ZR7R+@_@lt$WmFMy9|av>*276 zg1~}r0ZOSmt`HwKXJyKc?G}KNCj=od;r6EM$?Gc3;%UJ6`kZLPBxzm@x^5RATJJ{+< zKDKuOyp|$Ww@a(RS45TjbcQlwgV8C4?)-@fvN|A#pQg1^M1qO z{2|82`vI$q%+s7ODh5`1XO~t(4OXk44TMI0ULoN*Jz9>r*_to_=UOXep;e3Bac!<< z*medZyZ=mk`!V^X9tQ{3GD6>A-RZ@byPLjAC{FOk5EjZJCmF&i_@-=My&F3~mG+F8 zbaCCQn{mD#w+4mp9P)x?qh>h4rd3uY;}G!)|M5Lhf|Swcc@8;Bi$mP>souK<`3D6;%zoM z=h4SPb{6){8xvAc23;yXU3#mr1gd!O(xiqp7|9Jv=p+yVwpjO38G+72*A-R2er@U` zTt+IH_sT!w*R>!#SUX)xlRZZe7G9Hmb5wA2B`&&Mi2jvNb$TyzI&9FQ@)wy%Vwk0g zZIIJFTa5bxCqM85W0MlK{aUTMLX(jv<{eMkTBk#Z9VVe<4}AX9)&Qa4YbHt7XgjLq zl=u8P#%jx7!Jv1$VE|zip@j{p@IgWGAuKGnOi=(ICS*uauKU{fqGSln4LXH@+$X5a zZVBmxtm4IlE*wYV?xBTYv8QQwP2PP_jW4ZZ(On%XHKt~4W)K@f&{C;nG#DcK@V~Cv zMwmj8*r^l;u=hzwN0KgbqvXkRr=R%ZDTyQE1=GXw3`qgQt*Jep6a${ZZVB}ms6Sui zummf|k~#y5#`(qU6A8cfP}gVoLMcNXwo58TS0N;z?vT#7W07`+N%IIT}+#z^OA7Jp`rJZePQ5&AxK&O!MuUXkhX^8_>AyyqK3UK-M{ z$yz!VN^(4#7t0)3WhRaxXkl=^kPSzNXU>civ#F2p&tIN*kfL?SS6(|<_V+ZCj7zd#_6R(H4xWJVi4&_+zH+FqSro{!A=>`DziNb4$tuH zEZk`fFAH}f_#(qdskB8$>hp@I;p7~SsNPbt;h~@Dyo|1mn{{y|LB6G%%q;gikBOgv zRVa#r+AIUe8l&4`5Rx>r3OL{$xwi!=vgOElB+c{*kNewLyn_KZBet$3<{2YJ4P&2q zhE8Qr2zM36gO|&AN89z{C%M@44Z4eDH;yslZ1Nz|v*Z@x$T&w0EeR(@ma57Gc5m1N z+e`6Q&3*RKqZN={8lfh*;zFBwg4C#Qm+iq{MVl&<4MFj;CkG-jx%`YzC`8oph-3<< z=Iw8-rlS@<^L$S1SZZ9o!v0AoRX@i9rn^m#U366zY)oq={)? zad7N0a`7+T!KYfGsGjQUO@jeqFH~899#HabTXYHO={M-8w!qoYcxlceHWBPBXHgH* zXOyLwo;^0r!N6-SP7uvSAQsmwA0}67p#vKtphV|KRK$H01*&mgaukg& zS*TwKUvz2X%Ts$>zYRI-3qsS=?Z63e$2gEm?8WuC(IQQN&6LGv8-(`{8MR=Hqic`U zQ`EIkgfi~+yNA{cf=sTUX2NLi;+xhEronPzU3BShl>w=7K0FXUtjBe;^mgY1^Kh|V zXCZZ?@zD}Je0SW*dCt=s!P}3)H_+%Pl6U(#LD`ZomOAnAu6BLHFI;i+qX+)&?G;GE z`U!GZ@dzl+RMOQC8}cDg+*zVkF6xE~?I+(xpDAlf&aU>H!WSh__oPrZXlA*fT`>AP zLHhXDaL5*Mx@JK$WVb9-4!@zCDa>aO2gS^=do9>a2Nvn%^sF?z`1cL>~v}|hYY=o{MoB-YbLY-P{4y-^6h(^67L4; z6+P4+FJUgS_dgtPua)}L6J@Ft%5`CO-MBpsh%=tSu6SM%a^d*ueK=5va;2-*j`65L zHaGL3Kps*_&5liwUjK5A@DHSkuQ5Yy_tDqMee`v#|L0uuXJSeGpVNcEn^aOM^itib zUtUDZ62obsDT5^i(^F$nJ^YB6bYxN_u(X^rmMfv&@O%Vrf%%c?e_V=TO~Q(-Aj9=p z)|&o2O*_c^b-w)ic(TgmYs}*m+bs<)M9I+{1JRo*GTn_U$&Sw@Za6T|9wi3b66KBy zRw=BU7eKDY6NVblh7~NR0*pUMY*Ov%J|JHzTDE;fet#c$@GB64c~2+LNV`u*NTjmJ z1-iUcI~V$3+5+~d7S_0Sf>AzmmB^WF1r0V|1uI;wGN4udyBjZ|Tov{s&(gN!vDYAg z%p)FJv)za+(K*nC8`C7h<{fMqxiyhZJJ(BZA+gamjwI2Xd;6`8ZsQa+i$V4N(c`=U z8Ov1#ivpZ`;le2O(CV?;ZRJi<*YXkAsRD(ujt+-NPBR>{{8dE@HctwV`dQ$hkaJZ* z>T#!#^?Qlf9$1u1Tz?4+1_?X5maBUG)lxqS?Xvp9Gg@%eJ3dKp&?u9*^{i)CZ?IbV z1q?r@6BaLf;!cSB%&z!!f*W@9+d~8WV=K7kNx~VLs^K1lKDlRte*3c)BBG=y(SADj zXLO%YU%*o=%Z)yZGyniFo)(czFpYGUGQwK!o}4t?jS)^i zU5b+62zbx zImAFfod1mr|GCvFWMgA*^l=~NzY3%}l&hAS)7zw30Yy}HVU3Yn!r4&tu6X`<4IXz` z#ZvMvop@tS`!~!Ko+$ilj(jX*6Qi9k>wyD)g1J^p@n5>?!9vIoDQfm=Br?C)5!M&N z6vDt6)5rq@l7o}`NM9#CY|teP-R8WXZqB{#*Pk~%CLSm457HJVc|PeSoqmpm|6)7P zwG1R#|0)So$br%|?#koqomr}P0R?hU@1+=$Gc%}md&P$L93g4hvq)oyFK2Oq!*w?< z$rE6svc+(vmh@oZx!Sb}$_QaPa@Dl*mgU#E2(}6J4gdWc$tK+(KlVd0&>Pk}@)wW} zwP+u>Ee%gy{euJ7kO3_u_QFGNf zcq_isnHr2pg4`klVK}+;IU1t*R59?q;eK=Fnc(bI)Z@GP1smE=|B)+yKApM6&Es9L z`N?14I*TcvVFg+sn=o{NzFuY$k?{mSKoJ#cmBh#>7G-oGA_|R^DwR&@eDO%yH%K0Z zr4}lqF4Xkr;!s+gH;akMC{#rQVn{ftH= z3tG>5os|h!L5(d)YQ&G-1tbh-b^Lq`J$;+!*W*%ucnL3FG(P3ymL5fiR37TkAWgg2 zOyzK4N-EdYPExfzn>u@~si91cvN_2;*d&VGI zgd2ej0&IMigFuDp^jtHs6b3hW>_SFk`>T6}ehjCdOw$o6e&!36leh#Io3&DnWPC`k zr$o_CuNJ04b1K@I(?M!xMtGpM9cXzGm)wN@;Yf=LkF2rsa^|O&cFO)F{GS{ugrAvw z18q?1(Q|t%Qb7@`N>BKV@ETY0RV}M|@5f^wVHIF!B7;zwC~D2W&7c|fcKMF4r^pZ~;r#n%UiSkdHC&I?sp@gD4me`V@O)ej7?3A%ll)t1qMCrwg(R7J&jaqm%O-cM7#$74bQqxnXb zQj|<}i^+V2<+;!Y#bdVP@X#J6)ZE{fa%n7to?0u9o@S55r@uo;9L$=^K^y_6VKA~^ zI~PkMtq~kj(y6uOa8gzkCqB3RkT;xeWoAWKssuNtvY2LH$jU4(XSc*#GgL`(*Z4^( zom3dAPy?fZF^pBc6#S{U&gFW+?D-s$M0W%mo4sH@ksYwOJnCdXy`eXxQdAL}R8$dP zE~7zbA>9t)lJ-D(ZZMK5TK|~|$lk=xmD#kytfvt?n&U_s#D=jr1@ATF)OIA+;s$6D zTX34&s4}~Hwr`cmZ0NSABH^~kGL~M6eFTo&o4^hwW~U}^I5r1L#uIu_X1QR-`X_m< zh*e7xaUHACh3MH236J#|!x87@ZbI&?FL?*~$H{v}Yv@rc0jiEd2DV0_=o9ABwj!U5 zMGRzTtVUHT%i^>ASAYS^XtyRPF6E-<1KPo-%!O*s84sA}Y{m!#%>?(?tYDAH5<&0> zsTR*P-T10q8T&#=0?$VXRKje?Zo0T^3kRGit_4OGhm&KMmT>$=+II>q0qjv zUPEF>jO+Vr&z6#h4|ArEB^I5FKp&EMZc`6qKfh3{ z8SrcAHk7Pxm!I_rY}bQM#ln{$Jq*Fd@F1Qx>ucDIYF&(K9juiqwH6}Q$J?f6LEE&3 zTRzYBw+L?~li{l*-&N)bU@ouOikwL_PnmZl0=t}I`LzR=Wg;J@GB_$iRIvbfh2BzS zOxxA|+LitsQ6n)JSZA7A?P6Y>EzjB-bU-SX(|Vc7xW25kzS!$*-a@Q3^+-o#GoRG| zP+6DOJ>EFLMtd2Yb!2C0%CjBS@&l{PEaRpA$Nk=e3-3*~pZ>kEwY}C+6AKbSBT8wg zjKKumw?nJd%nXzDW^>NsZZwhP(cQ%63d+UvRNHUs5GYqJW{I|p$rvi|tu=}$EobOI zcERsnJ4cWGxsMp+p*$$Pm++f1H2u_OK{fhOb;jmPd)b=6VJ^_)>?*4~`z<3ihxg_V zXfH|d(05I4gb+ok(9O`myNdf0W@`nVG|{VNN10R4a3@UJCJq=k8|@3Lvk16gj&K4l zXeE~(Ci4f@`DbY~w`2_sWAhI8%YzTulbE$g6T3%Ql-p;8M9 z?4nW&jps88(dDNind6D5z`G;C@_paUE0_0cC>d}c>jAf(@3+CpIuoQXXv(^SSCY4L zzxY0!Yoz6kFDi{D}Z+(9u*Vh zgQjc#HGMW!#a~Q5Wx%rAYiZ4vD*9CE@;V!VM%isJ%A zc}!KIAGQDd;5NU8Pbc58)7GIKEmuTQhZtfR;Eq2!xg-8**6a*VWEFE|^6}&~^NMLg z3tw`Vnjmw7QnjFF#!JEwjRjdua;AADCaA;-p?-r?-U=H>J>3!e7M$OO z;~T({bF*wc3}-#1Sl&HHX!V#vVT9qc*`l~1%X&47x()#?MOTl+sQ>;(BG`TY9c?2= z*(z7Km0|OhmbjCq4}{k}s6Q{=fxB`Oo#7#$OZ)<`*CD$mfc!YqxiONXGP)DR#(tn- z-p)#UBB$5`U&9h+~ox*Uxbn;pC7~(tIf&g&u14`<41b@p1StBcVOLt(e}Fb9;sb0 z9h^~HNpmJ@7$)*4@loi^IF*NR#~nMJ_w22Pqs-G@HDmq`@}{j5W`9%4c{fh~Vygbn zd)g00xV=rd;5LPzO|vwc5&VRPA%{#Cz0Xv|a`B1hAeJ%m69|fe1dA$LF&{s1W^VI% z&>vhlwznMv@5cEYfvp*AWhbiP2}Nl`fE@xywgrM9yl0x=qdWfoY)UU~7O{R+?21hkodz(0z$d9X;pNcDnv`+!9D z&a`rgQv0)5Js^ik`z5o&4Sw}f>Sjlc!}s8dy?qGx0ohK+#Kb*l`e3ns-sTdieZV_ol6CzoMcLAk@dcdDir=HdMKAM| z44#gX^^(C}#!@Rwve73Hs*XrIO29c^dF71td@ZEEIE1Jb=!oP6nX7mJaorxokjv=lgXDni}L5BoAmrd}0-v+v{&Y z!C;_oRwr5A>z_x#&{eR#GQ|X1?{{%6Ftg%|X_fy)MM343b`iL{Iy%X{ABzDY*h9q` zFt&)vAhRbE+72KG(X=b9&lO2N093J+x2P5$k74E+Im@^B_@5J_i~wioQv6jJ zjU1{WM48zOHv74zjk_YpK>4_CPiU?h|BN|8bNL7#tbT;Qm`de<)+l^8Gpp}>LE~7x zlmq{kBxs!eV)}F_@Y<-T{dc{Qb{75_*9&K6>p|^FwaM={3OMc_?2jcT*pud4mdy+> zl##UuNht#m1hqjKqroUYa5zO)n!Yxv4|!mZqw5zE{s(QME3Uo45YbyT{F*nWEfx%` z9Rj^#bb~-1-n7L}gX0N4;mOHjeeSRs@#7P9vIf3ik$u@;|CYryJjq#s0RsSFK>`5a z{(pFu{!0skfWG5Di|2(Z=Z;v5KOzYAXf++uqzh2L+yD}`IxA7R1Q=5%c zl65iqTwTvsi|pO^oX1%|1<>Q~t#^PP`Hs|qPCL$9@dV?SG-woz4kEB_sP|f`aujuM z?I2~0s?i%5j4ty2W}}xT=w)L!5r8b|J7dhIV30sRfb7afu2QGDU?SR zRYn{py%g$E+3huUgJbWEAE{xtNKJpg;Tg_6Z(KHdZa;CB0rBx$AVr(_?@U1DH4`hxt zLR4-BW$?eulr&YA+>LF@Fu!j>18+&+X`{AMLm$zyk^Pf=c_54CE@Y+hKz;P;lv%SS zktJ$Z*x)fsv67|RT12-2857rfpFU>@(b0$b;MH6)^W30aYcY3p0hz7~#H)Bxx@|n1 zYDAz!5>|Aq9&tSY`##p|A(V+sPYHng-J;ifDr>a?@yoiAdiKtu0k&~J{wOoUG1>e( zgL<;5+x?t}YB|i8DhL{SC&m{V6lNn>7K071-=0fv=N_HaPCzA|&2~p#3Zn(DzoNt& z5DjKxH_msM&UPok8(C3 z{^=#I&gS?O>cVGg5~TnA?E4E#Ct89KGy*wump`F`wTH>9U6cgQqyzTR zvicR}lxN+wfH9{Hew=di%x#nk`fdsd02wB+8YznFKHWC}p`0LW_R&NzQdB^UZlOuQ z{pM;n-W`X*ELPn~H_bkln9#OB!#?Pr>zNmEYEFp@LQGfN9IU;uGsc4ImkzMKlamXK zW9?AG7b~+%B{S+QoVLIdl52oxwqN&rFg6`wSj)SJR8NKQl*8&BVX+nuCMXnDtg;I& zI8gcuZZ+(&YTU8&3+(kUvA@zn`i|+A{w_`l@e(s$&0rm3Elg%JXlNWr$ zz-FbL;$}sEr_6?_#{OL-!X6K55c|Z!CWqp3E$JNa3kc}LU>e`D$=QCRuZ-g;niLe$ z=lO}b$)0kWn>7|va%#Dz)Qvat(t0|TFYMGl^K5RY5^%-VgYGORw-?s4Y4En_Hq!MT z(rKqv{;V$!lEZnli|8 zwO~mOaceE}Il=iym=|4X&lBY&&3H{>?LSB#=^WpyM@3R}wdPke3r;bl1flQ=8v_S1u8WNf5hXDFy|Wo4jmX!&1tjLO(riC_Fb zxJ)R$DI&@^m!F?ex)V8ZDKb9TQ+@jGMoX(UizlKt6BKSwFyb>&PGH)Q0s71CH&2ke z=O1?vx?XW#eqViG!#+9*J6XpjnWTWT50AmTJA?3Imhh71Rt zdWl(!)eS8q4fO%QlRdm8StHtndmF6V=({wYVtZKptlXW8J zBx=7_gJY)jV0%eYsjnX8Syukf8R86YZP#*D1H@ei+S4CI5YOoj`=HyYEr15rx5Jan zL4eJ|@qzc>2xTrPQT>6RBC{L>0D$0s^0SHl!yWj~)H%`r53nnlIT-8z6FMnW(Nx9y z>7Iu*)gzhDrN+<2lk?Sq&c*LEYYbGOPDsLB(||8%Y$T1R$G|k%Gnxy3ZvO)L14!%b zD-qU~6wUK;l6}+L_yMuUL+V?U99TEezj|CZ-Q4||={b-Fu*qcY3#!3_?C zx3<9M%xzUvx`VKgSq8IS`bh7p?{mzuJl(E=uP@r?k7;2D?#^5u(WO_MRw>LTt?0fg zS=RL91Ki){9fj5j2$W@XCgZ+ZiR(-^krHIrT_zTPGekdJ4q02apucC5T}S%PC_nqWuJZ31n~2gQYQ)KP)%$l|5}M(VqL*z?l9Vn2|uUAT>#T*|C2f zdKhsX+D+ds2|w-DT0R5CmvZ+kMMKSQ9QmSy(2wps#I6XQjbK<$dTvUuf^5t<7+Ysk zXW&zIM}Ca+%t0HO;nd88e*^V24==YEVklmtSthuzia6O*tA6VZSiDmW(Y zD>o3*Mzh7g9TgG1A!Z;Z&@*lx>}94;G)L%(Cyax9oUtT9fV4T4Q}CS;xt8v)H!9B% zDfH*-&;ezZl2^-xTdTAR2T$V-2G8w=pSiL|ls@4FQxfo8R6W@4^b z)r6+F_fr_;IHQe`r=35DVSY}ww-E{o37N7pqarPmt02R$q72cS^xshxLc|L_s4+-= zu%CaUx&lYa;DfPp7u$t}nmyKMWp%+Ld1NNtWOSg;OE`9$N{+cw}JP>3eZdAT0P!V=)I4odM z3jCsc^9iE=hL0^#AB1HWCb5uL6h0THZmn&LH)&&PZ3<6gzNpHJB?M>wR%KDM8@huzrm)Vr5Kc0-Gz_(L8MZpc=p;FJh2 z^;m!`9by1WyN`0m$zOk|cYaWI%2sL^Fj1nghb*(~h+9bQ(4Kn0a81EM)Jh_3Q@jxC znxFa%->M_rQ|7)5G4pJSbjst-8q1yb0r=rrFfy=Q6D(B`HdXk@%P4vN$4F(S(=W@+ z7R58zXW$-N^1PdNo(IR?DNl0sH^;Mx`&;h4H_@cez$-k*E1*;C<*xt9p*XbSH@Gah z3r@g7I7>&+GRkzma~3JGBa9=*RKzKI_$+VIt@IHypzo5|Hs%{{j%I$G`W6+2V$q;8 z`bN%{I`K5Hjsj(bgmc)Ju<+NvwUg;YCu1i4RL6aPs^k9=iSs`W$$xptiT@~5|E18V z_|sSY(m-&mp$KrlUlGd+>&X!CKjJgy2*wd3%cJ7u)D$K9Cb zU{vcu7{VAu9rOr#0!vMArl5IHPxUiLKRl^~wNM)^)(%H@MSf?&$n2-9_`ab1Oqii$ zT;%{v6@x*a$S(xH{lHD8VFFJ=d+MaFqhmBj^@DnpPR^ODb!)41bSJ5#HGy2|v(1iG zc&EfMZ6Uu1i2>SGO1)4l#*|JK0HucX0k$glE`0}B5 zoG@kLHN%6oP@a#ibOS8Q-ClBdp~JF==`W0?&5^%2!<=7L5%OY*2$;>(E`gVj)%x2N z*5e*RIIS?nyP+jGa=VxLAmT+h>{Z@9dZpu)Nf5-{yUnLwoAMt)9LySW03>g8#stwi zNJR|78F;WHH2NC@;t^PCMryCNw-}&sj0JxN<-?%wwe1Tytw+dO=l40HZ9>i8<~;bG z0iygA{&q=K3E^eudf~o}!p@w+9x~tkT5_bbw87m-+YEjpvOy=({42A|dGf*S@bT;I zRTNtOOKMK!TGW?KVP74aoKJ=xBCD@r&{S{21M-p?a%{FAw{HfQfBE-3C-u;H8OIm- z5ZzBk#*j)U3$2=7V*ar(-y3ssRJN|{5&G>{MA@#gHi zF2roxl$~wE4g&_V!Tpq+?7e~*@u}<-I=ir`_!Nm=(^GlQx^6#WU>_%Vz0satl(jdf zH8cOgYla3#mutEE^{6AMwn&k%@-p*`$WQi&m}$jGeobh?=YOlJE7@B20sMG~`F}14 z|4X04e?e&fy7d3ag=j!{DJ?GY9-EkK8Qs;vBjQ;FEye@_)S1PA2T-Tffb@dr2{I7* z$4jN8)|3=#*e@>?(wJ$V1z|x_K+r>KP+v(_t_@nCm2WmwHa%G)9KL5iZ%LVu#E<42 z40k?nx?Z<_J6^H>BrUc(J|5%2Ld?qAwuC)bvSr#^CuN4ZeUnG$NyvdP!L$ofuLTtv zEIU?(F-)dW$(tl)? zyO{iG_s0uc1okPJyD0ocZU-@SsTI4cZ{Y%_m}R<_2AApiqW5t*UO^*mo#Y|5iTrJn zmSoVj`x0m>RDsbT?{6;o| zE4=UT;Pl7c6=mMq&tt!Ez0)bhoqw@UeF+FZy5~7PwR0#Qde?49Y0vm52ycHSKmDUo zgll)lPs&Re&QpFX3;gCNm zxGmeObmSir2RF%+?~PI0aNzCOy-jG${_dE)WXx}geO)NtYxY-Gpkr^+KX{Bj=Lg&3 zpPrH5I|p#uO2dDgcgAvbeX=&x#1_&vj+Kn!_<)pwPa9b)D|MN9Vqs@4hp<)Y5c0UPC56B*Ln-y_8}V zYZoBba^{$f9cQJ-XaWTxrQ0$Y@NmM(l94eKP85tJVu^)WfO8xQ(D8(;iaqd($xY6hJJ<21GnA7ZV0Z#g)z zx@)G7S$;?}rYhA0mU4N>`EwpTxod77=KgiJF5Ww1qu1 zFknh|D3W#V^&8-}$?e8~KEB@FdqlunqE0yt=J;*xxF{b)(U%FjXA&f8ji^z zsduO0>r}m<%%jLR?CKIhwFdWy8b}@p)Yq3fE9o(duV!^!WgjMpYXxd%v~=}k>w;yF zc$1)z!xl-!8jcU$aZe{Z!)kR+2Wp}MxHAJ3NoJueaaf>-x}`%LHhUN8RAC%zBdzi;Ud zRnS<2t1|bl@SN2HQ$X?ta{!yvQ?oNyqQrbQKv}JMY&%4Km3d2LI?hGkrw|^Q=nJ&j zHj#5D(X@OX)#B-?*|8G^vfQK<3oHLA&Rk-a{;CTQH3+P8`bI=?tOBYPYpT?_83TPc zFz1~|a^{myx@KLfaJViujRLqLrx=B^rprwFJA9Ifb>*D4`kt?W=epI;!{jl*NKw}E z(Z=Fg2`g#k1R`i4FNZ_QP*EL0a}zN@6f?oioMduA$cjo;u>8mtWi|~*)dwppZZZQG z{N-2pMr9<=glwX_CgB!+A`uoW@)F5pKbF+qqg|8bk>4cCGfTEEwgDt8mBeFG>U;ol z1P$+)0AU;=K1=!p9q}PakgeMO+Y=0yk-{IYOdeOw5yoY7=t8VOH_`lQ_!>OmUWlUE zY$j$6MMHR1GYhJV)afAY6!+nM`Q8jHBtIzEFe?BlxvaaarJTiE8Jm&g z`wkQUs0eDnq|SaJR;2XhuGR0X=m6uz)EW9g&$G&Qvqwe}bl!@yM;Q<_Kj(&aGII8& zt)?8qw5_k%T|u1!^2?TVT4$O1w{M~`bWoNsJvfX?xyzgCv3;eIN0A(ztSq7O@Enn% zXOFdFc*Cj<)5A^{2Axvhw5IQrTvTGs#5gY0qlgAfdP&&c;&K!oFH&k;dKQOQUI2eyJA za|aOAF^L8RY^`La!(!+Vhkgn|nb1gZA)&FF)%J`v?5hdY<; z!KEiW@tOpBIR@$^)a8~e(w`3FotOzcH`48f+wK+D)g((A=6&QbLdTrwCg9oDqfjR; zdpuamnTO^3jo_qaZy_^Mbd%FdLyNGK>|P=g@{T|`qNN*}_1^sb$lJPxQQF$sEAb*k zLdweqncBtI*Z8LBA2?C8gRbi55`y#3~8*!YM;#jE-yi zR*VB7@gdPwN&B-X;bPvo;tDfgHt(?-*wzQ#gXXeagLIWuQ(K;xov?`Mlq*RgTY3e(8 z?aTrSC+2ubCg-{;lTr!o%si8Gi>S2natdZzl*)@t%TtRkjhuTUvmlKURP!Hm}(=;4N)qvSWzrVeRX`;B{}@NZOC4wa3kVCB}G-qg&%*U21R^QFFjhDpxA?B zq_Tgy*CFMuCIVSgL+D8I_}`drImL13MuEjs3*zPTGbWI0x(?QiApyxb6ozT6fTn6x zei*43HOP>8Peq7gXHdhD$em?KR^Sh6Jmu=CnO7(EKam=gp6*3eOTJjnNyw&>*_xHh zrSVUUIB5B?{fbl4ipNtyiap?#>n@XP!nsCuGkY?a0K0*nFvApcU22XQZ~e?VxD|DtSid0=JRSO94(SK6tg3Pq zeMbjGa7uWa0IqSMFHpV^E6oRLNR>3-%N~)pR1@#=0(n*Ihtw*TTmW{m_YxoP{Fkce zl&ENZ#kdm?n`*bT7Zf*ev=gojs1(%4aOO9j<_&>Jsk%uV3$rK&i%i+Ww1cP)SAfFu z9KX88@!bVi9b~l6cM|#xTCP7LGgTqg5p0JP`hIzyC&-!LkxjPf@*+ovwD7B@>6!wz116ZhvAhxiV)>9xBDNJ ztPl-wshN;07jNnIr_9w>tQv0wKgwt#8gsb3RUXABJi2%$OB zEm`|lHsZ-N3z$H_T6FScdr`znks?z44Y1cW2;EX);{Tx%@}t&sg+s6Be#HM`91wlN zql*&@HO68*F>ZRZC&xZlZU!dPOoiAgD|dNk2Yq4fWg>b6&tZ4&LX;Ye&21VCs;YDn z;G@@t`y&{vTq!t~z=h)C13ua^Xi=4 zRW?(7ug+5aab5;Nd7l21zpg-KiG*n-M}<6Wgc)mYcVp1?k)CArhU99cSTPcf%!7NA zVwJ;613uykf??hU5?DxbLpcS%=ukYxgy3Dv5k#n)F#%;uxMwhzuJLF434Sl4lNVvt ze%Y65*-bH#3QMt6nh7+HT(3ZnkRJs{<(#%f9C6VSEXJ6pF=s6m$<@Ca*9^x(vsPAC z%leQK%LOu*UX*JkVb#*hL;(|ADta{K08+yIHD)YBdixXH&OhOIdcd=xM*(R+)SOPk zo{kOfP3cs`+OmdY7MYT04VASwpbt_0!}R^KhA~iTdUB~g#F9RDc+}!0gcUn{o9}Rl zI#~tU?++%6yk$fQ0H-&toP{8%+iwdvKQq$e^wQ`4b($5TCu{*9eHadr1il@bn_f!M zs%NOwcpcu2r0^nuexDDrPr;(dvmvyJY24I2q(>=br;6c?)jIa3g!C;>P+ZLTk=XMB zFlVV%v&=?1mm0H92}_)-=>JvRigoy2;f^wOz_YZi;pLxgV)PT0$VB8N!t}L*qh%Z- zsO?zwAZ8rV^)=(YG|vjB=+6>&npH#=P+&2SpBQ-qv-M}m)}%ejBA@0AAJ~lNqS19aOlqbAE3{;TCJJ0vh$B4kF)3S4Lks?g=zO*3rmiZ>90`2r^+AF zW}n-XyY&}sF|QM~D)MLsH?rr~$+mmvq4-8hHU~2Y2AjMK!tTkeaaY6LaoNM##mldW zj(H@KP0_L#Zz`_yC$dab=!ZLFlt$f|!=TK0V2VmJg?cf?v&>qpN!_1vaU{~@96Hfg=26m}ad4zp73;=q zU|{u}CO=RvP^k`~Dt`A!n3rgVXX7nHDXC}?tYp)D6}!&D3*Yr_pi9w(;BD2HMU3jC}2^*gH zq)EZ;Z3-$0!zog83s9cQYk(2o@`-EY5cMhJn@JU8JYZRMA^xWNDtP31OX1<;jJJx9 zj*-sahUJhN&aLOH%O?QV-}1-7fwfB2X7Vcq-4SKDED&IdGBnfBw?3_BvLHPzoSrG6 z!JKS3KY2&bUL1a*4;^~G;Y!OO%Vt<`M@IJe`J_;CXHQs#QMLhoqWhCybKIT3?caSU zat;St{5xE6*A|{VN-jwRH;PB<47^a2y5>pr4ZM-AE#pEhvc{XZkg&yn=qj`%rC%=6 zH3B4jk{^M-Xny#Cbl;ofGxf`WDpTf9VK?9kX%G&+6C>)|f)<%I=7}+1KMkd~FR06W z%iFM-*VQeK(t zZzrFmpe$HsOIwe;-gQoVOP{(PClNS>UIOE7z%eWbhL}mBUPOI3g|(efvD2*8>f)rC z%RF{OX1eAg|9zXekGF5WKdRGQAFM`#ru74L71)vthq8yojAC83g}n1j9F0a9S=dk= zFjG=~HFD(5&B-&$Daeyx0)7VISD4=eH$lFs`G$-HtsR%(K5Q5j6n19Aon9cNOT{^! ziv`{CjRqTRDXXFF(w#~vwQ&amr`XCm*TuQsg$4eT1LB4N$Y=b~tf`V<_PoLyn$}qN zDb<@F%glH0=?9w3F`acTp%b|`2bnZy)ukye#xXHvZz&ej`SFsox#ZZwvd4<}FB7c3X7##n041BTY1HC@WI z@95~c8MvLdZ}UuR%~qcADYZt@&(~RH!`H9hRx!gQH@CbgK`FED1;;qK(2=mFe}w0m z-W2i)s|cAi^Q*fGD5GcOBD;7XC14|?EWqh|V}>C6A)MC`#zfqamtt=^FUgD{E?Zb% zf?dh-BSJ4P=r$GCL~0;qd#@8a_?kMoFKw8w+G&Ku!3iUd_$7BE`6&W7$DJDcw=slT6Ebzrm}&^v@9R5x==!#tW3 zJL4>qLWxD6@NE5_*+dJLx zpqGgm*oabdr!V}q(F9!5uV)XxBmk-1AbxbL4g}FtzB>R_)Eg)Gs2_GolAkVpn(Q){ z6|X5Y0~BK__Kuam0x%jLHuJ6F`uof}7Nba9}TQ2A{~lB5|< z@|*}w{v}r^&GD!c^%<5M=H`T=8EG~^nGStzYJFvXXIkBb?pzrm6QqbT+%Iemd*t1G6LgIz5*HSLB@sN1Z@Sg{ zD8D=gU4kZt2^Y4pex^99yUKA$C|LDkW8=~K24_;K>hz|iWG?>oo9_)74qI{hhtH3< zhPk#nY*R3A(?^;yxb!}kiw(7i#&w|Em2g@8e1L~5lG*wcydgL?aJRRz)bBF5l@;^tG2I~D+5qd!gs zw>Ajdz~Z|Gb(I3clzB6AxaNvdJMmR~heZC#?sBtWzs`?5QZo!-z5z|L^k#ySRnQqt zGlFciP%IHSP&nb7xS&9Z$V}9yaYDUucl7h6u2%3kRW4XhpqTz{{1K=(Aa{B`9iW(G zpo2jG_t$1nb`>6H_1cB>6zX?5Lco4}O#DQI7aqwq8KIX=C;W;}&yfAwqdYM?Ha2YR zs}gGJtGw`Cjwl~1p#>bLQJwzpZp$1eUw_M7tmRp}t}KyT7^W;+;JS49whd_3#`v-q zRE|X3$bk^jU1SXN!5(JRA0_cKHsQvh0Oik1T;$P?bu1)|7yGyK+sc7u)+p(W6@F!h1+`_j%?ig@E7|wzwE#DmpPg(NWHRXoBgtLG*?0S-eEp|Z^S%$ z7Yf8g>>%~SeET`l4KPz5?jv5{+8}5)0mNdmlbMbNM{aCxB1d;j86Wpa+Guf4D8?3C zfToKrYn=Wcmf*(zYxjR8dv%+G7ECuwQqgebeb5; zTbQ1MPg?lrru8$O2#45oa^y>pvDqJ9i{1>lRya>hMjdaP{9T?#9Ju^`@1f;#()M2I z@)K7%bFV*R&mP->vJzw!h<0A1HD!36AcM67z>f$j^2>ezd156%ql8y54% zGvx%gB!xGi)7uE|w^0=mKi8(y$oDjLUnbtSq;$%iH^C zk__Hoy8?Z$t^<>*Qvvs}4(j*EYVS!l+Q1vDj*I$Yf-rc+W08nnN;G4PuSV*>X9bOM z4}7p?ZOBGo&iyyYxz_PmgO8v1ud3V}4Eb!Va1YAdviNOyXlq6)>qk&VZb7d9Gz-Kf z7;|srn>k0bn1pJVFpMc7nTJqBYvke83HjPP*sIY8=~V{CHXf;4o}#{bQs2#<$mT&S zBM56m$1G9LO@z0s<+;JI$cZRR^x%l__ISWQw3}(MZkoQVX}eH-RiVx~Ez~PHBNvtI425732C+bcp%KiU0e_f0_S)jSXs?2GlUOI| z&Z*H9_R$&SW!QM+{Jy&3m-mzLAk!IK7AbX$5}s|*J8!Z9vr?T^yI2!nOR!^qi&@|(V#@!SGaAM`c--Vp0jAZ zTehEwTIn#3vvR2B&L$(rnFnkf{o*%|D5G*4UoFGtj#3>Zr4l>(v}qr2E5Y{aR3%&E zAoKC{MYemu=q643ns||);r9B8e%D?O_d1$cKVoYwfN(GzzS9-JHzm~(`+Cdw8z?6D z9pJ90G4>o$f{0azz!MROow8QQVc(ZeUs)8FPp6s4!9@Vi{gy9F3Va|FT}+27#vkBL z3YTxI=5NI@=s3KN+K?EKf$8u?fxUy|=gB^kPj#(Z0Q%%0y8_5<1G<1kp*N8!Kc++HCNP{N zT+S6=XQEez?CCe$|7=q&wF+z~`C*iRexMt+|5xBfTEJM}=ATtHMQPa|sZVAgA0D3s z`R;pu@fd=FYFW!6XdW?Hh#)W+TjZsDM`^v~5>~(q)Tb!++po8LilL}P0tF1Br=4PV z&g)4tuJ_~XeOmywfNABG%D$|>9?=`ZdkM3{2q3&5Ql68RfZ`m7`d zgMaT17y%he_bCBUsy90j4ZctfUT+*NNXnR@Y ztItM}DnfBuvJgu`xs(3v5kHMmY1Kw)<$|5Ng#7IoS13a}=a>#7`O8uC+p?U#Esabe zoR0dAeJ2tfOt<4m^N4$`DGGw_H+|||n^TyfaiwJtOU^aLQKRO&{v;haCKoTkf^NO; zC=zw;nK34NE^uK|K(#6u-+EiVvb3pk4;K9cmf-R4>=@ zB3pT1OV7j}a6RxN#8E$#2?o!R59JN{@FIZ?@~wuvD-Mgpk7ZZ|YUSt}`GV_TNP>Tu zd=3$kMC5<|{hA+|;6G|o{ug*aPT$?i_Wwdwng37>|2Wy>iz*{$7gW~+q1w*{Cj_*~ zH^qc=OLCle#eSBxbOm+A6^Z~314g*0t2QjLN z6(x^m@TX3QI|~@@6eA1r5H0ID6uf#4Ja_zQXgaD=$t4xBc}IHqi|>j)lxst8WbsJj z?@r|D*LxaJ%Z8=vDWGjnn>T79`o?wUfI{-=WOnAmX0Y--N-O8U>v zBP=um>z2)Ky3_ZDx$MD%q?5!y7F;ngH_eL-wZxH}acp%6X@wgFlq#&%Nv)Sa*b^wH zBLR}SKb4TTrzIWV)<=@Yz*xctVNGl%@`x}3&XO|I2BA2OB7vl&R6xO45$uhe-1HLX zzjx_BhUpTJH?^|;7?&J=j7$H~E|s!1)VEUn8O&>A>PTbfU~6aW;AC#>Xsy(1v(5(J z2{ytDJtwHyQ{KQ`bkl2ZrKF}RLTy^lUrT0YPJ~b>o>)-f7XJA>6%v>4oaRpm%Wk{n z$#_7iHVWO?kKF;Ni$7rzJKMd0+=YUwZ;qJ>MH?B!TJQ9VY8HwbAwq}xG_-d(NI4Sm zq;iEROOFE2pMYu~z19wnCw#FJ|HzU>n-c?xpG-p}|ETg7=Icd_(=g-{?3W{yB}qe# zEGF&ijb~7c%#z$z(DpbxR(GeT5xJyX7lm#zE-`o5GYGO#MRDrIBu#5r(86i}^alY} z^%cI;u!Pm?sBF8_;~gO?p%YDXW=L?~4meU4V=1cyvD&+`UL1F_t4wh(R;JWnuud4w)XH5@5V#8iR5%Ix+g9Es!`y0qyjgx!RYo1 zJdZ>rbp=6{Si?qdxuEKGAg}SDiH3CN?TT@tMRK|b23h>=1z?qgNo!IeWS+7mv(TPH zKPK4i-Q2r7FnHC3QL^clAn+0N==^|YYv?>c<;PwWePf!jAq_CfQ06b&Xbd8xSeKdN z+KD4#p3~#sXQ^sP0+kxeq|K5iL^cUndBk2idsVpK#6gh47!l`r+V1W^>nxu;9$tZ{ zk)MXu-%n!JM3_qz_L1VDFMj3pTZRu86m1WOI1o&URrgQV`*rrVfVelj#F2b*{a*h( zTL6$0KnfqYGt{2VEs6Ax$NB3kiKa{H#Sx2#ciUztd$;FM*j!rinTc?d>@gLa*tW0<2)a$V$pseH>O~93FARJm5-l% z7tzUw=y-Hi9YeAHtq{>z2u_z@bxiS^OQY*+fbl|*A54$U?pODG>B$uyw^qL%bru<& z_T%il7Jjg{-P!r{Gp(M-bm}K*!Rl)64dGyBnZ-&Dd+|n{AN8h&2j*c2yR^;|w;xz3 zvYY2c9EySTH88j0fj>99AUA=E_f_r6+np+feVKN z5feFjqD}L{*!OCF7UZpu9)o*GP zhOH4Opq!y^wX_&Z>+;xkvq)cs2VG*qs)2sRwPzy%*(2vs5ziQ7%M9W|d~Y7_5+A5q z!XHvYVGDnRiYdhna7*M0gQ1g_*-XiP3!@QLHz||JzGL1iLSa~3j-YKi^7lJU>!8j{ zCek%*F(M7fcMty=DL@Mh-E!NB+~wY`a#0gE@<=MIVTP4}V`p-@%NX=~hUIq4we^Us zRdDfBy>Z9%Aha+A;8Edd8$A|sX;=&Nhd^T)qv6Tvn?dK44C0eugN)T;L#Ix1)5SM9-YsU**C{73$%kVT@t=?u{XoKc`?YDWyT-`6l;K$NKbPfvFm1 zj*fKB4l||f?0?~x{}E7|+O9x*ey&l%Kg;8P5t9CMY5Y6xT^Pk32E>mXa9(=;g60N| zhRV5W#ex)pEZ_U#e2=|uZECXqn?Ks52JA*|FCx}AMNPaH>`^}X{1vx{wGCknfg>O* zc>@RSPIZI_{>Xnc39iDbC~1$H)6?LRD9eaPKBIm$gaKP3s}6F@Vzs>VqT%J`{xxpK zp$@j*->q*N>kTEhege|g$SM>5Eqo(lg?;kKRZSg2mzF7XI!ue(N}~TWe4k04u@eO; z4Ojq1*#brY2PWqNj!9A=gd%DQ=D!2iKYowg7Yl^NpUZ{JPs`bV#B2Qne>eL-vxbT2 z|H;2ATmGLZfQoN1bppcVdq|C9s|u*dw}5BCMM80Y5Y+?G^P9EWS}x~TNlM=Vp(Jmd zQfufRJ8(Z9pKIty0Fb}FF!JfF#(+j0MkwnIg8siocZ1_?-~vHT=E2wY{ZA1vyX!)CX~{VJ%MJdP{F9EqW<|K+ zh_a{c^3z|+R;Zz}$@cUYVHxV7U-umo*;QK4Aw_|bt(IYN=^N^}@nua$vvJt=9$wmt zn=tY~rU~YQB$_Cf&hFe4`!Iqee>d8tBN2bv;EEK=9=t%J?4n`+2KMv8>`cf?jn6FX zJPgUZ_FTxXtlDa{9}FV5$h~aUrd)Th#!N<$TpYq2W_o~U7940oC;5`_!*`Yw>0Pg6 z7eJ&lYG1mO^caPyzDhS(O`3vr#!id0}eb`GLYs6Vi4HsGSZ29M8bAEiMq^Oa42SQyrV zGf>*D0teDTIPXJ#%EDVuuKQ*h^H#?=mc28Y6?)4%>d-h^fF3JwP$D6ntX{ZnWVB}3 zsAS@@kZx4P#BZE)n;q|t?jjUJvPf`A z55bc;Z^^RsJ)Nf(dhmksep71*Ea5@5#4q|I@Ikm4y2CZdhVRRYo}W_0*tZ8n1870Y zd;&OVtYuEgB`9Scbtb)MgXkO|k{)vS6dRH&n4x538~Tt*fXn;$6AyP#nZwY+6=wOA z$2F&*k4mueKq4f4y%<3 zO~{33b&~3pYL>|kt zeQ36!X)7sbu0gr*8)OZu6RqD}*YDa>6F$#7<+cD3J3&FAz-{!UyAD9|QbVx=2^Li) zM<|O@mTt_xY&wcyCQA1nRvAkW*uxb;d1uE9cO60Hm|O56?Q`YqO{CnuPWFp#%OlI) z^JB7YRkb=y+}%Bl;Uv@={5Yel>we;A?%=@=PXh~U#5#v-Ka%+?&bx|#?!Er-Ge6RYwR z87heTnHRaVB3_l_{T@EmfY5N&!8Wa!#|}5ap(0FN;*2<6g~ct#J1SG4z6a?@6EFPk zL^R{GOqIZ$D(GSRkHy=mN}8dO~kV$@=|-7Llxs~LQ6AH z%`_h(=PKFrQ9&CEE!-9}nQo{YH>tKuv69Np=rEJ?Rqs?)RWR!PfRGYsu@m$ESTnMt zoYG!wM(j@P+|3TqayT~=6-yUVw|@fLxIrB|cZA#nq5W=zckU>NNwU+{J2AUGV@vtv+h@2jo&%obmwxm8 zxY{z3=$^0~rhJ^*oGLu&>emBh#4rvcQPzu@b->x0e!Y#(p;%*F0q6L}(Z0ZCC z@F|#uEBFd6;Jr`$hRXdjh;e1)x^u&n1>zSQhwm4QhzKDfA(2py0UabT)}WYF+8(lv zJ!VZvpZ$p_ZQ4BJ;T_$XsnTQnvGF0({Jk=q;xUr4Cqbhpr4Mdup1Na;{`&WpoeP)2 zXBwx_B$106HNZ!I=3G~hZ_Hdi*%S;kxg$S0Cntt>*gO~5^;#dVaoaZdT= zCmh^`cL!&*4RFX@6p_d)OjkKqlP$n9UQKl?%OC1GYe%k*XG!dO$gfqdf@C%fR; zOd9*%nMi&`!-PnCJTpTO(YHQuBpyU$S(`+Udjyb1 zm=JVAaKZU4$O_T-HF1e52+;X2%zK(A9l=%8a4)f2$D$kq(Rx&7!}bJnX!@a$4rPDn zfTr=j{v{3ck2oy@G|BPxb7xWcd1UhcCuyL6iPQgj0!bRX|1%$?AZ`0ItiT(I(;iU^ zC^s;sXoipcmG1@K29OA|R6!V0A>6}^cC)2?Ww5b-NaRd*m-oOA7|5Q_?(k<|!6kfw zgMe9MJ!dn1#>UsnFX8(#V#3_)+kr zU{pTA-Y3~2BGBDQSh`VcL6XAnuDG*v92WSz$MA)j7MOoKORKF#2fll#N*ytbz02om zwO(2l-vy5fW?JTlaI!$wP;C%Dd<%vK!eA}iMcW+`lq;bxcfZ5kbnC~hz-5?9ggVlM z3`QQP{LUM-p1x<@A(PH>1-%X@tEH}Qj>Lw`*?0v$bK)g<&g#UbsqLJo%~4KS;0s;S zyI*~z!jy~%b}E){9cu|Y15)e;Wa7Y$Vf0u_>on{@Fl7j`hL83G~y{1|@uKJqsiE~XjdGQZ zO^a=oFiYC$6iXoDczHQ92CmkZI_=k$m6g`k!eu|syZBM~AUeLo@%HB|*Xh>dtV7=8 zNL|nK(oKLVg?cYGuxL;DAW|l)`(Az8tb}0~_lI%A9yneXvz1bPxqd~Si@tfD6E~55 z8(fJR(f)cLuHa70CwKAhI5@*wWBoPSyX<6F-Ps#u+^(SN@qMhmM`>DDZ^_@ZBSC1) zUYe-1ueaJ>vSi!O4$E*x=WvI>3o?Fubuaw3aWWaEmXgLD}Q{-7`0mynZi5rCkvtrz%nXzi7 z-i{sh{JCVSm2%nba{W<(|n#fY&kjOy7k!g-ICS_2$tSoHbxQZbX=HKm2lt6-X_ zS_>ORIcdmYSo^g`Vn@Z<(va$DQ6kU{K%Rv=1m;yo1oYb{2rMXO&u{T9Du z0+Xo0QJj-&d#ajAgQz&UZPdKyc%+cf5=I_lBZol$GR}CT8=UD}#B8E=Z(=?@4a@(> z+BXG@7A0A}>vwJ2wr$(CZQHhO+qP}nw(;(pThl!=RTVK2-4XqFVxPZrB6DZ1T)Ecq z8|Wr!yqkCBcw=FFw1bnN;$lICd^_W)34s8Nv=b>O68}|(_vsnJ6Z>hO_?5gXHLWRCJw-H`>mu(p8q)bn5* z^XFNsZXJ&>Y#Mf`KOP_}~H5_^@9-KJDkS5*{M2*&rIf>>xPsZ?PlVNZ3<}e)(!TC~Tkoi4LQaGpqNDuuwpaD}@6n6><7|Vn-x)ZnZER z17u$Y)kO8ehvQKVS%%7pNI#k)iFq1b>q1hsZpuVaw`(XCb%fKP!gPdv%ji->eMfyE zyAC5ZYSXY;r>dcAj+8^MjBhgLTR_704E0Jwke$*)f-Y52NDXJI!C{V_J^)a=e!42U z>$4SQGd6&+g}aiNz_(hhdq@aV+*-1IU&;Ivv^VCiYD88ge=T&}iwZHSb_I5)Cd$$p zt%+(%X?G-&SRH4k~x! zQ0)wgMP>Gyxn(tG8C7I9UDf0UuTYHI%3n6BY?p3*3aW@pLMvy6_8V07+u{(4u@IaF zyW&JI}jEV*2=8Acx>Y9rsDDCCSbco`?Q5tLAK{UlO9uEd4(S)W1z0Wo;JWky!m= z4DyPmTro~A3+yg76#dn?C4B8W4#I>4k9x5fC(@~#Hx0!LTYpw^ZlW!zz*mZyGz&9s znzTuC#p3uVD1NkF|7r%)RbZ7`^nSzZ<3;oOvOohQi`e431`&~I=nV!J<1?h|1{ z2`jE1!aSID^7BQFu%m7Xx%0eQ6JGH~hFzVc79~=ZJdTyDD6+yT)@i85@Qc)IX6P5I zJDz~s3-LYBAF<>>5N{Y$tGzh<*NEqRwe0a?v~8L+OvGR8Z#8r7M7-Fy!H+)XNWcN1 zUm1gY22Gnq@b4Cgu;Z&x;`#?Grpo%8WzO+gDqC$~c+a z9=`BMb!pXSr+6WJ0eYA9DJJY-kWL0-!56}Qv59-Y#{f_by?eR(f6;}K)Sw<$(H?cM zn|7yN60=_xfBg`Qrq|mw2{TO0+{k@EjRzMQ(b))tgJZ?Ep73D+aci62mkn$ySTUSNCT1uPP-Fs?*_Zf ziJC|cTY8tV+;s-lUbw*nh#LT)#wahZ&M4nAmJ$8|qp%525-VIcYZ`-$t@^GD9v>n}Wacu{} z1#pWufvr{#X}BqN56rbmU*iHsA>c!^%?#ih%n~L+s`5LLcCXqAdJh|5w}|R)HJ~SiFmXria?;!ukKL0>VAkR&9zN48Q~E89d1gqtE%+tD zo^rKy&vB&=FZ>dX{Jjfm+7L8j(6vcEK=$S!>xI7j4B;Lk?WjcA=h26;A| zB;rtP?CD#PI+Ncs{8?H-rt%05AX>AA2HTEl4Ir5BGKVeY&4Fnre7FPvs+wcnu3^VX z1TSx>!Y_scF)t}ai89=H)eG?BKyNjOPJbkvT9%{aQ+8 z+p!z98xGllJ@N4ixFhv&vnY;E3d)um+m{?+nMlQB)-__PD8K}8kRKR!0CVDcQ|8Zh zV!@F$XenIsJE}SMVBP?~{dxlN&#MhLWNIMYKIobEwqwl^wq{J_Hc!f|s~cfF92<`W zvLyqY6?#@(FxX5xKkQV>)L=5z@~!!e`=~KMxSIVB_?J4(x+1L8+MydKX3_f61-K^t zAyjEeAY_a0l8oI!?`25+2l=TwQDNumVfXOSmywLiV5Y`^KTqX{OM{eP2frCeL<5qD zc1wTLniCvzNUZT8ZH~$Pp>wr4uwd*BryYfcitn@|#?i;%3X#>rtQk?g7w?*Ct=(I6 zLtfou){0!cNAL2#OafYc+;oY|@Z(%U+A5bB*1q7{D&+C|O!5ycTmEB#j3dYGCZ`?F z<4lR80;^ZK5h7YG)R8TwG5kn0roE*;+th!(N63fXialh+1Dkhcjl!_{TSQ*DCykN$WP3@mZzw=xC2qZ) zdB`+>5)rFa-DLT?I-Qd8{iLN50HZCzb>{-0EAsf_N*~{lN)Kai+jXvi(-GL6F(9PR z2=ea@9^FPpHDT|s^`MMXx)#(!Dk=T39!-lOnIIf{t^|++2g}pNr+vnx?w{(DRCCMe zyRn;3T^%i(?udHE%C?x=+=46Il|jv#_=52j!OM;}r#o?z;AXNtlF~A%6TC5$(ULGd zcXrZ?_GWVM3Vr)eT%xrQPOq~=X?%z?6H72e_XoaZ zDZW9cpz0QfKZOaJpfWa?CYEYeOr1Bc3isz|JBf^7anKz~>1pgY&>x~&{}u#45ekNQ z>t!)vADJ9oEdKaomB3SdWo(Ijj!UGxsxB*1jGQ4U^i!^Iby>Agm`Lb^>WD_s>O&ku zMiT1`Av5$$#&_LQW2>32D2>lva_N=pr|KjYQTZun=9Ze1d4P? zwX z8jk1dKtz|4yv|rMDKc?7;IJ7xED2GEc7(!~Ofh_SMIR_H#||0G&_saZcAtdL?B6W7 z!+9)_>p0bnp!IOliWL3Dd2&fa=b?aaq=?v>SzgX(`*lMSH?R-^rM^Wah`GbYG>! z?3$R4pp&|B{4wI$_f(NzifT9oRSv|%iO`5n9UjtkQwODP?(FEKU>E7GFi%Dk=&TgN z|6Nq$8IZd2>b=jtWr8Mi{QAaeqgGR|yoFej>saBRo4k%csgK6>oYA2VS$d_4rWS)= z-(wq5VcRYvJ=hfj5>oS;a~!FX-RQfr4)K*JpwD`To=^$~=g|+%rD&zr5YJsbIy>fu z&CzjGUv`LMW7$?n7)gvhh_+B4)ybhkSG1oK^QpF69|8t7`FGhMWQzBQ@hP{9vUT|i zaj@-SV~ZTq;w7`DcOO)yoZ3hUx?w#fATPP0I@Y1E;rV{$yw22Gcw_ad5h|Uu1GpX-29XjMFgi5~46aaE^23B(|BG zfVk|>#twHr07)}Zh>|}|J3^9pXP6_AvHvWQ@mGMr3>Ln?WIWD04ksT|;&;RuJcq#B zbgg)A$rm+ADqP_sJNE$yy?eM%*8rK0Az;?Gd_-F4`iM>bxDCK5eL+rE$s1%4i^vX4 z!r_v#NLwnV6t6s`(IyIV^&#OG$)RH%Sy+>0CZ-JhSJYOhitKrLTPJ&=p}3f zQxX#}GXyYy2$*eN-OjC6eI>=W)U$iD`XhRpA#@E>qhu%U(` zm<+n6fO6q7v55J}rp_noN@G(tDb*T!o;KQ{<%ZJwyNJ6mRW4bCwIk{DV4Xw81$niOTx$7-@Y){-bUKUAR!9+|1>Migql?JUmp?tm7ZCu(nH;@#l=eUz|^2 z1O6C5HzNmEuStn@|Prnhyc&v`&3kVvHAhFVA@f&0w*b8h12}Dveq`@*^DRUB#=iy~pDN zeJ&7+J+?f@rN&|ri{?2a9P-|VLQ!{}-cS&u@kg)j4jU*4z4DTHqV2dC$KpF!{H(U8<>=6sS;J_m_f9k~NDnFrm+>j3T0W2( zH&-YL?e)|@W|Of6kq=T=Y?FM2XnW)OA#r%^A%$#VS41Gl*F@z)O^Hm*1t4BRLS$bP z%4D;r51eNTcwjb8Gjca?yXFsLr#_+%VCTRudl`EgL6g%q!M<_pgKtdk0r3n`%b~I3 zPh9C*dP|W)H2aQT1HI#u@Sppjp(vm38@Z&jJUO~~-T^OqAP8NK>2IZPR40EKA5*qa zf@KZBxPQuM-J8C!R*kA#Ns*2fo`oj0*jNS5wOl^VV8l7{(ewdeQ2O!LE`bZxdk|m9 zw1_fT=7H8ST84Uig)XG$SOR_G+|jpTU;P4u-X~O#+h<%i{~m>$*xlY}|IYXCz;>s3=4sA6sI!q;uiZi8y`&3oL+?|b%q>6Pc75UDMZSIO+d*Ou^nOyRu_8Rh;&oC z=ymNM&7kU`U8J2@yKnBrS#YO+r+U6}WKpF5%;7WPfBlmDujDmzn;(53Lu0$2$)Y2z zkgc`8xs8aq)z8^Ku>k)QpjCTU#5_g!K>@FhTk!+X1t4XS35$z39Pbd-fAd>c&V*U{C1i)3 zlGS=#Nhl~EGbLgVotwJ+OqU~nAN;!~j28TU{df4Ra2@6>7LCa?(KtF|t~d-bLn!jnIy=btgrNEMe4~kuEJq5v&DwZ@p-Cd) z))C{Nht4b-$~pl%A*+qrOA>qGUi|agBv|5LF)?uv2?YE0)M7xr4~V=5bDArZrOGUY z9B8?JlD~kw83cmh;z!j@dIHVSqVOccgN%YJ1UqB)l_RPCYZN3l{bPw^5>1%1t{fZ| znG_mCM#xl`eFqsy*5YVmQ4`e9ir`CtO?ty?IKSyc6LOXstl|g-l4(N8S_+FvR)8_7 zB2C7jNlH`y1DM8Q5~Ee74X0%hwBt&eTpepm&YeFwcP?wgAkL~jKit?ly1l@)76eN) zo5#mQ9naxmgopoGW*Qt~#|m>lWKt!^Q9b#ZA`npQDP#=0dp3U8(30vsAxI`SIQim= zsR`6J!gD`Q^Ki$g#louGfr4EFi4=1<^w9`;UHrf{lKT7{a;Fle z@7h%9XG0Xrpe?41y-8bv*3d~(?iW9x@dxYLkEy0rl`dB=@d>fFifO&a^QlPDao`cM zBBex_j4?d(hVqe~m7GyfY*C|6w2%mdFbO4N>WE8K{D`M;amc8h*x=}WSjZo?ynV#C zqJWzWO2xNPW~`w?3ZJTd(zo)6Tyr!K#p6>9AAeS6t{5KZ-l0VdA7WF_I@RG?<}XlF zCZc-T{y{`bwKLUqoyjz+jReDKW7cf+T$Y8Hh+T`c(Oaf39N)P+bbv?EtvNfWQRXjj zQ?$M2V#zO+Aj`K#vA4)O=t(<`D^EaK3${pj=u>{&+s`^_`7g(;-S10T@&J+P!==>){U1K|#v#BNO*rI1ZN|(J z#&q05C(FaKL=!=x3Vthr$EC$W5p1QEeq+dRoO2Cg!=Xop_@pGwk+b%SM{%EjmCfd> z4pSvp*Vd;EanK*kyVX0A!$-Q2(t?0k{GiVw#|QCEeCb3-i4K<2JSH1gliQOmg6%X% z#P_u=cAS$Nb01YU*WuK>p=6MyVW8U(RJbr!St>jYS=U_!!N1 zP!iO3M6*1Q=_Y+j>N8^HN1_8Vo?-QPkz317=;W_H;|M6C6nK@oDA3?*a)wYduKJ)e zu8%i)?I041-65ZK5S03J7L3&SB0ZSSwyx-tl9a-x< z)Rs9|&htQE?z&taHi<7ouKCLYyX$-FWMy7ZGwX?Gt?e0|8h6vTm%o_^Ag{<6%C9_2 zZv-vC9>$CwAGkauurjuzS&?}(^w&1EL58>mOzw!$Hih%qOf2G#u!q0^*+*^=i)aq{Hw3uS zwEW!zwWQ!yh&cmzv&-#yn(z_dsGdm3xiaNwAF!?2TufRI{k-mSUU3!UVDh_Q*UB`% zBOy7s>^{+u!x#BoU;3O0rtZN5JQF~3j?3W}X6Pqp7+q=MZiXS`$`Q(xz?b?VmNnNi^4J~44KXygfm({Dim+ni6sbd!7wMf|C%Ig zWjla6!b~qL1UG+xxntr2zd8ZJ#e<8l= zP^b8cv(&B;&?_UN8_N5A1a{niJc+K~@O#u{c1gu0X}i$=B~e@Q%&3z*)v^#%B9hp| z5YvRxtNxFUt`%WCt++1#!mEAvkxp~=tddwcEi(~Mz1K-0aT54TmxJe{)+?2JjwVn! zlj?Btv%2nzvaX8hfj6)%vBnG4K|edw2%_u#96`rP@zw2tKFwrWH_Hd$C~Ej$;;X*N zhg81cnVEzcnG3H8SXFMo=V}VpTtl$GdAI?r6<>D~6+Uz6_RBtIrmM9tgOx|_*3i6T z#{;hZX=VtwT2jpD-B4F}wVa)T-v{R;=p>MN(}SQGfrZVgw!Z!}F98TwF@nu;~a6ecS_j zlN$k$mf~UyeSe%})ivSa+1&x)(o@-Q8AzgYZn5e(P}Bl-3DVzg3JRYaeVX7wP};si z2};jXcCe;m$z}U}_V<@^>vW3UpRAbmwPM&5yVq-iz%m*I!_I^U4}JC>+_#~i(xmK@ znCZyn5J)gw_0+4^mQ|Wk!_q&u2DN`3iKb?AIP9D}8hOoytjk2PTBr1W~>~LJ)Fra7+Z}MxpMwpW51$T)4AJZUi8u&!10y z+V4ExXPss>o=5Z6>VVZ@DkEdBl^Xp1L=-#VL(J)~i(tz^o(xkHLB>L|4IN@2A(}0B z^3dU@@we}S6V(w02vue}40H35XLA?NilHE*U>kvRbx+SUeTM?VG>xOk>7UDW)gr7^ zeSW~2O>x$3mC~I3s8K)AadDDqwYEWSJ3R;89fiwwb{;fDOVgR1a%vzIo%!@CV&RR^OK10FrXd0*+bKHtfJFW z8%_8|&dIz<>f;Di!NZ7HG5}YvO~JQbu0(yas4Y=kDmG1Iqjj@Pr7sw8Qc#;Zi}YlX zCZ~m013Zdd{^Xr3K@D={d2&gBrF|oRxfvnyXC&{=QF##=ny_>PWKT_-ZzobFS`Cd6 zq$#Hpp2ciwLW8u z8CiZ6exOf?4m_>pc}x7XyfV}_0gt!OS(cyR9MY889v%flqidkoWj|(BT8`;P2%z8~ zmQ?(xd41NrUVcG;$e`VquQ_o@G-Wv!c{Yjp93!G7PQ)p9t}2?wB=ah9>F5*$ZCVPk ziC@y_Dyft8sGKe(_57V)JC5yk~f)}BJ$W$a|Q;V6zBPQnGrUI zzUIrNqh#t9vF33=qUmvpnp16T<4c4-XQl|$P9O*#<33XH7^(0)F5whSYWUW3&%crG z-H90fJj(Hs6#m93aE3H!nh_i^X3~e>v;+C0HelE$VaLb8|I2Eakk1am5AD1;4>mRd zHAD$$ZWBMR`+08yFykh~RG9D)9AW#}(jG(&>=;5TG-8(g4Hc~~)eSEK4u$e0oFPj8dDzS^&Arfh5gJuV9{n zK+W-?%8&wZ7@{OvW$Hn=><$WqWNaX+V=>HM@cA!Yg?3(rj$qdUap|LS&;BOo+GDZG z7yg0%LMZCZoO7Mm<^ID(Oeqsk0*Mcwsjr7Rj`of=a%cn(P9{#!VUCVKD9}PhSiT3& z0p9bnH(sY88jiMKk*$%AC(-qq{W^G1g(O@D{)Lfu{##;h$1KRjB7UY0SYAjY^!!s` z8^7X_sb#Td!7u?~Gh}G@Ur{$CGpXR>ANacRC%-EF&*s+uOG>L&l$1r3NBXwmblTwH z(g3~$y7%7*WuV{*q}M=5Fz5#hLJN!B++Wbinn^l`s{cC}joE6mmL^6-6J_%UnFoRO zVgy%@%T)t_xx>J5w)^xx`P-H(Dd(0h))s7Ve!xnj`&hino&2o^reeUMM ze#z~4gjt62EHp-mlh?j_!G5RCq7s|){@Ye+jp9a2loLXfB6336sAZSBC1bRSBXNab z73fw;6wvwugzjOT)sFc)T(aFQk zp)d_$NhO8Dw5{w7A9)xr^GsIm*w&>6d4!E+5Uk?p*hSqiyy^_e)}{+4acCyhr@3{> z+Rm^9*tm&a;7MD827j}jI)H0;v@KLn3n!nvM{a&EqHWS5F~&6*qR(G&JD}w7)`&0o zi~hKTxFQVkz5vu6;Wf|HYiee1SOVzQr7%c^^4Mp;xbSR~Nfg~8*AR=4W%i*Bh*!GX`EGXwZb#$m5Q2At#V$a-#V~>>-q2nWl(xh1Wn;o~|1B)e?qUfbe?kKN z*DtC6v9S2h8so=V_J7mrPNuu2rVJych%h2X#6rgze$$%;knsn^6XEfrm?w`O88gtO zqnncaZqcwVSE;P-9I0qt%2>fp1|AN!sI1-|+E`h+@wC3~QHxmk+vT24HRR_5&vUco zded$CIqN`6+x7gW_{$<`Hk4zl>JSAN!mbhZaqcjn1C*h28Txb9^78nSkzwm(w7zXS zl=DtKefym7+L6Hub>lR6U7O)E0Lpc8ja*%0@6!&%V&MyWmcvX-m z$sqK~M~w$}{=Up=i(D`_?$fwMas}sc-~I~aMt1D32uc>bw)D?hAnoLdY0zdPM-PF9 z?{e(vUDs5PN?7gZ9bgZBl5K>_?!vt_ZciX;aF^<+B!q|IMifnR3k8~Vcu=wq5-TG* zWg(qB3JUR|J!L{PF(O2b8$$(MH+yO6%~%np(w$I0m)QZ@(H~zSaGp|ijWZQeAoPz)d@?Ez6pos z6jH0(rontr`n8NEge+E<;kOz?;kl731(u{ywbPJ<{WR4spg&=z6r{@gL$1YC{Nro;dEyvwPc2pG>qB`ic#qUO z1Yl+&BBQS1PO36b5GRsWjl%8A{jPa+ZzG74OdAa)Le*DeO1|z=Hiy|#gw39@2(fcE z2^_6nUDkwF@DcKAe{jraSPBk}v3C{IGFmzkGOOeLnxi@OT%wvZ+uf+5h&mPQDJ|>0 z=cCtakWdq`vC%0f#kVAc8ndZX=|NnH*0b^I=fdSsGA8IBZ}PMr76cNHso{+q7wSW* z~9$%!){@ntPKB}lrUmyf@T0!a&88u77fdU;stXLq@p*7L$ZLY z>`d*^P`j1HL7a*n$mHHN6L*rg(vyHn`*J2%49fvktBo|+$ptdc`3Zw!)DQKcn=#mt zq+qy#@GjjG0@WT^0P&{$1H$rmte^NXPId$`oxDPQEB4pjUj_9Ew1h5#qp#x+**$QD zFzqEZCk&ArxV;Ahstr$Dxd)l)!yT?r`5N~NhPfZTglL4}T!H>lf8xaTrH|uV=+nJt z1@axedfdEqYfejIXP~jgU1Og`{`P%ucSz6$BaL>T<3e&>q3)%lSYHl2r2i|YidxT>nzqW zTQWPjI<2wB)eD%tooLycxm?u#)=udpzPm}>YGP>T%03F_NTfvQlJb~Ricn?#iHjc6 zhakJjteFmcp80^r73Mfgmi0KP5$eR8N8nZFwNU1YzRqq+3eXuS94%ebXcY(TavK|7 z^Q7z0@xH`Mx2CXwS(%}k+m;M7|4a+<_)H9}=cHLH+^+Zr3x&S|?rTo#c({P^fgTB) z?QybLNlOM1liJ!psL{d_QF6v+nphW1#H0g^DQg3e!GvFiphj|zG>ufLG)v2`ZJrEd zj~nB;9Ln<}*C(`C+6vT3Dw)#6^I`CC*Fe=2@2m*3B#a)^DI<7`oHy}8;&jFp4r(6m(wiOAc$(A9|jNH zpFbPn{pfo_j4l-Thvzrn4#1Zl@ig;DQD6J>D$R%T(Lx9!{~^O+Iw#ZI7Lh8%FdlLs znXf7#a175+bCi-1*~!A#{5|}q*zB|iP*WcpJR6lq9EWHdeTaaSv-D?Y%YpJ&jjA(+E|=Ep!|mDb>pY@AP9g<^xAqgs zYqh)43(Z3I9Rj>Ns|XcDx9HW%MOcM(V52YjQ8FAgqJW*S$62_#rNI(S`oB{1;|zfj z!BzdvlH~WOBC1OKnVITgv|9|Ak<~*dSM$?IG_0RaRuICU*lk<5xR#E$*AsI zK%V@1yH$2o$~<7TEGXp<+$}h}HSsY|#Hj05bugc9AW(SVICvMJTA?W7gweLy&@cLWe%Q#vJoDw zj$FkMx?bmb3APiZ#31aJ=F+oieYU_;a!g||3Kx$P0i5-`yf$i z9VrJ&hQsgPPG!cz&jaSr65ph*KS+a>PiDKMZ2kqG8M*{$+Z{l{Ry}J|NbUu24UCaZ zak!_@x>gFW(`No1P&DZM9&lJ6z8Tsi?%E^$z@E&j6~}wk?K`yJDa!2yjh)2V)mQGC zGdF*=Luk3p&Eg89%I zMWJb^Co$ip&2|nym9m?N+nuw{ptI! zwYc4~1$Z6QuU|CS|3!w?zYI`CJ5(D z#edyzrxWgetMz)Zziv6s`rfvmW_jLtJ3e%W;sVi0F1y!3bpM!06AHvYxUU5p;uvKd zhz4;{9MR*)LcW(k%DUyHL&!q7ON`m$%R;`V#39mnZ4SP0va^NXdfY+fAkR4xeCCYx z&~Cv7edbfWc9ngJjl~9k2~mBPmwinIqZ$pM27hfur*gf4_@oD>-czFbT=S#*5L)yi z_uX!}35)1B?=!=8ojLEn;!O2j3Vh=oLF4--)$@YCH$wW}>*0J~3}oUc?b`}`(-8i( zJItl|k}UC=4D>zZ9q6V$>J`|5f2fIj<#N;Y&r%Rz2x1Fj3pQHNNEXgaitJRf`QS5# zJcXwjEo5RAQ*zLzm@R%l#>yAt(^oPi!nnK8?yybV?QG{ndQ!mp9Rjp7B9^CtPqH>4s4q5i$Ek41zEr1ly%kFwbmb>tIJ(;5JjAqwzd{~N&xzxlcah^cl_V9k^z zRLCF74o=p$LhA#W08Bz2?k0^`&|+Kg?0f0{w1ETv2LiZgCs+4qwzn_sdoiXHZ5Q{t zN_^tI7YBoHJ5fYv!yPg!T5Z<3C~2SiN)No`4rvdzD_C_#m@>f15>f23Oi{I*Y__83Zl{kgI&EXvVkcy4C<>;70&cP%mj+Q)-a;U;v=U4@MpnR~#`@ z(9}8D`d_H^1rZLum8V2{kDWdk;;3CTn?q4(O{XOt1uJO69aYwsDuH*(QcCeOWdf1h zNjiOQ=DPb(8zj<7nHQ#kbup4QnA&uc(@6kU;Dn_DVJ zgRBq`kQ&f2kx6p3saNg51u!^*gMx*EoWR?WqP7QMl_i*!{kCb8%gPCu*NP*UnT4R2 zm*|uW_Bp&{6bI`i6$yi)hHRvNE{>)+`UULD5%aZ>NoFr>E`DK_W$D3SwZeRCsTq2I z9~v1U^9_+~`ZK%o`;3e{l8z-JX=xQjwe1-#mIalF3I%A^IV-KmY%lC5T^i?&Y7paO z1|Ad8DzYkYAXEhPHZ4Wu3I#>QbQ+5cI9lxStMzI+hr9@ay@??3QcBVSCT&H=B`Nh2 zEOy;LEh%Ia?;~9J*|7B|(3yXF+CsS3jujf2m^G*8?O+W|UclFBkNn~SiJ~UGq?OCbGb&QvR3okYiTVMX=ZaCxE$TH2$}xr|xL>2#&4+2M z!J0jyLhD`xjU5%Mbxo~th8%aSiiQ^AW+)r3emK7=z$&purWWSwe6J{k9U=l6o89(> z_Jpuaa=ONiClb6Q$Qy0D4bL$#8Fr%#9k)pLoSTpIBY=GFS9mLHaEN&m6;_9a+3;Njz zbI4<%&uyWcM_I;2`N#;|(-C8dU~MM|%ANLm5ZT9_)gGCMu&4b4lGInW`{t=1s28Uu z^?utvk0>&ob!;Wc*#NDmnTQzb;xC_U1{q{Wb6yu5LWQu39BC7(ABGVx#InTV;@L<# zLci=@gzT#jV`Ozl73M6yF5DJC~hBbbnF>HFqJEPSgUCPw2ldmKi zIF4Bufnkf-L`+N8zmvD%4WpE-6+8e2;~?SEb^jT$KFvsa*pf;?Raco@UC$bFDg?PnfnZH0Nf08DSu(hRDMsdDVXYX$en$vS>h zP3Tl|Mc^Cs&rz7Z3)*c7UE&JZgg^eIL^>;IO&7+Sp)Z6}_#`EE%5vT;<$N&08m@?V zbUOaV^)^qs3xO7Q@H?C+7SYg#@fMLs#KMz-@MF6HIbIwj1lRghRAJ`Ekc36W0ekqEqtw3^7`3!$UGD}+fmx8Z*pb$ct zJt7i1@S$l`Lo#zhhq)mqb^cc!KZT~gNEQxzwJEH5q$#kTp2 zwx$rb#t6K_NId;a+~dIBA?Ke6im%Egm2H2y+SvXQzM<9Rb-q5Nd1amFhm|o zZCxsL!lM)a+eT5C!76txSiFQZwC-L_pS-H6zyTOp+LMl=INs14Ngd-vj3yIM(x65m z9z{H{)=5dj{z|wQd04nSN)PT)^f_AJJ`s7K914F?KLg0*2*)ThY|8>E(WQS-kSA)? z6AJbX>Bf_UTU}Upg-!-q>WRg}6Z=nByw0{ntd4Z{efapj(NGMgy@H5S#GVHjBRaOKc>ksv$v*ks`!VD$ zmp#*VKd;^Zy_@?>DJ#xkl#7Rni6SwpuZ%IQ$-S?OFzm^dEK1=12!1z?jaNL%mLGnT zIUDSgnb&%qYZZI3e(jeID`4&@s+l}M@M)=%Ua z?s)z03i~7q^ru>M(Q}JIar9foB;uJ-X_~F80qUdVrN2ur$zFWwto@H8vYCA_l-nrB zr(6-k*D#<4sAe?nN^`yg>~F!91+OqV#&UX?w@Vtf41HLbdtf`hj9#w-NW3y)0ho#Yxe0SlV7pN zAHJcl8d%PleG)*5L`=4Fv$!VVa3q0DN%~t2T0wM#ti_+I9^ktO6-(Tq&Jl;W%%|vv zmLzaOsSaIIgKZ6$WSNKNcjFLSLbm#q>goUSY#Q!1Y)4W6^)ObBKkrEooR>nbd00fwF&w+g8ExW)2jvg8(Q*pi}`kPvli#IRvEsBVz6^s)1EYx=uG}&#h9I!`i{?`oW|1-FnO0 zpO!a3Os^d3Z$IjuIZ$1zNM5r@+J^qvx?x<2l^O39$`0*^)%ie3BG_t{O$%<7OvC1O zsV0>B*5wmTYyV{w4eR)(@u zfe(z*@`p?E{4=)``)>~?{;eVUCmxA&+_cO9AKa*Ey;o$O7n#o`IL*reqTZ06fEZu& zeoK-xb@`@=>waIM`yGH6+2NH5CVzhDH^<-fzf(>sdnh%HcIm;CfW*1w{8a&A zu7VecYv#?KWfRWJ=Fc0nz!z#>sNJIh;^FN+eWLvd`82GT##OlF6-V5qiE+}>pY#_G zwKq*89(?f7+%;)xb8v+17{^n0?5e;P-*=l;-L7mXrz7=*~X~GDdCgER$|ZWPm9;QZW^7 zIs?a}+$jY8_#mDXUG3QIe#M!Op_y1`HQM7qgb1%OQ>}mHOs86F)o-LUy^#3C|S*)fR zi^+`SQ@ixnP6@}Xm`-xiTRy0P6=U9{QYxjQ>9@OSR`~f4j+N}9-`lO%sN=LV>e-;n zD9`uIpO)M?$Yil=BZ-|jT`>$~f_~rn^v~qFgc_-G#r@>@CpRQrZhS8ZNfAkgl$4Q) zP*|S)Av4=$>vQ`Q)i5Fk%3}qKTY>_$iC?_!InlGU<~0uDMnHWFDb^spmO!$nqiSc)CW47ZJF_rpZfR zXCkKy>}Z#<3hHTZF46^lO5tt6Rqbl^K!J$?kNCqA0~;Keah2V(bl$YiB9=ly7v6wr z(qCv=?9XSi{&qoGan7Xoe&ccP`m>=d` z?Pzg9<9(t&R8*F~=#euOOZr=-$(RZ3^6pwGjS5aE{4F>rg-OU6af_C*NQ0XskJqYU z085|}D~liSbGB-9^q%hcEmH2LlP9{H45M+cv<(Z1g8;pZjKO-Hxb^91Xd*)lBq_36%yyWo7-Yf*qfR;F(-$ z_FGB#FEJ?ur@Lz338?+0F&Q0HYh>KSAlmk}Hkk^_$j5$cZ&`rHDHHUm?Jl<$-;+%5 zBjcfbl#WV_ODQmzlPm5fBuDN01QL_%>*Cf~k?eC-VFr%ChXL<2%0jBI?Kosj74PJy zvg<1TD|pY%?~gj~1lyMT((Ub5&wEecUF^QwcrNSch`pM`3xRflH=}vi4cuZXVz)CUJo)LP28BBJc6_(LM* z8sl@2>`hg1+|tx#n-zNR6#byhUaiJ2gYqP0eOg@vigrEIj`7gCs-l5&L2Qjb9w5jb z`jaK}g3mE;`*}816tnF*ssjPvUieKZ?nt^aG(Md^$QJjug>TbGU++&I4&I1?5XJpL z9#J>@aT8nClX3*HV>lRjPYp2h+e=jlF*d>vIT!~m0XU;DJv)FsO(^Rf8g`g8RpLfu zY|ZPp!4&BGItQQ=IAts!RIKBkbX=?rjRZ1+Rf4ec&X%lmKh?Ndo;HL|2b_uyTgE46Z zya_OVz(Q4N5x~aOoqgm9jL*X$MlOweymeXoIN~^(AErQ#k{o*O?QWaiHrdChAJEBE zx9Cv_s7vm^!X4LWHN;*{A`Sj5u({vvDY(yv7YDt*d#H`d{4d(xF-DXq+Sc7|+qP|M zw{6?DZM%E7ZQHhO+qU)k5VQnfPHnsbfu9Z_h2tHLPd@~;9T zP6jy}%loPj1l^;|3D+b8yJP?b9>^1v9iwMYee|0l{iCkx1CHKWsq<6Nu`f#+;kGD*8gN%5iUXk6?v6RNiZ*pD%Fw{TL#<|mza9th zyh$NiwNgx$vr~^bl`%w)t8i_!j#AB7kyo>aS8CH$(!b@Su7lzOKXL8dQRS$%r;{SQ zKW`7evRe$IE<9Z8f~<_wF_vh91A<} zRUtfh3Y6Be)6LSGW=F|!B6r1BVG<6R1e0+DHnv+liQ3q26N9{v<8yxD)_3bQNJv7L z+8wip42wCuB#%P~q(gT+PK&_og|mfLQGc&rYv&7WT@ckT8fvYj_&mN`2Rm=SNz1EM z@$6)tZESKh9x#;(zuwsgVhPW5J z1U(~b*8{XO=e0C0VfcvdDj+EyuO3%NtV$};=? z4r>^zo2HryNl!;z$NNNMTRBeOeK_^FcKKudhAfQ_MgoeC6}S6T;Ige;{e=V&-9gMf z`ox!%2-EnTiTL&ZJ9JyWbKS%IyFh~f)z$y`q1*p777Cd=+UYwPn*Emo^8cHUIrZ-s z+s%(0@?*Z)Dy@zAmx38Y1E2rAkwvT)kU#)3Us=IM8MQWjm1rZ0E5@sAk!;sJ4l(XG zQufk~U@%R*u$DjznZW1`d&cP7cKVYeooY{5ZYm=xq}(&n4dKI~VMCl70pbXaR<2z;~+(`H(=h zT4*QMoKz7?2lx3cvC_d@VIH(e?Q>~&A;uju3bU2;RPs8`eMj8kB71NkC+`+3w8rz&W{R6A)&_ZQ=zY>6Gh1&+o6qw&66H)3XsTJ-LYzqG-7_>=HKd)Tue+OLy09$zQ_=Rb8eH|M(RX4`Z6YuaN5r|12+gcn9H3;TW#T*uB48trG? z4m?L?Dzdz-G(CmcYZ#19M+MKfIDMx4IKkq3lMvX1r?6XR?v?}ZLv_NQh_^<>H&4X( zY(RGp>O8Y&`Bu2;&bISa6UO&sAm!E=?;BV5E)P~$+4DzWz*zW|g|53=5dNbdnpvOb9bnx?0cu{6>iD51$t-Th2^t1^5;<>ru%%r zvNeD7M{@34&i^$Y?MFN2r|*Z-sD={aN0z0g;uxmsV#H#v9P>*kdi!y&1W-DNy=XAh zg@OhxrIqE*O_+%6P63)iktj!XT)CzK2SulB(I^D&qfml{Nm=pgyX-;MduqOLn5>C0 zgK+{|`keU=>M_P`Q>u9=N@-jQLc%ayr!PQ`a1DzYG|Daqqmv3L5|m>LEBXagFnl{Y zAVH}IKlMNIz@pWdZGacXPUV?UCJPJd^w9YByRt+!PgxR)7e1mrUyLWC)=<1VDB`lX z>C(a-ol+yy{;k=h16kJzWk&K6x%9KAoiiRF2)MH+N~Pa5N~_|vPq5ppiUuLso6?vS zB7M!-)efEi4Q~ZJXSrb+NOK~jP*X{@$Y{u$kiv}(k)D4ItM8yQ$3!?6grU4MT}ZWsMlzE%w78ZbWds^9=e8~tG6m2t4Z=006yaeVTMQcI)LLWc70vjs zq?FAxbT{isG=kxV8D%hfsJZb8!znR!pzc%!%K|pDYj{kpKg>!gogy~1jG3*Z03zLc z%t=qa?2F>vXux^b5FBQ;1akRDN)N<_$e9thxT<4by{u$LjlcB9LJ3Pg;8E?TG^ zDOr|^MHg%^XN54aBCU@2@da~Z#}Kr@#g`OU^)$(~WL|{v3ZE8kBi9A%E7>(haW$_) zKCvyJUWt=oS5B#L@)1|^{fZ$_#eT_E4cB+_J-u&f8iL`ve5Y)Asox*s?y8*6istcH zkv_;}{Q(JrU3QF;V<$NS+QQ5~+3oPT)7-gQf==GJA2VA=FZQDqL6K28{-in_K-+pC z9sNnD*Gf*G&e*gisdoU~wa1OvoX$D=CI6 z$CXqPfRh8JnJqqSO+*!T5m9DA#X4Ln6LOhj&bsj0h1W7EkmMcAz+^q@aMF`4*ia_n z#hHW=*~e3J|3-(oNyNDm3+|%+kL-mTcI>%BAob#*h_;Oa6B$1Vn^vf{(aG`WDKf{ zCLuyrTxYew7_wX9nvIt8X6<^7KHJ4Y@suP)Wd0Q8dW{s8dKG#yzM^K6{JOAvV~+d@ zPW73-jem^G77h)xEu)})=Vj;R*LLhCC-GMzsqiw8Dk$~?og^6wiJH#l$MK|R7lBKrI|HjsM=w-{-?1hn&o{y zB}mzkkYkozxy&=%>!+;6Dm@`Htt{LR66}Z?sabK^cP2aWBvKk=Egu;>9vff zIR`pW@$ETvy&g?Vc$1qUn;7KoJtihgF_US`;d+XL^m&mF>R-t_Kf&H3{rR81Xw;gqB~52*SxM}dUzQuPa5aW?U(gi!)8V9aV0aoWGPU!qSp#yAp5ylhF>dm%LIr1i5sSn-1drmu&TW~Q)kRQ8ijY&+CHq{{K6f%hfrg9r*A zs|MQ2I^rEpkS}JR&;e=oAR_q9aED1{VLZRL^1>FMoFmC#?+%YjwVjd7?v-=PMXtg3 zW5vPqH_W>C)&(-^caX!GP`C}^9+`nDgf>tSe1FV;(0wT6I00O{m;s_J8oPjYZy~v0n}VhI!bkAsfXdtYN^l9X5DHc+{HC5*Gg^}3%XyF&@{t)73!u~k zRc8E5DuzU+tiNuWd>9(B#J??d_<;wP!dW_{$-pbo>e;u>@ zD;`Z$t1ggnp)vzMkZ~cP3qmq1f|b`V!Jwzxw||(^*DOoIy7KDGfgM5Va;r}`UMo)8 zb$dIr6`C%%k6oWyk=rm~4Ew-s+~T3K6-)64f&(I3>zHO&XPKiiWDJ+lBZUXltgLbP zoY5s=v+|lV2f{iQ=O{LzB;oL1A}&u#Mt< zz+>}6lQ{z#+_17sRLQlg8lLt}C8A~auadu~_f+pJ7c(%sfL`t{HMj$HOHx`#5lVwv zJSwz?G}LvDa?bi})wcV@j`8qpVoVG7>SR(q0VF-G#FJS%N@E>*ERiQ9cR4efTuEmB zeANeZtBT%Wjj*vr+ExckRL1|+Fo?GDLixODx$_I&@2j-+f#tPS-E6M3tZnBNdZ#hq4>3C-V6#3`u05eDoS*!A}ro= zWxA=VRKl-Ou}n4}L_y*VO$7w{*XwUOm~n@dSN)JYz?R?fPUgN@j5%?OnV1G1Zn>@Q zStT?CF!|~vyfMmT8|duRyBh<%aM z(j+F#nc5?At8qL;m7&=11cXZC81CCh_Jr%>OBh&8G(NAZ$H-ZI)&A5;Rt@i>qK|DO z%USsty_gesE0Zd9>x$*F(h<0pw@`R@=E*QVsw2%Aoh#s~78Un)PgWl-(5%^=T-WV-)VOL(h1?_|%U<9IuxkAD|G;D`}|I zz)|51T}lo<=(H;OW+2F%+B=!Jf7kjOng=Dm+uR$Ct&RprMh?bPVS_Y?x(T=iQgRvc0YUT)FG*v zk?p5CzI_)HNLji^c?=GKd=KpRFF68wLp1N^hKSQ4yXBS0tBg!XrK-D^NR(JFsbimA zc*F2iR3Mx{`$q4Kje!keegL%D^ zR-xbNcksfBewBf(ET*m`4H;GIPxqg%P|Mwu>IjML5-@5@*&2Z=;AM$l)UUPLUgqtc_N6G7PLe zzwMwcI|f|$#1yHMrVqF(Xzc0e%+$W ziy?{I@kVf-%4RB63Xa|33DBOxt;Y}+OZBwCiOGT;*(#C)|MW@ONetDOEejTKB!8xa zv_^z>p4$Et?|B&#XxD*ZX@=xd<7jM}Adkc4BJ%2BIe zHd!XBHliw~T8lV~P-IA&F95yERGb5mvqwR}%+_5k-`lMGvhoR7vtogMJDyQatPzy< ztpt@wG&FbaNn|-Lr933LEa<416TZY6{%#;KZLny7RR+; zymxwa)t>N0d8;A)X&QRVnb8s3nhrjs>+Shi!^C!Dy$PD))`yZ^O?M3VSw|8naqjQ? zOLln((c$*jv<|8BRjCVtYu~dpiihsH12kgJ^XjN@cjro2XQ=q?f7sdaBJKF!!qYD1*QT=+IM@qtSy(07J zb^&OwhtT+;A<|(m!@z6?7}X;tn$0_2@62$${@{(Xe;^#0z@|Ggc zOYpM_Fry}dZF?NkfId^vh^AGOH4ybG&0_q9 z(f4ZV!-2d_g5X(1uN;G#)h9N5%#4?;*D+Jd=Xql@>+=2k1~#uo*U$b~JOKkzO~}s= zF~3CqFd~5A=MJ6}rOZC=2Hh0(6c8OSmEWUWt6i&jTX=d=e3&8QPS>~gU*hNg!&tq^ zm}va;TOVVD|MN%dfBd~un{z6FY%!iWiR0&D9Y~geM?FmrMrZP-v`=5Y)W2=LoG^P znyJ2`+}#!XNiv-gH_rPkoz?pvl>ZS`1JLP@SLUWT6s!CxG$f1CS+r{k=`+16D{~Ch z=0%-hsz(u0-Dx^jOnpa3njsD%uT14 zH$)mRd(>oqOv^@jZhDqR`!EL0V9m;ckzy7WGFLyFI*P1egrtv>$zg1f$fb$daFOuNeTzBT!NR%! z0QyRJqI{b1QpfhVwT|8p+;XR1s%dzZ&)apGI4a$GQbvLdM^wUOjCVK=x`;K^uPF~kM#0YBGTC8+ zNrf@mNxL$0#dJJmH9~oDBGIFX*a+-#?SVvMyts9gn8q}PnyJk!l{JY+7)s^9xJ!j; z)X1Xi^tfE53(-EQ0aaY{SZs|_C%08&y2|1wJ(!$qJyUcg0Sf~ zXhZcD3ZzGg9~gdA-T9tf15w`kMP^iIPkF#xYc6hB00u*fp7kFB+wAha{2guZN#xR^P!A9-Mz>oUe=Za=Ry#Pv=S=EQzlA0%`zpEe$x`rIx& zvJ)J#nxMK=(4nFb#o9qJu{NEw!U)Bgd{$aXKJ+A=7{waF-XtF*Lr{j;<_@1UAgN>$ zs@Qq1P^*%oa3P>JCW5hx%)u^tTC|t$Mp3CRA;h>+Zi__=EzN&X0$0k z`zOi97OKek;%~szptg&3;9lO-jYDJ)PzCU0t!;sj^nu`*z0AAGg3~Ud2ZkIX9E#7wJk2(-f91rINfd_Yf(Wgl`ZjpTuK^wC>nl0Z-}S5Y~HnB)7M-czc>6 zABdcXx0wHoOC@hZLsQ`Ga;HhmrfV%Bwr<9Ir{^92_;?^}f#Tf+=In&pbmMq?f#Dv% z7>4or4SWhj-DbVAuZ3Vu6!>BA$ILrq{MucYNkt8)GG_@*vU-UYp(>tlSsJ?*G};CI zI(6HZF+pQ2L4i&%6W4aeG-j{zQ@w<%C#cN@ZPOMJ7mLf3%ewflq%Eixzoo8f7Qe-d zGs=R?hDxQkgl5W69zoe?h{Sk-7HJG0mPk8?u)0UEx>vBa&tYsILOwe8e#h1JEv)UU zkL@df?Q7r0-tKh8K9jJ@1-dttKiobrTtV-PUOe0$32#)(tIp;j!e{W!z|O1B{v(hT z72oLdy&&}%p1$d8LFF)9jY=8~r*d`ys?ZCc-M-FCtktpnJv-;;xi5BBLAL0L*Tre4 zKwe~Q{7&Q*h-=lZprPj=g~sr;9-sAHq20LcEK!V3(V*wVBP3vjLCH|Ga0jTNoi(VUJzi>NZ9)Hp1e`M&HELY zVczE*zh`srhwZ;FkMPfYHEw_9Hs!bIuk(LHZvR^xW|NAg6}BqM_wi(kaWDJrP`Bf}DE+2XD-=gna6gU7r zNNWPP2upI5AQkVRl)(Z(0$^bfU=Rp75SWuqj2dl2nn>V!uV24I_QRIrjO%ok_wy53 z@gJ+cE&ED-Uufx7w3EFoQk&?3UY|MWQ9J&S4I_5)0fIVC>;VMmh^;v2mJxffZIlst zY$p9Q^q2w!_ce-9J-S}Rs4!+qtPyE;QW>+^&=FDQ#^?5Jvt>%nw*wbe+c%Xt3U&1z z$B-+DW&4KE4pOfUOE06r=VnVY@^zKIXXeVXqh-@r7_eg$*UgCy%&3JJZ;^rZy!Ope z3Ntm;iO1#yM~lsAl-1Q+vT-j!80R~8uFQl3SBq1zAG8$f|?euv8-AZ4fMkmaxi~i!{&61A~FOllaz5lLi{0hWXXx5t1FXNU)2)997`zBp5;|* zNnXPcz(^^1c}7Jp-*a0M-XxPT8_jn)8g6H2h$ba+SykGH*5yXVa2>@}ZmPARGmkR6 zW3d;%r*Hl{U5ZDTfgRtWOu16XYiB`s(uX4&H3kD)3N$EOl5ygsQk&8pM){Pt?qyL} zr^ZkyvFN7FY|~hp1gS8oR?kNB!vnV3Wtgh)f&T%BWJJp|)|d%oM9bwH#{3Hv8+{4p z!3WJ5ithaf>MU@y)<=CeSjFj&L;^W;a28BmPZanF*k*2R5A4Bc0`X&H*eHdUl3?)_ z_oUQ^yAYG~u=^mRbSKKmAJj?UT3iNHzJ7qs$f8Gi>XMJz2;Pv3vjee(uhU#vJtl7j zkR=RkRhVLUtNzmvSzu}Vr z-sxQ3GMIK8uD`QZ;F$Wv=@a)u>g4g16Q2+endTfDL&8Z?*YH13YO7ulkuKRwQAvq& z-{#64-S>#7rt5SBVI?HBdrMQA9>M)!f_HEyDX7+cjPPBt6OH%QxVz65f zmY9=nSAS!Cu{_TnrU=N9tZzjj=zmZNyjRDE=OAbOl+fZki*18w|6nGcohEguEbDlR ziF;Jk&kEUwuzJ@os5F@`Yye^vsT$*JdYqKk60?qVS~#9|O~E&i7M$-GomwPuI;oss zy3q=SYxg?vWR?^ZVr&cl25j;rGhXxriTCt3Jz7@g?c`?Z3`;+1T9v5UL4Cot%-`69 zefh6_6Gc3dW#*~c$9zY9oYJ|4t>hH+?2Er+=@j-*k+#@PPv4QryfVF(EJa7~xi{4W zeOC1mMNmbry~P=XA=5<))D#RFf#cQODTdjeaBeL?+qtraT9*3|q3 zUtRtlkd^p9q_zKRBRixC;ia_ni)Ca=Y)c%2kpcw=1`pzqLJaVu2Jj~a1}6n3pcaq| zH9`bUNTX*GsLOCJn_n*Kkh5H(t>d+dl;9VrS~pl~US40fs94rmQL+B8@P;ev{Bga` z$`FSpK>gy`;F#z-@%nI?hKcQVo$(f8mK^eK%)w$5`%!iACY3&jp3kJ3A~k322$RW- zn{x-vxgo-18$ARJ6yzO0reQRH%rn2A6NAOtygWk1197Y1jzaI88rf)D5^dWgwJZP~ zVQkBC9ldX@6c}<`7sDXPm?EDuJgv)KTSpc%R zdsHL#vqW8fSmXZYk#@=8R+IbI4t@?Q@EI+2**3Rp3+b0p*tRy&^7^Xzc}4vV>#NG| zg6UNed+rv=ypu@QGIrVny-oIY#rw_s!!N>zy!rvMhm&S@jSTFH;ngde(JFxJ`u2*C z$M|ZKws}wh^;+A>ML5+3x^q%MzhiqF3+>ap3)b}+2Y+u!a7d=ZOF26*&rPlMqa+gR z_9h>{V95BE#>|&;jQ02NfbqSES$6bM_3u<-|6Wb-$Vx zTbI>)V5P@07z`g7drk_P@8dlbVGp19!r>9x(OyoG``85C#DHq&XZfV=#Qw?~9q%_) z4}sgxDTop%aS=DKF*zM@2_wvr;doip(7trM897F{aD_`qfjDUcCnn4Y zm8M|05PKgpvA4K2dpvkkP?}a%9cuAsx>{!u^CGUrCMNCH@*F0`&_S|TV^JgNGGmT7 z$$F~90vbz5LY~SWD(PV&&HnKD7^A`_Cm7PX9f$Ax@_Q2H3V@?c z$YQIDwexbvWtFNj(|h%Y@%ALiwE9YMcj>2g%HmBZ!T7^@H7z8a470M>#$ZF7-6&P? zOf}|sXyL?*zg0MTgI!FB-Ern3zCz8x8_hun;Z^a^^BSh$oILd{?cwGMz8xzfL|mNx zOVX>m7a@bp>~nMTh%&?j(iHS-(}~XMNEJj>`7+Gr7?MmBs- zWGy0k0+JtzGLqcOb2^yeqyu-ucAku=vj3{1gsC(Pqc`-CVy=b;Y3rMS%dNTrdh80| zk1Qm6QQ3UR)kvT9uX-op?F7>ODnJxE3vkBE+Qsk*y_n6vB6Cu}0{Fl?f`4=4t(0=5OVm z`VFS@d+suOB?PXM?;5R%tr~ndCyx`jO39?9`t`br`|eV;gv4oUEMyJW3c|AkTZ;d~ zqL-RLP0?dpu>QJt@&L}M))q0KNDflD8zGf;oC90`=fA?0*EI$-x4jsRc;DQ+(opH7 zU}K%l7&k>_)Dq#>uSKOIJRmOAU{~K+Mgf}!4n_c-Ci3Fd19~r|dnA4e29C9LQOV-Q zK}`c&T(KS+WN2!rJDUrl0#?M~bDA9~_ zelzMEQ<=BC@Y$^rA-5`>NSVa?n;gTh!niLYJzj%66BWrhA;p>(R6Vv(LXcw(dLV|loeZyRd9Rz}cZMCsqsBErw(;SLUmI|C z*x{?Y;adU+wlFL&Z)3{z2Z1#OC7KK6Ez?}CIA`_`_KH+QWofZH>orLgcL`hUQG6AM zQ=_HU6Sau~&4a(&DsMF|t{DI}9>kG*C)1MrwF%n^G~^cXA@J!81t`WUsE zpE*5|QUvo7LWS;OIzxMG9b?h5+&AJ)GT#ct{jshBRtWa>4L zaQjy#QsJc-EpI5T+$&s+Su)IYROE+@CPoQgzOOGv31IjN_SI5GI(w6P-=Qk*60gi| zR-(d4^G45XQyy-CxRCmNg8|L5rlhEpS61BLsvMV+S{{}{kMc|sgWMEvBeno9_pX^P z6uhnEhxug$b>N~x4vwuXg6RZiS4Iv|}nR4-01Gf8_S*72rHK& z4t55gNwDr(>u`Nf?NJg=!Ws&{vs-PNZqb}>SlU*cUNSDlqD#!<+&dzvNV6MU%qf|t zUWm#R&Bt<8OnGt^Qcka26yU5}CQeG_l4en+VN!l12hv%J$x*yAH={(g$cTL*<=kAZ zkLiAoR9I%QBq48>Ri;wrDAlCViaB4k{$6#r8tmX~T+ULSZEi)U^vp0H&xpOI?$5{# z>0aE0H9z8x{FgiYH|cw6ftn@^ayi{1OCz?hhZ2`|Hk3b6hCa;#=y1Z6LFhsgMUwc+ zwH#o33;@^Qo*mcro;*mjDZV5%bH-2#H&P@kvTS`2Nt%<8af^D&{oG4jg)a5+mn#k; z;a)HcWtup?dI(Yf-ZIK@4mc+)X3d~nV8Q6lvHxc!9QhYt$3Yd_mT0~U-7 zsF4ivOJfGSAl?B!i7d4yJz+rX-%J$a`2yZr_)wJCb=M*d5hJu&1W-?oL=8$$hm*B$+iM)bFOV=VHto$dZu})Xnm_F~%o>r18#yiIP`<5Z^)Tq)zh+}q* z_9#z-IP_@nq5Zf?3gi{NnLcbZxzzn`Lx0UG`dNQ zkTX^AdJ8fXo%b~1YL=pmT4*a}!!%?@sUGL{B*g?+ibrK|+B~_^UVQM29i}j+)rB2$ z(i@dC0*SIDc&{dAXs`?|FOj7;p7C(5qUUzZwVDC<3(3`+92XE#J@10;A2|_DrvfbK z7QtenDBVAXnVGCicD0EUFs_b;O-W^Yd~u(C)pn00p<2`JMa7Acu_*7P6`~$66CeW3 z-mT(Op{O!dXI&CDCYkpLahkvmDjEV1!|-^AXDNKd=GoUYQI0%DZ7rhx&d5&5$j=B; z+b^TEC^%D7e~ra|(7ebE*px0MLaL4) zX!xgjw0~OUyPhFA>N{wkikNuzuKrTmB*x}6$gixYOs z?u0fs1rKI!26INfu2Ac0_7vKDjX$U+u`Mnp5%r;qQP*}wCqvN0j$zCpU%PVjqf@k< z7~$y~t(2>6wwIJA4|&%tqNRtKwC@fK#5CBV3C$ax6b|u5m?C!>|zI z-2?zWC6V1q%d+8piHh;iNq@Xj5lwkgzA9%L{P=zUDeDRQ_y$ZGo?~8@74pHPF!hcS znXuP=VMjgtuHC|``|xz;Q@SP%KNCf#`m_z#QZ%?s_TBstz!ytu+59Z2G&4A$Z8q{q8_<)MIr?^_&mCcqIDUlI z93UOvXyxMIL?1!fJX4NNK*&>jZ+~vU&>X03VH3ftKmk>>H&uiEv;0g(HaRd%{<*k7 z=Elg7qqdt3Nz;9Oo4^Zr7(Ou~SUKEcA}opPT>0xjW({_TeSOwl(Bd594{m^Ga z=4W#2e_*2KbxyA+|FHAz{n)gJ?ht2gIv$Bw~vhXn*+fAJ23fC|O7;W$i3KOB-6^<#!0>MddNDLQoHAtwB+JvX;|*#Oy^Oc_ zL+?9ZZph$lPb%Ix(`7)d4eA1>oMNxx7WkZhSotV;_=aXq+axvDUi3wQW$E=k)^3Be z-1>;!_z^05pr3mHmwOPNdoWmcfIWY(t-d(bK2-IzTl$}2`}Sc6*1v^h7x+#wJTks} zBeIXMJz_>?AGnjgN10ARs&o17Bs}8T7INIFx&}ASP-JE+yfC_kRTp#x-Y!0c-=TD6 zZSP-BX}$rzqB~CUyy#AS{I>VVPSN=!Z!9crOQ?Ibfum;P{Izl4dAt}81+0L5{>^o z;99eu8VBkyoG!VV59zVou)`ckaI?z<&UQ<(NP~8n9D2qiPUNo0&gz~0^sff{8O-X& z0`y^VuF}(lMs|zauK6Fp|Bdwb$y3vgw{|wZ=5}S6q?w`FPAAyf9AK`=DK_r)58f^ia0&<^x*zg!}}B!e>@9CZB;lj;-+{g zYP5-5E~Yq=(yGO7M=}YfdY`2)A)i*GAFQmL3lbI(GvG5~RT7FrF%h>>j=hl1K}=WZ zXHe`c9{xlEsaccugPKvFC%G0$cxXK*g?2LMiZ;2 z<1}Kkfr(SLQ|q`bu>2+$#lJzI9j;IlYS~GCYD=l2)HAR*`wI7Xx+gq0>w`;nvl(wt zDmRT8i&&jj4U{xodi>Ce(H(x$k^ZPIht$rm_yInBjL3`?uBeSWYT2Ha<-smuPd!tV zGd(j>>DJRj^n!a2ob-3(4dul_HVX*F0yK!zJo2HpQNY1|_s~B;TOS9Ge&NnC*)pE4 zY9*2KCtG@KXw(1#%l{={Zoa2qV(HaTt)d1PISE5lb)8E`JPc_Ho4RN>^A>N>jzQ>i z6E!uJ0oxrf5j~vIMam6vCFiFNl4nF)vKAiNbSdXcP;koN$hn3v*s2$xz2-L=^ki= zK<#RqoHE96bH^QUo}qidE{4Lq=XQfPKql23k2AiH3aDr=o#WZaIN_BzxQ`nQiG*Tv zo}aCs?2PK1q_wyvuJK`=?2yGqm$`21nOqqOp|%>8*oZsn=$YK2V8~AlNoli=+*}sk zc-VARtccY5kYihv=cy{8KT<@oZuua7Z4avULmY5xR-AD(quTnDxEiD4k+u_+Gg*}K z=1P%&GOt;z>3=GrCB?xVec$#E(w%eafT!L^Gpb(hh{C!b zP2Oc1;`U7VR9MLc%Zl(3Gt>GOKUwd7h57}ea_aO>r$;Sj2LkhNcXrLKu0?Rul5x)n z5pL(89-j|~pq>B#du21e*g(P79U~QT{-{O6LDoOLCdA{&EBYPrD(jLvf$PZEy*iIUPOWMQ>f=+CjcexahrjhrQDhUFFcDV-IclnP0cGD2F?x|^&YqEs%tpetAY-3%43Mq@)9m`@KkVB_tO{+{^Ux+*a;nod zo)8cKN~e@`gq#sU6(d>dR-LjU8 z=DG8>C_uHybKT^^#w-kxbJHCWYY%ZP95!vluh@`TUN<+8iZlyHb~27O=^fwV)?;QQ zpmU7(Id+G2G+}d_ugv$TFwXi5F1pes~x zm_l3T>F}6#5rPZltn{nUl35Gzu)IV=unw0GW@y^Yp`Cvxj!S$IU zV-s4?PgMV*3ZtWr&33`*IFTUsCdFAI5SI_R6Jd-#*{pQy=iPaIwr#5)$HI-?GuGBkKIzLZ0#JsCs<@GItzk`r$ zW~os>zZ7kWL^Uz=6egC8>qdbCVF#0U(_mlBP4ojojo5*SHb(=2>7vDecEx|v!-xyW z5*OH^dZLI0(0f3MmqiOnan^J|HsNn2fl>^F946DfJezP}PH=7SSQ@@pL2+S8%5>f3 z@v_NqJq?R~td8Ehg1KyR1UMTwWeg?Zk^%(}+Cal>3;@Ag>+Lo)AAod%ojD4$XbB6< z!U^7U0{6b~<)8vyN~^k}(U{AW(UrWa(sz=Xga2T*ov@LAXXhh+)6ksk%z5~vv)(b8 zZ`ZCd3{H{5<2Ar7g%zm}S3U}ceEJ9Bv{LpaB4eQirdhTxbl0VL4Z-cLHGNclFypAz z2l!vizkUQbo+YmksSr#~IHIQPg@#_EX6ZBlf`^{~`){1dQ3W%~f*)5I>i_okcs+t(>R!fmphqAn()> zxcZ<3e!*P2yAV_J%>!Rg9k# z=~jlzG1i6I3}Bj1Il|nf0?*e?$^o9|Df?A-`rD>OIjjfW2^gr|gV8nGV&R5+<;5 z94F_>xVOazRMrE!K>}#!0#E^B^P3v`5N_S>18)Bqmk}^az!Xp>Nm?r7TFVWT2}I{w zTNE0Gz%=g?cUiltZP@%a1RXpEWo&uJM=`l;00}1n7EoewxAoP)8WlLSQyzTf|rB6XZDWB%h5 zWabfW7rBmJVmv(imp3goz&<{l>Th6L7C1+Cf)>=R%G_^UrZsM8g>&QdDw0%3{DhJ> z`ffr0dli^@nH7>ud3z2;kUx0I9bS|sLB{45YjK_r!qgo532qVA7+Z$Yt$G|1!=cRr zT_)ra!xQd6Ess=)ZHP<<8k;UcWQjE?W7McTUQl>kvH+-3LTS`c?ng!?n58a8ooq40 z72e59W-s3Jmsh{nB@^lAy#nD{pe)Esz?Q(zGgPWw+|7g$gCVCnyuq+Onyj55t}%vI zeJZz9mezRNa~_YiC`rC(;ww=tDq4PO^99Md+T5i0IG(;A@$Lc$dhcp8da3@ z>S6=Z(TqTrhf1PEK^6acL%G9Q`FKMQ+B1$(DLbJKqcm^90`mzWF37dY9VXTos;1nV zFr1toTr~MR0?2j##@Dg5Q9q%6_>Sr#)oXnkH|ESCPb&m7-LI zne$D43tzo;g7>~GC7Lg|n?e+y9|YUL313a`zzx2(Zi0ayE$_gQ9|P~ey`H-6zKb2T zSgT7qQOj4fyr*|xKh}jGj7HuchDP;ox_p+eXtRc|*nFJB84)h@i<`m=YhX=~zNvuS zjeuPW0eCcE-&ycvb6{ID;18DnhqZSM(ku$rHM`5UZQHIc+qS>5zp}b)+qUg4+qP}1 zOSkWwdne|ciI|8pGZFjO{<$M}u9cZ@K5sxiPTvrYkR}op{C6tO*8$EKRxe}Yo(9YZ zJcwUsZ;#xr2K2`sj&F2`Uu?)XKKwU3{I?g*7j1_B1Y3X$PTv|%pCZv~n_s=SA|+G} z8dxnk{41)x4MA(F1=7L@0$i68V9l-A%1cX`x{hYC+KqPUNOku9UaC98hK>nMJZ z>y}@#O~qfSbMh-QGqXtMuZVfsXWuyMT3_83Gmi?QygH^Qxd*vHt~K9K>mFY|784&D zdD%CFQLg^qE=}fdJwdMdez@ymUlK&0wGoI8>#21UyUnSIxvmQc9XQ9I;5kADHoJ z4h1LE|KynZPnYiUKaExYV~Ag^tY`htVx2$Hrcp}Q_S2$jxz=ilObv38vlsrM7Z+guUg?e81P<=^yXRLQB)DIwyLsn7&yauyhm&pAmmII_t+$Vh0m>h- zjy>TJHE(U(qTrl3WhPS|oZ0P1lO3_V0@o~bcoAf&aJYd!j#Tb;YW;<(679^&It(_R zc_iDkF^W3aG7mxd&#IPYoY)mt(+q(t3KE0$T#DL%CJ{sCyHEy#;+zB7P{wMQ#)rsH z*Z7l}Uq9I>g$Iy=v}G0)L{p?X+?gfiCWkady%Hq)|ItzVs+C02?^cW6(r7iX#_Hwd zhFhm3Gj0(Z^idM00d!YQ@Rsn<;{c*se4bBVwx3vLs>%OuWRz3k4l>+h6A%0ZZMNW0 z4jK6mE1AyVv_CVr(DS0zf5*UfuHHJv8eM!xP1UJFNe9KeJv$hPrvM7X;-<1}!{*9L zC1$d3Fn*ERf9Y6P&B0pFP814WmypgB#(TowypIx7Cx!uOp-2%pyXm9OVpPno~#j28?_{Uwl zacX>@pqf39cgim%gywmq=%ljTpi?8CD^<8-sY2yWC1V9^Pfnt8pw+-NV7$;zB3q)g zw@Z$|d;Uw1X_fv>S^MXGwDiyHMd`n-6ZyXd+5b{t{vYrESEQ+L*rTaoefxN2ZW&S8 zV#2g+27z=oZpi-}lF3)Lo)dP9M5Dbu1U{Sc*0oN`N{NJ8y`>y+fb4M>ptJGs zDAS?R=6tz68wodDYfRvUP(V4hKnFjOL`|(_$ zsI#574ZHXDQFq6@TEp?`pv;WX%dF?uxF$6xNpo)hin@qpY|>TWppWOx>=B*~cG3l2 zc-ve64S83jU1>SM+{l?JZKwq_*h%K@ z2cPQHif>bkHev?CzVh>l`yn&=-sEb?TbLGeZkf-x$8*k(`ADbR?lGH8*vEF&-aBmb zU^n3Tf~nz8;JadAAzJbmdgU)!>OlD+TNWGVh-jnzx@ z-9Qx0o;{lM%CP{uA69X)X7}*gAMmCmeDmYJL-RgvUB-R(-d(P;+-9pF@9YB~bwsd% z>g7~Xw>>4no0e-yF3X~8rPQqoZAO^hwe;O|xpijtx1$DYF;*t|*rGqmd#-~2+6LL5 zd%9mA>Ezk}fP74MLuM6}@P>v?Oo?NAPl;oRwAoVM-RgQK8M=tYI}}*>=r!^+zRz9z zhJC(G{v<|!uIQal$d}S$agVz4@uq?E@%K1J|1r*ZRX<0__#$Q}qGlkR{bBnwxBi4g%Xi!yijf^*V7j*bq)ogH(kpVG->+h2Y6 zJ2oFv)(+E4T9rY3JGM>_;Dx9Yc|>(}qh4bMJ3o?FVDl)47BOL(4LYwzMdSA@Q^e>O zA=~N;sdL@`x~{8R(>2)u;zBI8#Y7cJch#$Z-Y2vkF0vR&x){oLHOzF?N4*~DxE}ie z{E>P}v|Zqo_pflY(4qAzQ%meBE9(Qj#Keioog^ZlL#G=fEi7omGRY-fJIejR+? zOL4YDD%idhNZUz!C-={oIKI@Ez?E9QSN3g` zM8CqlRv6E0>_}|6;{uC9?4t$>JdQ$VohZ%8C~6C5(r^b|ebXUrbdctF3zc3A)_^Gh zk;PziisCBNU}3%*fG#d9R2xL59g1@a+bAMxTJ=^G<<2lQN~k#%_W~}nZrbADBC9yR zqz+j@R4$k{)`z!}Q_lr(K{I|6T||u|)dVhFz-`eoL^`M0+fZNPRmx_zHA&--0#oV_ znCMClp|bh=T{s>U20mqLX8{`?x#$7&R!KVdB;Mrsr+H;`3LR|I%BGFTh$5&Y1TNpf zmaI*D?-A~?Pm(JwOnl0LZ?-?Rz859&p$s{OkvV!e#DdBW2KC7jE@SE@2OTDKUkxUv zAsmyM>qHz!F5HC5W|?wu)oi!|;~Fht)1rMeEW|W>9XOmRGMUd!d4>ow9-Y27oTP(R zL$BkJpp>>@!!)I%jPj0D2gel|9Zip1=veYfN;_$)go{S=H_!G90vRbH$TALQu1uU2 zgEHNQI_Y_cVmP0Dxajd^fGebNDx}I`IJ6cYxI}I2Am0NK_;YTy9_k z$9H5Pha=vIaM21>(->lEmPcw)%Ixzu{k6-S=3O1FF=lDUPkybcQ5bOBImx)r=Hv6% z0vAA1ufhd7fChyYESD53hL#SmjArm)*-A83&lEJ(=|Fpk~8Y3GMrC0;H*tro@4YyOl}xDEZm{IhQyECj-&PR|0VZQuOnBR z<(DCaHr7W~)$J=F}CDJyt~(XtrK(E0()iq*!CG}WXVK%rZzhr@J5ZpGT8 zs7$DXo^?dVK`VKDCqa4I0P02^@u-j9dTmx7Ai7J8(15voAp6bVn&bQRk@MK~Pw{-w zH1_P>;C$sD zbNT&1%&lQdu4byA0Z-ai;pP#Dwgw(4wetwXC|F3ZsO5~W)PuL4S|MHMb*lQ;KvW9r z!6WaAv7k*bsnX$;gj|f%P9R$q#dJEf)`&yjQ70A1s};KF#^M4usRpXs#EklSvj~GL z690)`m^*MPrGbmTPY$aPlTw@vLc**_hZ`OLhPJVwhX8W}&8Fr?Jv&M7C8bU~h@45S zQ^YVf*f#|B_?o#dI_GmALayJ|%uwHV#*+aYF02Xx*|*x4zD&q1l*UpW#FbPR%{Cz< z{*jfO!&B#j=S%8lm-LabFr^;?YmX5c>Qoo*Hi6MCAK(HLgFR|^(d8|Hx6EyRKWtdZ9|du9$hE_ zPI{;&%|8B%8G9w}tT&hLMdE)k-PXp>ag4?-*``_yWymJuFkFr@llvpp_2j98aHuNJ z%n>QW`^AZ@$lqSKNmHLCx0!czySk|cJHBEAfx<}y+u3J4_dmxxbXzYC+0eELR+lXe z-|K!R57+#fcB(2Du#%v?;)e8M+(}nxS$Yc;Un9q*y$A2Knt zn|vhJp&4I(`uETue#Jisrt~|YBX(S!r8U>(8yaA?oKD`;Teq(;Pg|o06CX#@{8&x6 z;Mfm+opfNSPFcS)e`7DQq6RX-k}}~QCAoD?l8UmpC1;+0V-u%$gSwc%kMQ9dg3c6{*;n10zSj3_ zL~I(+IeX?o6nf~O&DJkXbs8pPZZT?`I@Z2VSa&yt{VX=}T`)eT_&xp=HxD7zEgi!xYAk?Ng{B%T^uRklBf#z8tP> z#;E=>U5<)FFGA3bVTX&E)Si_d9B>possiMZZdME1-6^%PHI>W1=2>c1`cL`Fis*8z zby!OthH~SH`?9yj^bXuH@r4H4;+siY#T*-Oyt;N&AaA0IW_o{JvyI-pz2upu?nFqT z9CT0=Yai%G?zj(EIfQWq_p=V|^#(BtzuQ z79CQo*FEOM)DwZV7!4_)1*cFmJzB0j@Jln z*MR=pQ;2=+zN52X;AWgd>kZ!AM~x1(;^SJN(zPN=me`WVi?DMG>Bby_dYaALpW%!B z$SkrFdkI&^XO2ZrJ^h!!fQW!1BzL{V{Vv%@GG-H8VD4p@K&=egdJsdcD^k0@oO&|+ z^x9Q6Z&!^p{Zm7?bLEOp*j&R@ZaO%QieYuvwNKj7uYt1cvoN245wJ&ZjP9C+9g)*@ z6y3;$TWr~W7rrRYI=;ki;X5;Tv@)8}g?s*>qd?A8xms-pDf#)(_~L z(VT7X6cfWbZHPCw?u5e#zgaUT3FxV-#FyjX(_|Xx4U&%4$*>(b z=0~BRB8z3J&q<0ghoO;`65-D<$J?*&e}8g}1caE_4-P!qO=^G{cwIyyGTU0`h1Ink{h6 z3Kg)Z{^)6&+7-%?L;OhsJ~__+1yd$5TCm zBIZ)s=2Ft7D!v9%XH}%pB44(0D6f|tPRFm)1mb)$bu(HZBdbN0{_SubP(aimF2Trx zRwihhxs^oiQ(EO?O-MU=y*J{h^Ip8|?-R{)oT`;0SBMnBJCLQXV}>ta%l#piPgSlGsBVracI?=4m6Ucs>5wYWC7>qq9MY&>^V?bQs>Ed zEa30aNq1)XvrD8=b4>IUVY|#}I%_iAibIj7bIz(oo5$KvVB3tJcl^>Dk^39`Ki5eq zV&4x(;6HxM{i~J!`>1ynOIrsUv;UK@VgJ9nnZ@dB8mQ)I-#(_;s1RZisuj!liFKmY z5f~N2P_}ITRzJ{FdB{lNRpMdpbX^yIFfa9~MA2Wa<Xey-aGiGVtS0; zpD98OU_s}7yqKq{r;_O+9KeWsw2iZ@km({GKlzxRmjA4nZEk@$|9M zM@em_8 zp~@99Jk$(Tv{@JZQA`l2O?a-@il?#)VyRMwt?d_XWGz~L8MEt*&^M|^S%(yAb2p!+ zrQpw41sBv%$SsU7h^>?Go=@bE-FrOe(>EZztZf@=$r|2#hp%W&sYi&Z)oW^`k?P0f z^!kr_g3M%qwiIe23=t*l7tiF3Lx-X5J#CpuurJh+V}aC!;1PBqRY3GO9aCqTYrb0X8d);5BuxJ3HR zzs5h_Jj^*$GuBV;#DCdn?a$$E?^;#w^tzALoiAc)T1|!6vRBL#2ZJLQn^C!RjvTcN zeN85{dFl>HUR=v4w;B172cSNzf~aw!rBE3ZfjXsF_GEIu=@*@HFb5Y$`Egc`YBYT- zsKd{8IhKRwA`Y094(VEJISf>jmhx0Qm)UXFhFt8pTlnUqp~RvIDQ?FVL5 z&P5IDxB(4Rg)4fsYk5!J!0lHT-61yX{T7iKPpE56HiEn*saFdKw&7zUW5L4faXjzX zUBBINaf`!R2&8~q(*m}{i5Fy%PA_wN@XAbeZ;Xgfs2)EI|05zL8=`vhxHw3XHbhS% z(3-K{Va<2E0MlgA9(Wl^Ia8?F;2-;Ben{|(8CdnjbVtPZRgreHyb+mJ^p~@KMug;- zCP7O+Ep25B z-R2-65_1+BVPpabzT?wJjN+5LIbIuHf=<;yoM&aFI_&+c%M?Xi6(iWUe@OT}gpB{uqa z0Cq^W4%CXkXp6u!;z%4Iq!_Kov0=ctTm|VSvc@Wup;e`Ww|jCN#w%MXFuu?e(i~-K zm)z3gz11Ye(UlWJ2V-Q)Doa~E1o69M@8|~*yy|rLHFw}R+C^1xF4Kk{b~Jh?q%4hC zZH(tClpC6*rG6)6VS;5iee#CJZq-3=lHLmlpBntE8qeb&X3O*+PvXBnw@?8Z z0WD4B%xsO#oSZHGlR@VH=9^cm+A5$5A^E1H5a5L_-tWUk5TQ$Zw5uzLhKHlT!!I%- zp&XQ6x!7vNb{^YJ+%PMd>~o^_S`-j|?#8lAGq4-WN|R3=0bGv(IUcTdu6`dM_wcN<0|!)jkj*`BE#A+>43?&yh-Z&lp;#@z-l0BM$(1^BSNFl9DPW zxO5Cx`MPU9RG3^_(KY6Ihr=%#90Q_5^b-A55wQdgJHot$DGi>?#ti`6C$(yGkbFCKWXEE8KB_AQdxvZ7PJP30eOiwtkn z(mA!^F0bmO>J^GOC^m@byAR*9IG(v~KbTU4s_9hutF#^P(G-Dk!yb?b5cpXGae;8d z^qW8j*a-x?gP34+NVocNCKoG8{7uli?Mq`^ta(q+nwh|iPL)`&T9%{^_22oN>U_$N zGS1{%C&{eS*aN+HXI`4sFa=x-uCEGk+YWMNm@E-X22~O5?XGX%PI)biUm74Hf@%z{ zc2UtWr>?+ixFM3V43P(1Z;qF)LcnZunY}Dgy!=HtnB;;Yj+}|Kf#>OzAr>5I(>f8a zlqZ>>A5@9~m#Bj89a8uQC7EExsZs)U1cbgx)M1(sRv)-7$fWcEizkCgSMd6;+A*qQ zM5vn|;iQiV#uAd27pzqT-XmqMXsFcU8akD~x#kt&0*DL#cI(lI8YV_QL;5obR^%39o_w@uU6UF1NyeyRZEJ5a<89 z#SH6?_K%W&BfwU<^jjR{XTlFyBu(ur5)r&Q@_iy=le%UUu?Sls9j_){NfGtV`)e4{ z`FS3f#FARROpJZ5nho*rY#u`!XlzKlg;l9_GI^DgCBCdCxd*!ib7|X!?@hgG^#I9$ zzp%N$lj&@)?QiZE-Me&+96s1xPZtxU)_oC(;egv+k>WOR!jwJI`@eN?v7@(hEQ`C0 z6Sq_X7=s8|arBgC&zeZ3w{70;B%{radmO|D3aJUk%A+|+&8#eZ4*CE;@`;QQN_alnnG@4D6|+}10nz~j+}BK^<%32cZ-iXT@EP3K0RJBP0nEFu z(NA7%eW+a-A#ZF0>H&?r<{w}BuD*KDS&3_$K@Xf}&-9>-5Vy8#&)Gk|`g#Q+<|6zO z6mpZ++yY6WN7qCo{~To;%>12h~etsfweU0q79D_OK}=GZ!yqc2_R*pn1Ch|&NkonT=u zFn$#)HcZKNtYw~-gbZ(>d-EzgRw!+sQDoO3uPs==P_`+rQFqz5F4T0LVEU{HrG{*A zq!#%DtxVh2gN$ly8d2F7!>5lp=m~jT>ltGX(x zEHg&ckX@OIqiBJKhED~U2J6AX38~}k`YPp%f~MeZ@MU>jbq4_mLv58i({Z=MZ%Ubn%E$s6QZ!inhMmw9Hlc|w z#=7bjJ^gs6(eO7}VOoYV|ZO6ID3L* z1v?rkrZ<+gf1an)Tw||MMEV?5L>3W+=N$y9TfxlW_dYr5zrQU44zrxe z7eG_YS8`928*b3AukxlAo)4!2u3BCmP%$}}c?(cUKjoYw#l;w_(@f4BPhiJ{l!H4U zP*H=5WrK=mfAE}CO|}ZpPsyl&xnW&mY2F;HJt*s6e-km^*Y6rqrB!8DvZ}y|*Q->& z=ki>VFZ?U_SgvhWwnSpnQ(n{e3A6FtlkUq-2QXuQm=i_Qqv+_PFfjoj*pR8VBi*XeGrIp;13n|9V_UUWO-Hs_Z7Z+tiDrf+xJE;+*rL;fwPyLTZ)3|Z&OMVx zO2ypq+@Z!RYa*6)gOuQ8LClsDe4QtfL_>8)OUtC(blLUjvBK&!s~S)V)Yj+7?Ep;> zk4ICP%74UoFKRo{uJ2NhZ=Xp^H?){?QOTBfBH}IM<$VVHtQp1NR$Nk*g+-c@htX5fs^O=|J`7rFynye<-*N+PHJ4V`Hg;AA z>RMjMEY8MdAG-O8Tys^9D!H^_d%3UHF9=^uwAmMY>RS>2+1zq3=hRX;7E{;pqe#XY zwmvA9foXQ$EI+#* zaOHV(HkLpYPSv{UlFgsZ1WyO=!o=QjCQEd2cdiYKE?SUh*|pB{I~XP9`3_qcDRFAMAn z_-9y&MBBei@GeO*#2a_o>>5*c)l@9VB}{nQiOuh<=a}|Ls0P@+V|Zvq(<3eYy(ED6 z3Gy`=z}^Pl8jy`Itw?H%_&a(2?UeFe?elVOrg;9`>EjPCG5V8v#Nc?t z_SOkPHJBn#*nIaa^Y;t%tMEDWtAf?M!Jej+lOgQL6xE3Js5h-|GA$qm%Wcn20Nv*C z1pAwSIv5~w>iGJ%U}m(?5|4bu=(uzkfA7Hr3K%>iF`a#A2U@8p5y4ZnpkN<=h~aB1 zM&Dw@uU|^eNDAJ5LOww!{(!chl{)Z_Vg=8I4}qXd1RCt`fzGS0Nap|^VSBQ|L9;AB z8eN$Q<%T(l3o7{+1@S%9B_Z zUzI9rTn^cvPjl%*leaUhxUJ?Mo>iDCB8RH!nh-%SNOeu??nX(|B$I-2WF3AB#r!86 zYDX9-5q|kO`1G^jFH!Uq(o7-SqrUR?$O-RR)XOZspYTdVq%fO6fbtaG7oP+6YFkjeJY9Etn_&;K(@f$g0Ws^#mQgK5cGFFy#l6 z+x>n}c6M)fr}oxwPADuEG()pn1Ab++veQDRv>549yL&U!kZTKDjyBEC$Lqe_4Dw)laIt(w;i=7 zR*(oYdi`5tUntq%4aYsz-%W#oL8l?<{1@h9^@q=m>Lk@-VZNT& zh+Pg??VmYCcf1u?27TUlZ=aM`_ZW{SYR{8}^_&hoN1>OBu4|#BdMN2H*~q88*xNsR z7&qkEiZuxA^~13y6Ic}mZw{Ni4ndTTg_x8sBlS+-! z>G$x~EFNVt(QNbzRy26G5cZ_P_7P`Hzje0kT6UhjKk`3!h(hh}uEgm2TgzA7BK8|e z7`17Rsh9_@Gmt-im=jcsVlPhIB2$0tl|n*w;qed@`*cKF7u}s0?D+WWXcLPhWP4x{o7ETdr_K!o|DcU~5lsnol{;J0`iyqBGwz#1H{hoJ zw{NcA1mbKE;XcF%RP9JCta$;DQAJ=Q=OulTz!b+r62C8ZpZGr7I?O}!sk9Hn@chV2 z@=0t8_B?)EN8V(GI_RkV9gRf&Q^jAPc4=+nq*1xs$Cq|_L&JEj+b1OX^a@tfrQ1h6 zd}&~=t^p79eu`%4A@9hE4i#mhsQ?dC3t?nv8EM3+GPkf;gQkjYM0(0Ld}+wBT(Yr( zE!Qk##_8h62)d_!wa2oBR&NM4&l8?$g}$b9-@A|} zivfscBhvM{Dh|3Dcp1w91nYr>^*SC~%}|cXtk=z6bfLH0+aKw_r)Z?RHG|a`AqE+6(dm ze~lvxg(wfqT`FxuxP%%wvk`Hx0%p>MW_PtJLoqJ2u5qB7b2aiu)K}qon-&hW&Zl2& zB`|RpIoCHl3qj35nms+^xJu-5DixP#sjO889efO8QgnS8xsqo$-u1+0zs*RypLbI@ z00BEWgXd|#u<~;I%321Y%HAOkq@mtZ+|mY69;i4 zOB)v_Gf^|3naMxe_kUE;#aht1swd5Ykbq-^0dNM8^Rl)6Exp|) zGcR|kvl!7z#y6XQIn%6Ye|m*jSB+27=ciGabb9f${wP|YLy@@x)gKOuW|?ur1c1wWoUk2;WaQm zISMc!&(n5YgwiC2tU;@j?j1qXw>{Bb>lA;kLC><{T^Y;M$I_xS?Cys@^QN{}Jay#d z99K>3#|_?)bKS1GHFJ_~RNN#ntn5$awZPR8{cVfzC!m$qyBKa0!O1zYsu{*YW%VG> z)h<T8oGl6=S_nCY#%X#Os&M;7Q*_J7ut5ELv6Mo z1BtirUL~G4y8$VRe&wwTj9&uv66UGlcr7d#uk_Z|^|HLeSqwpLE7}6SzMq7pUS44W zHTmL@Do*U;IYOt8eorSG-eZfqa52A8ZEX`WsGmgl#?AFDSUr7Zd5O_`Ma6o@6|Fi) zb(JMZe)W=UdiBqqodq1bdshz-ej^Hf&`mpqI)0=}tH;-k3_jxYEf%iMz5@>P#sC0k z%f{T%nbjSbNcOf}NyA(ko+w>)tV^FcV0Hn0^~&-R+9j|WNkx7O;l-|%c+twOtZ|#( z!ZLarp@(-9^^vKXAg125sWAG1CR$IRwMNTN;)o?q&aJf>o*xSjEF%{tM3_-^9+L&~!%^fAv=TMBdZndTvW-H&3A+Pc{bL0RNn8 z| z6ozyboPq1*>^iG0&p2!}Pq-S4LB5G%Ny zDl2PLVP|o2(+Y8@)sD%DY;Fp@^$-8L)^1E{5aI;tjn(dcTqid-uT3HDb%OIt=vMIO z-2lAo>o{ymV5$h86VScCzMLD}dBio?vR)4g&jiIbDrF8NAf2e@-Rm)k8(e3&W#{^- zRsGGuWw#D>KU9a$P80_{)8R>pnx2TV2Ha~V64v0()po^A_03x{KTH5HsgM3!t$Aq_ z#jb-^nsGz7#x=C7dTxoSf3u^PATB}QHWQ3ae7gSf@v%Q0*U*+&p{=x2fMHQWZaB`+ zh9Z!bjsSLl`J7&7xvCu9J9FmX2FfiUm18$&1hw10EWNfj!rhqYoIzTHO~1rl2+)-; z(?bad`50vMDpX|>3V!yZmCNkZ(!@pb|2&zlJ)C1utDQFBVc|IB^wi|#7IyNPM-FRXxpG+cDoNrxOk+$$0TtOSZjJ^XV7DdsGGf!GS{;FR(nsV2|Io4_P@ zip}9bz6u*xxLc5YNZ3V${Y&l$ZSc&Wch4FX89Dnd%Q}slk1kMg&n%FmD@Z&Ld?Cj! zR8Au}5gJDqy1YY^o7Y3u6PZu8DV~u2qC|*^0!p;FGU&2h;ub%QQqVj;6VB=*eU#`O zVL3l4WN>s6Jihf2FwRIK^C0u#QqpcBFWx_1Nz+4@`Pv(g8ZG*-ybVvEMlg2N$r}lmW8e(M;8}2gR zSmnqKD2CrfXv+d$R~FDMxg9U4Z6us z@)8u#PKuV+2s^Ak7Xw%k$t4u0?h(+=Du#6B0LLkaMV5N4H{KCtB*+fV*Ed=IZ~+`q zv5XhUd)9b^%t1K&sWF{i4@FEhR*qaH3fCK2KP_7s8QxPFm?2Gc<)i1Mx%hcbeDA^rvA1Ilu(oO$uZ(6BzceVGM8C--KD+UVAI@2KpQ-o!_tax6@Ib=)U z&!W224UCSuJKCPu(@~Hn@OUwH;z;=jQk8OAWzB zgJ?6qQ5#a!z(EMCe3U-p?12VNVK{{m!JUc1Ebj1``rH@A0jWf_AcB!F-dJ1kxP=rm z5NDYzxmgPFM$)>Hk%*d74!Ajc;#k-uTdt)XCd6B zl|G-)=f=ToEU%P6%Y`N7`SjAsnqbJy?LYBEfpz#lOYKsrdsWf`>id#8ovzba?ZfPf zR`-hYD|&!eC3h?*?Ygchic$>_xzAAxbss@f5CoX(bK{> zOymMez9ahbqLWU}lqLTgR5Dk!M@s|LQC7)^#S8d2zoZs}a~fv;-Mh`^_g<#_L^Mvjr^#j$S6r-)04EDxxnkP-V~9d})j&sjkFppZV2K8(7oVOeqEIG> zA!AAC8FPd2jniK~pPx~Iwkl+2PYVZs+n*lA{-O*fZl|6xak+zhLYwLp&T4!~o&ARK zNsgROc=E~PFE^m)BNXI2oVxgn&{ABmWu$dZ!zYiLM#5Gf3p3{??KiK&_I5as6iUIv zeuQ;INH#RDkg`~;@|S8$%{{5)d115EV%;%gT5(Vns4xqsdj@_05Vue_3Ia%2OgnZk z1s?+7&E%Hs2O+mRs3Jkw5f0%VS2Ip;Cq?{D zZ)6Cnj2g-%7WP7Pa8SC5}i?!`na)E0kOytHO-vD z@#Dq*VJLcTc^MT+!KQu`w+idm8nf`uEDQ$*LR@iY zR=pqYKg6AR&wjCQ}Fcp z@|5Ei!1@N`C~|hFG8dIe6_}?Tif+pqM5dcEn+=eeM@mgI(<^gJG``}|_o`ZjlRFm+ zR8A^Q3#+CmXad5t1J(ES4qW_}`!q-3&*{Li#;ij-!O z)TU-kqWpMFv!>~6(}y!Ak6wIMywnkwSW_f6ao8ye& zF9=^oc~1$to^-Gz zgO<_oOPk9b;#F}V7jg?sB*t>gL`NE9|U{2 z#&i3jN2V4_dervqis7pE2X6bCDx3?LTt4w(EkEBz&uGSXmo#zX^i@o zRn#!JSngSN0HlenLb_}Esm(l7(yDhF;3D3MSUg8TJs0D-rRXb-u~z?ZaWDxd`v-|5 zYP25@_wAY@>9#R~FOB@^qq8bX+##Cy#0dC8I9k0Sz9+Px{)DFZGPf$|$=iLUy+7JP zg8zyUeb6CGMKnHFQe=`oBR*fVuNaBwztizdCqADWef~)e!+sx(oy?JhsyLLXG*l!{ z#QTNpXQIg52^_kN3XcKHWTkq;Zg^Tach^%JR&~#}M0^4qW+?*(r(IA0El$^n;dh_SLMaXF3uHo5G@#pJ&v^RT=gtx?ybGENpJ4FDu~V#Y42T zux_n0E**?9InbT+)Opk2rhFzGT%tO6CT-adl2M$^hc9J-MOH9PB_4wF^*6=DE*`zc zsn?OYCGqj}oaq;&Eh=R?`FEmO$cT6pIZ&Rh-vohxZ)%D`S7AzNJ)m_qum7oTBDv@m zMfD(cFnB9mByk!{@{yz4gutOZUGZKom}+__miH9#DCJBIZlS za-5kiG1_At*J?ArLp9jBA2}${P(mOew4r!xptQFe0i?4tPXg0WFQXjYx>RMJ>nB>) zj^6`DwQghObCeFGGwTb@1b)Wmg z%4iv^3g!!eGecJCOA$)IA-RT)Cb-?RA-+P`~^k?`naRH5zl(lDY%dlUoH$^+$ zNl)zxtd(H5hg0XWH=|DLf(iDjfoY7Tq+QWD2eiF@u+v>2lpX(rwRa4XEy}iqt4`Ur zPT96?+qP|+r)=A{ZQHh8b;|YCeYfL#-TmXe=odF5G9xo1f33Cm%(=!Ga}0bzsA=be zMUKHRRG}aloe}Fzzvj3NcS2V?zpnN(o`B6q?4&$_HYhFD0#u(EA8@pGRJdY1eHtkA zr$@uvN_jwseOWn{($W;)fcZVs(Ts#vJH#>#CJ(g5ST zct$WA0~5=8nmKHw3U9myt@0GfZQ3b($}4qfjZ**l2B_*?G?y5UBkl6G`P6YY>}%bh z>7bfJM3q;1p|I=NT%(fuJH3ltS#xL6YVIu~y-K6BY^}J;#zLiWyV#_|#apq#WZ_5t zeWlFT@eHq*jtbyp#tK+$xdK?ej^7JyO{rI03}9m3=9limtk?WZv&&`;q!%5XQ1OXL zC;Lvg>z4HeeD!-*=!z^?u>;gD-UZRF{#m`3e4P~Vp$WFPY+b3>Tm#syy&2vvBpJ-j zKblu@1CC8n6M{{%gi*8ts8h}pyOxg=giX~EpuN$fSAZIEzl}w5pY-^3jT8iyYEEMM0{=7!yzw`ZFdU>B1H({9_3#@{8vL<^lpnAecpKdY7XH@wD^ z3Z#E{+C8?hc_$+gy!r{?Ql!!=@X!PDQw+0a18$shGLo-sMQJsfW80v38I)$es!HKE z1jN4jjrr93h0DGOKRnzPUny(O+>&NTpxbV-#uz1uE#c%zDU<)PP%=dy&rEFZ5fk}a zlxa~vCzFdt`5X*`eUqM~$gWO#Vtv3Ga5~)p0}VQJ#Ekrc(pY`27J8$3FwUZrB)Wfe zWB~>eInE5)av9QZIiMB||4%z`04mqK>oq^_na_wR3EtA{rraxcwL5T*Z2ckdXl~g| z+YFg2oxld$f0eXG@GK~;{_IQ7&v?XtE@}PYCggsSNX7rlbuHb zzovf^*zt`Q97(#}G7n}`)vKu~sk@Czxz4a|>6UbyT+DQN0|dIs|A9JHkq^aMI_;Bg zD^#j4QjTYU^g!8+H^|{SljT#T_uF7@4eWpfMcFhgg+!~$_4L!HI(aLe=C+}N+}g!& zp$@&svpo{d&FI#Abeez&wgsnk`sB-D?NpzjFBxy9a>r`Mro`4y70cSu_VCB&xkd#R z)Sh-2tk`$Zd3oTnO(^0y!Q9l@?IwOAG}Iy)$d!b0#H-h{n8FAl>H;14mc5hmUJMYM?e?*hsHM3HHb4U6>X*_}~Q^##g^cA6S+t zYM)$?f(vJZ&^sQfNq{I>L4~gPXABTo$}DxzF(l>tE|h_2LdZ8mWCqKRKaYals1UPD zUrgu)#U_DcN)BUHz-^Jc%v^m)=yztn6|hR1ewg2|p&w`=cM{JUr=;-4y!8qbMA?Z} zf(15IGR9*AW+l2tGmmJ5;j~?7h5)Se4zIReDT}Zg1N~#6%%kR5s&ozuePcF%mV)jP zkF)r3Vav)Zv3}6nCLV~rs`2~0S$^Pl8iz-S8Uy)zLLvJ8Vj+y48Ig6+Bl?v^@n1r< zV-K&OpeHFkFuS&7QZOr9!G&!haLNP#N79J zAMv2?zd71m9_#s5{Y)3NVgEl;eE)VE{o~$IgK$$?LiwU)Ok+)R?7xvEkr$*O7D6uD(- zd8M0X?O)49#(@iT|_ijHI zO*Sk@kcVkseC?yW)>nG>f?$^%C=`b4YCy?rpqJ5yE3)KpDU{&e)CrxtsJh!2jl5E*S0T2&~>?EEI3wSiOtDlQ(`T2IfP^>9q{*;kNwpL+bE* zvzONBJw@kZJXH69)#n4X=Jk&ALq|29#4F&dd%+*I*Bn z(j@o_crAp5+Lo)P&gRMdWJ!fpS#fe06U3G%xgKewsx*K@Ft3)-{KQEStJI3YxQHN+ zx$aa3gm4ZaQob;NG^xn^R5sF%V0#YN2^M_qs?3c5!wRw~^3{3E(|GGTH@aGmsz^@0 zXKCHWxDtHGFfUrDKe{MDg<=~O0;D1=0%GluObZQSq!QU3x$?^l4X4MQ(vz~mF5HdhU&Q7jjCaw3{5CLM$9Gfcximj$LPbw!98NOXQ6C}GdRiO9~@4PSQ9 z&P~JvK&7*xks-~b`}p1TmQ}G-6|~$*w}nkWwaVM2gYZo#9lSqMQ4*p~Q29rn8_VxI{-^ zI;Av_q@wn$Qz4L7m;*~25-nHixig-@J*6a!*diInV4qgW6JROrB_)MfCX!Z;u9{)d zh-tW=@RHd7$dC3Dx~4u-ZeNU9BLU6ar-Wo5Tqa>(R7O%ZR-8_dM&~!^XyHRO2(6FQI4dPRwkpgpoTmm|3xy*|1;o!e#+PK;9U$2>=KzL!=T)jZd2-4Mxj*H z*ISX6ZzrdmW|5q3U7m2{9L+H#SCVc~oo>3%vT0NP+M0|%iSlM-$sk%XM&QAKvT0I+ zDz*)eDuErttNBJ|T`F9xQJI|j6N4fm3+wR`w>tae2&S}qT2VJFQIAsTR#VQpxT+$> z|Cd_!`Qf0wtW2V(%gK&0q;XYXyQ?XA3$;XpN2hMB0lE0eCiNyC>HT=ozic&$oP)6~ zDu2^(k_NY;D~pu?N8aagM%2;hJ+1LdiR)xQprWXVW7#1+D=VE1Tza)QHZw8lEv1zWx{O>LOQ=7%RyUzuBAn@zVPyfE8;=z`Z^i>NEbb? zPy1+K^hl~A4QFq2wuahW2JcgGYd+rYdcpj&SS#kW(A48bs@TfM=g;V}v0~wrO_)#t z1MvhM*-fV7#yTU=HfD)#Rg{Ll>1D-)SuF{xhsQYUG8v*GRZG&p| zXFC6s_6U6-v{ov2eBs@)X2+y zF?S5xzfyk>1U?+1_m^mfXrGL^uefL5a9J9kJ8!eUa6DpTX7MK3gBDM!REPW)*jzvG z#tLzq!bnFykm1zQ0`%uY3jr4Cdjg021svmtV8{E*mXA9?05HeTH-?Z@CKHmjE&wxA z;`4;xkSC(fFPUnPh>9O0S%Js&XcD3o0D`Av)JO(`OM7VaVt@O=Kb|HvZ2?zgZ=p2^ zZiYq+oy{+AO36C4v{!f29GZ3>#-B;#QZ%k#KM|*Q^q3}!fIKto&nO>!rnt$CU`G9%p;2C&+v^_VFsy+%&G;=G$ zpBJX-!K%s7_f$B~xgXshYPKOuBj>hbf+-S5ZB}=|Nd0!=Qt&E2+>Thy%^=w8h43a0 z$P7ZJ<*uMDz8kO&5Lyf+%^%pF`6uHD$k(9m!nn!N;Wa?pi(~;6s}lV-IxZ9EBvD0l)`%h ztqc>LLHCDBvU-S;1)Q(m(Q#L>vMqDjopZP)Rzvv}cFsB~!*khu5R{cQmB_}K-XnD;5EY-4MU&^$q?oIR;cVQR!=U?-6#*pd&&?sJUz zo0=x!{jpHc&6zqzL@!9jXx#&s+IOR|2jMBvb8$>^RR>6hEGmKD;>&l)BQ1_Mok;7CYR}CtP&ipD%-4vkldR zCK-`jTxT`xqtsCwIzp9e(nM7j)x~H|ZpT>lMRnnbW*fT22G~-oxg#;YA?8V1W^1b2 z9>}tjbVEhM&nu9A~SB`n^Q*h0BsINYxt=DPZ*4eEl`I+SZ=yz59PHa4?Z zc}8mlWme&7pKHKtQOHia6AW2xY1|b+g4+o+m`0+m&2V=vf@Y-nY5Lp^&9M8 zaRsk&CZ2&GtOxi9_xXRqeE#h~^v{@2w6w*KJT$0c>E$CB`!`q^mgxaR5IAHXpHqT1 zr}=Q4zDX);_ki&pAXlQ17nbUBK4f=sMECX=4FGDY3c6}4e6h$qiwV}pcpbjej;UpT z>ul3ZJf;iv20TgdmE{^v!mTZoFL=R?os5RcGQ^&B$wA6fv9(1wd*Mt`ZB9uhRf=j`-PFw8&BkE-FGN~$Q| zU1O7-lM{hbzr-gfnyAG|{KX~Xk^$m_W`RkO6U4;r&n6}(4*RSoJN0U5S_dg;TIDE} z>J%t7G&GZmW+AIID^BtDcl6%NdK^vhadPkz15U=7asuuqCG%~`;Zx_;Lur+OBg3% zt_(MR7%NR`*hg}CoHZH`SIBf?7&D{FxSZdmEMyisp&X)KkzmK5JU`B&?|{#8%2IMl zl_Fs`Gp;PmDoNwzW??Ae-zegjjd4D4=$B_3BtGRZ*L34HM%mnss>ox}7K@fDv$nj9 zbzY>%#+)(PPk8OjvM)%^kmkHIYtb-Ri+UkZ5mbDDJ)Jmdb7rW{;asL0_rOcT2RCZJX0}*%a3-+gkHlcQ8laJT}61 z1-rAh-k3@CY=F=d^qw4B^(0*|bnzL)l$4)GpBS!M^r5@~*F}8Wf(WgCrVest$jO=% zR*tpjJTZ9)J{<)%9t+PzF z1W}IEnRYbIai&UYLe%~hF??vNHYn_^XmDY~s2~r*nqepg(Xp$bScrM8DJ3KYQXvSb zcb7+h)RsSh$>N*K#tb|h-Nw?;7F2}9%VlypHXdg~p(^o1azV+rb=a0{6 z!zpUL-Cg$tyNPNS=+2pvr0~>ojhHPgM+LQn__Yj3EH#Z*ue3%EYFy_as?b;J5coKI%)3mW)rZ9mq zuqIxt-$K~cINw0Y65&f?fX;LW-kg4lST8;5g3np2Jn%LIf1trPzE)t0eU4`NFpfY@VGf2eH zSn`E2nlHUQj5$ut1c#*oI-yk@=c#zx3k*_^sK#hwI0PHXFuxkhfgwkAMyo%ov{l~# zrbC{0Jw>S42-*Yj}_4 zs>24Mr2GtL{s={F`x`H?DX6E_&l!GvduIoe#oJGwNV-Qfy}RtuTA2;4XVtp2oCDqQ?3Npy;=O3(1+xW-~b4qaEF| zRCLV7Yrd`3O?u&Gw}t-*I9Qn?`e>BtI|G9#k_8=CpF6A0c@)WX$2Ux@ZaSw&Co-wD zeBmAf+$ijDc}3I2gHDg2X@wl^1=3Rt4g7@-<@5)Rp&dg4@$>X+$>aT=(rytH@7Cfi z4cL++*1K@$xgDHtdPeSDkycF7{Gpdgb@G=AoQ#ZOlS|UFb&<2D`BvU?ZIon_OUg1X zGG1$DM#Kq`5?5%R2G}BIvieAq|6fP9gll3~B*1GwB_mi3qcdnP0gIrQVBjENLR&sO z=3_a|z}WTB#qHFVnnULUB0MOUnghR%A3M59NYa{4Qlo%lqD@MgjYCN$F=8N*E^VnHd*wM z%wU6NsFvo27T~k#g)FG-ksKxaz1cO z6Lb0*5`V)K{Itwa|2oi@ERePW=Xk?P=VMmJKy4#~nAqo>l84eTv^tyd2OTLCxTyHl;%H-HMkUJ?N<>`9}M)U8Kw6Om3o-?)4%e%r2_?p(Tp$D|ot?=5UO;Zfjhv zIeTA2d2n4)EGxZ++`%O>ne*Z@Ve6-Q4M~-|CgUMQJe8vfWn`FYV-Vgtq~BLZ zr(!u|%Npu7-8Gij16G6S z4O=P?lXCqb<^ChMH2m`#xti9i?e3me?pD+A~0pnLw?Jl;+)frWL#GX&Fie^UmF*9sKGqZ zp9YWchd`3~pJ`nFxzCG{mi_i`wM6geCn9KxzIrI?&pa>J=3 zXy>>O@5lYbr30mFRWPTU@xjG}=YLUqxYdTOQG1a535=X`DrD?p5TdmUXRruNT25rt zjF#~nNuSE{rmNn9a<0UL@oS{!T@|_^!w=cZW1#$(Lr(7$216|eQL?PtP8(;@$wtz4 zHo_5Q@l32C;*sIXl>GKHhJ{4Fs~QRO?aDL5iQXj{X~f0YM=1PL!H9JR!Yc$>AB7bm z=E_|8GCMW&ifwsTzZF7uNz~Dk9)hPQyvY|-((VWe@2gXh`yv^zk)%%p^d+dogNar# z=}j??rz`4Sm`z^3zu_A{ugT-EWsfCAtWf|1AdyQ@+Jt}qvfG5I6u4{yW1jKQBedhK zg`l1Z>~-12$9BgJZBNLR-J5h4vb(;9)bjebStPKsi(IIm?K=C(cToAyx6IX6&P?C& z#|+Kd+WepUO(JQ1J7F6q2lsz8o(WSnNc8X{-!d#~Bv#@J02YKV7Pvv0#Q{;nWcQ^#$32FleQ*S-yct( zV165FHThAND2cU3gY^iMG}RrgeR5F`_yZl zqg!lO2p>6UrLD)k5j9G?A;FJ%b|abcv2c16JBDV|P;Ck!cX za->EYqU$JdcN3FeP^jP>OLgE*G--HLovs4<%JfVfDhESj#HA?pU;~;N!W?)ucO9TJ z_2VC0qH~+)h0iOtNk1mR%|e8N@u)TS7#CiYmMmP7R&^;FHly}C4sIZ_Y>XUj5V~Oh z#!BsB=kNP@&e=-sdev<^5}{SiP_ns6uWidcYEtdu907aPD{vj#6^9#2;h>QdH>?w9d@!65 zBU}7ETiJ`K`lN{CXP!OC8>7m-$NJZbku2W0aSI6maEb;1ApJjg`Th4*H}ns>%+|y` zVGK&@7hnN6KVZTb15H@$Z;4-Kbm586l48m_B(!6JV^W!E0CmmE6-`iPO-)JbkVQpK z^5mKVLUSsSRa;h;nm>=GNDa-6_C=7C?@sl2KJYrcos~&eSN6Y|jx*dRyeHdZ1vi_X z@V!#ZeUZVdrTPhI>Z_@LEH)1VKL7Sxq-{}6nL5NqYIb68QC#LEot-dkl6;;Ny#}DQ z7&b(8pAO-?#DjaQo4JmgMMgDCJfP4v?^R%S9}D9*PbBNE)DmJP+``CzNauM;3UyOY zY2$8I?cwfikq7MD8KAkG=)pZhTIZm3ojxeI^^87AI@U0OF>U4q2DFnKEvWCQ6!jVxg6DaQwDwRU@R1fW()q&fgP*8t z;ilE6XzN5BMP$GY>0wP|Fl^B;!eujz()p+FRWeYODitrYCU!|ndOH{fO2JW-ZN1vg zLYrwBm##fZE)+v;0jK#FQHy5WGoN;2SA@cyOmMGWacmr2zsevuk%3Ai2AmUVrCn}Z zf|zF)0{!|F`Vd!^3D-3JA9U50VKq~tH5!(EoW^A6wLdDJgJMo2Qo(;j9VcAFFwafPP|9=GGErakmAfs6#q*1TltqgB=Ft*ATzD+v7i` zqW9>RFKCj$E(pz!W1(C&C#p0P%6s&_920CxzXQgIuU`;xBmpgCl;N_}7AHiW{>-sb z9krH1&ubD2!eLrQJD%%@=@+)#$MhMpE1B(Dgic%LNXSq|?uh}4@U5qkkj6t9Pm`WY z9m-_thm@4%I!4hdhE{`D2gPW2VXV^wcmn3I&yn8mSJH{?pPW4qT+JM+IMiCZ1LQHi zGssxf$E*{IG$%?GK<#N#LI|%mtu@k>j0mDs?j>P@D+g(`(^wa3;?MithRULr#elH4 z9+cO%ypS~Ak`cP}{9Qp^d4%aRLxH^d&h~BasZjfT_(q1;dlPRoxOMm##OWz!|@fA#F0JBh?%`~ zXZj&LGE};Br}`m1Vt~O-+QCf=O?&#nsiVZ^jf|VT@F6(Ddl%myk91{)Qn1)zT)H410~*|bIO62MF{R*BdfK>euVV?>4Y;elUOx;??DT;(bNT|OvwRy7t$LRp z@_p`xV>?>6y?C1(J)lOL(Bj+~=;|z>c18guYc}2|X^*aDFxsM+i@2YMoJg3mW*dAT~6D4+Z zZV{F0(X?y6NvB@4%iEm6@TxUu0^bsKSYbg0SK|eVmX#}JK_RR9YLQtzT=6UTA-aME zWRIVsyex%v=1!mYbTQBi;WA8kh4dmUW$0$!=(D8)4@ynO$(pX62o;7NK;g`yNGzI` zri>GjTtP>XSYgqq`X}f-S}z?1rn2%{JauWy+WPs4Md1zB_&9_(`K!H9Rw}SOBBSH%a({?ushBpLgK<9l zR1SThZWURV?<3f3GV0)plNXiI<5UVR2Nq%gQP)%0S;Nx;Z<{RIg?%e(zaWdd@_UQE zkH`C3d}C0bAbpZp2XB#6jYhl%Gq@zA(<5O-mNHAxt8w@^?rQ4Na~xdOA;i85flvV| zgp=F*Abx=gPoW;ua~~pM=A~24m1>xh)yz5lNrjEdc5e6Gy*285zwyRPRF##G$rBw* z6oWD5lgK=g?WCxI;>=MoIm`Zn0+h*B3j5)BI6vC7T5kh-0YASq9I{^b-L7iUqaubLy^JM}mEE}n)01H8Qk(|#B-+wt|` z-x%z0sj3Eir*-fbO`{++lvBBu!}i^~$-eTdoNQ&{kym+hw0@^$B|K3de(bNGZ{IbL~S2yF)1a8$UMFFsLB20H6+nl_jU$3Q_S7_(|0gBvj)DCGAxQI5BswP*(mh4n;=^;n&?SRjYgwc=m%0;cRRtAMo9adDY* z`Z;xohO60uT9bveGebg?0vOW=rYy&Xu-;k_K+3I*eHDo$GD4Pq>NIB-e)?*S_4u+vW!SOewStKt2ky&6y zmO~RRFgQ%rX=U8u6EMf&^z(bXXl1Sj4w1dbBXCmNv4lJ5nZKD%KH0j)_|F?ZQ@2+m zF+SM{p*ZO{n*g1k^IE?ENXDojg6luY&H{V-mQ}YS6(}BGB-;k~YEkiHtf{qIQsp{> z^h*l_FYKuY8pFfwpcM5P6@OgxzTlDe;1&1mN%|k8f>Y8!YvxL9>8%i3-R%^sHFQ#; zr$|D$BWSK4*oq6yW(FcDtua4yATIPdQ^#TTakXp>J3>-JUa;7hDSrb><#Hxj13n}A zru2SQOKG%O?;iy!j3tQ|IjiL$Opk+Gy5iw)GF0AzJ{AU@#A)6hKj$zI6?CyQ{b9Ij z4uKG_p4{7XS%R;q=?`US$8Lt&{35495Ixrr)V7Stlcb0{ZRgPTU1V{v)Y=%+(6%1UEu}G-Y8kVTZ~*0&CHCcK3g{^vNU!Pg6RhaFRx_ecZpCYW35*7-5e9 zCjXIp4ss~b0%Na znT>>k7LzGr?>1dKe`Z@jGv*xr3%pUMVFx!{)HsvxvNMtIgR=Bakk9-3 zEeE&on_cr;M)SL&`OCcdE3NrUu=&eF^Sdg4hcyEW`B3#nbP5+)yhjhN_`3eVcsDv@ z*eNp_j1DMf7kd9ik!76sPoz~e)wc5zv^5Kb9bUDwY0tkgE>_QKLQg*}b@k7Ioa_JG zTASO_3OJjX7(2+>+FB9)@3;JN;{V-AC&lzh4Di8+e3#MF(>E#W_6d5N=?q4aQX>D7 zfC53VU7-6zE=iE_r!?lc??+cVC>?>!g`73;!AQ6B!I-0ag9k8ekGV_MOOIbZw0%F3 z?}ikRQdqz#kQ$lARFQ-pATb|0CvEI7B%8?{F}_+)BcZa4ELo;3U-mv$kpyEW9`c#QXS*_(HvA9ho6okm0H&zO;hnd^=oBTEehx6T727#qIUrB09Vbo0>?7xAO- zlf6c=K{fMA(_)bRMJ`iHTRQbhyt=@>DrFAeX&%gsV@oc0|xc$&Q*`)h;gGYHP{*iPx4|A?|XgUBETGh5z*w1eZ=#3o*z2|9Q{rd?X4I=R(=o&*Ks{5K{xU&gNCNg z@}>F&gF}Nmpu;v3v*)DVQn?BWJX2-8pUzPIgnIMvA_{ef2IC`D_(Z$LyG2#f&pi=_J49s=!BC0?H=!Lu~3R4KIkR(yQ3p zSNQ-_ze(%-Z-B5^oC? zpI*W@TuBVcQ+!&?qFs^53waM4Jb^b;?$7qD{HqOucMsSB}A>Bn~aQI%#&eY+0D4NoSANY&5p@NJ|jZQ)nqr; zGTABbCS9IKUk^#bE;iv)-e5EGmOx6pF>7kj8CDZUJW#&pDoLTnthq$uoULD3%~?C% ztX0=%hH30cV9DgOzR6-HYhA`?_3NXNhtbS87cq219nh{?(8= zhWAVCi$eKH{yL^3lZ7SL422~fM>J!Rvb3{MqEV?@e4f6#koqvB6G8<;b|1WaoPPg) zTcJ?p*b8Q&8cMXErR|74;MEiSv5M7&W{jqEX49fhSvkAnC1*@@o>BJ1zH?;fnVGRn zUYMb~s4gF=Ik_{6>}1U^g9uOdxEZ5@5K5xpRX~Kh9I0aUU@cdon8D5$k-u@Sbbt3d z)3~Bu)Yw;J^9Vm(@Epq&vYZ^(_Ji4e{W)K8jk+UJ#F_As2~8ky?xP`wOQLY@&!S0k zU-(EAm96C+VvdG8eF|SNToJNGrB64}cEdaQJqru(7lkY1kWTrbHMiOaNB&2Dowz>U zBwZz;5ptHSs0F`}k(c1MziDQ+1%>~u`1D9Bp#}QQ+ z+H-*x;RT1D$La6oZ}h=88iAqfY-^^f1c6y+!nRl-Gg5%-{Y=x&n|!pC&B2#T1|Iw? z%Id0F8G&|guNn~EgrJkAV7N4#ARssU-X)as&7}}4#P@2%){u*!6V9-OL>rQwK5ka& z-`DK1ueCt(Y(c&_)<(m3#xuPmf8{qyQ*#VPML(hPGj0}OgueLb5vaGnr?R4N1So6@ z)W?VpaTwtwqHfMXdH5an(jgq6PT457x`s&+3Ke26c_yl`Zw{g3>iv>6 zYfe!^Qy#YDk);aR<#qdQ;HEWL)e{bg5U@_Um8%Js%ZT6|?8-VfK2j|`2n?B!B5U@0 zQ=Q?e08uA5?55QS8=v7}A5!RtnI=uhH z`@?$8t7;viCCF!4@+g!qE~TsdrlLv&p2E z?$glYwo4%C?nQ*dSTX$NMq-xHgVN1-0WFdCnrPYC^F(s&?1GDIXUhy?GEyR^-ebPn zcoLn5a0Z7-frE0q{?pMZlZD4w%PN^o8fYNt#8EjWv|)>IR+vPIcSsx;HBS^dc^)Dw z-jhG4_KewLgf5;j8&743=`F!y4poD2_C1`Ew;{fMn< zTQ#sO8JL=1QykKQAQ~_tkuxu@60Bjq?Bp8%fi8nDOj#BsGaaj%_ZPEj?SrQALvqmK zPJ7Tb_BXHkhOh5BPr!;-v{_HFZ@>Ztw_s>%q+nc;0o=){ zeoG^r{!(dES9+CK42^zkQ0NgxN6-bmDQUIg~Iv+!Omh zodhPz9Leh^j5POK}gW*@WxcB7UH|App zokR9c-mPS9(6v3BrSyjPzbl7w7K2nFUiC1}&*+0Q=Ff!J|Fv=mn(5ov7+VSHJL&(U zX#D@6?bIP4K9PSdcv!Dd2t2YKU;r>UM=Ssd72+bDILUvFI7~{x7phq{Ej2GUD^WHp z7eY1X2S|hklxo|VZ~bkGwBFLNY^w6S^1b$COoPVfyFcoFzvli+^}TjILHONq^4rhc zA{R_}^}0`MGjU=K*8MYl(uZPT#^|LDn$x&-El_tiMZiH4*JV!yj%1(3y-Pb}tG-!u z`8sw_2JX6FC(XI7RyKP}z`14eI&RGe4t7^34JWbb{qV^L4!5_)=%uOhQ^dvhq7R>o zjDqK|e}IN-zt3&+u>U4#|F6JZDRfNRZ7Y!!F!Q0hX`B!HmFb`|1}O+Shsi4)Q%xo*NswIzj|# zf8FVQuNO#@oPKYo8dDs!NCIU*+;l9^aSVaC^3=R>1?I6TO@&oyWmT0{5uLfSGu5^R z?j<-&Q}B33z?dEpHcT?`gXydea*XtiwRyw{MJXGG$%HXI z&(MGlMogU@3`i!*!^&*Q?7rh;wl#{MoMBVx(k}T2hiORBfw4767TYsOkoQhC#wQFV zoahi#SIDV)J;NYMkfk~j0}P^kuNKs+v1Ysd)AhfgW7kz^;v$x0m=RzJ_()lR&SQED z?df`;ha;+X3f@A5(<;L6d2mMP4qikGjp4g_;f$VxUK7o%I(=q|LkE+uDgNCe>siVo_zOs@OobW(cg*0c+5ylsZ**Wl#}q z%CB0>oK$wGH_w!W-ALcSh-SKgZ)By3Tp~xd++Y4QKo%Mv)Ff1m30z0325tz^AL z;9;2sU4IStm%U5#C*pwdqVdex_oeaDhX*w-#WrS4)MkgS9O6iEz--lOgVqYKK#}1{ z29QHv7F0>ob4^?-cjH3kEx*SY6X8qJ+*LExgQ8JptIH`!o`V#Ofd|@e7BeNlh=8K2 zK)Nf2tYcW=!-hz6PsL&!3Cf^^)(W+rTu(DZ4;h0zjx$M9!y}hfRRf|nLx~B6@xohy zXS@1-%CvGR;|ipM-SvY0ZU%SSp@RpQaPo1%e1r=#R+cR|3vFh^h)$G@;hea1{nbp0 z8^toRJ~e&vyj*g=w_2d0$0AXoRt#xFv!m#k(nNYypyTL7Y`D)phH3koc=$>?HQfYV zrzKp+jC4Sc3wLu7`C_$j_o5&QbMAPlzG; z!4KKGYk0mor}FG=tiC#j>hWz1a^{5WUXOIwt=dc0UilyH6)e62q_w{-o`Y9&SM8rw(3Bb|mpzk(O-Q|y)-Xd1hq5cZa|*4< zsRUHjH0@sPV9;qWK5zbhY_w%ENuycBHSy;AE`@m1vxl4D0akO`EA$SuYFy3`Mbq0- za(80T_&)e+=mM{~-V$a?aZ9=UIRy_Aw&T;Z-{uDvgy~c$6<>l5uJ|5w&B*D0O$L z$QWBt%!+X^T#kDP$n2sc`SGZmUS05na)Qw+5)V{pMO(1vk|s zH_f`O8)LT;qnl7MiAtcXOz(Jwg7J)wd4ssPGUM(*%pF11 zJ{(^uLyltSgCko_78qDF7?#ZD$H%G+Qm4kt1Ae0B{f1UJF%6U4 z{z!L3!w2M2eG91(rmJ$<#9NM&nI{km*?D zxitsxN9&N82&9JV(%we1jCnw z8TPRFo2kMpXi3kh6n`}z(mtGGUsRjkr!>T%12ftG9QHYgMU2 zB9#)#yJ)$JbQ6aO4Ui!fl)k-6j9dYOgriM6lWug4I`ni)#1`E*5ZQWhe_3rO17cQd(TNkXQ-+qQ0`#XEPG`6 zE+mmDpD5iXIHc=@Uv}U_U!SS16w3I|eU>6EWH%%fr0V6Fz4@TbFg8D#N$J!5UYOpF zpdzIhk7Jci%^l*tMIwv49~oAu`PayjTLMvyE>o20)^Sj(-k_|s=EPbbEP@+KS~gV< zvx0UK6&SMJ+3<7JQp$aKs7Al{#Z`^Kx(gzs3Mc z_GkOIob{|jf1_x$?1N6Rm*_>;ZmrX9V8!&hNPqu-jGY6MCSSMZ%XXKZVwY{R%eHOX zwr#V^R+rgj+qP|E>L2$`+&gc~%zGm;KR{-j+>GnO8iwpf=vMLl^w32 z86s~;*WW=b#ujXpLa{4@)!yM zy*D1&IjH5CVQyY+MH+z+tVfP;_6#e(dXC>EUVIVCJhuwk=*iyjSgK<^=VPDAIDAp6 zzU*Jo_ZOH88#f~Jx#Z2;f3$i!Sv;**kkU&AT|&?t41WEKcIjguw;uUhy9D~(mi_f_ zPZ~nz4&St70e2^3eg_AAcUfnrZ;8C3(>IyG`agTL3Tyv}lz3!Vn@2Y;(JSTEa8nv5QdAt@~?}_#rT)oMzG_2enuaC14IvwL*+6Yul+%`y7~*tYe>A zwvcnCSguC>JT*pAjy)OgbLO8KOGO8$z}l%m%dQyI4no?6ZCKWk;p(LUVGlhzlBJ>@ z3q|8vO!w}tkyPf71%*Xif2L}0Q&SKNQMy>Yuc!u|*dW^2rZY95yF`i9yk9a})B*`^ z6vVA}(E~rOlj%G(Lim3L!w7bqD+pK9I0-TCGds3Vox+{i=lEsr@VyvFXFyB(9&39~ z>e@jvshQY)sWXGNoc@Fz>S0mBbyKsm!xe^PlQU}h*wUcipAafOUAli~-&jryLxC2+ zNFiryik7|Akp<%tiEC@0h$G<7AT&Fhlw+Q&`-M)!Bcm6;nJj%3O}qS#A`Bg28b`z> z+3vhLG(4q@&_kJv?5PokPxy(v=s7xQ7iEQD|A$1a-vvjq!7ot|)%%VQ^}s%W9gw|$ zJZ@K$z^1%13aJ*%1}Vn<$!{Sls(iaC8?*wgk6uF9JBO;dKQ%pSsL$*|V*y?W{{Wm| zOV%+$t{cgotv?Z#nCG|arPPBzE^oY9KeVeA4${<|+9H?(ccut8DfA zX8gCSP0HNS$=F6v-^$8B-_Y_u7MOPw157U;s?gC;T50k&2`cg0vbsnmVL-sg)T=ma zHMY0`g6Tgdl{7u$J=DJL>&>$dHxM;_96~q-!trW_rL2(RxzTi_iNrsns9S1B z`A$#jdulA-V?h=B$;t2y?~#XHp){N^&mv>XN~g*G`RJCkDrt4y`~Xc->Mu;`G9N&1 zLrIcxYMHl2m<k0AanH0bk3Z>=R_&wqR1Z`Fs?vg661*mnz%;5*%p<=;QBt)afv z_viGD`*5VSbFj5Dc5pH`cC=QKv|STH>cYPE#bgg9_7iB272FYkd?64rqeLrSpNDc# zix+e-bV%LM&QSO!X8C*z)rz8NQB#?=d}3F;`LCP?2OVX46iU<3t46QItdTtq(o&k3 zT47ePJQ~GPYoKe+hp|Y{O6y`|Wp(6Cr0qPGz$+I(3Cm^~*sKC%!xRpo{%%^SE;TD1 zXHYEpnDt(EA|wL^OL(4Ec@~1mQBE~lRawkJz)tY>+m~roONV=}1}RE zqxzn;c;o}^T8c>-2N0CI)Ja-w8 zo|vLt(Aj^=PmhtN!N%F|e*3i)94#a3qAg$h*0;(zftwMV8y2`8K5mdV4|Wn9Vs zM!8!8l(m(ahRK-03DH@HXDQg%FUJ0p9|5I^`9Q0*8sYv<_OF%}T*uETdmQkYT!>N& zl&l>PNqydrcpt-w%%-&+G*FafG#H}n1(>>d6{Y97#1Axj$gc47ocYn@=U+$}kr3&L z-|-X-1RX=uP@i&%Ua+&mJ(?w%FO7_Jx)1^9q&lnxHONBMWDj6>g`9aA(tz?AAM+L* z>0cp(wI(fGdd;k|<%=(CX#?*j8nKJJUOWbVCd}yaXcb+-jI4mOLrbnkxY3TR;=ehT zf5~hyiwf*Q0Yq9&r|I38l;^OE3ARewUqh9f>WZWc2`^Xdv;z4Gyr*GXAuT8x;J3*a zr`$QkZcKaB9Ps|R!GWa@zyjiX2zP<;|Jt1|h5d2?{_f06Ap!x>|JzSf*1+QX&!_N> z;4%Kstbk+{Ye#HVG@t5*+0jwTnCzB*d!r?DEaH{A)oqB{z&W*W>=Ku`LGe}gj;f`l zTTbi|v5I-|Ifb8cqn0PI_wW#yY4o7u(<$uW5WLs%zP-BNNyJB++KYb*mQNrzmK<~L zzD1E76~5m0OTIvugHvych<|GWg*}{4wzBYl(5;NNwg#!4~pyoXg`#lJ1RqJ zisU2<5PY$*T2LT;{%W4^RD__hXtCH!PfV5Vv|;6_deEgkdtlM+VoSVal6H|GJ(U~# zpDQ)0(5{X()ssg`!cWoMww$Ys4wPBAEB#dYOD$)G?qId`xE`T>Z+V$jiGkg9hGyDQ zmQ->Pp`F4~PI80=3;TzZzBavFlZKbcXCZY@BhA8ms`_mRM|ANFWH*U#bP=0l>Y|b_ z(@+)X#N8s7dsjuvSE_qh`f$pTQu(Ne?=49)UY415YGhU2b8=7oNNJ(2^Uh^L`R#i8 z8bf;(b3I`5q?P34*|d-c|GHqCFvMQm7vn&b(%0~_)4-zyA9WaK-K>d~n>?4#h&@q`>3A00{_z(|nG1xpy=pE*W z$M3N>2v08K&}m!ejXHPY$F|ApjCSDy(F#4{e!!u3iqWk;kO3S<$z3}wvK@=5Kgx>l zi^+d@Wopt@9XJ(t=?o5MDl7fZAa$~Of`Xwra_q#pnIiW zkM;52v0$pmC`5A?mRT<3{)K9E1vn9Vil~eh1!lSNhW*uzDE&U%8+#KGjN)UkqnxE! zvBc`C_hG31Ed*41E>rME`&A#O2u!~2`I6~2*Q@Ea*30Flsu%jWRKG$2O3{=9U(_sP zc4)DYdR~MpQ=pQF_EqVrF4LY<(k4g9R;Jrv8@bs{esoI%{A0nMu}wP2xc_H*n`CL` zg~LG2N(_GTG7_voqzInKHM^|{sBDQ*(K#K&LVw0ab2$DFW|b;!<4ie^(VEZU|oq6h4IbtgckJh18 z5MXd1TQc`@gD{Uad#%HIL&G)%I*|T?7hJOu)81n?$9I6=@kDbC-|&uthK6|{t;zKx zc!h9>v?{t{K?`z+>hJ`Gnv1S*p{{a?07w>8Fx7-lSyvZ-&%GLeQADx!Gz!~UGqd3I z@}Ts7Bsx8dLKUUln-k)C*!_4b-U@x-Wz1evo%zH#591$mauMSFV+81fJXY2E!O52x zag$L)vYA`hZ$Ib~V1#F=M8>l6R#u;jhd*e_a-ks9-tY6`ZV+qN`J*nj43DX2Y6uzX zhwkw~LG+H<@sxZo)MR=#W`wrPDn6WgE5sH)WyTz47%P;dmxW+EfZL} zIkZa@0)(D0uKQ2KI9i6LO|ol8`QJ5nV>p7qRPgje^AXwW+9hxfGiN8B-2)d7*_FNkWy zT55QERrsmol434V2~YnN2qjHZBWh7a&N^&|0Q1EVvHoe~Sa@`GoDmai?CBG|aXPLx z;7v5B*R+<_ij2Yb>+@+lm+(&~J%^4V3(t_+H%)+hsvaZFdrAEloyg7k!4;THq8!)W zyOEf~PbX607jf-=fCTS=RJeH?pr2QO>&{i=9de_CH`0;dOi(|+5M(iTHI0fb!+`|t zVDyE2hLpVOl2ZWD^($ab8uO+x6v|J>2ILgVU&IMya1~z}M`km6ZZbMc$9&}Eq% z;q-2X=T_S-V#`+o=U)qp<`MG9#MiexIA3VpnA(8LZ0h@UfhUp5Eu^z%*B*r}yidyk z)%-NP`KTACY)@XHDahLSjweu~&AH8*p2O0VqY>3cj<^42xc+BkrObw1Q1SgcrAGRn z>~s~3?X1iVzq6ZdZT|c5Faxx@nR>QhM^-4KYXPOXiUbfC+dzr|q;^v?F+tj7L zHWTEC`0Btt_o?+W$8_`K?d#J4xBJLmeF$$KYdS_9*Rj^QdeXv8ChqPbZE2?)tsk6$ zyQXJOZd$(^Lr}giKg4nORe>kPIco@(GsB*LDAG;5uh~iH=1+|69#_BzT3zQ)p&GO2 z>g~^*5LL8!v_rH)QEgjRYudCG4ytSxZzfwVlhvnl^NKjyR~KHMo@k~_23*I*+gCKq zl@4|CsJ6qX12oigP9Bd%E#^7*xpZm#6?Q^Xt8N!7U$Gvd5x*gqIig8{nG&(FtgEea zlOt&GQ)Jgcg=uCBu0=I_pVix#%sF=j4bhFt^k4cOP0OJ|3%T{?WB#&^A)~o}&~I5! zn$Chqr-uWyD8iN+Ta?ehm#F9KsH4s++{z0M6Ng_=@_*#=zItE= zj&J&Zm6`EtcRLAveFyfOf}&X!+nRGW6(;%R}-RdI1@Hdr$-RN^`RA= z98EEG?Yg;z({h;bax2!$OeRp<_&X9)WC(unvEnzOd-u|KsGpV6aIeTKZ+G@0faVTp zLg01t8f*(j4g&%&%Ot9S%9&1zaub@FTKQvjX`e2li?Ail$m`)w-x zor-S}j3IoYaxtGNHj4wInWjb$)V)ulxD1c1;%^=;=#8P%duxwcbNr|D=)m2Sb4<0# zL=$RuOd)(?bi>Fy3iKDc+udSmjxUkW*fy80{rw}Ki~MzW1VKrQUuIgSSS`0ve5!uh zdj^)7)fc6OA9Cp+*Y_9Gi1XiNml7FSrqKPBZ~XfUL}In_Aa>-km1jl00^}jU*28C~ z@M21yzp9J5NRO&$y_g}slG5LSj$v49)P`RmVp3gf7d3$ zG04%e{ERXw>DF|9ZJUO z^hBeC1mf4q$}k;s*W?d^x<*Ufc&Tzv+|$*xX*^9L-6YN?yC|jOPpl_^!q9UEPHLNC zA$Hgf@+%L;!7V@u%lcdU&qac!Dqf}`$uZ#XXck-5Y| zo{2e%oE#H}9R2*s>-UvEhVA6~P`U{*Bx5loMO^(jfp3_2h`5#_`=lC4`tY*rL6dbj z_h!d4$d@_&cH8l{beBOSsfxY=8)RXTC$GZH5gZQmj^Oen1yRBXW!g($Fa>m29H@~) zZPmKHM&(p^T*F!q<{Q3(f&n*X<6-s{ue0r90}ILxPhzLG)1M3(vfe={i;K=y?GYDj z#NJXog{1j6Y66*R;S{PiA3EzZ9@TsoGD0;3n;4S)i?0UwL>?02{nZ9X@E$i2&nff? z41Gi$~m2i!4x;De7K4(~;bv8nRgu}Q*} zcFkfVH9OWF{3o^sXtpEAbo6Xom}Ldej6_RQW=&ETX^;w>*OW2#XnDz0&zwvp3QLi0Fh9m;ZffH|v_bIwL&QhnTV&!S zjb7!C!!y5UiMIMw%;Ebbt$X<4C2HSduVVevombz!Qs1b30bcB1JN9#?hpa2$5QU zap4YafghhE_2fr=5~Pgt1jz2to@R)uxRB;Dxfyax{c-ByNbFz7pI|eW*dXNRSk`QX zFOYmzEb&T?=X73Tz_freG1fyiI;gO3g_QT>F{HT&~ z6$-W3JzLJtccxc3W44I5LhAja#5aG8Sopu{mRd2uD9%6OAJ1ekY~PVu^?_yypUnp% zc%ikkVO^`3gGv7QTV(h*(F7aV)ofX$pvqLBq!on`KaQJE(DIGN=^dFyppZ~_a9=)Q zFG|Vq<6i_T)(ee?W2ittNL2q5!HU{H9pwLzNdHGyuSy--3wt5`YtyU{FtR5klTX~V z&khNu-sPb0z!~m{L>BYIfUSok%vjPz2z5k^(VpDDch-Tr7N=eFvb~T-9~SI<8ceZG zd$Os0jb_7I(wsxm+_hb@6}s^2YQl`$lPTU;-Pd3EC-*TjzB9+#_?@Cx zcl(eXM}qj?Lil&9vTklsp1G&@>cF@dK>&gl`4)R~fd~0Gog@EDY(y1U=^t&h9lRM5 zSIsh~5dOlNP_4<)sZyIOV1h$n0!VWUwp$U~;y{G9vEfm8T`-)eyNd%kLGf zIChp+dOensACP8YV@X4=XJ%LLZQo@%dL;hAl6EOk*k*w>ryU7K zvBDEzkrm0A-)hDfAF;U482;$iR7{pCw#aN4cdCIeE!@5fu)1Surrw(W<9KkJa`3yZ zN++(X+`NdzrSZuLW_FsDj5Z9^1XQF>sEH^eT)#nCj-Sxk$HTRQXd`hHy4;ML&BJG& zyOb#V^mxQ*w@gc#IdwDfxKy1MAHGa$oqM&OJziq}6s)xmUUQ5MRzbDUklonIkPyxG zbY%{2szGQiF%7VkcInrhkAywASeUVvJbar@rq2;y&C%|oORKXrw?Z+cRG)w>>!#W1 zZUo2GjXFpQAw@2-H&bexIVI4js-EtUeYuru9N zqk7Vx!IU#VT1gI<>L41*94q>LcZX!m#p+DFHv@+x)ZV^FG2F~<6~P2fizCIHBzWnM ztXo&rulPGF;;K<8Kjh54Q*2vxs;`P$sn2pEl$f+Nl}EMh2h3ByXL~_ZHz?;U7z~gz z_!xWq8e}!eMf5g~ND@o90Pm#`CHfVMt8)p%)uoitAL{nwMtvad97UbJ0}&P+ofkC*zG7EpO0D#&zmX0vhqigQ`VPaEUppIL-lC zS~7CBB?dHlhEJeLjM*cO=!+dLg6 z95M_|eE6qzYV$s{gp%{dv~b14yl%~)eunYfSgB~Nu@7M-&Jz|oN>lUECNWGA6vq2Y zF0?!v=qmE%)7%_uLuUT~xkfvtpcaV>r>xU7W zY;7YWxyu?S`P@03>6Z|!M5%CpN{7%Et{r88P`J|wY+}S0J%J8nokQnm$`Y#Tz>QTV zG8JU0W3gw2kgjABDp0eXCh$ngBwFW=nFxf;4O*}~)(GqpMFcct#Ukivz?GiGh^oqdky@)nss02)(e{e zd6(vuH={D*W;w=d+xm?^17)X&j?LEuh|F}jD{-$|G;!O_n-LJ`pk5ZXCK&@lnBIC)}(f<5e zL|q5>#HJP(Iv0}_TO=((*g~mD8}adY7FkkFPvW}$?@Tw+#7Q_q7DTYh5LuhZ zLketp+uuP4t7{C^aK1W?Y%Lz~WqI7XEMA^33Iiuc&rt;(f*wsU%(S`}FgNE@6-e1f z-mQ!-d}kIzyi5wcy&sE#^;`t5hB}ob)3$$G6kVtyO;2Y z6pSJ#R-4USVso|ixMT+u*dc^W5GyP5h|6%q66;Kxo1YB?ERcp&%bDW)yY6GvJmy~?%NN60M5UW8tVw}`fO)e$rpA_^}0 zkG-ayb~spOWeExKh)8xlqO_177!-(l3OHqhrhV0NHiKPY%*~nuFD2c%~`a z9gJBmk!9)36#Pe{h@^_!@q$T0rxCBhay<1eKFyfBsmy^h=XRZTH+By;@<~h$ zDo0{G4O0bBdgt$ssT@2FD99Y8Dy^y{AY|}E+iCS#SzxkvHiu;@Nl@(;nb(TN1>HRzQwqMnGzkAu3Ytw8qF~5qf*-4ojp5>7MFZN|2RHkG_1) znjS3VuT;=K=E;bAaiTykNI!o;#2yzYmTnF#{GqO(FJtzx$IAAP!IuxM#i}zaDXMmG9%>t zB9=cZLs*_5FZ5um_pwD#p3ATFYsj8XKh*C^HQ))kzT36whm0v zri5_bEbFD`O-D3Lj9hJFu7GUHrhv^7KZN?KN(F>cBrqK#vZp5blmLZkzTfNDo{cjz z`b7Cq#rBK)^TnaJr%)O{c)aBan4Avy^UAfcFbDU~CPF!MCvDMAnJsV8I)eflfn#>!I*boO3wAOa|(i)wWdi) zmjX{B^RLoKP>_w9)uf4FM4mXcvIkeAmCQaE6r&E1)^fpvPjB%P*l5U{858XAbAgi9 zE2bo~twyxRSEn*a^xQ#ERqIBpvr^+rU0hlBWk}^r0ZDa}P~BuwXx|A^njE}?eiRf{ zqNV&96x!A=a*Zp-`?tj9y(` zJgQ-uQCVI5YvhmVj)0_dsJRHm_v$B91YZiidoH;O{-2vEU<;JH5h8RxOxQ9Z>JajjX=-`VMgxi}w6Wi12MvPrbF_5< zv`7`iHO_hlkjb+X3RHSSi`_nL!WP|ue0CM{-BMcIE|T!$0gpC)oQj~qS%#ARB@K#Z zVn-k+?=q6-T(!|Wjr1tz1#^q4c*S;#3$-4imEfn&N22jwT%q&Sfi=p3%7;=TDPu}33Iln~ z29kX6O*b)&j-u*5q4#Kzw;J1ob;0YqR>SSdgJD%l#7*+)%QE_Pfrnv^$4+&LDPgP{ zz^1<>8|GAIcA)atND!?wHII1#g*63%-f#{@kKKYSwb&&$QS`lFz z%(}$p(aVC?ga_M|+6H7RTzcB?t0b|9(wA!qOqbq6j|NHS1hvoF9^D4^@aT6Ae@~D} zibbgr5C+xN*CVKfw$8|tKFCpBCFT?=v4LSP`6EwNsFtL{{Mv_ie;xr;jeetCIt8d- zhN|m;9q617Q~#h|aL@YpJiS5APa#Q9+xwo`-{LAZKPA9Tt==|~8 zWky_jB|^vEPDA)K2F5)D`S92)rZ+v_r6Ep&(;-4X3cMobzAVh6#N;a zA_`j*nX+{SX82ov0;iExwjEk3$9*o>qn5NTFYZ+7osCE3-A_Gf66b)UsU0TlJ&eDO zXPR)hJV3K|T+)Xg?;P@rjKmz^_|X_N5qv>?Z2j= z{Po$%kBD2FQN{Jfc*0HXInlxoGmUf04W8o(?SJEzMyLDP|DGm;{3{RUMln>a{P=D5 zvNg44q@22rzLcns)W0gxT(wlDBO>ettLjJ1oX8DCHqEBc;w#U< zfF^=Vd-o;j$alPhYJ8{d$oc+(Z?n4jD+&D=zV&Nz+o(U(sfp`J&!~Tpww9vVcvsM+tIR7uL@7jHm?Ta-tP?$2JAZ;*YRpsV8k<>76HdM zQ+Hk3=HO=pGY|UpdY^Zrin3)VFdd>Pm|T-=8JydZfo1nv$VPGSLV2n?{|<@I75uR? zWX#rnA;E}mfzvbsQ>ml)J9yD@yIArSzt`1V*)Aw?CZhb4SCG&b1Ii>B)W}er6K_Fs z?dwC_sEF{i$$&5yYO)I@CkZOug$fLL5oUufMIrWehd4m8naZb4l_DQ9+5Vo#7=))- zDq;6B=y|g5BkYP_2c4KUt@z<-E>XqqYADz-^FDtF3056kKgnITM_RdDXyZdrU28l* z@V%b;MP`WS-D5qHB_no>3&XkXJ`anM6XLKV|C*iBi>|%gN%fORVW{;Xz;L*wXso;9 zkjf5pI`&xC&Z?x+PYWe#68M9D0`DYp%+#n};be*RA*N5W3XON&Qae4r)U9guymatyG0au_WWIQQmi7Q{c@cynheeM*%IE>4 z`rW4dx5X>;hmy*~(lTNDAo>bR%5ck5O-n($+_83q=j&7@3b5;wAv1r$*LQRU)`wOB z#?tl^a`YW)&d)>LX7*SVN!%ID|PK_Vv;OW|Kt>bl_qb-)9&s}Z~!N0kx> zq9Dd3YP!P0-{j5GEOC-iEJ{Tz9JEvBSGw0C?k3FCQ{BK|LZOyayE>IpxL@@?hI;Sf zPk?uw;w=sSmPrW?yicGCgg2d%N>Ly)2V$I9ZCKC!A%m{4_sOmm_PEmB?LE zr^CQ6h@s75DoEOcEO^Baq2%3D#e(|}mZA?TslLvV6{ogV=FV@L8X7#G95huKzABOx zlhL_Dp=KS84FfuD9)(4Ybq(iG)@IHRbAy7+sp;q_CqnAXiy%t?q-_I@pfUXt2g=PZ z%2xM_n*TELseDgGeMtb(yx(j#>~A*PzY!T(Si8|lSi310n|{k4|2On6S=HU^pR}S) z>Tmp-Ap?@0*fL3wc&}L=jD9^Bp&m-gPbBoQv3-Vg`a2UZCeSfQDMhQxS^Zhn4K%JByN!r&E;;I0Eruy8E)bX*XP!cS~CRL4AK7MYy&5O zYaYrB*OzOXUz>qXDLdY7ea<4+Su>WzVIE_=-37J@+ko zuR+V))U2Lk*I>L98M5KUvIFAyGSC@wlsWf1Q4v1)ldpD@p}_n%O5aqRIb%1hsjx#P zfxocdNk>yKC%K9@?s@0>;FoHI`Fa|Ty%9n8g?N{Y0vqXS%>4&q^HD(=KjMpEw8~ln zQlOjub76Z%S<$Vk(8apcMTnu@VGLvs5bPu{~#&O}U% zr0TVrZU>RE+8exNj}t`|8EWcb|3ElR1>A;J;+wz#0*|p3{X+`@5RO1cUcnkviDs+x zYJ#ymQ-%(IhvlKI^0v8@Q-Y8|8;&EsU3_dA z`$8XVMgCMGjWCr96)YsKW>m;9`x`E)t5;>fU;wtV$w=+N$8TugXZ=xaX7Vxpu_)BW zfGj(h-WPg$DvTfkdR7w(Q>bp>EBSN2O|bwyyHfr;v}qK@M#S6e<~bye?R@BX%p zIArZm>63g;3E`?!>1)2p4=GYB*5@#j5O&RZG%@hc#-Qvf*lB;xiMXVu8CsTeiT!Fy>#6d4NW08^QshElST zaU-4%VU#RV?lfLW<6XDPL%SoO=dVmN@op;vJ26mH<(4AlSEw15z2Q~MxCR!{gb z6nkvy%R(A$m0iEzm2={Xup}z&cDMrjz!Msh10Uu6!%WdxTcJ9l3zIRF z=%=x@=7p}TB{WsX<3rM(j$*QOaMml0Ct*i$eFf=HmnONeA?ef{3l@*r-5t{QUgn8| z?sG!<^a@gvC|5wy(!t(5=A2?#@6#v!-?#Vu36jZjs_WQYG6G+#w`X7-DYR5JQRUrF zlPioVXmU6BA==8_A;?giyNRC7A>=KhLbaili7blq8t9y06mG~RKuh2#z)eOX<-uxf zM_+Tug?ALG-)(*mz1obGC}XC#3$#GSd%%bNDGJGue*8F1?+-oWs9(Zm8DL* z71ONFs71NxvmxTeN|d!ro~py7RuzrL?PN~hX!9shY{KXW4NxTI_6FUCf0SZ&6N`M4 z4LtA?*8tRtSlqx<&mlfwP2k-9-jwaP674lVHr$mOA-O-&T+rt@Fb)i~{1jfVe@EP+WY z?%_E>%h^>%p7?C8I1b4-*n*1)Be>*yss+`~^*g4nhUbM|Wlz6{J0tXbq;Q^r&Ly2O;y?h zeTI6ZNDdI#;01FkMF)rrb-Ih&dT%1tE5qcDTo?Re7Ev`0{GS{43V6o5xCNs4<3(1m zf7{K14GJW!W)WBwTRp@EM|dU&jOMn^=J(UDJ9-nYk{2dr zw%JPOVZM6qm7@}Y3~!}dx$Mi5;FVI|CU*ws$T2>4=hE!(B*V=5%#*?lD#bvDM(r{r zffuN2?^--^J28^dBz@=7v~|!?)E7?mL#2_5Uw;|7R~M^?x^`1S?6(uJIvt z5#8X6?0_hoehX&o>0?Wax5ezqh0#KzdFoPE+b=J%$OPV>CM&JQ_^ci4mbmUZO_D%c z5-2Dm0qpSAd{CD0vqUpgOE7`-3(=!Ni5flnX;QI%F=l*JVAj89A)cNPelCmxTCH%r zsknrYTKOyGIIw|;!|-@>X!7e})kaVV5}PauA641{{Iv*Z8dl!}(D=it6QyV*;v#sJ zvXKH?>C=@sZWghL?t1-g(6BUzIrY-Oxx|YD(bsl7RBqi%GB*cP_ISe>yvT4&UQltE z<_VUfUe{)3FqXgB<*dIO0ta`|nX45mam7irm9-`E6xJOcd->hhAAWkAfGxmYf!$lQ z!vz(HTpsA|XnnXdny;}U>Dd34<^{mXRFf~Vw?0po9TsCN=QpA*UWs5uxU~YyCzdNw zi(67?;Qhu=z~?P9gDeyka5O`hG2oOTfVtJvOwNlBs$kR~c(z&#nn1xJGyZNBs*FW^ zoqxTum^PX$HIgxk9Z$6XiX6SmQ#PYCd#gqRJ&swNl>D8DcJ8Sw)bRI7uIebQzFqpa zQ`|{}h_i$H2WXor>y+g555uOl{8YrWHZ>*8O0X(XmtM`0J-#vZ37yNGqq&>A51=P< zi5G~`XAI`lg^Z+@dY|@n?EV;gNGmm=qbDS__qfETPuCosyZK*k{2^mG#TXa*%BH(} zcOSGm1)JngU!-4Sc}UrhB>5itMFJ98qE6ls0wiW;Ol| z)U&r^pv_=!dkPnjG?s1Z-e*14LNTt84phK7uS!Bvo+ z{o;b~cDM9|5A=A`D*~JhVx!;JTO7UCVz@_pxw72b6#Pb7PHF*n7;g6qN|q5-^JuqV zy9{5jTah}OstFX_#0zhKM%`x;*ufdz%eWu zeWlXWCoMCLkPu#;BvUou{E$o)p@A?b9MY({Pk(=uC>gbp-McuakW;NcAv_epMc%Yl zW~q3F;cGwohlQU$8f$f&%Wy^? z2yTj1^gg3IySa#m&k@z~5%WIfh}Wr>V03*+j4;W_5CvSRSC1BhEASrn zAzhp-wWEdcwD7)|P26Tbr*c{kRZ9$Zq3Q|deyg}C&4lI`{Qp@a3FSeJ1HS8H0Rj*Z z&;P$h{s`9qqRl$dD`pZsCSEE~T7I;k%f~Q3~03ew)>9B}4AU8d$zDpU8 zB|dNy@$s|~pG3puvdU9QE*IJH_PlY^zV`sGHHMQs0FnivN)V+PKldwLr!AQtO0`Wf z*iM1UjbpM}2iQ9wxC*JkUj*Ch^BjC%gM$boyP%QtX8<|8LEz{L*iXUx>$$a;{R&6y-i1*}hQ zUtHW9Fy^kyoSeZ7&LLip8F?^(6ei7ZJWpfA_?bz_kfDFtcv3u|s*%52YmOf%9HM4W za>)}Wz2Ze1WH*>$nZIbzAX8%&r$jsH$UfR@IZfZ0vbEOI3OdSKic>`myu5RED)Ra! zG5iHfq~JrV-n12Kj??-u*OfN-V} zX#f>a?$-jREm;)p$s24VmheWa@BFPK;_hwH@B?S=^kC-h)r)vsM%j)xr$=QUM-Trplv5Gsk8d8e~r>p zev0sJqwmB+j!drtdFV7KN(%{z-|!0nMms09>;Uoi@B9pf-6PAXoesk|CbxiD?0Ugu_ zslNDaD~nQ=Ax$~#2X|8@kHZ)U3?be~l6w02o0a_#59n5Sr!9=h!61iIYXotI!Z!g8 zEYdiI+7s?I{tJA2a#+D1li#zs0vNaM1IKPZ%iHMy1x#B@&e^z^gO%894Ex951l)#GUly?%ZM;EE)4l!1` zK>p93%t?n*8&ySrEXqmJY@`ptI697KJ!l3u06P5142SxhNIppBI_7AyaCVVmX1l<@ zVQbk~4p!0TXxP=>E~%^Yt&`pta%2XJr7PbAZmiE4kFhDd;LOPWf~@xb(#C=Rwt!RX z`YTK5vUH^DlVRVuUjWYk9rnM9`#;UtY_kMXUH}kK(l^SN{eN8Cr498RofM57T+9uP z{}Xb61+9m=@X(pNF>b`v$_gFF*AlEn3M}YnM-Cm@0~Y7UCug4sr*9wI(heLDu~_g} zTeaw+XKBroVbKU4Bux#|pwaM{-&mronLN8#kyE7{)b(WQ@;GdR62bU2k^8mvu=SF9 zB=d2N1T-H(f}rMihPJ*9(sZ*RUIpBiErF8Bz4Wm6U z@g3f|OM^hp&nBpe>&D@MV@KfOK6wO$`$6ea;RgQqf06c%-I+#Tw`WlC9ox2T+cqk; z?Nn^rww+X*JGN7?ZB(2}=jn4^od4IGSiX~-lVynW9- z%$=#%Ak3Y`m0VQw?!emra(|TlqeEk0mdZ01eB#dg_!82_Q!`82p^E!#e<*_edEc`RWG%29~|4|gC;cF^}FCS0%LUk;mUt2U-StG zRql)k`pWl7`2;3(`)215@j9TMt2*LGM?K92MWNIH&4!;-lfQ!EAB;M+s|d~Kvc7%H zVEKom#3Qa5g`i<^w+E7$j)ea*2o=o+KVR4c{RcPVXkKE1W~*LQ(>}PN9vcn?U3O>h zFs(pJNI%F`KU0H7@fzR)rawNy()DLO^G`+{yskZH{uvAlR=h}>pD7~vf__cq7!1!v z!}bm_Ua0$O5BF8PXrljAzEem4se0ED6`*<-5*2Vl{T6fCsv-;=nWd2MF=>!Ho!&)f3e3D*dgxIC}5DD+KXfS!G?Dy>;j20jqpJ zkRM6ZMj6f>L-h#SXVvjxJ2w6rx+#ubRoa(g{?v?~JUL$gZ<(IQzxB8XOwdIniLu^3 zUq5ESsB1d5N}ayCdLo*_hV9XOZo3HF#qjWOlMScEvR($?*u?iny&?ltjp75&1o)W% z$@Ca$<}ToNGmns6MenrX+k}85%f@W}e+cQL{n1P=B_vXFrUDzZ5cl;?K5hYu(4g5; zB;1|m@~lA%SLc6U^mAQdadD9rcs~u&HzXhMb@c@D6|%B<(AFeO(2<+o{TS+J!l$7c zi`Qvq$E)8(mT5QI&+!YAUBWtTM9p)@7(XETL^bATG*fL$t*w}M^Wr0iNQ~W( zp3T^@lUH>0hT3F?A>N8-FI4mV($WygK0=7dLG{MZtrq9;ID{VF!>9K@Sj^J$=4@gaf_qs@Weba6dO;QBMiMxI(He8>bs4R%Ey{U6 zgEv;KrmLlbPexr!HwR_d)hdy9gz9rT?XboGQ6zxQv5!%E5-(M$L?L5VV0`J`<@()*<88egql&$l}P zTI>=r>}=AHjgN8i399Vxwc8{o7e$D5a*$&rbl*AB%fl;pPEBiy<;v3~evW0>{S`Ca zINxg2xgmLmend#7wlw>De|qkfGKl_>V2uayC9el5`p@2&qN6q#P40~qRaLYe*#uU0 zl7qrU-qq!Il8v_drJVGtS@J9-Rb93vI#-DyjPknN1oJUTiaDjrCUPh}6n;x&KAQFT zFGv3~=%@G?iLCZqBn512L1lL5TY6mW1sZ@(mvI%?#33mXNnM=byPJ%u6FC?<8PG7Q zo(fCeNa$IG2rI-&&eWf&t4ui|xB0IE?mP@qsjCTYYA{+RAmc#Hqx~9|sR*xr09>3R z*BNbE4L)+chFxxkJd&-djtU`XfWdfjc>uw`Y>Dc{yalR4W#3ZVX~r~fvo_fsMMuP? zQ{iV+(Yz6}-x+L2clBYp7wjYL3t`ntEEAS$ic?LDmwb7>4OdFTT5S}XB?n6vBoG%P zTV2PSsfh`zdCuT>V_<7Ca!j46Tx?=e9Kh359KX2LU7j$qH%7^34p05tVSp9MJBOZP zrMaS&l7HgiIrTO(e|`hwdMdl6S9my_W~?3~8w_*|VbN*ouOAS-ZGeQ@gGtg)>yV&m zTAj&K*R0-?eEF%;`eCRJiOp&;Q(0B`W!b?8rNqe#39xyg7E~DU!O6oA>Z*8>9$K(omcW_! zQVw3-MbRYI23g-9or2d5!=6dv%$7)duLY_gerQu9 zgmynkB_6Xfgr!_EV6}kwIN(uPc{{QmxQY)*qE>g)O%<|FAunE25^JOwiE^@K5bJdo z+gll`FN|danH^MQhZgOF1b;*#7t+59&%$D)5JN-#$zXX)|@Vznd4CRBN z`pM~~FpSm-T^&A)OID8bn3nfr+rBS;##va6F)M>Xh8>T7f=!u$2F2{q*`#vvYHzW6 zsR3LNPQa@rg}#QpBEyE!w0*wx(n4H3B)O>Z~e%K{);m+ z$Rj@$@@eV@93`0e0c4C~J`CcjzJJy2WHD_Xm!QH0L*)*Mi~;W^nVA=>%?M?pM#xtP zd7PoCw+To7r@O^F-XdV`L6}P-dOM!j-8_s3PZ0cxgI5rqF-@tJV8~%!F&m#9$9Cgc zN^u+|BEDo}oR?7_31KXtj&EVFYs>f;UUWQ_*{aTJ9rIO*k(k8c?M-D0K|(DNOH>+F z$lvxpkzg01EwVb1ki~3rY>Vw~ak~V_Yg(Q$o#ca^Z2%`w9ukqykyW6aSsWq}j;!}K z{oqs)Cv<)l5qqIqS2nw>h`Ov`aaZ#)nd(xeD_g|nkRZzOlQ6>-c^!*ptxB8y@YTU_ zO=nDkM}12ytfXu~62{^^009Cg{FVSgM~PJPx2J2_yrehQGJ?0QJ>`>Qm{ zV3W{lla0Z6pz0d>;Y*6__&SE^l~&!zq212h*ebxej3j^9VO?^;ahOVP?~ee$SuJ6f@xi z$NTlZ>~N4g-_Du``1B&@z1tR%FDANkp2*H&;Y=z@28OZ%&K5hz)iQWcL;ZJ)dq?4( z-#(rZ;dN+%__?vac%QW3>}V5SRaG?ABnVafh1fXmG%@c?5eYEE3rrg>I7mo$ogO*b zU@HCd7Pg(RJ=g5T+T~~l7K1+bjRG1PAvn=jC+bwcq9*%T2Gw6O2{X7}b z9F1f)uB;AjQmJ>UB{Gqar>m8SkM^yz&Dc3TgwP^WqG&!Q-Xa~p@nC|n4}&lae%KZ0 zASC!@OLdF@3o_!gC|Ml)?!~QgBX?kYje5x23hP{Qoh30a+=PcXHa}vQjR$o|)v=g( zAnYl!UtShG(y10j7)JW|f!yPVyZ{ZRrLv8v<&QKJ<}bwy(&o$u@^t@c=u*a;%2aVd zmb2%oedrn%!F09-#)Ep_i ze2a32OwMGCB}~s`EE$|RZw%X&>0nh<%Jf(XsD4M;ZkyLs%-^U`aI$R;;&>uq%atxj4?wmEQ(O0CKv@6 zpjsypz~W8|CCrKsV`0ekHSpJhn_q&egCO(~Zq((cl9MN+w2~yj6A_Fhl`+KO;zM=< z%(DoxFPzNYM$5iG%PiE`2SJGXpC5=8B|(EV_tDw-YA4LtfwyFbw6~BweJ~E>sm74f%&eJcjL4bks#14tF>KIZK^{pm%%l=g zE(FrDDf{XqcQ}QD3Mx5Vq}1D?&vewb3*hk7)|7z$8dH^S1=DRQ;^Ft(z?6N_m-a|C z&QdHpqS(Zu>v^z@Ps<>@FA|a)q(BepxM!1yn6|?)8RF3Zm7I}HwemYck_Tm2ZUGj> zgFb2nlk2&1rz9y~nNvk!fkEutk% zF4|$_V(=zr)=+DOEXj{bx1qZn^URzT{;XeY;at=BVT-C5<#3UT$80@0DnI>5f*}k? z2hrx)26xZUR4mGpyxFAr%`Gd>*pg*)GiA=5$lS&gR5o5TNl`1qV*wB&W_1Lbm%lc}d_f^+um*jxgKyf^!;c|{NsMWyWN z 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

?xtoq}(@UjpNouRZwJYp|KNyO?*~PD?5q^ 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≥k>IU1 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

+

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 +pathInfo is then searched unless it is null - in +which case the servletPath is searched.

+ +

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 +PATH_INFO environment variable.

Comments @@ -132,5 +150,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

\ No newline at end of file diff --git a/output/webapps/docs/changelog.html b/output/webapps/docs/changelog.html old mode 100755 new mode 100644 index 3202f03..445cbca --- a/output/webapps/docs/changelog.html +++ b/output/webapps/docs/changelog.html @@ -1,7 +1,1358 @@ -Apache Tomcat 9 (9.0.0.M21) - Changelog

Changelog

Tomcat 9.0.0.M21 (markt)

+Apache Tomcat 9 (9.0.4) - Changelog

Changelog

Tomcat 9.0.4 (markt)

+

Catalina

+
    +
  • Fix: + Correct a regression in the previous fix for 61916 that meant + that any call to addHeader() would have been replaced with + a call to setHeader() for all requests mapped to the + AddDefaultCharsetFilter. (markt) +
  • +
  • Fix: + 61999: maxSavePostSize set to 0 should disable saving POST + data during authentication. (remm) +
  • +
+
+

Coyote

+
    +
  • Fix: + Fix NIO2 HTTP/2 sendfile. (remm) +
  • +
  • Fix: + 61993: Improve handling for ByteChunk and + CharChunk instances that grow close to the maximum size + allowed by the JRE. (markt) +
  • +
+
+

Jasper

+
    +
  • Add: + 43925: Add a new system property + (org.apache.jasper.runtime.BodyContentImpl.BUFFER_SIZE) to + control the size of the buffer used by Jasper when buffering tag bodies. + (markt) +
  • +
+
+

Web applications

+
    +
  • Fix: + 62006: Document the new JvmOptions9 command line + parameter for tomcat9.exe. (markt) +
  • +
+
+

not released Tomcat 9.0.3 (markt)

+

Catalina

+
    +
  • Add: + 57619: 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) +
  • +
  • Fix: + Add some missing NPEs to ServletContext. (remm) +
  • +
  • Fix: + Update the Java EE 8 XML schema to the released versions. (markt) +
  • +
  • Fix: + Minor HTTP/2 push fixes. (remm) +
  • +
  • Fix: + 61916: Extend the AddDefaultCharsetFilter to add + a character set when the content type is set via + setHeader() or addHeader() as well as when it + is set via setContentType(). (markt) +
  • +
  • Fix: + 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) +
  • +
  • Update: + Modify the Default and WebDAV Servlets so that a 405 status code is + returned for PUT and DELETE requests when + disabled via the readonly initialisation parameter. +
  • +
  • Fix: + Align the contents of the Allow 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 + Allow header and a method listed in the Allow + header will not return a 405 status code. (markt) +
  • +
+
+

Coyote

+
    +
  • Add: + 60276: Implement GZIP compression support for responses + served over HTTP/2. (markt) +
  • +
  • Fix: + Do not call onDataAvailable without any data to read. (remm) +
  • +
  • Fix: + Correctly handle EOF when ServletInputStream.isReady() is + called. (markt) +
  • +
  • Fix: + 61886: Log errors on non-container threads at + DEBUG rather than INFO. The exception will be + made available to the application via the asynchronous error handling + mechanism. (markt) +
  • +
  • Fix: + 61914: Possible NPE with Java 9 when creating a SSL engine. + Patch submitted by Evgenij Ryazanov. (remm) +
  • +
  • Fix: + 61918: Fix connectionLimitLatch counting when closing an + already closed socket. Based on a patch by Ryan Fong. (remm) +
  • +
  • Add: + Add support for the OpenSSL ARIA ciphers to the OpenSSL to JSSE + cipher mapping. (markt) +
  • +
  • Fix: + 61932: Allow a call to AsyncContext.dispatch() + to terminate non-blocking I/O. (markt) +
  • +
  • Fix: + 61948: 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) +
  • +
  • Fix: + Fix NIO2 handshaking with a full input buffer. (remm) +
  • +
  • Add: + 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) +
  • +
+
+

Jasper

+
    +
  • Fix: + 61854: When using sets and/or maps in EL expressions, ensure + that Jasper correctly parses the expression. Patch provided by Ricardo + Martin Camarero. (markt) +
  • +
  • Fix: + 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) +
  • +
  • Fix: + 61945: Fix prototype mode used to compile tags. (remm) +
  • +
+
+

Web applications

+
    +
  • Add: + 61223: 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) +
  • +
  • Add: + 61565: 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) +
  • +
  • Add: + 61566: 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) +
  • +
  • Fix: + Partial fix for 61886. Ensure that multiple threads do not + attempt to complete the AsyncContext if an I/O error occurs + in the stock ticker example Servlet. (markt) +
  • +
  • Fix: + 61886: Prevent ConcurrentModificationException + when running the asynchronous stock ticker in the examples web + application. (markt) +
  • +
  • Fix: + 61886: Prevent NullPointerException and other + errors if the stock ticker example is running when the examples web + application is stopped. (markt) +
  • +
  • Fix: + 61910: Clarify the meaning of the allowLinking + option in the documentation web application. (markt) +
  • +
  • Add: + Add OCSP configuration information to the SSL How-To. Patch provided by + Marek Czernek. (markt) +
  • +
+
+

jdbc-pool

+
    +
  • Fix: + 61312: Prevent NullPointerExceptionn when using + the statement cache of connection that has been closed. (kfujino) +
  • +
+
+

Other

+
    +
  • Fix: + Add an additional system property for the system property replacement. + (remm) +
  • +
  • Fix: + Add missing SHA-512 hash for release artifacts to the build script. + (markt) +
  • +
  • Update: + Update the internal fork of Commons Pool 2 to 2.4.3. (markt) +
  • +
  • Update: + Update the internal fork of Commons DBCP 2 to 8a71764 (2017-10-18) to + pick up some bug fixes and enhancements. (markt) +
  • +
  • Update: + Update the internal fork of Commons FileUpload to 6c00d57 (2017-11-23) + to pick up some code clean-up. (markt) +
  • +
  • Update: + Update the internal fork of Commons Codec to r1817136 to pick up some + code clean-up. (markt) +
  • +
  • Fix: + 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) +
  • +
+
+

2017-11-30 Tomcat 9.0.2 (markt)

+

Catalina

+
    +
  • Fix: + Fix possible SecurityException when using TLS related + request attributes. (markt) +
  • +
  • Fix: + 61597: Extend the StandardJarScanner to scan + JARs on the module path when running on Java 9 and class path scanning + is enabled. (markt) +
  • +
  • Fix: + 61601: Add support for multi-release JARs in JAR scanning and + web application class loading. (markt) +
  • +
  • Fix: + 61681: Allow HTTP/2 push when using request wrapping. (remm) +
  • +
  • Add: + Provide the SessionInitializerFilter that can be used to + ensure that an HTTP session exists when initiating a WebSocket + connection. Patch provided by isapir. (markt) +
  • +
  • Fix: + 61682: When re-prioritising HTTP/2 streams, ensure that both + parent and children fields are correctly updated to avoid a possible + StackOverflowError. (markt) +
  • +
  • Fix: + Improve concurrency by reducing the scope of the synchronisation for + javax.security.auth.message.config.AuthConfigFactory in the + JASPIC API implementation. Based on a patch by Pavan Kumar. (markt) +
  • +
  • Fix: + Avoid a possible NullPointerException when timing out + AsyncContext instances during shut down. (markt) +
  • +
  • Fix: + 61777: Avoid a NullPointerException when + detaching a JASPIC RegistrationListener. Patch provided by + Lazar. (markt) +
  • +
  • Fix: + 61778: Correct the return value when detaching a JASPIC + RegistrationListener. Patch provided by Lazar. (markt) +
  • +
  • Fix: + 61779: Avoid a NullPointerException when a + null RegistrationListener is passed to + AuthConfigFactory.getConfigProvider(). Patch provided by + Lazar. (markt) +
  • +
  • Fix: + 61780: Only include the default JASPIC registration ID in the + return value for a call to + AuthConfigFactory.getRegistrationIDs() if a + RegistrationContext has been registered using the default + registration ID. Patch provided by Lazar. (markt) +
  • +
  • Fix: + 61781: Enable JASPIC provider registrations to be persisted + when the layer and/or application context are null. Patch + provided by Lazar. (markt) +
  • +
  • Fix: + 61782: When calling + AuthConfigFactory.doRegisterConfigProvider() 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) +
  • +
  • Fix: + 61783: When calling + AuthConfigFactory.removeRegistration() and the registration + is persistent, it should be removed from the persistent store. Patch + provided by Lazar. (markt) +
  • +
  • Fix: + 61784: Correctly handle the case when + AuthConfigFactoryImpl.registerConfigProvider() is called + with a provider name of null. Patch provided by Lazar. + (markt) +
  • +
  • Add: + 61795: Add a property to the Authenticator + implementations to enable a custom JASPIC CallbackHandler + to be specified. Patch provided by Lazar. (markt) +
  • +
+
+

Coyote

+
    +
  • Fix: + 61568: Avoid a potential SecurityException when + using the NIO2 connector and a new thread is added to the pool. (markt) +
  • +
  • Fix: + 61583: 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) +
  • +
  • Fix: + Improve NIO2 syncing for async IO operations. (remm) +
  • +
  • Add: + Sendfile support for HTTP/2 and NIO2. (remm) +
  • +
  • Fix: + Reduce default HTTP/2 stream concurrent execution within a connection + from 200 to 20. (remm) +
  • +
  • Fix: + 61668: Avoid a possible NPE when calling + AbstractHttp11Protocol.getSSLProtocol(). (markt) +
  • +
  • Fix: + 61673: Avoid a possible + ConcurrentModificationException when working with the + streams associated with a connection. (markt) +
  • +
  • Fix: + 61719: Avoid possible NPE calling + InputStream.setReadListener with HTTP/2. (remm) +
  • +
  • Fix: + 61736: Improve performance of NIO connector when clients + leave large time gaps between network packets. Patch provided by Zilong + Song. (markt) +
  • +
  • Fix: + 61740: Correct an off-by-one error in the Hpack header index + validation that caused intermittent request failures when using HTTP/2. + (markt) +
  • +
+
+

Jasper

+
    +
  • Fix: + 61604: Fix SMAP generation for JSPs that generate no output. + (markt) +
  • +
  • Fix: + 61816: Invalid expressions in attribute values or template + text should trigger a translation (compile time) error, not a run time + error. (markt) +
  • +
+
+

WebSocket

+
    +
  • Fix: + 61604: Add support for authentication in the websocket + client. Patch submitted by J Fernandez. (remm) +
  • +
+
+

Web applications

+
    +
  • Fix: + Correct Javadoc links to point to Java SE 8 and Java EE 8. (markt) +
  • +
  • Fix: + Enable Javadoc to be built with Java 9. (markt) +
  • +
  • Fix: + 61603: Add XML filtering for the status servlet output where + needed. (remm) +
  • +
  • Fix: + Correct the description of how the CGI servlet maps a request to a + script in the CGI How-To. (markt) +
  • +
+
+

Tribes

+
    +
  • Fix: + Fix incorrect behavior that attempts to resend channel messages more + than the actual setting value of maxRetryAttempts. + (kfujino) +
  • +
  • Fix: + Ensure that the remaining Sender can send channel messages by avoiding + unintended ChannelException caused by comparing the number + of failed members and the number of remaining Senders. (kfujino) +
  • +
  • Fix: + Ensure that remaining SelectionKeys that were not handled by throwing a + ChannelException during SelectionKey processing are + handled. (kfujino) +
  • +
+
+

Other

+
    +
  • Fix: + Improve the fix for 61439 and exclude the JPA, JAX-WS and EJB + annotations completely from the Tomcat distributions. (markt) +
  • +
  • Fix: + Improve handling of endorsed directories. The endorsed directory + mechanism will only be used if the JAVA_ENDORSED_DIRS + system property is explicitly set or if + $CATALINA_HOME/endorsed 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) +
  • +
  • Add: + 51496: 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) +
  • +
  • Fix: + 61590: Enable service.bat to recognise when + JAVA_HOME is configured for a Java 9 JDK. (markt) +
  • +
  • Fix: + 61598: Update the Windows installer to search the new (as of + Java 9) registry locations when looking for a JRE. (markt) +
  • +
  • Add: + Add generation of a SHA-512 hash for release artifacts to the build + script. (markt) +
  • +
  • Fix: + 61658: Update MIME mappings for fonts to use + font/* as per RFC8081. (markt) +
  • +
  • Update: + 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) +
  • +
  • Update: + Update the NSIS Installer used to build the Windows installer to version + 3.02.1. (kkolinko) +
  • +
  • Update: + 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) +
  • +
  • Fix: + 61803: Remove outdated SSL information from the Security + documentation. (remm) +
  • +
+
+

2017-09-30 Tomcat 9.0.1 (markt)

+

Catalina

+
    +
  • Fix: + Use the correct path when loading the JVM logging.properties + file for Java 9. (rjung) +
  • +
  • Fix: + 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) +
  • +
+
+

Other

+
    +
  • Fix: + 61563: Correct typos in Spanish translation. Patch provided by + Gonzalo Vásquez. (csutherl) +
  • +
+
+

not released Tomcat 9.0.0 (markt)

+

Catalina

+
    +
  • Fix: + 61542: Fix CVE-2017-12617 and prevent JSPs from being + uploaded via a specially crafted request when HTTP PUT was enabled. + (markt) +
  • +
  • Fix: + 61554: Exclude test files in unusual encodings and markdown + files intended for display in GitHub from RAT analysis. Patch provided + by Chris Thistlethwaite. (markt) +
  • +
+
+

Coyote

+
    +
  • Add: + 60762: Add the ability to make changes to the TLS + configuration of a connector at runtime without having to restart the + Connector. (markt) +
  • +
  • Add: + Add an option to reject requests that contain HTTP headers with invalid + (non-token) header names with a 400 response and reject such requests by + default. (markt) +
  • +
  • Fix: + Implement the requirements of RFC 7230 (and RFC 2616) that HTTP/1.1 + requests must include a Host header and any request that + does not must be rejected with a 400 response. (markt) +
  • +
  • Fix: + 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 + Host header and that any such request that does not, must + be rejected with a 400 response. This check is optional but enabled by + default. It may be disabled with the + allowHostHeaderMismatch attribute of the Connector. (markt) +
  • +
  • Fix: + Implement the requirements of RFC 7230 that any HTTP/1.1 request that + contains multiple Host headers is rejected with a 400 + response. (markt) +
  • +
  • Update: + Add a way to set the property source in embedded mode. (remm) +
  • +
  • Fix: + 61557: 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) +
  • +
+
+

jdbc-pool

+
    +
  • Fix: + 61545: Correctly handle invocations of methods defined in the + PooledConnection interface when using pooled XA + connections. Patch provided by Nils Winkler. (markt) +
  • +
+
+

Other

+
    +
  • Fix: + Update fix for 59904 so that values less than zero are accepted + instead of throwing a NegativeArraySizeException. (remm) +
  • +
  • Add: + Complete the implementation of the Servlet 4.0 specification. (markt) +
  • +
+
+

2017-09-19 Tomcat 9.0.0.M27 (markt)

+

Catalina

+
    +
  • Fix: + Before generating an error page in the ErrorReportValve, + 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) +
  • +
  • Add: + 61189: Add the ability to set environment variables for + individual CGI scripts. Based on a patch by jm009. (markt) +
  • +
  • Fix: + 61210: 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) +
  • +
  • Add: + 61280: Add RFC 7617 support to the + BasicAuthenticator. Note that the default configuration + does not change the existing behaviour. (markt) +
  • +
  • Fix: + 61424: Avoid a possible StackOverflowError when + running under a SecurityManager and using + Subject.doAs(). (markt) +
  • +
  • Add: + When running under Java 9 or later, and the + urlCacheProtection option of the + JreMemoryLeakPreventionListener is enabled, use the API + added in Java 9 to only disable the caching for JAR URL connections. + (markt) +
  • +
  • Add: + 61489: When using the CGI servlet, make the generation of + command line arguments from the query string (as per section 4.4 of RFC + 3875) optional and disabled by default. Based on a patch by jm009. + (markt) +
  • +
  • Fix: + 61503: This corrects a potential regression in the fix for + 60940 with an alternative solution that adds the + JarEntry objects normally skipped by a + JarInputStream only if those entries exist. (markt) +
  • +
+
+

Coyote

+
    +
  • Update: + 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 SSL_CONF OpenSSL API. (rjung) +
  • +
  • Add: + Add support for the OpenSSL SSL_CONF API when using + TLS with OpenSSL implementation. It can be used by adding + OpenSSLConf elements underneath SSLHostConfig. + The new element contains a list of OpenSSLConfCmd elements, + each with the attributes name and value. + (rjung) +
  • +
  • Fix: + 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) +
  • +
  • Fix: + 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) +
  • +
  • Fix: + If an invalid option is specified for the + certificateVerification attribute of an + SSLHostConfig element, treat it as required + which is the most secure / restrictive option in addition to reporting + the configuration error. (markt) +
  • +
  • Fix: + Improve the handling of client disconnections during the TLS + renegotiation handshake. (markt) +
  • +
  • Fix: + Prevent exceptions being thrown during normal shutdown of NIO + connections. This enables TLS connections to close cleanly. (markt) +
  • +
  • Fix: + Fix possible race condition when setting IO listeners on an upgraded + connection. (remm) +
  • +
  • Fix: + Ensure that the APR/native connector uses blocking I/O for TLS + renegotiation. (markt) +
  • +
  • Fix: + 48655: Enable Tomcat to shutdown cleanly when using sendfile, + the APR/native connector and a multi-part download is in progress. + (markt) +
  • +
  • Fix: + 58244: 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) +
  • +
  • Fix: + Improve the warning message when JSSE and OpenSSL configuration styles + are mixed on the same SSLHostConfig. (markt) +
  • +
  • Fix: + 61415: Fix TLS renegotiation with OpenSSL based connections + and session caching. (markt) +
  • +
  • Fix: + Delay checking that the configured attributes for an + SSLHostConfig instance are consistent with the configured + SSL implementation until Connector start to avoid incorrect + warnings when the SSL implementation changes during initialisation. + (markt) +
  • +
  • Fix: + 61450: Fix default key alias algorithm. (remm) +
  • +
  • Fix: + 61451: 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) +
  • +
+
+

WebSocket

+
    +
  • Fix: + 60523: 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) +
  • +
  • Fix: + 61491: When using the permessage-deflate + extension, correctly handle the sending of empty messages after + non-empty messages to avoid the IllegalArgumentException. + (markt) +
  • +
+
+

Web applications

+
    +
  • Fix: + Show connector cipher list in the manager web application in the + correct cipher order. (rjung) +
  • +
+
+

Tribes

+
    +
  • Fix: + To avoid unexpected session timeout notification from backup session, + update the access time when receiving the map member notification + message. (kfujino) +
  • +
  • Fix: + Add member info to the log message when the failure detection check + fails in TcpFailureDetector. (kfujino) +
  • +
  • Fix: + Avoid Ping timeout until the added map member by receiving + MSG_START message is completely started. (kfujino) +
  • +
  • Fix: + When sending a channel message, make sure that the Sender has connected. + (kfujino) +
  • +
  • Fix: + Correct the backup node selection logic that node 0 is returned twice + consecutively. (kfujino) +
  • +
  • Fix: + Fix race condition of responseMap in + RpcChannel. (kfujino) +
  • +
+
+

jdbc-pool

+
    +
  • Fix: + 61391: Ensure that failed queries are logged if the + SlowQueryReport interceptor is configured to do so and the + connection has been abandoned. Patch provided by Craig Webb. (markt) +
  • +
  • Fix: + 61425: Ensure that transaction of idle connection has + terminated when the testWhileIdle is set to + true and defaultAutoCommit is set to + false. Patch provided by WangZheng. (kfujino) +
  • +
+
+

Other

+
    +
  • Fix: + 61419: Replace a Unix style comment in the DOS bat file + catalina.bat with the correct rem markup. + (rjung) +
  • +
  • Fix: + 61439: 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) +
  • +
  • Fix: + 61441: Improve the detection of JAVA_HOME by the + daemon.sh script when running on a platform where Java has + been installed from an RPM. (rjung) +
  • +
  • Update: + 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) +
  • +
  • Update: + 61599: Update to Commons Daemon 1.1.0 for improved Java 9 + support. (markt) +
  • +
+
+

2017-08-08 Tomcat 9.0.0.M26 (markt)

+

Catalina

+
    +
  • Fix: + Correct multiple regressions in the fix for 49464 that could + corrupt static content served by the DefaultServlet.(markt) +
  • +
  • Fix: + Correct a bug in the PushBuilder implementation that + meant push URLs containing %nn sequences were not correctly + decoded. Identified by FindBugs. (markt) +
  • +
  • Add: + 61164: Add support for the %X pattern in the + AccessLogValve that reports the connection status at the + end of the request. Patch provided by Zemian Deng. (markt) +
  • +
  • Fix: + 61351: 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) +
  • +
  • Add: + 61366: Add a new attribute, localDataSource, to + the JDBCStore 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) +
  • +
+
+

Coyote

+
    +
  • Fix: + 61086: 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) +
  • +
  • Update: + 61345: Add a server listener that can be used to do system + property replacement from the property source configured in the + digester. (remm) +
  • +
  • Add: + Add additional logging to record problems that occur while waiting for + the NIO pollers to stop during the Connector stop process. (markt) +
  • +
+
+

Jasper

+
    +
  • Fix: + 61364: Ensure that files are closed after detecting encoding + of JSPs so that files do not remain locked by the file system. (markt) +
  • +
+
+

WebSocket

+
    +
  • Add: + 57767: Add support to the WebSocket client for following + redirects when attempting to establish a WebSocket connection. Patch + provided by J Fernandez. (markt) +
  • +
+
+

2017-07-28 Tomcat 9.0.0.M25 (markt)

+

Catalina

+
    +
  • Fix: + 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) +
  • +
  • Fix: + 60963: Add ExtractingRoot, a new + WebResourceRoot implementation that extracts JARs to the + work directory for improved performance when deploying packed WAR files. + (markt) +
  • +
  • Fix: + 61253: Add warn message when Digester.updateAttributes + throws an exception instead of ignoring it. (csutherl) +
  • +
  • Fix: + Correct a further regression in the fix for 49464 that could + cause an byte order mark character to appear at the start of content + included by the DefaultServlet. (markt) +
  • +
  • Fix: + 61313: Make the read timeout configurable in the + JNDIRealm 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) +
  • +
+
+

Web applications

+
    +
  • Fix: + Correct the documentation for how StandardRoot is + configured. (markt) +
  • +
+
+

Other

+
    +
  • Fix: + 61316: Fix corruption of UTF-16 encoded source files in + released source distributions. (markt) +
  • +
+
+

not released Tomcat 9.0.0.M24 (markt)

+

Catalina

+
    +
  • Add: + 52924: Add support for a Tomcat specific deployment + descriptor, /WEB-INF/tomcat-web.xml. This descriptor has an + identical format to /WEB-INF/web.xml. The Tomcat descriptor + takes precedence over any settings in conf/web.xml but does + not take precedence over any settings in /WEB-INF/web.xml. + (markt) +
  • +
  • Fix: + 61232: When log rotation is disabled only one separator will + be used when generating the log file name. For example if the prefix is + catalina. and the suffix is .log then the log + file name will be catalina.log instead of + catalina..log. Patch provided by Katya Stoycheva. + (violetagg) +
  • +
  • Fix: + 61264: Correct a regression in the refactoring to use + Charset rather than String to store request + character encoding that prevented getReader() throwing an + UnsupportedEncodingException if the user agent specifies + an unsupported character encoding. (markt) +
  • +
  • Fix: + Correct a regression in the fix for 49464 that could cause an + incorrect Content-Length header to be sent by the + DefaultServlet if the encoding of a static is not + consistent with the encoding of the response. (markt) +
  • +
+
+

Coyote

+
    +
  • Fix: + 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) +
  • +
  • Fix: + Improve the handling of HTTP/2 stream resets due to excessive headers + when a continuation frame is used. (markt) +
  • +
+
+

Jasper

+
    +
  • Add: + 53031: Add support for the fork option when + compiling JSPs with the Jasper Ant task and javac. (markt) +
  • +
+
+

Other

+
    +
  • Add: + 52791: Add the ability to set the defaults used by the + Windows installer from a configuration file. Patch provided by Sandra + Madden. (markt) +
  • +
+
+

not released Tomcat 9.0.0.M23 (markt)

+

Catalina

+
    +
  • Fix: + 49464: Improve the Default Servlet's handling of static files + when the file encoding is not compatible with the required response + encoding. (markt) +
  • +
  • Fix: + 61214: Remove deleted attribute servlets from + the Context MBean description. Patch provided by Alexis Hassler. (markt) +
  • +
  • Fix: + 61215: Correctly define addConnectorPort and + invalidAuthenticationWhenDeny in the + mbean-descriptors.xml file for the + org.apache.catalina.valves package so that the attributes + are accessible via JMX. (markt) +
  • +
  • Fix: + 61216: Improve layout for CompositeData and + TabularData when viewing via the JMX proxy servlet. Patch + provided by Alexis Hassler. (markt) +
  • +
  • Fix: + 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) +
  • +
  • Fix: + 61229: Correct a regression in 9.0.0.M21 that broke WebDAV + handling for resources with names that included a & + character. (markt) +
  • +
+
+

Coyote

+
    +
  • Fix: + 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) +
  • +
  • Add: + Add LoadBalancerDrainingValve, a Valve designed to reduce the amount of + time required for a node to drain its authenticated users. (schultz) +
  • +
  • Fix: + Do not log a warning when a null session is returned for an + OpenSSL based TLS session since this is expected when session tickets + are enabled. (markt) +
  • +
  • Fix: + 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) +
  • +
  • Fix: + 60461: Sync SSL session access for the APR connector. (remm) +
  • +
  • Fix: + 61224: Make the GlobalRequestProcessor MBean + attributes read-only. Patch provided by Alexis Hassler. (markt) +
  • +
+
+

Jasper

+
    +
  • Fix: + 49176: When generating JSP runtime error messages that quote + the relevant JSP source code, switch from using the results of the JSP + page parsing process to using the JSR 045 source map data to identify + the correct part of the JSP source from the stack trace. This + significantly reduces the memory footprint of Jasper in development + mode, provides a small performance improvement for error page generation + and enables source quotes to continue to be provided after a Tomcat + restart. (markt) +
  • +
+
+

Web applications

+
    +
  • Fix: + Remove references to the Loader attribute + searchExternalFirst from the documentation since the + attribute is no longer supported. (markt) +
  • +
+
+

Tribes

+
    +
  • Add: + 51513: Add support for the compressionMinSize + attribute to the GzipInterceptor, add optional statistics + collection and expose the Interceptor over JMX. Based on a patch by + Christian Stöber. (markt) +
  • +
  • Add: + 61127Allow human-readable names for channelSendOptions and + mapSendOptions. Patch provided by Igal Sapir. (schultz) +
  • +
+
+

Other

+
    +
  • Code: + Restore the local definition of the web service annotations since the + JRE provided versions are deprecated and Java 9 does not provide them by + default. (markt) +
  • +
  • Fix: + Add necessary Java 9 configuration options to the startup scripts to + prevent warnings being generated on web application stop. (markt) +
  • +
+
+

2017-06-26 Tomcat 9.0.0.M22 (markt)

+

Catalina

+
    +
  • Fix: + 48543: Add the option to specify an alternative file name for + the catalina.config system property. Also document that + relative, as well as absolute, URLs are permitted. (markt) +
  • +
  • Fix: + 61072: Respect the documentation statements that allow + using the platform default secure random for session id generation. + (remm) +
  • +
  • Fix: + Correct the javadoc for + o.a.c.connector.CoyoteAdapter#parseSessionCookiesId. + Patch provided by John Andrew (XUZHOUWANG) via Github. (violetagg) +
  • +
  • Fix: + 61101: CORS filter should set Vary header in response. + Submitted by Rick Riemer. (remm) +
  • +
  • Add: + 61105: Add a new JULI FileHandler configuration for + specifying the maximum number of days to keep the log files. By default + the log files will be kept 90 days as configured in + logging.properties. (violetagg) +
  • +
  • Update: + Update the Servlet 4.0 implementation to add support for setting + trailer fields for HTTP responses. (markt) +
  • +
  • Fix: + 61125: Ensure that WarURLConnection returns the + correct value for calls to getLastModified() as this is + required for the correct detection of JSP modifications when the JSP is + packaged in a WAR file. (markt) +
  • +
  • Fix: + Improve the SSLValve so it is able to handle client + certificate headers from Nginx. Based on a patch by Lucas Ventura Carro. + (markt) +
  • +
  • Fix: + 61134: Do not use '[' and ']' symbols around substituted + text fragments when generating the default error pages. Patch provided + by Katya Todorova. (violetagg) +
  • +
  • Fix: + 61154: 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, + org.apache.catalina.security.DeployXmlPermission, that + permits an application to use a META-INF/context.xml file + and then granting that permission to the Manager and Host Manager. + (markt) +
  • +
  • Fix: + 61173: Polish the javadoc for + o.a.catalina.startup.Tomcat. Patch provided by + peterhansson_se. (violetagg) +
  • +
  • Add: + A new configuration property crawlerIps is added to the + o.a.catalina.valves.CrawlerSessionManagerValve. 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) +
  • +
  • Fix: + 61180: Log a warning message rather than an information + message if it takes more than 100ms to initialised a + SecureRandom instance for a web application to use to + generate session identifiers. Patch provided by Piotr Chlebda. (markt) +
  • +
  • Fix: + 61185: When an asynchronous request is dispatched via + AsyncContext.dispatch() ensure that + getRequestURI() for the dispatched request matches that of + the original request. (markt) +
  • +
  • Fix: + 61197: Ensure that the charset name used in the + Content-Type header has exactly the same form as that + provided by the application. This reverts a behavioural change in + 9.0.0.M21 that caused problems for some clients. (markt) +
  • +
  • Fix: + 61201: Ensure that the SCRIPT_NAME environment + variable for CGI executables is populated in a consistent way regardless + of how the CGI servlet is mapped to a request. (markt) +
  • +
  • Fix: + Ensure to send a space between trailer field name and field value + for HTTP responses trailer fields. (huxing) +
  • +
+
+

Coyote

+
    +
  • Fix: + 61086: Explicitly signal an empty request body for HTTP 205 + responses. (markt) +
  • +
  • Fix: + 61120: Do not ignore path parameters when processing HTTP/2 + requests. (markt) +
  • +
  • Fix: + Revert a change introduced in the fix for bug 60718 that + changed the status code recorded in the access log when the client + dropped the connection from 200 to 500. (markt) +
  • +
  • Fix: + Make asynchronous error handling more robust. In particular ensure that + onError() is called for any registered + AsyncListeners after an I/O error on a non-container + thread. (markt) +
  • +
  • Fix: + Add additional syncs to the SSL session object provided by the OpenSSL + engine so that a concurrent destruction cannot cause a JVM crash. + (remm) +
  • +
+
+

Jasper

+
    +
  • Fix: + 44787: Improve error message when JSP compiler configuration + options are not valid. (markt) +
  • +
  • Add: + 45931: Extend Jasper's timeSpaces option to add + support for single which replaces template text that + consists entirely of whitespace with a single space character. Based on + a patch by Meetesh Karia. (markt) +
  • +
  • Fix: + 53011: When pre-compiling with JspC, report all compilation + errors rather than stopping after the first error. A new option + -failFast can be used to restore the previous behaviour of + stopping after the first error. Based on a patch provided by Marc Pompl. + (markt) +
  • +
  • Fix: + 61137: j.s.jsp.tagext.TagLibraryInfo#uri and + j.s.jsp.tagext.TagLibraryInfo#prefix fields should not be + final. Patch provided by Katya Todorova. (violetagg) +
  • +
+
+

WebSocket

+
    +
  • Fix: + Correct the log message when a MessageHandler for + PongMessage does not implement + MessageHandler.Whole. (rjung) +
  • +
  • Fix: + Improve thread-safety of Futures used to report the result + of sending WebSocket messages. (markt) +
  • +
  • Fix: + 61183: Correct a regression in the previous fix for + 58624 that could trigger a deadlock depending on the locking + strategy employed by the client code. (markt) +
  • +
+
+

Web applications

+
    +
  • Fix: + Better document the meaning of the trimSpaces option for Jasper. (markt) +
  • +
  • Fix: + 61150: 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) +
  • +
  • Fix: + Correct the TLS configuration documentation to remove SSLv2 and SSLv3 + from the list of supported protocols. (markt) +
  • +
+
+

Other

+
    +
  • Add: + 45832: Add HTTP DIGEST authentication support to the Catalina + Ant tasks used to communicate with the Manager application. (markt) +
  • +
  • Fix: + 45879: Add the RELEASE-NOTES 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) +
  • +
  • Fix: + 61055: 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) +
  • +
  • Fix: + 61076: Document the altDDName attribute for the + Context element. (markt) +
  • +
  • Fix: + Correct typo in Jar Scan Filter Configuration Reference. + Issue reported via comments.apache.org. (violetagg) +
  • +
  • Fix: + Correct the requirement for the minimum Java SE version in Application + Developer's Guide. Issue reported via comments.apache.org. (violetagg) +
  • +
  • Fix: + 61145: Add missing @Documented annotation to + annotations in the annotations API. Patch provided by Katya Todorova. + (markt) +
  • +
  • Fix: + 61146: Add missing lookup() method to + @EJB annotation in the annotations API. Patch provided by + Katya Todorova. (markt) +
  • +
  • Fix: + Correct typo in Context Container Configuration Reference. + Patch provided by Katya Todorova. (violetagg) +
  • +
+
+

2017-05-10 Tomcat 9.0.0.M21 (markt)

General

  • Add: @@ -35,10 +1386,10 @@ (markt)
  • Code: - Start to switch to using Charset rather than - String to store encoding configuration settings to reduce - the number of places the associated Charset needs to be - looked up. (markt) + Switch to using Charset rather than String to + store encoding settings (including for configuration and for the + Content-Type header) to reduce the number of places the + associated Charset needs to be looked up. (markt)
  • Fix: Use a more reliable mechanism for the DefaultServlet when @@ -156,8 +1507,8 @@ in order to expose to JMX. (kfujino)
  • Add: - Add JMX support for Channel Interceptors. The Interceptors - that implement jmx support are TcpFailureDetector, + Add JMX support for Channel Interceptors. The Interceptors + that implement JMX support are TcpFailureDetector, ThroughputInterceptor, TcpPingInterceptor, StaticMembershipInterceptor, MessageDispatchInterceptor and @@ -2494,7 +3845,7 @@ (markt)
  • Fix: - Work around a + Work around a known issue in OpenSSL that does not permit the TLS handshake to be failed if the ALPN negotiation fails. (markt)
  • @@ -3459,5 +4810,5 @@
\ No newline at end of file diff --git a/output/webapps/docs/class-loader-howto.html b/output/webapps/docs/class-loader-howto.html old mode 100755 new mode 100644 index 4797e6c..0426daf --- a/output/webapps/docs/class-loader-howto.html +++ b/output/webapps/docs/class-loader-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Class Loader HOW-TO

Class Loader HOW-TO

Table of Contents

+ Version 9.0.4, +

Class Loader HOW-TO

Table of Contents

Overview

@@ -225,6 +225,21 @@ http://docs.oracle.com/javase/1.5.0/docs/guide/standards/index.html. For Java 9+, use the upgradeable modules feature.

+

Tomcat utilizes the endorsed mechanism by including the system property setting +-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS in the +command line that starts the container. The default value of this option is +$CATALINA_HOME/endorsed. This endorsed 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 $CATALINA_HOME/endorsed exists, or the variable +JAVA_ENDORSED_DIRS has been set. +

+ +

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.

+

Running under a security manager

When running under a security manager the locations from which classes @@ -245,5 +260,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

\ No newline at end of file diff --git a/output/webapps/docs/cluster-howto.html b/output/webapps/docs/cluster-howto.html old mode 100755 new mode 100644 index ff82446..baf9b1b --- a/output/webapps/docs/cluster-howto.html +++ b/output/webapps/docs/cluster-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Clustering/Session Replication HOW-TO

Clustering/Session Replication HOW-TO

Important Note

+ Version 9.0.4, +

Clustering/Session Replication HOW-TO

Important Note

Table of Contents

@@ -198,10 +198,22 @@ sent over the wire and reinstantiated on all the other cluster nodes. Synchronous vs. asynchronous is configured using the channelSendOptions flag and is an integer value. The default value for the SimpleTcpCluster/DeltaManager combo is - 8, which is asynchronous. You can read more on the send flag(overview) or the - send flag(javadoc). - 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. + 8, which is asynchronous. +

+

+ For convenience, channelSendOptions 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 + SEND_OPTIONS_ASYNCHRONOUS | SEND_OPTIONS_MULTICAST. +

+

+ You can read more on the send flag(overview) or the + send flag(javadoc). + 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.

Bind session after crash to failover node

@@ -665,5 +677,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

\ No newline at end of file diff --git a/output/webapps/docs/comments.html b/output/webapps/docs/comments.html old mode 100755 new mode 100644 index 6e5d510..c3b8b2b --- a/output/webapps/docs/comments.html +++ b/output/webapps/docs/comments.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Documentation User Comments

Documentation User Comments

Introduction

+ Version 9.0.4, +
\ No newline at end of file diff --git a/output/webapps/docs/config/ajp.html b/output/webapps/docs/config/ajp.html old mode 100755 new mode 100644 index 48d6d27..4cd7d78 --- a/output/webapps/docs/config/ajp.html +++ b/output/webapps/docs/config/ajp.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The AJP Connector
\ No newline at end of file diff --git a/output/webapps/docs/config/automatic-deployment.html b/output/webapps/docs/config/automatic-deployment.html old mode 100755 new mode 100644 index a21326f..c06eaab --- a/output/webapps/docs/config/automatic-deployment.html +++ b/output/webapps/docs/config/automatic-deployment.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - Automatic Deployment - Use cases
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-channel.html b/output/webapps/docs/config/cluster-channel.html old mode 100755 new mode 100644 index cec8ae0..a780690 --- a/output/webapps/docs/config/cluster-channel.html +++ b/output/webapps/docs/config/cluster-channel.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Cluster Channel object
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-deployer.html b/output/webapps/docs/config/cluster-deployer.html old mode 100755 new mode 100644 index 757bafc..79cb836 --- a/output/webapps/docs/config/cluster-deployer.html +++ b/output/webapps/docs/config/cluster-deployer.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Cluster Deployer object
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-interceptor.html b/output/webapps/docs/config/cluster-interceptor.html old mode 100755 new mode 100644 index 2eabc3e..a66f8c3 --- a/output/webapps/docs/config/cluster-interceptor.html +++ b/output/webapps/docs/config/cluster-interceptor.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Channel Interceptor object

The Channel Interceptor object

Table of Contents

Introduction

@@ -57,7 +57,7 @@

In addition to dynamic discovery, Apache Tribes also supports static membership, with membership verification. To achieve this add the org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor - underneath the org.apache.catalina.tribes.group.interceptors.TcpFailureDetector interceptor. + after the org.apache.catalina.tribes.group.interceptors.TcpFailureDetector interceptor. Inside the StaticMembershipInterceptor you can add the static members you wish to have. The TcpFailureDetector 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.

@@ -258,5 +258,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-listener.html b/output/webapps/docs/config/cluster-listener.html old mode 100755 new mode 100644 index 7479d42..0bf8a1f --- a/output/webapps/docs/config/cluster-listener.html +++ b/output/webapps/docs/config/cluster-listener.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The ClusterListener object
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-manager.html b/output/webapps/docs/config/cluster-manager.html old mode 100755 new mode 100644 index f9988b9..0e34a76 --- a/output/webapps/docs/config/cluster-manager.html +++ b/output/webapps/docs/config/cluster-manager.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The ClusterManager object
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-membership.html b/output/webapps/docs/config/cluster-membership.html old mode 100755 new mode 100644 index f3024ed..a27330f --- a/output/webapps/docs/config/cluster-membership.html +++ b/output/webapps/docs/config/cluster-membership.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Cluster Membership object
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-receiver.html b/output/webapps/docs/config/cluster-receiver.html old mode 100755 new mode 100644 index 3d0c615..ec7f6ff --- a/output/webapps/docs/config/cluster-receiver.html +++ b/output/webapps/docs/config/cluster-receiver.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Cluster Receiver object
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-sender.html b/output/webapps/docs/config/cluster-sender.html old mode 100755 new mode 100644 index 70a96e8..cebea92 --- a/output/webapps/docs/config/cluster-sender.html +++ b/output/webapps/docs/config/cluster-sender.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Cluster Sender object
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster-valve.html b/output/webapps/docs/config/cluster-valve.html old mode 100755 new mode 100644 index ed4b22e..796bbd5 --- a/output/webapps/docs/config/cluster-valve.html +++ b/output/webapps/docs/config/cluster-valve.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Cluster Valve object
\ No newline at end of file diff --git a/output/webapps/docs/config/cluster.html b/output/webapps/docs/config/cluster.html old mode 100755 new mode 100644 index b254897..6fd2f9a --- a/output/webapps/docs/config/cluster.html +++ b/output/webapps/docs/config/cluster.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Cluster object

The Cluster object

Table of Contents

Introduction

@@ -136,7 +136,15 @@
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.

+ to the order in which they were sent. +

+

+ You may also set these options as a comma separated string, e.g. "async, multicast", which + will be translated into Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST +
+ The valid option names are "asynchronous" (alias "async"), "byte_message" (alias "byte") + , "multicast", "secure", "synchronized_ack" (alias "sync"), "udp", "use_ack" +

channelStartOptions

Sets the start and stop flags for the <Channel> object used by the cluster. The default is Channel.DEFAULT which starts all the channel services, such as @@ -172,5 +180,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

\ No newline at end of file diff --git a/output/webapps/docs/config/context.html b/output/webapps/docs/config/context.html old mode 100755 new mode 100644 index 4f3306c..a55982f --- a/output/webapps/docs/config/context.html +++ b/output/webapps/docs/config/context.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Context Container

The Context Container

Table of Contents

Introduction

@@ -266,6 +266,10 @@ Note that any setting other than false causes Tomcat to behave in a way that is not technically spec-compliant. The default is false

+ altDDName +

The absolute path to the alternative deployment descriptor for this + context. This overrides the default deployment descriptor located at + /WEB-INF/web.xml.

backgroundProcessorDelay

This value represents the delay in seconds between the invocation of the backgroundProcess method on this context and @@ -549,21 +553,21 @@ Context. If not specified, a standard default value will be used.

xmlBlockExternal

If the value of this flag is true, the parsing of - web.xml, web-fragment.xml, *.tld, - *.jspx, *.tagx and tagPlugins.xml - files for this web application will not permit external entities to be - loaded. If not specified, the default value of true will - be used.

+ web.xml, web-fragment.xml, + tomcat-web.xml, *.tld, *.jspx, + *.tagx and tagPlugins.xml files for this web + application will not permit external entities to be loaded. If not + specified, the default value of true will be used.

xmlNamespaceAware

If the value of this flag is true, the parsing of - web.xml and web-fragment.xml files for this - web application will be namespace-aware. Note that *.tld, - *.jspx and *.tagx files are always parsed - using a namespace-aware parser and that the tagPlugins.xml - 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 - xmlValidation on. If the - org.apache.catalina.STRICT_SERVLET_COMPLIANCE + web.xml, web-fragment.xml and + tomcat-web.xml files for this web application will be + namespace-aware. Note that *.tld, *.jspx and + *.tagx files are always parsed using a namespace-aware + parser and that the tagPlugins.xml 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 xmlValidation on. If + the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true, the default value of this attribute will be true, else the default value will be false. @@ -571,8 +575,9 @@ penalty.

xmlValidation

If the value of this flag is true, the parsing of - web.xml and web-fragment.xml files for this - web application will use a validating parser. If the + web.xml, web-fragment.xml and + tomcat-web.xml files for this web application will use a + validating parser. If the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true, the default value of this attribute will be @@ -676,7 +681,7 @@ createSubContext(), destroySubContext() or close() will trigger a javax.naming.OperationNotSupportedException as required by section EE.5.3.4 of the Java EE specification. This exception can be - disabled by setting this attribute to true in which case any calls to + disabled by setting this attribute to false in which case any calls to modify the JNDI context will return without making any changes and methods that return values will return null. If not specified, the specification compliant default of true will @@ -818,6 +823,10 @@ to establish default mappings (such as mapping the *.jsp extension to the corresponding JSP servlet), and other standard features that apply to all web applications. +

  • The web application properties listed in the + /WEB-INF/tomcat-web.xml resource for this web application + will be processed (if this resource exists), taking precedence over the + defaults.
  • The web application properties listed in the /WEB-INF/web.xml resource for this web application will be processed (if this resource exists).
  • @@ -1215,5 +1224,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/cookie-processor.html b/output/webapps/docs/config/cookie-processor.html old mode 100755 new mode 100644 index fb75b77..dc60cae --- a/output/webapps/docs/config/cookie-processor.html +++ b/output/webapps/docs/config/cookie-processor.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Cookie Processor Component
    \ No newline at end of file diff --git a/output/webapps/docs/config/credentialhandler.html b/output/webapps/docs/config/credentialhandler.html old mode 100755 new mode 100644 index dd3c3d6..af8be1f --- a/output/webapps/docs/config/credentialhandler.html +++ b/output/webapps/docs/config/credentialhandler.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The CredentialHandler Component
    \ No newline at end of file diff --git a/output/webapps/docs/config/engine.html b/output/webapps/docs/config/engine.html old mode 100755 new mode 100644 index f5c8049..1d28c69 --- a/output/webapps/docs/config/engine.html +++ b/output/webapps/docs/config/engine.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Engine Container
    \ No newline at end of file diff --git a/output/webapps/docs/config/executor.html b/output/webapps/docs/config/executor.html old mode 100755 new mode 100644 index cc58bee..6a0189b --- a/output/webapps/docs/config/executor.html +++ b/output/webapps/docs/config/executor.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Executor (thread pool)
    \ No newline at end of file diff --git a/output/webapps/docs/config/filter.html b/output/webapps/docs/config/filter.html old mode 100755 new mode 100644 index 5e02a73..ebb1251 --- a/output/webapps/docs/config/filter.html +++ b/output/webapps/docs/config/filter.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - Container Provided Filters

    Container Provided Filters

    Table of Contents

    - + Version 9.0.4, +

    Container Provided Filters

    Table of Contents

    +

    Introduction

    Tomcat provides a number of Filters which may be @@ -1473,7 +1473,7 @@

    -

    Sample Configuration

    +

    Sample Configuration

    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 @@ -1502,6 +1502,45 @@ org.apache.catalina.filters.RequestDumperFilter.handlers = \ 1request-dumper.org.apache.juli.FileHandler

    +

    Session Initializer Filter

    + +

    Introduction

    +

    The Session Initializer Filter initializes the javax.servlet.http.HttpSession + before the Request is processed. This is required for JSR-356 compliant WebSocket implementations, + if the HttpSession is needed during the HandShake phase.

    + +

    The Java API for WebSocket does not mandate that an HttpSession would + be initialized upon request, and thus javax.servlet.http.HttpServletRequest's + getSession() returns null if the HttpSession was not + initialized in advance.

    + +

    This filter solves that problem by initializing the HttpSession for any HttpServletRequest + that matches its url-pattern.

    +
    + +

    Filter Class Name

    +

    The filter class name for the Session Initializer Filter is + org.apache.catalina.filters.SessionInitializerFilter.

    +
    + +

    Initialisation parameters

    +

    The Session Initializer Filter does not support any initialization parameters.

    +
    + +

    Sample Configuration

    +

    The following entries in the Web Application Deployment Descriptor, web.xml, + would enable the Session Initializer Filter for requests that match the given URL pattern + (in this example, "/ws/*").

    + +
    <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>
    +

    Set Character Encoding Filter

    Introduction

    @@ -1590,5 +1629,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/globalresources.html b/output/webapps/docs/config/globalresources.html old mode 100755 new mode 100644 index b65e465..5199b02 --- a/output/webapps/docs/config/globalresources.html +++ b/output/webapps/docs/config/globalresources.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The GlobalNamingResources Component

    The GlobalNamingResources Component

    Table of Contents

    Introduction

    @@ -167,7 +167,7 @@ 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 singleton attribute is - false. If not specificed, no default is defined and no close method will + false. If not specified, no default is defined and no close method will be called.

    For Apache Commons DBCP and Apache Tomcat JDBC connection pools you can use closeMethod="close".

    @@ -254,5 +254,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/host.html b/output/webapps/docs/config/host.html old mode 100755 new mode 100644 index 0682faa..3f39eea --- a/output/webapps/docs/config/host.html +++ b/output/webapps/docs/config/host.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Host Container

    The Host Container

    Table of Contents

    Introduction

    @@ -234,7 +234,13 @@ fail to start in case the descriptor contains necessary configuration for secure deployment (such as a RemoteAddrValve) which should not be ignored. The flag's value defaults to true unless a - security manager is enabled when the default is false.

    + security manager is enabled when the default is false. + When running under a security manager this may be enabled on a per web + application basis by granting the + org.apache.catalina.security.DeployXmlPermission 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.

    errorReportValveClass

    Java class name of the error reporting valve which will be used by this Host. The responsibility of this valve is to output error @@ -258,6 +264,12 @@ 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.

    +

    Note: Running with this option set to false 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 ExtractingRoot + Resources implementation.

    workDir

    Pathname to a scratch directory to be used by applications for this Host. Each application will have its own sub directory with @@ -614,5 +626,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/http.html b/output/webapps/docs/config/http.html old mode 100755 new mode 100644 index 9d5ed5c..5a9bf31 --- a/output/webapps/docs/config/http.html +++ b/output/webapps/docs/config/http.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The HTTP Connector

    The HTTP Connector

    Table of Contents

    Introduction

    @@ -275,6 +275,11 @@ 0.0.0.0 and will listen on IPv6 addresses (and optionally IPv4 addresses depending on the setting of ipv6onlyv6) if configured with ::.

    + allowHostHeaderMismatch +

    By default Tomcat will reject requests that specify a host in the + request line but specify a different host in the host header. This + chekc can be disabled by setting this attribute to false. If + not specified, the default is true.

    allowedTrailerHeaders

    By default Tomcat will ignore all trailer headers when processing chunked input. For a header to be processed, it must be added to this @@ -447,6 +452,12 @@ 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).

    + rejectIllegalHeaderName +

    If an HTTP request is received that contains an illegal header name + (i.e. the header name is not a token) this setting determines if the + request will be rejected with a 400 response (true) or if the + illegal header be ignored (false). The default value is + true which will cause the request to be rejected.

    restrictedUserAgents

    The value is a regular expression (using java.util.regex) matching the user-agent header of HTTP clients for which @@ -998,8 +1009,12 @@ compression then the default for that OpenSSL version will be used.

    disableSessionTickets

    OpenSSL only.

    -

    Disables use of TLS Session Tickets (RFC 4507) if set to - true. Default is false.

    +

    Disables use of TLS session tickets (RFC 5077) if set to + true. Default is false. 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.

    honorCipherOrder

    Set to true to enforce the server's cipher order (from the ciphers setting) instead of allowing @@ -1026,8 +1041,8 @@

    The names of the protocols to support when communicating with clients. This should be a list of any combination of the following:

    -
    • SSLv2Hello
    • SSLv2
    • SSLv3
    • TLSv1
    • -
    • TLSv1.1
    • TLSv1.2
    • all
    +
    • SSLv2Hello
    • SSLv3
    • TLSv1
    • TLSv1.1
    • +
    • TLSv1.2
    • all

    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 @@ -1542,5 +1557,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/http2.html b/output/webapps/docs/config/http2.html old mode 100755 new mode 100644 index 019b5fc..2be52dd --- a/output/webapps/docs/config/http2.html +++ b/output/webapps/docs/config/http2.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The HTTP2 Upgrade Protocol

    The HTTP2 Upgrade Protocol

    Table of Contents

    Introduction

    @@ -75,6 +75,40 @@

    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.

    + compressibleMimeType +

    The value is a comma separated list of MIME types for which HTTP + compression may be used. + The default value is + + text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml + . +

    + compression +

    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".

    +

    Note: 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 useSendfile attribute + of the protocol, as documented below, or change the sendfile usage + threshold in the configuration of the + DefaultServlet in the default + conf/web.xml or in the web.xml of your web + application. +

    + compressionMinSize +

    If compression 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".

    initialWindowSize

    Controls the initial size of the flow control window for streams that Tomcat advertises to clients. If not specified, the default value of @@ -121,11 +155,21 @@ 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.

    + noCompressionUserAgents +

    The value is a regular expression (using java.util.regex) + matching the user-agent 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).

    readTimeout

    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 10000 will be used.

    + useSendfile +

    Use this boolean attribute to enable or disable sendfile capability. + The default value is true.

    writeTimeout

    The time, in milliseconds, that Tomcat will wait to write additional data when an HTTP/2 frame has been partially written. Negative values will @@ -166,5 +210,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/index.html b/output/webapps/docs/config/index.html old mode 100755 new mode 100644 index 4069815..544655a --- a/output/webapps/docs/config/index.html +++ b/output/webapps/docs/config/index.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - Overview

    Overview

    Overview

    This manual contains reference information about all of the configuration directives that can be included in a conf/server.xml file to @@ -103,5 +103,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/jar-scan-filter.html b/output/webapps/docs/config/jar-scan-filter.html old mode 100755 new mode 100644 index 129ad69..e4d9ad3 --- a/output/webapps/docs/config/jar-scan-filter.html +++ b/output/webapps/docs/config/jar-scan-filter.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Jar Scan Filter Component

    The Jar Scan Filter Component

    Table of Contents

    Introduction

    @@ -161,10 +161,10 @@

    Nested Components

    -

    No components may be nested inside a Jar Scanner element. +

    No components may be nested inside a Jar Scan Filter element.

    Special Features

    -

    No special features are associated with a Jar Scanner +

    No special features are associated with a Jar Scan Filter element.

    Comments @@ -179,5 +179,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/jar-scanner.html b/output/webapps/docs/config/jar-scanner.html old mode 100755 new mode 100644 index 51bd975..3290d7c --- a/output/webapps/docs/config/jar-scanner.html +++ b/output/webapps/docs/config/jar-scanner.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Jar Scanner Component

    The Jar Scanner Component

    Table of Contents

    Introduction

    @@ -111,7 +111,7 @@ files. The default is false.

    scanManifest

    If true, the Manifest files of any JARs found will be - scanned for additional class path entires and those entries will be added + scanned for additional class path entries and those entries will be added to the URLs to scan. The default is true.

    @@ -137,5 +137,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/jaspic.html b/output/webapps/docs/config/jaspic.html old mode 100755 new mode 100644 index 7b31061..02124fb --- a/output/webapps/docs/config/jaspic.html +++ b/output/webapps/docs/config/jaspic.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - JASPIC
    \ No newline at end of file diff --git a/output/webapps/docs/config/listeners.html b/output/webapps/docs/config/listeners.html old mode 100755 new mode 100644 index d612719..88ae5d5 --- a/output/webapps/docs/config/listeners.html +++ b/output/webapps/docs/config/listeners.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The LifeCycle Listener Component

    The LifeCycle Listener Component

    Table of Contents

    Introduction

    @@ -193,7 +193,7 @@ The protection is enabled by setting the java.util.concurrent.ForkJoinPool.common.threadFactory system property. If this property is set when Tomcat starts, Tomcat will - not over-ride it even if this protection is explictly enabled. The + not over-ride it even if this protection is explicitly enabled. The default is true.

    gcDaemonProtection

    Enables protection so that calls to @@ -530,5 +530,5 @@

    Using JAAS

    Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/loader.html b/output/webapps/docs/config/loader.html old mode 100755 new mode 100644 index 385af94..7042687 --- a/output/webapps/docs/config/loader.html +++ b/output/webapps/docs/config/loader.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Loader Component

    The Loader Component

    Table of Contents

    Introduction

    @@ -128,10 +128,6 @@ A non-parallel capable loaderClass is available and can be used by specifying org.apache.catalina.loader.WebappClassLoader.

    - searchExternalFirst -

    Set to true if you want repositories outside - of WEB-INF/classes and WEB-INF/lib to - be searched first. Default value is false.

    @@ -161,5 +157,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/manager.html b/output/webapps/docs/config/manager.html old mode 100755 new mode 100644 index e3db3d1..321db1f --- a/output/webapps/docs/config/manager.html +++ b/output/webapps/docs/config/manager.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Manager Component

    The Manager Component

    Table of Contents

    Introduction

    @@ -367,6 +367,10 @@
    JDBC Based Store
    HOW-TO.

    driverName

    Java class name of the JDBC driver to be used.

    + localDataSource +

    This allows the Store to use a DataSource defined for the Context + rather than a global DataSource. If not specified, the default is + false: use a global DataSource.

    sessionAppCol

    Name of the database column, contained in the specified session table, that contains the Engine, Host, and Web Application Context name in the @@ -484,5 +488,5 @@

    JDBC Based Store
    Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/realm.html b/output/webapps/docs/config/realm.html old mode 100755 new mode 100644 index 583c5fe..238d135 --- a/output/webapps/docs/config/realm.html +++ b/output/webapps/docs/config/realm.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Realm Component

    The Realm Component

    Table of Contents

    Introduction

    @@ -399,6 +399,10 @@ protocol

    A string specifying the security protocol to use. If not given the providers default is used.

    + readTimeout +

    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.

    referrals

    How do we handle JNDI referrals? Allowed values are "ignore", "follow", or "throw" (see javax.naming.Context.REFERRAL @@ -996,5 +1000,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/resources.html b/output/webapps/docs/config/resources.html old mode 100755 new mode 100644 index 47b067b..ee552c1 --- a/output/webapps/docs/config/resources.html +++ b/output/webapps/docs/config/resources.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Resources Component

    The Resources Component

    Table of Contents

    Introduction

    @@ -68,9 +68,9 @@ Description allowLinking

    If the value of this flag is true, symlinks will be - allowed inside the web application, pointing to resources outside the - web application base path. If not specified, the default value - of the flag is false.

    + 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 false.

    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 @@ -135,9 +135,27 @@

    Standard Implementation

    +

    Standard Root Implementation

    +

    The standard implementation of Resources is - org.apache.catalina.webresources.StandardRoot, and - is configured by its parent Context element.

    + org.apache.catalina.webresources.StandardRoot. It does not + support any additional attributes.

    + +

    Extracting Root Implementation

    + +

    The extracting implementation of Resources is + org.apache.catalina.webresources.ExtractingRoot. It does not + support any additional attributes.

    + +

    When deploying web applications as packed WAR files, the extracting root + will extract any JAR files from /WEB-INF/lib to a + application-jars directory located in the web + application's working directory. These extracted JARs will be removed + when the web application stops.

    + +

    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.

    @@ -298,5 +316,5 @@

    Ordering

    Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/server.html b/output/webapps/docs/config/server.html old mode 100755 new mode 100644 index 05c2427..b47d911 --- a/output/webapps/docs/config/server.html +++ b/output/webapps/docs/config/server.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Server Component
    \ No newline at end of file diff --git a/output/webapps/docs/config/service.html b/output/webapps/docs/config/service.html old mode 100755 new mode 100644 index 05cb7ae..524ea59 --- a/output/webapps/docs/config/service.html +++ b/output/webapps/docs/config/service.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Service Component
    \ No newline at end of file diff --git a/output/webapps/docs/config/sessionidgenerator.html b/output/webapps/docs/config/sessionidgenerator.html old mode 100755 new mode 100644 index b9aa508..b2d117a --- a/output/webapps/docs/config/sessionidgenerator.html +++ b/output/webapps/docs/config/sessionidgenerator.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The SessionIdGenerator Component
    \ No newline at end of file diff --git a/output/webapps/docs/config/systemprops.html b/output/webapps/docs/config/systemprops.html old mode 100755 new mode 100644 index 6c93a7e..e05df0e --- a/output/webapps/docs/config/systemprops.html +++ b/output/webapps/docs/config/systemprops.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - System Properties

    System Properties

    Table of Contents

    Introduction

    The following sections list the system properties that may be set to modify @@ -47,6 +47,13 @@ Required to have a public constructor with no arguments.

    Use this to add a property source, that will be invoked when ${parameter} denoted parameters are found in the XML files that Tomcat parses.

    +

    Property replacement from the specified property source on the JVM + system properties can also be done using the + REPLACE_SYSTEM_PROPERTIES system property.

    + org.apache.tomcat.util.digester. REPLACE_SYSTEM_PROPERTIES +

    Set this boolean system property to true to cause + property replacement from the digester property source on the JVM + system properties.

    Clustering

    @@ -127,10 +134,15 @@ cause an error.

    If not specified, the specification compliant default of true will be used.

    + org.apache.jasper.runtime. BodyContentImpl.BUFFER_SIZE +

    The size (in characters) to use when creating a tag buffer.

    +

    If not specified, the default value of + org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE (512) + will be used.

    org.apache.jasper.runtime. BodyContentImpl.LIMIT_BUFFER

    If true, any tag buffer that expands beyond - org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE will be - destroyed and a new buffer created of the default size.

    + org.apache.jasper.runtime.BodyContentImpl.BUFFER_SIZE will be + destroyed and a new buffer created.

    If not specified, the default value of false will be used.

    org.apache.jasper.runtime. JspFactoryImpl.USE_POOL

    If true, a ThreadLocal PageContext pool will @@ -469,7 +481,11 @@ Engine element. It does not override the value configured on the Engine element.

    catalina.config -

    The URL for the catalina.properties configuration file.

    +

    The location from which to load the catalina.properties configuration + file. This may be an absolute URL, a relative (to the current working + directory) URL or an alternative file name in which case Tomcat will + attempt to load the file from the default location of + $CATALINA_BASE/conf/.

    tomcat.util.buf.StringCache.byte.enabled

    If true, the String cache is enabled for ByteChunk.

    @@ -529,5 +545,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/config/valve.html b/output/webapps/docs/config/valve.html old mode 100755 new mode 100644 index 6e30c01..a432240 --- a/output/webapps/docs/config/valve.html +++ b/output/webapps/docs/config/valve.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 Configuration Reference (9.0.0.M21) - The Valve Component

    The Valve Component

    Table of Contents

    Introduction

    A Valve element represents a component that will be @@ -257,6 +257,13 @@

  • %T - Time taken to process the request, in seconds
  • %F - Time taken to commit the response, in millis
  • %I - Current request thread name (can compare later with stacktraces)
  • +
  • %X - Connection status when response is completed: +
      +
    • X = Connection aborted before the response completed.
    • +
    • + = Connection may be kept alive after the response is sent.
    • +
    • - = Connection will be closed after the response is sent.
    • +
    +
  • @@ -636,6 +643,77 @@

    Proxies Support

    +

    Load Balancer Draining Valve

    +

    Introduction

    +

    + 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 DISABLED + state; in mod_proxy_ajp, this is the Drain (N) state), requests + for expired sessions can actually cause the draining node to fail to + drain. +

    +

    + 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. +

    +

    + 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). +

    + +

    + 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". +

    + +

    + 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. +

    +
    + +

    Attributes

    +

    The Load Balancer Draining Valve supports the + following configuration attributes:

    + +
    + Attribute + + Description +
    className +

    Java class name of the implementation to use. This MUST be set to + org.apache.catalina.valves.LoadBalancerDrainingValve. +

    +
    redirectStatusCode +

    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.

    +
    ignoreCookieName +

    When used with ignoreCookieValue, a client can present + this cookie (and accompanying value) that will cause this Valve to + do nothing. This will allow you to probe your disabled node + before re-enabling it to make sure that it is working as expected.

    +
    ignoreCookieValue +

    When used with ignoreCookieName, a client can present + a cookie (and accompanying value) that will cause this Valve to + do nothing. This will allow you to probe your disabled node + before re-enabling it to make sure that it is working as expected.

    +
    +
    +

    Remote IP Valve

    @@ -908,6 +986,17 @@ point where users are authenticated. This is to prevent session fixation attacks. If not set, the default value of true will be used.

    + charset +

    Controls if the WWW-Authenticate HTTP header includes a + charset authentication parameter as per RFC 7617. The only + permitted options are null, the empty string and + UTF-8. If UTF-8 is specified then the + charset 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 charset + 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 null

    className

    Java class name of the implementation to use. This MUST be set to org.apache.catalina.authenticator.BasicAuthenticator.

    @@ -947,6 +1036,12 @@ 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.

    + jaspicCallbackHandlerClass +

    Name of the Java class of the + javax.security.auth.callback.CallbackHandler implementation + which should be used by JASPIC. If none is specified the default + org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl + will be used.

    @@ -1065,6 +1160,12 @@ 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.

    + jaspicCallbackHandlerClass +

    Name of the Java class of the + javax.security.auth.callback.CallbackHandler implementation + which should be used by JASPIC. If none is specified the default + org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl + will be used.

    @@ -1154,6 +1255,12 @@ 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.

    + jaspicCallbackHandlerClass +

    Name of the Java class of the + javax.security.auth.callback.CallbackHandler implementation + which should be used by JASPIC. If none is specified the default + org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl + will be used.

    @@ -1232,6 +1339,12 @@ 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.

    + jaspicCallbackHandlerClass +

    Name of the Java class of the + javax.security.auth.callback.CallbackHandler implementation + which should be used by JASPIC. If none is specified the default + org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl + will be used.

    @@ -1358,6 +1471,12 @@ services) via the org.apache.catalina.realm.GSS_CREDENTIAL request attribute. If not set, the default value of true will be used.

    + jaspicCallbackHandlerClass +

    Name of the Java class of the + javax.security.auth.callback.CallbackHandler implementation + which should be used by JASPIC. If none is specified the default + org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl + will be used.

    @@ -1439,6 +1558,10 @@

    Java class name of the implementation to use. This MUST be set to org.apache.catalina.valves.CrawlerSessionManagerValve.

    + crawlerIps +

    Regular expression (using java.util.regex) that client + IP is matched against to determine if a request is from a web crawler. + By default such regular expression is not set.

    crawlerUserAgents

    Regular expression (using java.util.regex) that the user agent HTTP request header is matched against to determine if a request @@ -1563,5 +1686,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/connectors.html b/output/webapps/docs/connectors.html old mode 100755 new mode 100644 index f68e6a8..ec3e99a --- a/output/webapps/docs/connectors.html +++ b/output/webapps/docs/connectors.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Connectors How To

    Connectors How To

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/default-servlet.html b/output/webapps/docs/default-servlet.html old mode 100755 new mode 100644 index d7f19db..b165cc8 --- a/output/webapps/docs/default-servlet.html +++ b/output/webapps/docs/default-servlet.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Default Servlet Reference

    Default Servlet Reference

    Table of Contents

    + Version 9.0.4, +

    Default Servlet Reference

    Table of Contents

    What is the DefaultServlet

    @@ -66,8 +66,19 @@ <url-pattern>/</url-pattern> </servlet-mapping>

    -So by default, the default servlet is loaded at webapp startup and -directory listings are disabled and debugging is turned off. +

    So by default, the default servlet is loaded at webapp startup and directory +listings are disabled and debugging is turned off.

    + +

    If you need to change the DefaultServlet settings for an application you can +override the default configuration by re-defining the DefaultServlet in +/WEB-INF/web.xml. However, this will cause problems if you attempt +to deploy the application on another container as the DefaultServlet class will +not be recognised. You can work-around this problem by using the Tomact specific +/WEB-INF/tomcat-web.xml deployment descriptor. The format is +identical to /WEB-INF/web.xml. It will override any default +settings but not those in /WEB-INF/web.xml. Since it is Tomcat +specific, it will only be processed when the application is deployed on +Tomcat.

    What can I change?

    The DefaultServlet allows the following initParamters: @@ -155,6 +166,9 @@ fileEncoding File encoding to be used when reading 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] 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 @@ -298,5 +312,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/deployer-howto.html b/output/webapps/docs/deployer-howto.html old mode 100755 new mode 100644 index a774edf..f9f87ed --- a/output/webapps/docs/deployer-howto.html +++ b/output/webapps/docs/deployer-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Tomcat Web Application Deployment

    Tomcat Web Application Deployment

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/developers.html b/output/webapps/docs/developers.html old mode 100755 new mode 100644 index fcba4c3..d1d31bf --- a/output/webapps/docs/developers.html +++ b/output/webapps/docs/developers.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Tomcat Developers

    Tomcat Developers

    Active Developers

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/elapi/index.html b/output/webapps/docs/elapi/index.html old mode 100755 new mode 100644 diff --git a/output/webapps/docs/extras.html b/output/webapps/docs/extras.html old mode 100755 new mode 100644 index 2bd4e9a..8b90e50 --- a/output/webapps/docs/extras.html +++ b/output/webapps/docs/extras.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Additional Components

    Additional Components

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/fs-admin-apps.html b/output/webapps/docs/funcspecs/fs-admin-apps.html old mode 100755 new mode 100644 index fe6f11b..d05d429 --- a/output/webapps/docs/funcspecs/fs-admin-apps.html +++ b/output/webapps/docs/funcspecs/fs-admin-apps.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - Administrative Apps - Overall Requirements

    Administrative Apps - Overall Requirements

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/fs-admin-objects.html b/output/webapps/docs/funcspecs/fs-admin-objects.html old mode 100755 new mode 100644 index e2fb26a..f3d3938 --- a/output/webapps/docs/funcspecs/fs-admin-objects.html +++ b/output/webapps/docs/funcspecs/fs-admin-objects.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - Administrative Apps - Administered Objects

    Administrative Apps - Administered Objects

    Table of Contents

    + Version 9.0.4, +

    Administrative Apps - Administered Objects

    Table of Contents

    Administered Objects Overview

    @@ -446,5 +446,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/fs-admin-opers.html b/output/webapps/docs/funcspecs/fs-admin-opers.html old mode 100755 new mode 100644 index 5851c40..46af9a1 --- a/output/webapps/docs/funcspecs/fs-admin-opers.html +++ b/output/webapps/docs/funcspecs/fs-admin-opers.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - Administrative Apps - Supported Operations

    Administrative Apps - Supported Operations

    Table of Contents

    + Version 9.0.4, +

    Administrative Apps - Supported Operations

    Table of Contents

    Supported Operations Overview

    @@ -305,5 +305,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/fs-default.html b/output/webapps/docs/funcspecs/fs-default.html old mode 100755 new mode 100644 index ecb8759..f8879d5 --- a/output/webapps/docs/funcspecs/fs-default.html +++ b/output/webapps/docs/funcspecs/fs-default.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - Default Servlet
    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/fs-jdbc-realm.html b/output/webapps/docs/funcspecs/fs-jdbc-realm.html old mode 100755 new mode 100644 index f1491ef..2ad7c31 --- a/output/webapps/docs/funcspecs/fs-jdbc-realm.html +++ b/output/webapps/docs/funcspecs/fs-jdbc-realm.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - JDBCRealm

    JDBCRealm

    Table of Contents

    + Version 9.0.4, +

    JDBCRealm

    Table of Contents

    Overview

    @@ -262,5 +262,5 @@

    Method hasRole() Functionality

    Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/fs-jndi-realm.html b/output/webapps/docs/funcspecs/fs-jndi-realm.html old mode 100755 new mode 100644 index f05485a..19afa3b --- a/output/webapps/docs/funcspecs/fs-jndi-realm.html +++ b/output/webapps/docs/funcspecs/fs-jndi-realm.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - JNDIRealm
    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/fs-memory-realm.html b/output/webapps/docs/funcspecs/fs-memory-realm.html old mode 100755 new mode 100644 index d01c6d8..9ad09f6 --- a/output/webapps/docs/funcspecs/fs-memory-realm.html +++ b/output/webapps/docs/funcspecs/fs-memory-realm.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - MemoryRealm

    MemoryRealm

    Table of Contents

    + Version 9.0.4, +

    MemoryRealm

    Table of Contents

    Overview

    @@ -249,5 +249,5 @@

    Method hasRole() Functionality

    Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/index.html b/output/webapps/docs/funcspecs/index.html old mode 100755 new mode 100644 index 9228229..84f5cd2 --- a/output/webapps/docs/funcspecs/index.html +++ b/output/webapps/docs/funcspecs/index.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - Table of Contents

    Table of Contents

    Catalina Functional Specifications

    + Version 9.0.4, +

    Table of Contents

    Catalina Functional Specifications

    This documentation area includes functional specifications for many features supported by the Catalina servlet container @@ -76,5 +76,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/funcspecs/mbean-names.html b/output/webapps/docs/funcspecs/mbean-names.html old mode 100755 new mode 100644 index 9a79477..5293c2c --- a/output/webapps/docs/funcspecs/mbean-names.html +++ b/output/webapps/docs/funcspecs/mbean-names.html @@ -1,5 +1,5 @@ -Catalina Functional Specifications (9.0.0.M21) - Tomcat MBean Names

    Tomcat MBean Names

    Table of Contents

    + Version 9.0.4, +

    Tomcat MBean Names

    Table of Contents

    Background

    @@ -697,5 +697,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/html-manager-howto.html b/output/webapps/docs/html-manager-howto.html old mode 100755 new mode 100644 index c429b85..647562b --- a/output/webapps/docs/html-manager-howto.html +++ b/output/webapps/docs/html-manager-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Tomcat Web Application Manager How To

    Tomcat Web Application Manager How To

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/images/add.gif b/output/webapps/docs/images/add.gif old mode 100755 new mode 100644 diff --git a/output/webapps/docs/images/asf-logo.svg b/output/webapps/docs/images/asf-logo.svg old mode 100755 new mode 100644 index 620694c..e24cbe5 --- a/output/webapps/docs/images/asf-logo.svg +++ b/output/webapps/docs/images/asf-logo.svg @@ -1,4 +1,20 @@ + -Apache Tomcat 9 (9.0.0.M21) - Documentation Index

    Documentation Index

    Introduction

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/introduction.html b/output/webapps/docs/introduction.html old mode 100755 new mode 100644 index f2e483d..67e2698 --- a/output/webapps/docs/introduction.html +++ b/output/webapps/docs/introduction.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Introduction

    Introduction

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/jasper-howto.html b/output/webapps/docs/jasper-howto.html old mode 100755 new mode 100644 index 57e0030..a84c80e --- a/output/webapps/docs/jasper-howto.html +++ b/output/webapps/docs/jasper-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Jasper 2 JSP Engine How To

    Jasper 2 JSP Engine How To

    Table of Contents

    + Version 9.0.4, +

    Jasper 2 JSP Engine How To

    Table of Contents

    Introduction

    @@ -188,8 +188,12 @@ debugging be suppressed? true or false, default false. -
  • trimSpaces - Should white spaces in template text between -actions or directives be trimmed ?, default false.
  • +
  • trimSpaces - Should template text that consists entirely of +whitespace be removed from the output (true), replaced with a +single space (single) or left unchanged (false)? Note +that if a JSP page or tag file specifies a trimDirectiveWhitespaces +value of true, that will take precedence over this configuration +setting for that page/tag. Default false.
  • xpoweredBy - Determines whether X-Powered-By response header is added by generated servlet. true or false, @@ -216,6 +220,17 @@ of the new compiler by configuring the compiler attribute as explained above.

    +

    If you need to change the JSP Servlet settings for an application you can +override the default configuration by re-defining the JSP Servlet in +/WEB-INF/web.xml. However, this may cause problems if you attempt +to deploy the application on another container as the JSP Servlet class may +not be recognised. You can work-around this problem by using the Tomact specific +/WEB-INF/tomcat-web.xml deployment descriptor. The format is +identical to /WEB-INF/web.xml. It will override any default +settings but not those in /WEB-INF/web.xml. Since it is Tomcat +specific, it will only be processed when the application is deployed on +Tomcat.

    +
  • Known issues

    As described in @@ -404,5 +419,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/jdbc-pool.html b/output/webapps/docs/jdbc-pool.html old mode 100755 new mode 100644 index f08fa7b..a535f25 --- a/output/webapps/docs/jdbc-pool.html +++ b/output/webapps/docs/jdbc-pool.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - The Tomcat JDBC Connection Pool

    The Tomcat JDBC Connection Pool

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/jndi-datasource-examples-howto.html b/output/webapps/docs/jndi-datasource-examples-howto.html old mode 100755 new mode 100644 index 9b595f8..03dac03 --- a/output/webapps/docs/jndi-datasource-examples-howto.html +++ b/output/webapps/docs/jndi-datasource-examples-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - JNDI Datasource HOW-TO

    JNDI Datasource HOW-TO

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/jndi-resources-howto.html b/output/webapps/docs/jndi-resources-howto.html old mode 100755 new mode 100644 index 64f9063..f50ebc3 --- a/output/webapps/docs/jndi-resources-howto.html +++ b/output/webapps/docs/jndi-resources-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - JNDI Resources HOW-TO

    JNDI Resources HOW-TO

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/jspapi/index.html b/output/webapps/docs/jspapi/index.html old mode 100755 new mode 100644 diff --git a/output/webapps/docs/logging.html b/output/webapps/docs/logging.html old mode 100755 new mode 100644 index ce951e4..b36da13 --- a/output/webapps/docs/logging.html +++ b/output/webapps/docs/logging.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Logging in Tomcat

    Logging in Tomcat

    Table of Contents

    + Version 9.0.4, +

    Logging in Tomcat

    Table of Contents

    Introduction

    @@ -284,6 +284,12 @@ boolean value.

  • The root logger can define its set of handlers using the .handlers property.
  • +
  • By default the log files will be kept on the file system + 90 days. This may be changed per handler using the + handlerName.maxDays property. If the specified value for the + property is <=0 then the log files will be kept on the + file system forever, otherwise they will be kept the specified maximum + days.
  • There are several additional implementation classes, that can be used @@ -414,5 +420,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/manager-howto.html b/output/webapps/docs/manager-howto.html old mode 100755 new mode 100644 index 9aa25b0..d05643f --- a/output/webapps/docs/manager-howto.html +++ b/output/webapps/docs/manager-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Manager App HOW-TO
    -

    Connector SSL/TLS diagnostics

    +

    Connector SSL/TLS cipher information

    http://localhost:8080/manager/text/sslConnectorCiphers
    @@ -866,6 +866,61 @@
    +

    Connector SSL/TLS certificate chain information

    + +
    http://localhost:8080/manager/text/sslConnectorCerts
    + +

    The SSL Connector/Certs diagnostic lists the certificate chain that is +currently configured for each virtual host.

    + +

    The response will look something like this:

    +
    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
    +  ...
    + +
    + +

    Connector SSL/TLS trusted certificate information

    + +
    http://localhost:8080/manager/text/sslConnectorTrustedCerts
    + +

    The SSL Connector/Certs diagnostic lists the trusted certificates that are +currently configured for each virtual host.

    + +

    The response will look something like this:

    +
    OK - Connector / Trusted Certificate information
    +Connector[HTTP/1.1-8080]
    +SSL is not enabled for this connector
    +Connector[AJP/1.3-8009]
    +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
    +  ...
    + +
    + +

    Reload TLS configuration

    + +
    http://localhost:8080/manager/text/sslReload?tlsHostName=name
    + +

    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 tlsHostName parameter.

    + +
    OK - Reloaded TLS configuration for [_default_]
    + +
    +

    Thread Dump

    http://localhost:8080/manager/text/threaddump
    @@ -1401,5 +1456,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/maven-jars.html b/output/webapps/docs/maven-jars.html old mode 100755 new mode 100644 index 74c5a7b..ec69374 --- a/output/webapps/docs/maven-jars.html +++ b/output/webapps/docs/maven-jars.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Apache Tomcat - Using Tomcat libraries with Maven

    Apache Tomcat - Using Tomcat libraries with Maven

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/mbeans-descriptors-howto.html b/output/webapps/docs/mbeans-descriptors-howto.html old mode 100755 new mode 100644 index 628b391..285153a --- a/output/webapps/docs/mbeans-descriptors-howto.html +++ b/output/webapps/docs/mbeans-descriptors-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - MBeans Descriptors How To

    MBeans Descriptors How To

    Table of Contents

    + Version 9.0.4, +

    MBeans Descriptors How To

    Table of Contents

    Introduction

    @@ -50,6 +50,11 @@ a mbeans-descriptors.xml file, located in the same package as the class files it describes.

    +

    The permitted syntax for the mbeans-descriptors.xml is defined by +the DTD file.

    + +

    The entries for a custom LDAP authentication Realm may look like this:

    +
      <mbean         name="LDAPRealm"
                 className="org.apache.catalina.mbeans.ClassNameMBean"
               description="Custom LDAPRealm"
    @@ -85,5 +90,5 @@
                         Comments may be removed by our moderators if they are either
                         implemented or considered invalid/off-topic.
                       

    \ No newline at end of file diff --git a/output/webapps/docs/mbeans-descriptors.dtd b/output/webapps/docs/mbeans-descriptors.dtd new file mode 100644 index 0000000..f12b8fe --- /dev/null +++ b/output/webapps/docs/mbeans-descriptors.dtd @@ -0,0 +1,247 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/output/webapps/docs/monitoring.html b/output/webapps/docs/monitoring.html old mode 100755 new mode 100644 index b4cd74f..d0124a4 --- a/output/webapps/docs/monitoring.html +++ b/output/webapps/docs/monitoring.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Monitoring and Managing Tomcat

    Monitoring and Managing Tomcat

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/proxy-howto.html b/output/webapps/docs/proxy-howto.html old mode 100755 new mode 100644 index 7d95e2a..19cea52 --- a/output/webapps/docs/proxy-howto.html +++ b/output/webapps/docs/proxy-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Proxy Support HOW-TO

    Proxy Support HOW-TO

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/realm-howto.html b/output/webapps/docs/realm-howto.html old mode 100755 new mode 100644 index 8ce8e96..3df1103 --- a/output/webapps/docs/realm-howto.html +++ b/output/webapps/docs/realm-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Realm Configuration HOW-TO

    Realm Configuration HOW-TO

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/rewrite.html b/output/webapps/docs/rewrite.html old mode 100755 new mode 100644 index 04349e5..44ae04d --- a/output/webapps/docs/rewrite.html +++ b/output/webapps/docs/rewrite.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - The rewrite Valve

    The rewrite Valve

    Introduction

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/security-howto.html b/output/webapps/docs/security-howto.html old mode 100755 new mode 100644 index e09935a..388ffbe --- a/output/webapps/docs/security-howto.html +++ b/output/webapps/docs/security-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Security Considerations

    Security Considerations

    Table of Contents

    + Version 9.0.4, +

    Security Considerations

    Table of Contents

    Introduction

    Tomcat is configured to be reasonably secure for most use cases by @@ -293,26 +293,6 @@ proxy uses AJP then the SSL attributes of the client connection are passed via the AJP protocol and separate connectors are not needed.

    -

    The sslEnabledProtocols attribute determines which - versions of the SSL/TLS protocol are used. Since the POODLE attack in - 2014, all SSL protocols are considered unsafe and a secure setting for - this attribute in a standalone Tomcat setup might be - sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"

    - -

    The ciphers attribute controls the ciphers used for - SSL connections. By default, the default ciphers for the JVM will be used. - This usually means that the weak export grade ciphers will be included in - the list of available ciphers. Secure environments will normally want to - configure a more limited set of ciphers. This attribute accepts the - - OpenSSL syntax for including/excluding cipher suites. - As of 2014-11-19, with standalone Tomcat 8 and Java 8, Forward Secrecy - can be achieved by specifying only TLS protocols using - the sslEnabledProtocols attribute (above) and excluding non-DH ciphers, - and weak/broken ciphers. The - Qualys SSL/TLS test is a useful tool for - configuring these settings.

    -

    The tomcatAuthentication and tomcatAuthorization attributes are used with the AJP connectors to determine if Tomcat should handle all authentication and @@ -469,9 +449,9 @@ that are safe for ISO-8859-1 but trigger an XSS vulnerability if interpreted as UTF-7.

    web.xml

    -

    This applies to the default conf/web.xml file and - WEB-INF/web.xml files in web applications if they define - the components mentioned here.

    +

    This applies to the default conf/web.xml file, the + /WEB-INF/tomcat-web.xml and the /WEB-INF/web.xml + files in web applications if they define the components mentioned here.

    The DefaultServlet is configured with readonly set to @@ -539,5 +519,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/security-manager-howto.html b/output/webapps/docs/security-manager-howto.html old mode 100755 new mode 100644 index 05f9f9d..89d0c1f --- a/output/webapps/docs/security-manager-howto.html +++ b/output/webapps/docs/security-manager-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Security Manager HOW-TO

    Security Manager HOW-TO

    Table of Contents

    + Version 9.0.4, +

    Security Manager HOW-TO

    Table of Contents

    Background

    @@ -209,7 +209,7 @@

    The Default Policy File

    permission java.io.FilePermission "${catalina.base}${file.separator}logs", "read, write"; permission java.io.FilePermission - "${catalina.base}${file.separator}logs${file.separator}*", "read, write"; + "${catalina.base}${file.separator}logs${file.separator}*", "read, write, delete"; permission java.lang.RuntimePermission "shutdownHooks"; permission java.lang.RuntimePermission "getClassLoader"; @@ -330,8 +330,9 @@

    The Default Policy File

    // The Manager application needs access to the following packages to support the -// session display functionality. These settings support the following -// configurations: +// 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 @@ -341,6 +342,7 @@

    The Default Policy File

    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"; @@ -348,8 +350,23 @@

    The Default Policy File

    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. @@ -498,5 +515,5 @@

    The Default Properties File

    Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/servletapi/index.html b/output/webapps/docs/servletapi/index.html old mode 100755 new mode 100644 diff --git a/output/webapps/docs/setup.html b/output/webapps/docs/setup.html old mode 100755 new mode 100644 index f213473..34e6277 --- a/output/webapps/docs/setup.html +++ b/output/webapps/docs/setup.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Tomcat Setup

    Tomcat Setup

    Table of Contents

    + Version 9.0.4, +

    Tomcat Setup

    Table of Contents

    Introduction

    @@ -69,6 +69,31 @@ 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. +

  • Defaults: The defaults used by the installer may be + overridden by use of the /C=<config file> command + line argument. The configuration file uses the format + name=value with each pair on a separate line. The names + of the available configuration options are: +
      +
    • JavaHome
    • +
    • TomcatPortShutdown
    • +
    • TomcatPortHttp
    • +
    • TomcatPortAjp
    • +
    • TomcatMenuEntriesEnable
    • +
    • TomcatShortcutAllUsers
    • +
    • TomcatServiceDefaultName
    • +
    • TomcatServiceName
    • +
    • TomcatServiceFileName
    • +
    • TomcatServiceManagerFileName
    • +
    • TomcatAdminEnable
    • +
    • TomcatAdminUsername
    • +
    • TomcatAdminPassword
    • +
    • TomcatAdminRoles
    • +
    + By using /C=... along with /S and + /D= it is possible to perform fully configured + unattended installs of Apache Tomact. +
  • Refer to the Windows Service HOW-TO for information on how to manage Tomcat as a Windows service. @@ -104,7 +129,7 @@
    cd $CATALINA_HOME/bin
     tar xvfz commons-daemon-native.tar.gz
    -cd commons-daemon-1.0.x-native-src/unix
    +cd commons-daemon-1.1.x-native-src/unix
     ./configure
     make
     cp jsvc ../..
    @@ -124,6 +149,14 @@
         -Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \
         org.apache.catalina.startup.Bootstrap
    +

    When runnong on Java 9 you will need to additionally specify the + following when starting jsvc to avoid warnings on shutdown.

    +
    ...
    +--add-opens=java.base/java.lang=ALL-UNNAMED \
    +--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED \
    +...
    +
    +

    You may also need to specify -jvm server if the JVM defaults to using a server VM rather than a client VM. This has been observed on OSX.

    @@ -164,5 +197,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

  • \ No newline at end of file diff --git a/output/webapps/docs/ssi-howto.html b/output/webapps/docs/ssi-howto.html old mode 100755 new mode 100644 index c14fe05..e48d344 --- a/output/webapps/docs/ssi-howto.html +++ b/output/webapps/docs/ssi-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - SSI How To

    SSI How To

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/ssl-howto.html b/output/webapps/docs/ssl-howto.html old mode 100755 new mode 100644 index 1383883..17994a6 --- a/output/webapps/docs/ssl-howto.html +++ b/output/webapps/docs/ssl-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - SSL/TLS Configuration HOW-TO

    Using OCSP Certificates

    +

    To use Online Certificate Status Protocol (OCSP) with Apache Tomcat, ensure + you have downloaded, installed, and configured the + + Tomcat Native Connector. +Furthermore, if you use the Windows platform, ensure you download the +ocsp-enabled connector.

    +

    To use OCSP, you require the following:

    + +
      +
    • OCSP-enabled certificates
    • +
    • Tomcat with SSL APR connector
    • +
    • Configured OCSP responder
    • +
    + +

    Generating OCSP-Enabled Certificates

    +

    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 openssl.cnf file could look + as follows:

    + +
    
    +#... 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
    +
    + +

    The settings above encode the OCSP responder address + 127.0.0.1:8088 into the certificate. Note that for the following + steps, you must have openssl.cnf and other configuration of + your CA ready. To generate an OCSP-enabled certificate:

    + +
      +
    • + Create a private key: +
      openssl genrsa -aes256 -out ocsp-cert.key 4096
      +
    • +
    • + Create a signing request (CSR): +
      openssl req -config openssl.cnf -new -sha256 \
      +  -key ocsp-cert.key -out ocsp-cert.csr
    • +
    • + Sign the CSR: +
      openssl ca -openssl.cnf -extensions ocsp -days 375 -notext \
      +  -md sha256 -in ocsp-cert.csr -out ocsp-cert.crt
      +
    • +
    • + You may verify the certificate: +
      openssl x509 -noout -text -in ocsp-cert.crt
      +
    • +
    +
    + +

    Configuring OCSP Connector

    + +

    To configure the OCSP connector, first verify that you are loading the Tomcat + APR library. Check the + Apache Portable Runtime (APR) based Native library for Tomcat +for more information about installation of APR. A basic OCSP-enabled connector + definition in the server.xml file looks as follows:

    +
    
    +<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>
    +
    +
    + +

    Starting OCSP Responder

    +

    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: +

    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

    + +

    Do note that when using OCSP, the responder encoded in the connector + certificate must be running. For further information, see + + OCSP documentation + . +

    + +
    +

    Troubleshooting

    Here is a list of common problems that you may encounter when setting up @@ -575,5 +683,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/tribes/developers.html b/output/webapps/docs/tribes/developers.html old mode 100755 new mode 100644 index ffc5e07..233155a --- a/output/webapps/docs/tribes/developers.html +++ b/output/webapps/docs/tribes/developers.html @@ -1,5 +1,5 @@ -Apache Tribes - The Tomcat Cluster Communication Module (9.0.0.M21) - Apache Tribes - Developers

    Apache Tribes - Developers

    Developers

    + Version 9.0.4, +

    Apache Tribes - Developers

    Developers

    TODO

    Comments @@ -46,5 +46,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/tribes/faq.html b/output/webapps/docs/tribes/faq.html old mode 100755 new mode 100644 index cced8e9..72625b7 --- a/output/webapps/docs/tribes/faq.html +++ b/output/webapps/docs/tribes/faq.html @@ -1,5 +1,5 @@ -Apache Tribes - The Tomcat Cluster Communication Module (9.0.0.M21) - Apache Tribes - Frequently Asked Questions

    Apache Tribes - Frequently Asked Questions

    Frequently Asked Questions

    + Version 9.0.4, +

    Apache Tribes - Frequently Asked Questions

    Frequently Asked Questions

    TODO

    Comments @@ -46,5 +46,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/tribes/interceptors.html b/output/webapps/docs/tribes/interceptors.html old mode 100755 new mode 100644 index 015c16b..2d1d057 --- a/output/webapps/docs/tribes/interceptors.html +++ b/output/webapps/docs/tribes/interceptors.html @@ -1,5 +1,5 @@ -Apache Tribes - The Tomcat Cluster Communication Module (9.0.0.M21) - Apache Tribes - Interceptors

    Apache Tribes - Interceptors

    Interceptors

    + Version 9.0.4, +

    Apache Tribes - Interceptors

    Interceptors

    TODO

    Comments @@ -46,5 +46,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/tribes/introduction.html b/output/webapps/docs/tribes/introduction.html old mode 100755 new mode 100644 index 3bdc24a..31633cc --- a/output/webapps/docs/tribes/introduction.html +++ b/output/webapps/docs/tribes/introduction.html @@ -1,5 +1,5 @@ -Apache Tribes - The Tomcat Cluster Communication Module (9.0.0.M21) - Apache Tribes - Introduction

    Apache Tribes - Introduction

    Table of Contents

    + Version 9.0.4, +

    Apache Tribes - Introduction

    Table of Contents

    Quick Start

    @@ -273,5 +273,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/tribes/membership.html b/output/webapps/docs/tribes/membership.html old mode 100755 new mode 100644 index f32255c..698d0c8 --- a/output/webapps/docs/tribes/membership.html +++ b/output/webapps/docs/tribes/membership.html @@ -1,5 +1,5 @@ -Apache Tribes - The Tomcat Cluster Communication Module (9.0.0.M21) - Apache Tribes - Membership

    Apache Tribes - Membership

    Membership

    + Version 9.0.4, +

    Apache Tribes - Membership

    Membership

    TODO

    Comments @@ -46,5 +46,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/tribes/setup.html b/output/webapps/docs/tribes/setup.html old mode 100755 new mode 100644 index fec94ec..1586614 --- a/output/webapps/docs/tribes/setup.html +++ b/output/webapps/docs/tribes/setup.html @@ -1,5 +1,5 @@ -Apache Tribes - The Tomcat Cluster Communication Module (9.0.0.M21) - Apache Tribes - Configuration

    Apache Tribes - Configuration

    Configuration Overview

    + Version 9.0.4, +

    Apache Tribes - Configuration

    Configuration Overview

    TODO

    Comments @@ -46,5 +46,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/tribes/status.html b/output/webapps/docs/tribes/status.html old mode 100755 new mode 100644 index 767ae74..ada5239 --- a/output/webapps/docs/tribes/status.html +++ b/output/webapps/docs/tribes/status.html @@ -1,5 +1,5 @@ -Apache Tribes - The Tomcat Cluster Communication Module (9.0.0.M21) - Apache Tribes - Status

    Apache Tribes - Status

    Status

    + Version 9.0.4, +

    Apache Tribes - Status

    Status

    TODO

    Comments @@ -46,5 +46,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/tribes/transport.html b/output/webapps/docs/tribes/transport.html old mode 100755 new mode 100644 index 0fbe0bc..db3a28a --- a/output/webapps/docs/tribes/transport.html +++ b/output/webapps/docs/tribes/transport.html @@ -1,5 +1,5 @@ -Apache Tribes - The Tomcat Cluster Communication Module (9.0.0.M21) - Apache Tribes - Transport

    Apache Tribes - Transport

    Transport

    + Version 9.0.4, +

    Apache Tribes - Transport

    Transport

    TODO

    Comments @@ -46,5 +46,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/virtual-hosting-howto.html b/output/webapps/docs/virtual-hosting-howto.html old mode 100755 new mode 100644 index 33a0c7b..7d3adba --- a/output/webapps/docs/virtual-hosting-howto.html +++ b/output/webapps/docs/virtual-hosting-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Virtual Hosting and Tomcat

    Virtual Hosting and Tomcat

    Table of Contents

    + Version 9.0.4, +
    \ No newline at end of file diff --git a/output/webapps/docs/web-socket-howto.html b/output/webapps/docs/web-socket-howto.html old mode 100755 new mode 100644 index a19b93e..5e77963 --- a/output/webapps/docs/web-socket-howto.html +++ b/output/webapps/docs/web-socket-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - WebSocket How-To

    WebSocket How-To

    Table of Contents

    + Version 9.0.4, +

    WebSocket How-To

    Table of Contents

    Overview

    Tomcat provides support for WebSocket as defined by @@ -108,6 +108,14 @@ set then the org.apache.tomcat.websocket.SSL_TRUSTSTORE and org.apache.tomcat.websocket.SSL_TRUSTSTORE_PWD properties will be ignored.

    + +

    When using the WebSocket client to connect to server endpoints, the number of + HTTP redirects that the client will follow is controlled by the + userProperties of the provided + javax.websocket.ClientEndpointConfig. The property is + org.apache.tomcat.websocket.MAX_REDIRECTIONS. The default value + is 20. Redirection support can be disabled by configuring a value of zero.

    +

    Comments

    Notice: This comments section collects your suggestions @@ -121,5 +129,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/websocketapi/index.html b/output/webapps/docs/websocketapi/index.html old mode 100755 new mode 100644 diff --git a/output/webapps/docs/windows-auth-howto.html b/output/webapps/docs/windows-auth-howto.html old mode 100755 new mode 100644 index 9fe4f4b..d739556 --- a/output/webapps/docs/windows-auth-howto.html +++ b/output/webapps/docs/windows-auth-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Windows Authentication How-To

    Windows Authentication How-To

    Table of Contents

    + Version 9.0.4, +

    Windows Authentication How-To

    Table of Contents

    Overview

    Integrated Windows authentication is most frequently used within intranet @@ -193,7 +193,7 @@ changes:

    • The Linux server does not have to be part of the Windows domain.
    • -
    • The path to the keytab file in krb5.ini and jass.conf should be updated +
    • 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/...).
    @@ -336,5 +336,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/docs/windows-service-howto.html b/output/webapps/docs/windows-service-howto.html old mode 100755 new mode 100644 index c73fb85..e777977 --- a/output/webapps/docs/windows-service-howto.html +++ b/output/webapps/docs/windows-service-howto.html @@ -1,5 +1,5 @@ -Apache Tomcat 9 (9.0.0.M21) - Windows service HOW-TO

    Windows service HOW-TO

    Table of Contents

    + Version 9.0.4, +

    Windows service HOW-TO

    Table of Contents

    Tomcat service application

    @@ -94,9 +94,9 @@

    Command line parameters

    - Each command parameter is prefixed with --. - If the command line is prefixed with ++ then it's value will - be appended to the existing option. + Each command line parameter is prefixed with --. If the command line + parameter is prefixed with ++ 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 PR_ exists it will take precedence. For example:

    @@ -133,13 +133,13 @@ Service startup mode can be either auto or manual - ++DependsOn + --DependsOn List of services that this service depend on. Dependent services are separated using either # or ; characters - ++Environment + --Environment List of environment variables that will be provided to the service in the form key=value. They are separated using either @@ -173,11 +173,22 @@ You can use the environment variable expansion here. - ++JvmOptions + --JvmOptions -Xrs List of options in the form of -D or -X that will be passed to the JVM. The options are separated using either - # or ; characters. (Not used in exe mode.) + # or ; characters. If you need to embed either # or + ; characters, put them inside single quotes. (Not used in + exe mode.) + + + --JvmOptions9 + + List of options in the form of -D or -X that will be + passed to the JVM when running on Java 9 or later. The options are + separated using either # or ; characters. If you need to + embed either # or ; characters, put them inside single + quotes. (Not used in exe mode.) --Classpath @@ -236,7 +247,7 @@ Method name if differs then main - ++StartParams + --StartParams List of parameters that will be passed to either StartImage or StartClass. Parameters are separated using either # or @@ -272,7 +283,7 @@ Method name if differs then main - ++StopParams + --StopParams List of parameters that will be passed to either StopImage or StopClass. Parameters are separated using either # or @@ -468,5 +479,5 @@ Comments may be removed by our moderators if they are either implemented or considered invalid/off-topic.

    \ No newline at end of file diff --git a/output/webapps/examples/WEB-INF/classes/CookieExample.class b/output/webapps/examples/WEB-INF/classes/CookieExample.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/CookieExample.java b/output/webapps/examples/WEB-INF/classes/CookieExample.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/HelloWorldExample.class b/output/webapps/examples/WEB-INF/classes/HelloWorldExample.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/HelloWorldExample.java b/output/webapps/examples/WEB-INF/classes/HelloWorldExample.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/LocalStrings.properties b/output/webapps/examples/WEB-INF/classes/LocalStrings.properties old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/LocalStrings_en.properties b/output/webapps/examples/WEB-INF/classes/LocalStrings_en.properties old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/LocalStrings_es.properties b/output/webapps/examples/WEB-INF/classes/LocalStrings_es.properties old mode 100755 new mode 100644 index e843d25..025a3ff --- a/output/webapps/examples/WEB-INF/classes/LocalStrings_es.properties +++ b/output/webapps/examples/WEB-INF/classes/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + helloworld.title = Hola Mundo! requestinfo.title = Ejemplo de Informacion de Requerimiento: requestinfo.label.method = M\u00E9todo: diff --git a/output/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties b/output/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties b/output/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/RequestHeaderExample.class b/output/webapps/examples/WEB-INF/classes/RequestHeaderExample.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/RequestHeaderExample.java b/output/webapps/examples/WEB-INF/classes/RequestHeaderExample.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/RequestInfoExample.class b/output/webapps/examples/WEB-INF/classes/RequestInfoExample.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/RequestInfoExample.java b/output/webapps/examples/WEB-INF/classes/RequestInfoExample.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/RequestParamExample.class b/output/webapps/examples/WEB-INF/classes/RequestParamExample.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/RequestParamExample.java b/output/webapps/examples/WEB-INF/classes/RequestParamExample.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/ServletToJsp.class b/output/webapps/examples/WEB-INF/classes/ServletToJsp.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/ServletToJsp.java b/output/webapps/examples/WEB-INF/classes/ServletToJsp.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/SessionExample.class b/output/webapps/examples/WEB-INF/classes/SessionExample.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/SessionExample.java b/output/webapps/examples/WEB-INF/classes/SessionExample.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async0$1.class b/output/webapps/examples/WEB-INF/classes/async/Async0$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async0.class b/output/webapps/examples/WEB-INF/classes/async/Async0.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async0.java b/output/webapps/examples/WEB-INF/classes/async/Async0.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async1$1.class b/output/webapps/examples/WEB-INF/classes/async/Async1$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async1.class b/output/webapps/examples/WEB-INF/classes/async/Async1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async1.java b/output/webapps/examples/WEB-INF/classes/async/Async1.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async2$1.class b/output/webapps/examples/WEB-INF/classes/async/Async2$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async2.class b/output/webapps/examples/WEB-INF/classes/async/Async2.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async2.java b/output/webapps/examples/WEB-INF/classes/async/Async2.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async3.class b/output/webapps/examples/WEB-INF/classes/async/Async3.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/Async3.java b/output/webapps/examples/WEB-INF/classes/async/Async3.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java b/output/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java new file mode 100644 index 0000000..685ac23 --- /dev/null +++ b/output/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/output/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class b/output/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class old mode 100755 new mode 100644 index 903cd1f8fe72501f69c31a70a6272d740b392ed0..c0ee6aebbb9cf314f7d1a9b6256d2160b4d3b093 GIT binary patch delta 2562 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 IzAYm1FP{l{FaQ7m diff --git a/output/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java b/output/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java old mode 100755 new mode 100644 index adaa72b..8b3ac15 --- a/output/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java +++ b/output/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java @@ -25,6 +25,7 @@ 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; @@ -45,7 +46,6 @@ public class AsyncStockServlet extends HttpServlet implements TickListener, Asyn private static final ConcurrentLinkedQueue clients = new ConcurrentLinkedQueue<>(); private static final AtomicInteger clientcount = new AtomicInteger(0); - private static final Stockticker ticker = new Stockticker(); public AsyncStockServlet() { log.info("AsyncStockServlet created"); @@ -63,6 +63,8 @@ protected void service(HttpServletRequest req, HttpServletResponse resp) 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 { @@ -85,29 +87,46 @@ public void tick(Stock stock) { } } - public void writeStock(AsyncContext actx, Stock stock) { + + public void writeStock(AsyncContext actx, Stock stock) throws IOException { HttpServletResponse response = (HttpServletResponse)actx.getResponse(); - try { - 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(); - }catch (IOException x) { - try {actx.complete();}catch (Exception ignore){/* Ignore */} + 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. + Iterator it = clients.iterator(); + while (it.hasNext()) { + AsyncContext actx = it.next(); + 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); } } diff --git a/output/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class b/output/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class old mode 100755 new mode 100644 index ea96b912d67aa2ef1b57259ddfb2c5bd264c1134..28b82bb492956bd86b8da0bedcc40d79e22074d3 GIT binary patch delta 201 zcmZ1?vP5J<2&-fR0}De911Cc*10O>jgD^uQg9JkpgDgYyyC27@5O%*nUd!WidFHe|P9TrfG0-IjF; zP2JGde0XaTBa!kNt;VVn|M}36h#RCfJ0$19y#MlTDqp6(Y#1#CuOHERYyE4 zuex$$^i}#+G14=%*Z?d!MYA9EBUX7$}`}*C`50fsdz_=%J^+E B4*dWC delta 86 zcmdnYG>b{<)W2Q(7#J8#7zEfExY-$a85vkgGLy5}8TckjSxih;VC0|JQlrht!pOkP hzz$T%#J~Y2IT_f1v=ETb!obDA${@+W2&8$~I045P3oifw diff --git a/output/webapps/examples/WEB-INF/classes/async/Stockticker.class b/output/webapps/examples/WEB-INF/classes/async/Stockticker.class old mode 100755 new mode 100644 index a88c4cccbc98be229898d9c5701c4d5252ce0838..c3235e61bbef13841a227d9e24341ec58f6abdb4 GIT binary patch literal 3437 zcma)8`&S%y75~ic?9S{mNeBTF2*i}6DUTRhv}i&?Lm&^51vHDKn^f(vJAr{^cAcF~ zLtAat`fiQZXKJfyeBdKi(XfQ3sr6ay@f?5h*PMgrRL{}Bz@FInxw8vw9=7tscfQa2 zx%YEF_b#u!`Qpm}-i_Cy*a8a`WrT6`|b*PoZOF9^nyvV2UIPs#F&8qVnW zQh4tpor?!ws3ycFd|AiS;k{k5et1#GSHgSGymV6jG<-FRui@)awBQ>ud{c(AGCU&> zza_)7GCU{9-wrWO{soVUd*9J;E{aY(ui?Cg?`rs-f>7McBqtRZ{f=X~y=gO-vvOPx z+sVn8o%1a2DhRrHM}cx&ftJkV9Z&Y!ViV>mvpw(G>GovCN#3Da{%uPGVcHdKvep&9;a`(ErX&_uY zP*7EToi?4Z_Th2YGE+;Z4xLu|d3Cq#*j_iIYHk@(p!Q}`L|qfJ9cwT@HEOxT=4hHb zRk2LcOplnZE$h;z>W$kBVco4h5hj%LOxL5yoR`TG?6iW-W$p+YuA9$#R%-w0q?PsT zjKf!};+~nD95Ay!1f`@v&yDB3ROTTeJuODwh5-%VX9Q*{RnCioEzNKDPzcbMQp1p4 zYbtZfy3vYa`;qxFsk@CqKQBUZa-5`-IHiviWYc-_q)c$1Y$PYSs6X)*uN7velsjKi zM@=V{nWEX6G6q*@(=f(bVCnc;KBpiW&*a^tb-(p7ZO`g)U2|IGY+xUH4IIEh1BXDtRr-KsiWIvuOuX=HxtohJ zHSk0H$iVx>&mZH6f=w&WZl@drKfwhJKQ-_IentTp_&F{Zn8h#n^sV(`;FzEsmEo7T zXkZQn1M@Pwgo1+gw?6j?Wm*po4Kb|4Sl~QyXlRI4)Du6j6k}QDG`wiwGG3C)R}8!? z2*1KB27WDG{zhiM#qSLKUKsuZUN!JXTw!6Y1ihSW1Ah`e*52aP60A?{(CCDfWbsw4 zSU8$@oKh|Oo4$MfEJ8LZ%1v$V7yYkqE>qajlP)>Ya+Wt}PEk-b<#*zqYdd594Rs=8 zvq&rKmD2Y63OnWM6-ZG9>x?2PA=fsy6ftk`h+@~q&D@}MT6&1%f2x;mmc__>LDu?B zUKQi-Y9aI*+exyL*^Yah)Ip2Z*y^P770a6!Qr1luYHt%@pKwqn-uN_s52l!iQm-Gj zr>p@x&Gz8~92Q0o`@D(o)GVt~W__8w-%#lUJ41zR?aO4+mPzLHG0Ph<(|K~NlkL(} zZT7Ll-02lFs&sb+4Y%uO#r7kxp80Cv~UN1aCbt%E`-n{O@Kd% z)l$~{R!X(>V6qT-i`L1KL{Wp|q-V2((^CFcF*w=ONC+ ziFs&q&|8%`L|TJ$h|cnQ00SKB`9B3vM-%mkU?XbKfX!&co&32T zlwcny!8R>HRwU?vArKc4sajRQYMB(UW(BR5!HSg-ny?mIh`E)kJIj!omXX*AN=Q%A z*8tx&iM>~$&Poh{qVdWZ=&?(vI_3vA%NMIi<9b>T`tfaJRHTNKZHJB>JiVLe@8XSn zumK&6_Fj6>>3dL1lnsn3j$uFQC0{;33p#@OpoS5lnvJUD+2i~M#XgvTBAOTNR1j8?^N4r)Q(*t9=vmBnB$I4y+%Ka zb#$GENwwI(hisy=v}#Z|yPLWnPiU6Hy-Ne~-lR#e2UXkD}} zw1AEPRk8R)P?@>zQIwZ(@67el85l7Ubz1@Nnf3E|6^qm}a22mpsYUUeWX*y)?Z617 zbBwLweiD_Sc8_y*!p~BQY)){N#fOo{gZ%G*6i*|C^RW0kcM^Zb82-ZBf90*KytRll z{>Ja?aPW6z@K1ci&(cXmc|YQdF-n9-X|JDklENgdnylstS{y}^f)%V3o0-m*b%wkB z^tS^Sh&IM#?!ogIXTu86zSP+S_n6Q!aqoliAMDXEsUdw0x^j)B^Cq@wmDMZWUQ9oJ>kfI0i;$MasU7T delta 1791 zcmZuyTU1nK6#mYf%YWv0EQA?lAW#7{LB&u(K@3zWKd9zWHO#+)O48ax?TjlwjB+pCo zfoO}u8rDz+BioOjsAAOXB?;tivsOv+nsnt0Qw z*mbT^egt+{cndo%=Vq@}Pj8Vzj@MmDsUDe%@tnp#8c9nr9Y zlKChS#m{3@?q;ua*Ac)^JpT(&9{1<0%cSgp~_?DnR6Y z&Q&$XtVWHEa?En>s*{?k(PiUdR47RMpJZ%QVz!McJYr)W<|{~XjaovjO@&L>M8ly5 z8`bzs!B7bwj*jZT{2X7{cvJ#?i5dmjPOB$7+eQLk+4vdEvWeP^Q^M`iG1HjYb+6G+-PDg94L?ljKWI4hGshx4q@#s#VS9v7V(T5j$o z{9xlUj`f%2W?Z$YKHSzGS>I~oN8+8(yPeC%AI?T2=o}T5RV5rq1v8+tXtsyX=aZe` znIhXj-5l~B%;lFIAwO3(g{MIsyGpvinQqQ33-T_5w?H~HPKlS2ADI}12QUU%SV)ac zYoGv&u$bp)*(}%ph&g4B^dHVVKo6a|VaQ>GTylAXd~*hT**)n?`>o8+!!yH~=*^1h zM7f{dDrCfL2-0zkIG*D-&beLR68?!*)pR6GC)HmA1{l3R{C zMwgH(lnk;f2H;lp*VhL(JdR<#a3l7(VCjRvVlLVYqLs41nS;>!%aYIZFSG#B%KN+N z83U8fz;DKR1nShYB&iubWS&G;ZJp+d**=VPMcoxg`;a5W;92C=#ZF<&NsL{{1U+%= zRcB>sUDz=piE&0-vF6wI!RyyNYl^i3zgASLQ}N&ogLHhc={Ms@3+Ms%F+bg?Pof}! zlmWSkazM|oI}S@*z2XF{Bqqp)Br&nn8}OdSBn5F~#w1&);36iMS^+DdpTJ^Fg4NBkboUbzzp*Fio4zMxrXZ;8{isl@pr5D?Hbuba1Dw$_T^lFxmY~{tKIs)K!_RcQN|$SNxz4w}!SfcL z!fiZ_U$M%4rbbw__u@&8f<@mg)X(Q!HXuT)m7L*b)YEn~x2%mfA?~ZmxI6I-?Nlat z5cM&d%jevWFdA9cZFjJnc*iFlG}yCY-$l8=8iB|in93cDQ0`%@K(ngYcaScywuif? t3AFSYF~Hx@|AIN2`!GjfoyO>`jOxL9l<`a@7r@XGckm|j|7WJ*{RdqCOU3{I diff --git a/output/webapps/examples/WEB-INF/classes/async/Stockticker.java b/output/webapps/examples/WEB-INF/classes/async/Stockticker.java old mode 100755 new mode 100644 index 8965b60..e87744e --- a/output/webapps/examples/WEB-INF/classes/async/Stockticker.java +++ b/output/webapps/examples/WEB-INF/classes/async/Stockticker.java @@ -17,14 +17,15 @@ package async; import java.text.DecimalFormat; -import java.util.ArrayList; +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 ArrayList listeners = new ArrayList<>(); + final List listeners = new CopyOnWriteArrayList<>(); protected volatile Thread ticker = null; protected volatile int ticknr = 0; @@ -36,6 +37,12 @@ public synchronized void 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(); @@ -46,6 +53,17 @@ public synchronized void stop() { 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(); @@ -97,6 +115,7 @@ public void run() { public static interface TickListener { public void tick(Stock stock); + public void shutdown(); } public static final class Stock implements Cloneable { diff --git a/output/webapps/examples/WEB-INF/classes/cal/Entries.class b/output/webapps/examples/WEB-INF/classes/cal/Entries.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/cal/Entries.java b/output/webapps/examples/WEB-INF/classes/cal/Entries.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/cal/Entry.class b/output/webapps/examples/WEB-INF/classes/cal/Entry.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/cal/Entry.java b/output/webapps/examples/WEB-INF/classes/cal/Entry.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/cal/JspCalendar.class b/output/webapps/examples/WEB-INF/classes/cal/JspCalendar.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/cal/JspCalendar.java b/output/webapps/examples/WEB-INF/classes/cal/JspCalendar.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/cal/TableBean.class b/output/webapps/examples/WEB-INF/classes/cal/TableBean.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/cal/TableBean.java b/output/webapps/examples/WEB-INF/classes/cal/TableBean.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class b/output/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java b/output/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class b/output/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java b/output/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class b/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class old mode 100755 new mode 100644 index 1fd67451c6817ebcc4f851c076841a9de5b4961a..1d4f513de723db9c1cfa5d41a574b1cd435912e1 GIT binary patch delta 2241 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 0) { - System.out.println("compressionThreshold should be either 0 - no compression or >= " + minThreshold); - System.out.println("compressionThreshold set to " + minThreshold); + System.out.println("compressionThreshold should be either 0 - no compression or >= " + MIN_THRESHOLD); + System.out.println("compressionThreshold set to " + MIN_THRESHOLD); } - compressionThreshold = minThreshold; + compressionThreshold = MIN_THRESHOLD; } } str = getInitParameter("compressionBuffer"); if (str != null) { compressionBuffer = Integer.parseInt(str); - if (compressionBuffer < minBuffer) { + if (compressionBuffer < MIN_BUFFER) { if (debug > 0) { - System.out.println("compressionBuffer should be >= " + minBuffer); - System.out.println("compressionBuffer set to " + minBuffer); + System.out.println("compressionBuffer should be >= " + MIN_BUFFER); + System.out.println("compressionBuffer set to " + MIN_BUFFER); } - compressionBuffer = minBuffer; + compressionBuffer = MIN_BUFFER; } } diff --git a/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class b/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java b/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class b/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java b/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class b/output/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class old mode 100755 new mode 100644 index 61032eaef9f4b7b59197909c3693b3582ed421b9..626c503b36bbec8d9dc1cb8cc8bbe3807ba08268 GIT binary patch delta 1822 zcmZ{kS9DZW6o$VuGnspHbEhPM1c}l$FiF6rARQDDqevtaNd$#}1c*eCDz-rs6)SoL z!~!ZJf(-~HhA71Xh|1;Zd8%93E%2 z#S;$Mtg?AhM^D338rImXwOQxzH0y1W&saR0!E-$Ca2^{pY}D|Ah8H!ww=D!?`sj!5m{Ydox3`%nI*l=vZzk<6JIh zq{|hIa=DUXm#ZlDcBT!y_-aPGTtl%Tv#MfAMW4ls=FII=T(NNWn2Px>rBu0$p~U4f zMp(S(@;)DUox;PyAG#dmkT*R%C~}yOTn=-@7a zQa)F-FD$-v`HHVyzTsP!@A%$e3SEBSN0%imb-A6THSzQl0k1KmcJgp>3~btICz6HK z5PuX;{84Q2M{&j<#TkDTb7ag?8!%ied4RD*Bo|*Lj`t#wIc9>lG}3?2MERN{-=U1_ zm?WcSWx{AEmpq0!E6V|k>n$eBf>Aqske?$11f**;w|5IjeltiuH;RlVkRYb3q+(&J zu(P)^dX5xt{NLhf|1K8m{ort9SZ==w(tzW4 zyOuQ8(IPzD3=!7LB^4n(P}w`)tB*|-%2>Q$K+FD-sr}vPCg(D%g)+`;AqmOC1@fCi zmBjJhg7{E@*dFhmPzYDnphpTqZB8eY8Ik*Xvl={Cij?e>}7MkQV-uR)uK8^xsWTX2I>UDTqqGNP2`{rSLb&ewX*-4|!Yu;(Qt@;*4C( zvy_Pm(~M!639{OxwK|M7DP?60Wj?oxCF)TIAvb=Q8?dOyQjt>(%_~6yCre#-?wA+lR*^hFI*QDUM#MN!>jI^voe3U6otQ@naq2c>6s)GOn?|j0aPoLYb5A|FX zji0!5;2_Y4p8{OX-RTS=ZeY2A6$b9HSZQ;w%_^JwOvn8O9YfM&J%SYzO!bROmr zn@0mY#^V-G1juH!jbqv;4LoIFt<5@{^#L~Uv`zdOi)Vv8$HoBpJa6Cy1Dg!IXyB!Q zh}#@s3!5#r+H5nOFI#N4c_lzkb_68%t2R3g`D-?>+w8L0Z8+bsX|&j5u{S_p_8Fok z18)Y|&jAC?`2qaAW%IWAI%q67WZg1+|)TMr($0jm3MK_c^NQ@61Un zbjti4(?8H0fh;U~_|{)+BLG;^4#so=C` zI#V>a7?@_@R&LXLO0C5iXNon<`x&*)7He{01;;frn5oFBk1d#9T~|<3Ur;|iRuG$8 zU^0E~6xlPpUr4ewc6r|l&KmkJ4SZ$swdNbX)qKbInjbi)P$io4{HR&X63tyKQS@=N zuanb|meW|4zQL2*p~t9M)r+c2Yvz`YUKpFVFgDIj>zocYPZ}ZygH1bQh(tbPquYv; zZYyTGt@!D-;-}k+rP4->n<&Oe>|rb+iKQBXLmN*0Tw+whJCRt3D4rP3FNrr?wJLf|khEI^*h{%I^B6mK8)YFX^t<>F<)ZLjX z;##P^s6q*)A_=;FDO5{^YMD^Qg=+c#P*wk%O6uxT9SjeY?Oh0Wj<;%vCN)I4U5rX< z=qjO{53^9VFj%}WZup~ldkOBA$b;En!0la28tYQj_>-i5bC89@XU>nzHC&r;)@O_n zCBJ4A_iI%$EU~DFA}Q$|tx7VfkySqF=qB$hY6ZtTqcY2cVs&PhsG-o(2VD~srb6lX zvO+^GW}Dj7$s$SaoXsprG4rIDd5TO<(~&c-{1%$L6dI{U+x+tPxKtyurb_3xpER*3sg5OiC~9gM;d&^N6B|qL~`TXh(w#|Qx)BVr-^=h@k->~ zB@?}_+XDzo{JSjvLw5Y9Tv-?7I=jdf{6#M=Q7$G_DmgpKLxb|OOj)c`>1F?n%extDEJorr= zR8~s1a3Y(mVUe3nnIAvFcTVbRevvxE7Z<_-9=Y1bv|%srb(GRx`xv;99_~Oh*;P%n zldhb|Ab}Ej_tAboWnLz3Bg36k@}Hm4;*ur?oAcY^XeaR!l|xA7k{4I)8L2ujQFUa7 z%44>=+}%i2B<3-Q29fVIVv}2{OKi#X-6^As6w 1) { System.out.println("character encoding is " + charEnc); } - // HttpServletResponse.getCharacterEncoding() shouldn't return null - // according the spec, so feel free to remove that "if" - if (charEnc != null) { - writer = new PrintWriter(new OutputStreamWriter(stream, charEnc)); - } else { - writer = new PrintWriter(stream); - } + writer = new PrintWriter(new OutputStreamWriter(stream, charEnc)); - return (writer); + return writer; } @Override diff --git a/output/webapps/examples/WEB-INF/classes/dates/JspCalendar.class b/output/webapps/examples/WEB-INF/classes/dates/JspCalendar.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/dates/JspCalendar.java b/output/webapps/examples/WEB-INF/classes/dates/JspCalendar.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/error/Smart.class b/output/webapps/examples/WEB-INF/classes/error/Smart.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/error/Smart.java b/output/webapps/examples/WEB-INF/classes/error/Smart.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class b/output/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java b/output/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/FooTag.class b/output/webapps/examples/WEB-INF/classes/examples/FooTag.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/FooTag.java b/output/webapps/examples/WEB-INF/classes/examples/FooTag.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class b/output/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java b/output/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/LogTag.class b/output/webapps/examples/WEB-INF/classes/examples/LogTag.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/LogTag.java b/output/webapps/examples/WEB-INF/classes/examples/LogTag.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/ShowSource.class b/output/webapps/examples/WEB-INF/classes/examples/ShowSource.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/ShowSource.java b/output/webapps/examples/WEB-INF/classes/examples/ShowSource.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/ValuesTag.class b/output/webapps/examples/WEB-INF/classes/examples/ValuesTag.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/examples/ValuesTag.java b/output/webapps/examples/WEB-INF/classes/examples/ValuesTag.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class b/output/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java b/output/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java old mode 100755 new mode 100644 index 56272de..3e0123b --- a/output/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java +++ b/output/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java @@ -96,7 +96,7 @@ public String toString() { StringBuilder sb = new StringBuilder("TimingFilter("); sb.append(getFilterConfig()); sb.append(")"); - return (sb.toString()); + return sb.toString(); } } diff --git a/output/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.class b/output/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java b/output/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class old mode 100755 new mode 100644 index 715ae0111056fc2c7259f3a70499e6ef8439b109..61c5868d26db532fbfe4960aa64e249a9781ebb5 GIT binary patch delta 593 zcmZ9J&rTCj6o`38 zp&T|_XB3G_*jTN#)?U^X{r|PcyY=Swe*f=Q`)gA5&M3Ue^`-iYR``6ishQPOqMxe0 z?>2Wdb3XIj)hzhjaIk!m~a#9&2WNmRRzqDKH&az5ma2TM6!RTA;;OG}@VscZ}><;lAblINh%WmUza20QuGI?KzgvAHE zX{ln}Dk{bE)wgYN+GHdiKugTxk|SVPHsmRCO#ULrBF8x--4WR|zzGI9BCew75J!c^ zqaw~6mYk__n0`^0x#(j&*q9YB#HCjhr{bhcu}I6ehNvSN7{uWYy%zI^FW*fKnzf6T ll4WpO-gcC|jP0UiyVgI;WC*7ON||w#Br_<1;6)W3{00@8W^e!i delta 609 zcmZXQPfrt36vcn9Gwo}KNsUT(L|aj@Ep-49HHxun{euG*QHzRyhT51>f}|}*R{acQ zzJT!?G?+1QVO+a$z_}bfoWRXPNCJ(2=`hDFL-sZEngz{mh5f3v)lua9m%*FB+w6vGUbWp0 zw*0WuJ+H_tg)i2F?q<8CDDL5GzZ>1ZXWRcaq=xGXr}nnl+USO_*E^a;&7J6n>gSfY ztGVZLpN7ja4_qGdDEgR~DX;KYVdZD@E-O4yBrkYt;YF9HJk!)&0#;p`JeMHRgevY- zt%};|*{dp($L1*eI2P?D4^Mr^A}L?AT#8A>Xy2M0DSg0>Nx!FNx{;X77n}v@lctZV zsY);Ii^ifL^$=QWku)W8lw~(AwZfvz4Lpv>>$Kb`Fu`%gL{%0%AqpFZd1001mn8wC zk_+*vi$ev)Nts*{zi~94`h_nJkP>!pk|`ma65|AUSvCc2!Gk98c+7Ca#I2adBuxyG sX5}`_kl_pmI6FvI`X~E;TMRfY8I`dT=9nl=XVO}O>$bd25^d keys = new ArrayList<>(); - private final ArrayList values = new ArrayList<>(); + private final List keys = new ArrayList<>(); + private final List values = new ArrayList<>(); @Override public void doTag() throws JspException, IOException { diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java b/output/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/listeners/ContextListener.class b/output/webapps/examples/WEB-INF/classes/listeners/ContextListener.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/listeners/ContextListener.java b/output/webapps/examples/WEB-INF/classes/listeners/ContextListener.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/listeners/SessionListener.class b/output/webapps/examples/WEB-INF/classes/listeners/SessionListener.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/listeners/SessionListener.java b/output/webapps/examples/WEB-INF/classes/listeners/SessionListener.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class b/output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class b/output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class b/output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java b/output/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class b/output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class b/output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class b/output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java b/output/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class b/output/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java b/output/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/sessions/DummyCart.class b/output/webapps/examples/WEB-INF/classes/sessions/DummyCart.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/sessions/DummyCart.java b/output/webapps/examples/WEB-INF/classes/sessions/DummyCart.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.java b/output/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.java new file mode 100644 index 0000000..437fb7c --- /dev/null +++ b/output/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.java @@ -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. + */ +package trailers; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * This example writes some trailer fields to the HTTP response. + */ +public class ResponseTrailers extends HttpServlet { + + private static final long serialVersionUID = 1L; + private static final Supplier> TRAILER_FIELD_SUPPLIER = + new TrailerFieldSupplier(); + + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + resp.setTrailerFields(TRAILER_FIELD_SUPPLIER); + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + + PrintWriter pw = resp.getWriter(); + + pw.print("This response should include trailer fields."); + } + + + private static class TrailerFieldSupplier implements Supplier> { + + private static final Map trailerFields = new HashMap<>(); + + static { + trailerFields.put("x-trailer-1", "Trailer value one"); + trailerFields.put("x-trailer-2", "Trailer value two"); + } + + @Override + public Map get() { + return trailerFields; + } + } +} diff --git a/output/webapps/examples/WEB-INF/classes/util/CookieFilter.class b/output/webapps/examples/WEB-INF/classes/util/CookieFilter.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/util/CookieFilter.java b/output/webapps/examples/WEB-INF/classes/util/CookieFilter.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/util/HTMLFilter.class b/output/webapps/examples/WEB-INF/classes/util/HTMLFilter.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/util/HTMLFilter.java b/output/webapps/examples/WEB-INF/classes/util/HTMLFilter.java old mode 100755 new mode 100644 index 9bc8cff..29463fb --- a/output/webapps/examples/WEB-INF/classes/util/HTMLFilter.java +++ b/output/webapps/examples/WEB-INF/classes/util/HTMLFilter.java @@ -37,7 +37,7 @@ public final class HTMLFilter { public static String filter(String message) { if (message == null) - return (null); + return null; char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); @@ -60,8 +60,7 @@ public static String filter(String message) { result.append(content[i]); } } - return (result.toString()); - + return result.toString(); } diff --git a/output/webapps/examples/WEB-INF/classes/validators/DebugValidator.class b/output/webapps/examples/WEB-INF/classes/validators/DebugValidator.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/validators/DebugValidator.java b/output/webapps/examples/WEB-INF/classes/validators/DebugValidator.java old mode 100755 new mode 100644 index d0ac758..596065b --- a/output/webapps/examples/WEB-INF/classes/validators/DebugValidator.java +++ b/output/webapps/examples/WEB-INF/classes/validators/DebugValidator.java @@ -76,7 +76,7 @@ public ValidationMessage[] validate(String prefix, String uri, } System.out.println(); System.out.println("-----------------------------------------------"); - return (null); + return null; } diff --git a/output/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class b/output/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java b/output/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class b/output/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java b/output/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java b/output/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java b/output/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/echo/servers.json b/output/webapps/examples/WEB-INF/classes/websocket/echo/servers.json old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class b/output/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java b/output/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class b/output/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/Location.class b/output/webapps/examples/WEB-INF/classes/websocket/snake/Location.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/Location.java b/output/webapps/examples/WEB-INF/classes/websocket/snake/Location.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class b/output/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java b/output/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class b/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java b/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class b/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class b/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java b/output/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/jsp/applet/Clock2.java b/output/webapps/examples/WEB-INF/jsp/applet/Clock2.java old mode 100755 new mode 100644 index abdf02d..c745815 --- a/output/webapps/examples/WEB-INF/jsp/applet/Clock2.java +++ b/output/webapps/examples/WEB-INF/jsp/applet/Clock2.java @@ -138,12 +138,12 @@ public void paint(Graphics g) { // 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); + 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 diff --git a/output/webapps/examples/WEB-INF/jsp/debug-taglib.tld b/output/webapps/examples/WEB-INF/jsp/debug-taglib.tld old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/jsp/example-taglib.tld b/output/webapps/examples/WEB-INF/jsp/example-taglib.tld old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld b/output/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar b/output/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar b/output/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/tags/displayProducts.tag b/output/webapps/examples/WEB-INF/tags/displayProducts.tag old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/tags/helloWorld.tag b/output/webapps/examples/WEB-INF/tags/helloWorld.tag old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/tags/panel.tag b/output/webapps/examples/WEB-INF/tags/panel.tag old mode 100755 new mode 100644 diff --git a/output/webapps/examples/WEB-INF/web.xml b/output/webapps/examples/WEB-INF/web.xml old mode 100755 new mode 100644 index caf9d55..4fb4d16 --- a/output/webapps/examples/WEB-INF/web.xml +++ b/output/webapps/examples/WEB-INF/web.xml @@ -27,6 +27,8 @@ Servlet and JSP Examples + UTF-8 + Timing Filter @@ -42,21 +44,6 @@ org.apache.catalina.filters.RequestDumperFilter - - - Set Character Encoding - org.apache.catalina.filters.SetCharacterEncodingFilter - true - - encoding - UTF-8 - - - ignore - false - - - Compression Filter compressionFilters.CompressionFilter @@ -86,13 +73,6 @@ --> - - - Set Character Encoding - /* - - + + async.AsyncStockContextListener + + @@ -389,6 +374,16 @@ /servlets/serverpush/simpleimage + + + responsetrailer + trailers.ResponseTrailers + + + responsetrailer + /servlets/trailers/response + + index.html index.xhtml diff --git a/output/webapps/examples/index.html b/output/webapps/examples/index.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/async/async1.jsp b/output/webapps/examples/jsp/async/async1.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/async/async1.jsp.html b/output/webapps/examples/jsp/async/async1.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/async/async3.jsp b/output/webapps/examples/jsp/async/async3.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/async/async3.jsp.html b/output/webapps/examples/jsp/async/async3.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/async/index.jsp b/output/webapps/examples/jsp/async/index.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/async/index.jsp.html b/output/webapps/examples/jsp/async/index.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/Entries.java.html b/output/webapps/examples/jsp/cal/Entries.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/Entry.java.html b/output/webapps/examples/jsp/cal/Entry.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/JspCalendar.java.html b/output/webapps/examples/jsp/cal/JspCalendar.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/TableBean.java.html b/output/webapps/examples/jsp/cal/TableBean.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/cal1.jsp b/output/webapps/examples/jsp/cal/cal1.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/cal1.jsp.html b/output/webapps/examples/jsp/cal/cal1.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/cal2.jsp b/output/webapps/examples/jsp/cal/cal2.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/cal2.jsp.html b/output/webapps/examples/jsp/cal/cal2.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/calendar.html b/output/webapps/examples/jsp/cal/calendar.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/cal/login.html b/output/webapps/examples/jsp/cal/login.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/checkbox/CheckTest.html b/output/webapps/examples/jsp/checkbox/CheckTest.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/checkbox/check.html b/output/webapps/examples/jsp/checkbox/check.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/checkbox/checkresult.jsp b/output/webapps/examples/jsp/checkbox/checkresult.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/checkbox/checkresult.jsp.html b/output/webapps/examples/jsp/checkbox/checkresult.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/checkbox/cresult.html b/output/webapps/examples/jsp/checkbox/cresult.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/colors/ColorGameBean.html b/output/webapps/examples/jsp/colors/ColorGameBean.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/colors/clr.html b/output/webapps/examples/jsp/colors/clr.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/colors/colors.html b/output/webapps/examples/jsp/colors/colors.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/colors/colrs.jsp b/output/webapps/examples/jsp/colors/colrs.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/colors/colrs.jsp.html b/output/webapps/examples/jsp/colors/colrs.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/dates/date.html b/output/webapps/examples/jsp/dates/date.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/dates/date.jsp b/output/webapps/examples/jsp/dates/date.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/dates/date.jsp.html b/output/webapps/examples/jsp/dates/date.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/error/er.html b/output/webapps/examples/jsp/error/er.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/error/err.jsp b/output/webapps/examples/jsp/error/err.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/error/err.jsp.html b/output/webapps/examples/jsp/error/err.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/error/error.html b/output/webapps/examples/jsp/error/error.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/error/errorpge.jsp b/output/webapps/examples/jsp/error/errorpge.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/error/errorpge.jsp.html b/output/webapps/examples/jsp/error/errorpge.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/forward/forward.jsp b/output/webapps/examples/jsp/forward/forward.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/forward/forward.jsp.html b/output/webapps/examples/jsp/forward/forward.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/forward/fwd.html b/output/webapps/examples/jsp/forward/fwd.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/forward/one.jsp b/output/webapps/examples/jsp/forward/one.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/forward/one.jsp.html b/output/webapps/examples/jsp/forward/one.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/forward/two.html b/output/webapps/examples/jsp/forward/two.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/images/code.gif b/output/webapps/examples/jsp/images/code.gif old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/images/execute.gif b/output/webapps/examples/jsp/images/execute.gif old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/images/return.gif b/output/webapps/examples/jsp/images/return.gif old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/include/foo.html b/output/webapps/examples/jsp/include/foo.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/include/foo.jsp b/output/webapps/examples/jsp/include/foo.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/include/foo.jsp.html b/output/webapps/examples/jsp/include/foo.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/include/inc.html b/output/webapps/examples/jsp/include/inc.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/include/include.jsp b/output/webapps/examples/jsp/include/include.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/include/include.jsp.html b/output/webapps/examples/jsp/include/include.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/index.html b/output/webapps/examples/jsp/index.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/Functions.java.html b/output/webapps/examples/jsp/jsp2/el/Functions.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/ValuesBean.java.html b/output/webapps/examples/jsp/jsp2/el/ValuesBean.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/ValuesTag.java.html b/output/webapps/examples/jsp/jsp2/el/ValuesTag.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/basic-arithmetic.html b/output/webapps/examples/jsp/jsp2/el/basic-arithmetic.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp b/output/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html b/output/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/basic-comparisons.html b/output/webapps/examples/jsp/jsp2/el/basic-comparisons.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp b/output/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html b/output/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/composite.html b/output/webapps/examples/jsp/jsp2/el/composite.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/composite.jsp b/output/webapps/examples/jsp/jsp2/el/composite.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/composite.jsp.html b/output/webapps/examples/jsp/jsp2/el/composite.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/functions.html b/output/webapps/examples/jsp/jsp2/el/functions.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/functions.jsp b/output/webapps/examples/jsp/jsp2/el/functions.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/functions.jsp.html b/output/webapps/examples/jsp/jsp2/el/functions.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/implicit-objects.html b/output/webapps/examples/jsp/jsp2/el/implicit-objects.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/implicit-objects.jsp b/output/webapps/examples/jsp/jsp2/el/implicit-objects.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html b/output/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html b/output/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html b/output/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html b/output/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html b/output/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html b/output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp b/output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html b/output/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/shuffle.html b/output/webapps/examples/jsp/jsp2/jspattribute/shuffle.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp b/output/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html b/output/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspx/basic.html b/output/webapps/examples/jsp/jsp2/jspx/basic.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspx/basic.jspx b/output/webapps/examples/jsp/jsp2/jspx/basic.jspx old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspx/basic.jspx.html b/output/webapps/examples/jsp/jsp2/jspx/basic.jspx.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspx/svgexample.html b/output/webapps/examples/jsp/jsp2/jspx/svgexample.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspx/textRotate.html b/output/webapps/examples/jsp/jsp2/jspx/textRotate.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspx/textRotate.jpg b/output/webapps/examples/jsp/jsp2/jspx/textRotate.jpg old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspx/textRotate.jspx b/output/webapps/examples/jsp/jsp2/jspx/textRotate.jspx old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html b/output/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html b/output/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html old mode 100755 new mode 100644 index aa053c7..cab826d --- a/output/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html +++ b/output/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html @@ -20,6 +20,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; @@ -33,8 +34,8 @@ extends SimpleTagSupport implements DynamicAttributes { - private final ArrayList<String> keys = new ArrayList<>(); - private final ArrayList<Object> values = new ArrayList<>(); + private final List<String> keys = new ArrayList<>(); + private final List<Object> values = new ArrayList<>(); @Override public void doTag() throws JspException, IOException { diff --git a/output/webapps/examples/jsp/jsp2/misc/coda.jspf b/output/webapps/examples/jsp/jsp2/misc/coda.jspf old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/coda.jspf.html b/output/webapps/examples/jsp/jsp2/misc/coda.jspf.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/config.html b/output/webapps/examples/jsp/jsp2/misc/config.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/config.jsp b/output/webapps/examples/jsp/jsp2/misc/config.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/config.jsp.html b/output/webapps/examples/jsp/jsp2/misc/config.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/dynamicattrs.html b/output/webapps/examples/jsp/jsp2/misc/dynamicattrs.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp b/output/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html b/output/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/prelude.jspf b/output/webapps/examples/jsp/jsp2/misc/prelude.jspf old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/misc/prelude.jspf.html b/output/webapps/examples/jsp/jsp2/misc/prelude.jspf.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html b/output/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html b/output/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/Functions.java.html b/output/webapps/examples/jsp/jsp2/simpletag/Functions.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html b/output/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html b/output/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/book.html b/output/webapps/examples/jsp/jsp2/simpletag/book.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/book.jsp b/output/webapps/examples/jsp/jsp2/simpletag/book.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/book.jsp.html b/output/webapps/examples/jsp/jsp2/simpletag/book.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/hello.html b/output/webapps/examples/jsp/jsp2/simpletag/hello.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/hello.jsp b/output/webapps/examples/jsp/jsp2/simpletag/hello.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html b/output/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/repeat.html b/output/webapps/examples/jsp/jsp2/simpletag/repeat.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/repeat.jsp b/output/webapps/examples/jsp/jsp2/simpletag/repeat.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html b/output/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html b/output/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/hello.html b/output/webapps/examples/jsp/jsp2/tagfiles/hello.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/hello.jsp b/output/webapps/examples/jsp/jsp2/tagfiles/hello.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html b/output/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html b/output/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/panel.html b/output/webapps/examples/jsp/jsp2/tagfiles/panel.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/panel.jsp b/output/webapps/examples/jsp/jsp2/tagfiles/panel.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html b/output/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html b/output/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/products.html b/output/webapps/examples/jsp/jsp2/tagfiles/products.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/products.jsp b/output/webapps/examples/jsp/jsp2/tagfiles/products.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html b/output/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html b/output/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsptoserv/hello.jsp b/output/webapps/examples/jsp/jsptoserv/hello.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsptoserv/hello.jsp.html b/output/webapps/examples/jsp/jsptoserv/hello.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp b/output/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html b/output/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/jsptoserv/jts.html b/output/webapps/examples/jsp/jsptoserv/jts.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/num/numguess.html b/output/webapps/examples/jsp/num/numguess.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/num/numguess.jsp b/output/webapps/examples/jsp/num/numguess.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/num/numguess.jsp.html b/output/webapps/examples/jsp/num/numguess.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/plugin/applet/Clock2.class b/output/webapps/examples/jsp/plugin/applet/Clock2.class old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/plugin/applet/Clock2.java b/output/webapps/examples/jsp/plugin/applet/Clock2.java old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/plugin/plugin.html b/output/webapps/examples/jsp/plugin/plugin.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/plugin/plugin.jsp b/output/webapps/examples/jsp/plugin/plugin.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/plugin/plugin.jsp.html b/output/webapps/examples/jsp/plugin/plugin.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/security/protected/error.jsp b/output/webapps/examples/jsp/security/protected/error.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/security/protected/error.jsp.html b/output/webapps/examples/jsp/security/protected/error.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/security/protected/index.jsp b/output/webapps/examples/jsp/security/protected/index.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/security/protected/index.jsp.html b/output/webapps/examples/jsp/security/protected/index.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/security/protected/login.jsp b/output/webapps/examples/jsp/security/protected/login.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/security/protected/login.jsp.html b/output/webapps/examples/jsp/security/protected/login.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/sessions/DummyCart.html b/output/webapps/examples/jsp/sessions/DummyCart.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/sessions/carts.html b/output/webapps/examples/jsp/sessions/carts.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/sessions/carts.jsp b/output/webapps/examples/jsp/sessions/carts.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/sessions/carts.jsp.html b/output/webapps/examples/jsp/sessions/carts.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/sessions/crt.html b/output/webapps/examples/jsp/sessions/crt.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/simpletag/foo.html b/output/webapps/examples/jsp/simpletag/foo.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/simpletag/foo.jsp b/output/webapps/examples/jsp/simpletag/foo.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/simpletag/foo.jsp.html b/output/webapps/examples/jsp/simpletag/foo.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/snp/snoop.html b/output/webapps/examples/jsp/snp/snoop.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/snp/snoop.jsp b/output/webapps/examples/jsp/snp/snoop.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/snp/snoop.jsp.html b/output/webapps/examples/jsp/snp/snoop.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/source.jsp b/output/webapps/examples/jsp/source.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/source.jsp.html b/output/webapps/examples/jsp/source.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/choose.html b/output/webapps/examples/jsp/tagplugin/choose.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/choose.jsp b/output/webapps/examples/jsp/tagplugin/choose.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/choose.jsp.html b/output/webapps/examples/jsp/tagplugin/choose.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/foreach.html b/output/webapps/examples/jsp/tagplugin/foreach.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/foreach.jsp b/output/webapps/examples/jsp/tagplugin/foreach.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/foreach.jsp.html b/output/webapps/examples/jsp/tagplugin/foreach.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/howto.html b/output/webapps/examples/jsp/tagplugin/howto.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/if.html b/output/webapps/examples/jsp/tagplugin/if.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/if.jsp b/output/webapps/examples/jsp/tagplugin/if.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/if.jsp.html b/output/webapps/examples/jsp/tagplugin/if.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/tagplugin/notes.html b/output/webapps/examples/jsp/tagplugin/notes.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/xml/xml.html b/output/webapps/examples/jsp/xml/xml.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/xml/xml.jsp b/output/webapps/examples/jsp/xml/xml.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/examples/jsp/xml/xml.jsp.html b/output/webapps/examples/jsp/xml/xml.jsp.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/cookies.html b/output/webapps/examples/servlets/cookies.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/helloworld.html b/output/webapps/examples/servlets/helloworld.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/images/code.gif b/output/webapps/examples/servlets/images/code.gif old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/images/execute.gif b/output/webapps/examples/servlets/images/execute.gif old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/images/return.gif b/output/webapps/examples/servlets/images/return.gif old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/index.html b/output/webapps/examples/servlets/index.html old mode 100755 new mode 100644 index ba3f80e..d07a277 --- a/output/webapps/examples/servlets/index.html +++ b/output/webapps/examples/servlets/index.html @@ -176,6 +176,17 @@

    Other Examples

    + + Servlet 4.0 Trailer Field examples + + + Response trailer fields + + Execute + + + + diff --git a/output/webapps/examples/servlets/nonblocking/bytecounter.html b/output/webapps/examples/servlets/nonblocking/bytecounter.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/reqheaders.html b/output/webapps/examples/servlets/reqheaders.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/reqinfo.html b/output/webapps/examples/servlets/reqinfo.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/reqparams.html b/output/webapps/examples/servlets/reqparams.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/servlets/sessions.html b/output/webapps/examples/servlets/sessions.html old mode 100755 new mode 100644 diff --git a/output/webapps/examples/websocket/chat.xhtml b/output/webapps/examples/websocket/chat.xhtml old mode 100755 new mode 100644 diff --git a/output/webapps/examples/websocket/drawboard.xhtml b/output/webapps/examples/websocket/drawboard.xhtml old mode 100755 new mode 100644 diff --git a/output/webapps/examples/websocket/echo.xhtml b/output/webapps/examples/websocket/echo.xhtml old mode 100755 new mode 100644 diff --git a/output/webapps/examples/websocket/index.xhtml b/output/webapps/examples/websocket/index.xhtml old mode 100755 new mode 100644 diff --git a/output/webapps/examples/websocket/snake.xhtml b/output/webapps/examples/websocket/snake.xhtml old mode 100755 new mode 100644 diff --git a/output/webapps/host-manager/META-INF/context.xml b/output/webapps/host-manager/META-INF/context.xml old mode 100755 new mode 100644 index 18c5623..8d1f61d --- a/output/webapps/host-manager/META-INF/context.xml +++ b/output/webapps/host-manager/META-INF/context.xml @@ -18,4 +18,5 @@ + \ No newline at end of file diff --git a/output/webapps/host-manager/WEB-INF/jsp/401.jsp b/output/webapps/host-manager/WEB-INF/jsp/401.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/host-manager/WEB-INF/jsp/403.jsp b/output/webapps/host-manager/WEB-INF/jsp/403.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/host-manager/WEB-INF/jsp/404.jsp b/output/webapps/host-manager/WEB-INF/jsp/404.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/host-manager/WEB-INF/web.xml b/output/webapps/host-manager/WEB-INF/web.xml old mode 100755 new mode 100644 index 31f2143..e9faa2c --- a/output/webapps/host-manager/WEB-INF/web.xml +++ b/output/webapps/host-manager/WEB-INF/web.xml @@ -28,6 +28,8 @@ Manager lets you view, create and remove virtual hosts. + UTF-8 + HostManager org.apache.catalina.manager.host.HostManagerServlet @@ -45,20 +47,6 @@ - - SetCharacterEncoding - org.apache.catalina.filters.SetCharacterEncodingFilter - - encoding - UTF-8 - - - - - SetCharacterEncoding - /* - - CSRF org.apache.catalina.filters.CsrfPreventionFilter diff --git a/output/webapps/host-manager/images/asf-logo.svg b/output/webapps/host-manager/images/asf-logo.svg old mode 100755 new mode 100644 index 620694c..e24cbe5 --- a/output/webapps/host-manager/images/asf-logo.svg +++ b/output/webapps/host-manager/images/asf-logo.svg @@ -1,4 +1,20 @@ + + diff --git a/output/webapps/manager/WEB-INF/jsp/401.jsp b/output/webapps/manager/WEB-INF/jsp/401.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/manager/WEB-INF/jsp/403.jsp b/output/webapps/manager/WEB-INF/jsp/403.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/manager/WEB-INF/jsp/404.jsp b/output/webapps/manager/WEB-INF/jsp/404.jsp old mode 100755 new mode 100644 diff --git a/output/webapps/manager/WEB-INF/jsp/connectorCerts.jsp b/output/webapps/manager/WEB-INF/jsp/connectorCerts.jsp new file mode 100644 index 0000000..77ddc2b --- /dev/null +++ b/output/webapps/manager/WEB-INF/jsp/connectorCerts.jsp @@ -0,0 +1,92 @@ + +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT 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" %> + + + +<% Map> certList = (Map>) request.getAttribute("certList"); +%> + + + + + + + + + Configured certificate chains per Connector + + +

    Configured certificate chains per Connector

    + + + + + + + + + + <% + for (Map.Entry> entry : certList.entrySet()) { + %> + + + + + <% + } + %> + +
    Connector / TLS Virtual Host / Certificate typeCertificate chain
    <%=entry.getKey()%> + <% + for (String cert : entry.getValue()) { + %> +
    <%=cert%>
    + <% + } + %> +
    + +
    +

    + +

    +
    + +<%--div style="display: none;"> +

    + Valid HTML 4.01! + Valid XHTML 1.0! + Valid XHTML 1.1! +

    + + + + diff --git a/output/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp b/output/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp old mode 100755 new mode 100644 index a660886..e82a3dd --- a/output/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp +++ b/output/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp @@ -18,13 +18,13 @@ <%@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.Set" %> +<%@page import="java.util.List" %> -<% Map> cipherList = (Map>) request.getAttribute("cipherList"); +<% Map> cipherList = (Map>) request.getAttribute("cipherList"); %> @@ -32,7 +32,7 @@ - + Configured ciphers per Connector @@ -42,13 +42,13 @@ - + <% - for (Map.Entry> entry : cipherList.entrySet()) { + for (Map.Entry> entry : cipherList.entrySet()) { %> diff --git a/output/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp b/output/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp new file mode 100644 index 0000000..7d1ed96 --- /dev/null +++ b/output/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp @@ -0,0 +1,92 @@ + +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT 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" %> + + + +<% Map> trustedCertList = (Map>) request.getAttribute("trustedCertList"); +%> + + + + + + + + + Trusted certificates per Connector + + +

    Trusted certificates per Connector

    + +
    ConnectorConnector / TLS Virtual Host Enabled Ciphers
    <%=entry.getKey()%>
    + + + + + + + + <% + for (Map.Entry> entry : trustedCertList.entrySet()) { + %> + + + + + <% + } + %> + +
    Connector / TLS Virtual HostTrusted Certificates
    <%=entry.getKey()%> + <% + for (String cert : entry.getValue()) { + %> +
    <%=cert%>
    + <% + } + %> +
    + +
    +

    + +

    +
    + +<%--div style="display: none;"> +

    + Valid HTML 4.01! + Valid XHTML 1.0! + Valid XHTML 1.1! +

    + + + + diff --git a/output/webapps/manager/WEB-INF/jsp/sessionDetail.jsp b/output/webapps/manager/WEB-INF/jsp/sessionDetail.jsp old mode 100755 new mode 100644 index 29c87f0..58d1f90 --- a/output/webapps/manager/WEB-INF/jsp/sessionDetail.jsp +++ b/output/webapps/manager/WEB-INF/jsp/sessionDetail.jsp @@ -51,7 +51,7 @@ - + Sessions Administration: details for <%= currentSessionId %> diff --git a/output/webapps/manager/WEB-INF/jsp/sessionsList.jsp b/output/webapps/manager/WEB-INF/jsp/sessionsList.jsp old mode 100755 new mode 100644 index 4067e90..2c760aa --- a/output/webapps/manager/WEB-INF/jsp/sessionsList.jsp +++ b/output/webapps/manager/WEB-INF/jsp/sessionsList.jsp @@ -17,7 +17,6 @@ --%> <%@page session="false" contentType="text/html; charset=ISO-8859-1" %> <%@page import="java.util.Collection" %> -<%@page import="java.util.Iterator" %> <%@page import="org.apache.catalina.manager.JspHelper" %> <%@page import="org.apache.catalina.Session" %> <%@page import="org.apache.catalina.ha.session.DeltaSession" %> @@ -34,7 +33,7 @@ String submitUrl = JspHelper.escapeXml(response.encodeURL( ((HttpServletRequest) pageContext.getRequest()).getRequestURI() + "?path=" + path + "&version=" + version)); - Collection activeSessions = (Collection) request.getAttribute("activeSessions"); + Collection activeSessions = (Collection) request.getAttribute("activeSessions"); %> @@ -43,7 +42,7 @@ - + Sessions Administration for <%= JspHelper.escapeXml(cn.getDisplayName()) %> @@ -101,9 +100,8 @@ <% } // end if %> -<% Iterator iter = activeSessions.iterator(); - while (iter.hasNext()) { - Session currentSession = (Session) iter.next(); +<% + for (Session currentSession : activeSessions) { String currentSessionId = JspHelper.escapeXml(currentSession.getId()); String type; if (currentSession instanceof DeltaSession) { diff --git a/output/webapps/manager/WEB-INF/web.xml b/output/webapps/manager/WEB-INF/web.xml old mode 100755 new mode 100644 index f2f7829..e73aae0 --- a/output/webapps/manager/WEB-INF/web.xml +++ b/output/webapps/manager/WEB-INF/web.xml @@ -28,6 +28,8 @@ Manager lets you view, load/unload/etc particular web applications. + UTF-8 + Manager org.apache.catalina.manager.ManagerServlet @@ -89,20 +91,6 @@ /html/* - - SetCharacterEncoding - org.apache.catalina.filters.SetCharacterEncodingFilter - - encoding - UTF-8 - - - - - SetCharacterEncoding - /* - - CSRF org.apache.catalina.filters.CsrfPreventionFilter diff --git a/output/webapps/manager/images/asf-logo.svg b/output/webapps/manager/images/asf-logo.svg old mode 100755 new mode 100644 index 620694c..e24cbe5 --- a/output/webapps/manager/images/asf-logo.svg +++ b/output/webapps/manager/images/asf-logo.svg @@ -1,4 +1,20 @@ + 4.0.0 org.apache tomcat - 9.0.0.M21 + 9.0.4 pom - Tomcat-9.0.0.M21 + Tomcat-9.0.4 http://maven.apache.org UTF-8 yyyyMMdd HH:mm:ss - 9.0.0.M21 - 9.0.0.M21 + 9.0.9.0.4 + 9.0.9.0.4 ${maven.build.timestamp} From b556c177b0ecbad48759baa3b48737b57300cea8 Mon Sep 17 00:00:00 2001 From: apple Date: Wed, 31 Jan 2018 16:58:38 +0800 Subject: [PATCH 3/5] 1 --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ae8efad..d9d217d 100755 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ .idea/* */output/logs/* */output/work/* -*/output/webapps/* -bestsign-sdk-logs +*/webapps/* From a73d904219237a3ce0178ed2b6de8475ba17340e Mon Sep 17 00:00:00 2001 From: apple Date: Wed, 31 Jan 2018 17:08:35 +0800 Subject: [PATCH 4/5] 11 --- .gitignore | 4 +- all/pom.xml | 2 +- all/tomcat-all.iml | 14 +- core/pom.xml | 2 +- .../main/java/javax/annotation/Generated.java | 2 + .../java/javax/annotation/PostConstruct.java | 2 + .../java/javax/annotation/PreDestroy.java | 2 + .../main/java/javax/annotation/Priority.java | 2 + .../main/java/javax/annotation/Resources.java | 2 + .../annotation/security/DeclareRoles.java | 2 + .../javax/annotation/security/DenyAll.java | 2 + .../javax/annotation/security/PermitAll.java | 2 + .../annotation/security/RolesAllowed.java | 2 + .../java/javax/annotation/security/RunAs.java | 2 + core/src/main/java/javax/ejb/EJB.java | 1 + .../main/java/javax/el/ArrayELResolver.java | 2 +- .../main/java/javax/el/ExpressionFactory.java | 9 +- .../main/java/javax/el/ListELResolver.java | 2 +- .../java/javax/el/LocalStrings_es.properties | 1 + .../java/javax/el/StaticFieldELResolver.java | 5 +- core/src/main/java/javax/el/Util.java | 107 +- .../message/config/AuthConfigFactory.java | 54 +- .../javax/servlet/LocalStrings_es.properties | 1 + .../java/javax/servlet/http/HttpServlet.java | 1 - ...etMapping.java => HttpServletMapping.java} | 4 +- .../servlet/http/HttpServletRequest.java | 25 +- .../http/HttpServletRequestWrapper.java | 25 +- .../servlet/http/HttpServletResponse.java | 36 + .../http/HttpServletResponseWrapper.java | 38 +- .../java/javax/servlet/http/HttpUtils.java | 5 +- .../servlet/http/LocalStrings_es.properties | 1 + .../java/javax/servlet/http/MappingMatch.java | 3 +- .../servlet/jsp/tagext/TagLibraryInfo.java | 4 +- .../java/javax/servlet/resources/javaee_8.xsd | 1310 +++++++++-------- .../resources/javaee_web_services_1_4.xsd | 30 +- .../javaee_web_services_client_1_4.xsd | 58 +- .../javax/servlet/resources/web-app_4_0.xsd | 211 +-- .../servlet/resources/web-common_4_0.xsd | 259 ++-- .../servlet/resources/web-fragment_4_0.xsd | 184 ++- .../javax/websocket/ContainerProvider.java | 4 +- .../server/ServerEndpointConfig.java | 6 +- .../main/java/javax/xml/ws/WebServiceRef.java | 37 + .../java/javax/xml/ws/WebServiceRefs.java | 31 + .../org/apache/catalina/ContainerEvent.java | 4 +- .../org/apache/catalina/SessionEvent.java | 17 +- .../org/apache/catalina/WebResourceRoot.java | 2 +- .../catalina/ant/AbstractCatalinaTask.java | 29 +- .../apache/catalina/ant/ResourcesTask.java | 2 +- .../apache/catalina/ant/ValidatorTask.java | 4 +- .../catalina/ant/jmx/JMXAccessorTask.java | 22 +- .../org/apache/catalina/ant/jmx/package.html | 17 +- .../java/org/apache/catalina/ant/package.html | 17 +- .../authenticator/AuthenticatorBase.java | 56 +- .../authenticator/BasicAuthenticator.java | 53 +- .../authenticator/FormAuthenticator.java | 33 +- .../authenticator/LocalStrings.properties | 2 + .../authenticator/LocalStrings_es.properties | 1 + .../catalina/authenticator/SavedRequest.java | 38 +- .../catalina/authenticator/SingleSignOn.java | 2 +- .../authenticator/SpnegoAuthenticator.java | 1 - .../jaspic/AuthConfigFactoryImpl.java | 55 +- .../PersistentProviderRegistrations.java | 31 +- .../jaspic/SimpleServerAuthConfig.java | 5 +- .../catalina/connector/CoyoteAdapter.java | 21 +- .../catalina/connector/CoyoteInputStream.java | 4 +- .../catalina/connector/CoyotePrincipal.java | 6 +- .../catalina/connector/InputBuffer.java | 7 +- .../connector/LocalStrings.properties | 2 + .../apache/catalina/connector/Request.java | 132 +- .../catalina/connector/RequestFacade.java | 43 +- .../apache/catalina/connector/Response.java | 67 +- .../catalina/connector/ResponseFacade.java | 20 +- .../catalina/core/ApplicationContext.java | 114 +- .../core/ApplicationContextFacade.java | 2 +- .../catalina/core/ApplicationDispatcher.java | 18 +- .../core/ApplicationFilterConfig.java | 36 +- .../core/ApplicationFilterFactory.java | 18 +- .../catalina/core/ApplicationHttpRequest.java | 77 +- .../catalina/core/ApplicationMapping.java | 69 +- .../apache/catalina/core/ApplicationPart.java | 6 +- .../catalina/core/ApplicationPushBuilder.java | 49 +- .../catalina/core/ApplicationRequest.java | 2 +- .../catalina/core/AprLifecycleListener.java | 4 +- .../catalina/core/AsyncContextImpl.java | 33 +- .../apache/catalina/core/ContainerBase.java | 40 +- .../catalina/core/DefaultInstanceManager.java | 86 +- .../core/JreMemoryLeakPreventionListener.java | 17 +- .../catalina/core/LocalStrings_es.properties | 1 + .../catalina/core/NamingContextListener.java | 4 +- .../core/RestrictedListeners.properties | 1 + .../apache/catalina/core/StandardContext.java | 267 ++-- .../apache/catalina/core/StandardEngine.java | 14 +- .../apache/catalina/core/StandardHost.java | 59 +- .../catalina/core/StandardHostValve.java | 6 +- .../catalina/core/StandardPipeline.java | 15 +- .../apache/catalina/core/StandardServer.java | 49 +- .../apache/catalina/core/StandardService.java | 2 +- .../apache/catalina/core/StandardWrapper.java | 71 +- .../catalina/core/StandardWrapperFacade.java | 2 +- .../catalina/core/mbeans-descriptors.xml | 9 +- .../catalina/deploy/LocalStrings.properties | 1 + .../catalina/deploy/NamingResourcesImpl.java | 9 +- .../filters/AddDefaultCharsetFilter.java | 20 +- .../apache/catalina/filters/CorsFilter.java | 148 +- .../filters/CsrfPreventionFilter.java | 4 +- .../filters/CsrfPreventionFilterBase.java | 4 +- .../catalina/filters/ExpiresFilter.java | 2 +- .../apache/catalina/filters/FilterBase.java | 16 +- .../filters/HttpHeaderSecurityFilter.java | 2 +- .../filters/LocalStrings_es.properties | 1 + .../catalina/filters/RemoteIpFilter.java | 19 +- .../filters/RestCsrfPreventionFilter.java | 2 +- .../filters/SessionInitializerFilter.java | 61 + .../apache/catalina/ha/ClusterRuleSet.java | 12 +- .../catalina/ha/backend/CollectedInfo.java | 9 +- .../catalina/ha/deploy/FarmWarDeployer.java | 6 +- .../ha/deploy/FileMessageFactory.java | 8 +- .../ha/deploy/LocalStrings.properties | 2 + .../catalina/ha/session/BackupManager.java | 22 +- .../ha/session/ClusterManagerBase.java | 6 +- .../ha/session/ClusterSessionListener.java | 3 +- .../catalina/ha/session/DeltaManager.java | 13 +- .../catalina/ha/session/DeltaSession.java | 10 +- .../ha/session/LocalStrings_es.properties | 1 + .../ha/session/mbeans-descriptors.xml | 5 + .../catalina/ha/tcp/ReplicationValve.java | 5 +- .../catalina/ha/tcp/SimpleTcpCluster.java | 32 +- .../catalina/ha/tcp/mbeans-descriptors.xml | 7 +- .../catalina/loader/JdbcLeakPrevention.java | 3 +- .../loader/LocalStrings_es.properties | 1 + .../loader/WebappClassLoaderBase.java | 82 +- .../apache/catalina/loader/WebappLoader.java | 5 +- .../apache/catalina/manager/Constants.java | 2 +- .../catalina/manager/HTMLManagerServlet.java | 158 +- .../catalina/manager/LocalStrings.properties | 22 +- .../manager/LocalStrings_es.properties | 3 +- .../catalina/manager/ManagerServlet.java | 220 ++- .../catalina/manager/StatusTransformer.java | 91 +- .../catalina/manager/host/Constants.java | 2 +- .../manager/host/HTMLHostManagerServlet.java | 14 +- .../manager/host/HostManagerServlet.java | 11 +- .../manager/host/LocalStrings_es.properties | 1 + .../catalina/manager/util/SessionUtils.java | 2 +- .../org/apache/catalina/mapper/Mapper.java | 14 +- .../catalina/mapper/MapperListener.java | 4 +- .../apache/catalina/mapper/MappingData.java | 4 +- .../catalina/mbeans/BaseCatalinaMBean.java | 9 +- .../catalina/mbeans/ClassNameMBean.java | 17 - .../catalina/mbeans/ConnectorMBean.java | 14 - .../catalina/mbeans/ContainerMBean.java | 15 - .../mbeans/ContextEnvironmentMBean.java | 15 - .../apache/catalina/mbeans/ContextMBean.java | 6 - .../mbeans/ContextResourceLinkMBean.java | 23 +- .../catalina/mbeans/ContextResourceMBean.java | 24 +- .../apache/catalina/mbeans/GroupMBean.java | 21 +- .../mbeans/JmxRemoteLifecycleListener.java | 5 +- .../apache/catalina/mbeans/MBeanDumper.java | 173 ++- .../apache/catalina/mbeans/MBeanFactory.java | 14 +- .../apache/catalina/mbeans/MBeanUtils.java | 36 +- .../mbeans/MemoryUserDatabaseMBean.java | 25 +- .../catalina/mbeans/NamingResourcesMBean.java | 25 +- .../org/apache/catalina/mbeans/RoleMBean.java | 19 - .../apache/catalina/mbeans/ServiceMBean.java | 6 - .../org/apache/catalina/mbeans/UserMBean.java | 23 +- .../catalina/realm/DataSourceRealm.java | 8 +- .../realm/DigestCredentialHandlerBase.java | 2 +- .../catalina/realm/JAASMemoryLoginModule.java | 5 +- .../org/apache/catalina/realm/JAASRealm.java | 48 +- .../org/apache/catalina/realm/JDBCRealm.java | 18 +- .../org/apache/catalina/realm/JNDIRealm.java | 69 +- .../catalina/realm/LocalStrings.properties | 4 +- .../catalina/realm/LocalStrings_es.properties | 2 +- .../apache/catalina/realm/MemoryRealm.java | 11 +- .../apache/catalina/realm/MemoryRuleSet.java | 16 +- .../org/apache/catalina/realm/RealmBase.java | 74 +- .../catalina/realm/UserDatabaseRealm.java | 4 +- .../security/DeployXmlPermission.java | 38 + .../security/LocalStrings_es.properties | 1 + .../catalina/security/SecurityClassLoad.java | 6 +- .../catalina/security/SecurityUtil.java | 4 +- .../apache/catalina/servlets/CGIServlet.java | 43 +- .../catalina/servlets/DefaultServlet.java | 310 ++-- .../catalina/servlets/LocalStrings.properties | 1 + .../servlets/LocalStrings_es.properties | 3 +- .../catalina/servlets/WebdavServlet.java | 149 +- .../apache/catalina/session/FileStore.java | 14 +- .../apache/catalina/session/JDBCStore.java | 43 +- .../catalina/session/LocalStrings.properties | 4 +- .../session/LocalStrings_es.properties | 1 + .../apache/catalina/session/ManagerBase.java | 43 +- .../catalina/session/StandardManager.java | 18 +- .../catalina/session/StandardSession.java | 72 +- .../org/apache/catalina/ssi/SSIMediator.java | 4 +- .../org/apache/catalina/ssi/SSIPrintenv.java | 6 +- .../ssi/SSIServletExternalResolver.java | 9 +- .../catalina/ssi/SSIServletRequestUtil.java | 2 +- .../apache/catalina/startup/Bootstrap.java | 6 +- .../org/apache/catalina/startup/Catalina.java | 29 +- .../catalina/startup/CatalinaProperties.java | 15 +- .../catalina/startup/ClassLoaderFactory.java | 2 +- .../apache/catalina/startup/Constants.java | 1 + .../catalina/startup/ContextConfig.java | 49 +- .../catalina/startup/ContextRuleSet.java | 14 +- .../startup/CredentialHandlerRuleSet.java | 5 +- .../catalina/startup/EngineRuleSet.java | 16 +- .../apache/catalina/startup/ExpandWar.java | 15 +- .../catalina/startup/HomesUserDatabase.java | 12 +- .../apache/catalina/startup/HostConfig.java | 98 +- .../apache/catalina/startup/HostRuleSet.java | 16 +- .../startup/LifecycleListenerRule.java | 3 +- .../catalina/startup/LocalStrings.properties | 7 + .../startup/LocalStrings_es.properties | 1 + .../catalina/startup/NamingRuleSet.java | 16 +- .../apache/catalina/startup/RealmRuleSet.java | 14 +- .../catalina/startup/SetNextNamingRule.java | 4 +- .../org/apache/catalina/startup/Tomcat.java | 127 +- .../org/apache/catalina/startup/Tool.java | 5 +- .../apache/catalina/startup/UserConfig.java | 38 +- .../catalina/startup/WebAnnotationSet.java | 9 +- .../catalina/startup/WebappServiceLoader.java | 7 +- .../storeconfig/ConnectorStoreAppender.java | 13 +- .../catalina/storeconfig/SSLHostConfigSF.java | 6 +- .../storeconfig/StandardContextSF.java | 4 +- .../storeconfig/StandardEngineSF.java | 4 +- .../catalina/storeconfig/StandardHostSF.java | 4 +- .../storeconfig/StandardServerSF.java | 4 +- .../storeconfig/StandardServiceSF.java | 4 +- .../catalina/storeconfig/StoreAppender.java | 41 +- .../StoreConfigLifecycleListener.java | 2 +- .../storeconfig/StoreContextAppender.java | 9 +- .../storeconfig/StoreFactoryBase.java | 4 +- .../storeconfig/StoreFactoryRule.java | 9 +- .../catalina/storeconfig/StoreFileMover.java | 4 +- .../catalina/storeconfig/StoreLoader.java | 4 +- .../catalina/storeconfig/server-registry.xml | 17 + .../org/apache/catalina/tribes/Channel.java | 88 ++ .../catalina/tribes/ChannelMessage.java | 2 +- .../org/apache/catalina/tribes/Member.java | 4 +- .../catalina/tribes/group/GroupChannel.java | 10 +- .../catalina/tribes/group/RpcChannel.java | 5 +- .../group/interceptors/GzipInterceptor.java | 211 ++- .../interceptors/GzipInterceptorMBean.java | 79 + .../interceptors/LocalStrings.properties | 17 +- .../group/interceptors/OrderInterceptor.java | 7 +- .../interceptors/TcpFailureDetector.java | 2 +- .../catalina/tribes/io/ChannelData.java | 20 +- .../catalina/tribes/io/ReplicationStream.java | 4 +- .../catalina/tribes/io/XByteBuffer.java | 4 +- .../catalina/tribes/jmx/JmxRegistry.java | 5 +- .../tribes/membership/Membership.java | 28 +- .../org/apache/catalina/tribes/package.html | 4 +- .../tribes/tipis/AbstractReplicatedMap.java | 86 +- .../tribes/tipis/LazyReplicatedMap.java | 14 +- .../tribes/tipis/LocalStrings.properties | 2 +- .../catalina/tribes/tipis/ReplicatedMap.java | 33 +- .../transport/LocalStrings_es.properties | 1 + .../catalina/tribes/transport/RxTaskPool.java | 2 +- .../tribes/transport/bio/BioSender.java | 2 +- .../transport/bio/MultipointBioSender.java | 12 +- .../tribes/transport/nio/NioReceiver.java | 7 +- .../transport/nio/NioReplicationTask.java | 1 - .../tribes/transport/nio/NioSender.java | 2 +- .../transport/nio/ParallelNioSender.java | 88 +- .../transport/nio/PooledParallelSender.java | 1 + .../apache/catalina/tribes/util/Arrays.java | 2 +- .../catalina/tribes/util/ExecutorFactory.java | 9 +- .../apache/catalina/users/AbstractGroup.java | 16 +- .../apache/catalina/users/AbstractRole.java | 16 +- .../apache/catalina/users/AbstractUser.java | 22 +- .../catalina/users/LocalStrings.properties | 2 + .../catalina/users/LocalStrings_es.properties | 1 + .../apache/catalina/users/MemoryGroup.java | 28 +- .../org/apache/catalina/users/MemoryRole.java | 8 +- .../org/apache/catalina/users/MemoryUser.java | 40 +- .../catalina/users/MemoryUserDatabase.java | 99 +- .../users/MemoryUserDatabaseFactory.java | 6 +- .../apache/catalina/util/CharsetMapper.java | 2 +- .../util/CustomObjectInputStream.java | 4 +- .../org/apache/catalina/util/DOMWriter.java | 80 +- .../org/apache/catalina/util/Extension.java | 18 +- .../catalina/util/ExtensionValidator.java | 44 +- .../catalina/util/LocalStrings_es.properties | 1 + .../catalina/util/ManifestResource.java | 8 +- .../org/apache/catalina/util/RequestUtil.java | 40 - .../org/apache/catalina/util/ResourceSet.java | 14 +- .../org/apache/catalina/util/ServerInfo.java | 12 +- .../catalina/util/ServerInfo.properties | 6 +- .../catalina/util/SessionIdGeneratorBase.java | 16 +- .../org/apache/catalina/util/TLSUtil.java | 43 + .../org/apache/catalina/util/URLEncoder.java | 32 +- .../valves/AbstractAccessLogValve.java | 83 +- .../catalina/valves/AccessLogValve.java | 6 +- .../valves/CrawlerSessionManagerValve.java | 78 +- .../catalina/valves/ErrorReportValve.java | 20 +- .../catalina/valves/JDBCAccessLogValve.java | 2 +- .../valves/LoadBalancerDrainingValve.java | 262 ++++ .../catalina/valves/LocalStrings.properties | 4 +- .../valves/LocalStrings_es.properties | 5 +- .../valves/LocalStrings_fr.properties | 4 +- .../valves/LocalStrings_ja.properties | 4 +- .../catalina/valves/RemoteAddrValve.java | 38 +- .../catalina/valves/RemoteHostValve.java | 37 +- .../catalina/valves/RequestFilterValve.java | 29 + .../org/apache/catalina/valves/SSLValve.java | 96 +- .../valves/StuckThreadDetectionValve.java | 2 +- .../catalina/valves/mbeans-descriptors.xml | 4 - .../catalina/valves/rewrite/ResolverImpl.java | 6 +- .../catalina/valves/rewrite/RewriteRule.java | 14 +- .../catalina/valves/rewrite/RewriteValve.java | 26 +- .../catalina/valves/rewrite/Substitution.java | 3 +- .../AbstractArchiveResourceSet.java | 54 +- .../webresources/AbstractFileResourceSet.java | 143 +- .../AbstractSingleArchiveResourceSet.java | 34 +- .../catalina/webresources/CachedResource.java | 45 +- .../catalina/webresources/DirResourceSet.java | 6 + .../catalina/webresources/ExtractingRoot.java | 106 ++ .../catalina/webresources/FileResource.java | 2 +- .../webresources/JarWarResourceSet.java | 127 +- .../webresources/LocalStrings.properties | 3 + .../catalina/webresources/StandardRoot.java | 21 +- .../webresources/TomcatJarInputStream.java | 61 + .../webresources/war/WarURLConnection.java | 6 + .../org/apache/coyote/AbstractProcessor.java | 91 +- .../apache/coyote/AbstractProcessorLight.java | 110 +- .../org/apache/coyote/AbstractProtocol.java | 283 ++-- .../java/org/apache/coyote/ActionCode.java | 22 +- .../org/apache/coyote/AsyncStateMachine.java | 459 +++--- .../org/apache/coyote/CompressionConfig.java | 274 ++++ .../org/apache/coyote/LocalStrings.properties | 3 +- .../main/java/org/apache/coyote/Request.java | 54 +- .../org/apache/coyote/RequestGroupInfo.java | 7 +- .../main/java/org/apache/coyote/Response.java | 56 +- .../coyote/ajp/AbstractAjpProtocol.java | 3 +- .../org/apache/coyote/ajp/AjpAprProtocol.java | 2 +- .../apache/coyote/ajp/AjpNio2Protocol.java | 2 +- .../org/apache/coyote/ajp/AjpNioProtocol.java | 2 +- .../org/apache/coyote/ajp/AjpProcessor.java | 13 +- .../apache/coyote/ajp/LocalStrings.properties | 1 + .../coyote/ajp/LocalStrings_es.properties | 1 + .../coyote/http11/AbstractHttp11Protocol.java | 186 ++- .../coyote/http11/Http11AprProtocol.java | 4 +- .../coyote/http11/Http11InputBuffer.java | 41 +- .../coyote/http11/Http11Nio2Protocol.java | 4 +- .../coyote/http11/Http11NioProtocol.java | 4 +- .../coyote/http11/Http11OutputBuffer.java | 99 +- .../apache/coyote/http11/Http11Processor.java | 306 ++-- .../coyote/http11/HttpOutputBuffer.java | 40 + .../coyote/http11/LocalStrings.properties | 5 +- .../coyote/http11/LocalStrings_es.properties | 1 + .../apache/coyote/http11/OutputFilter.java | 23 +- .../http11/filters/ChunkedOutputFilter.java | 107 +- .../http11/filters/GzipOutputFilter.java | 31 +- .../http11/filters/IdentityOutputFilter.java | 37 +- .../http11/filters/VoidOutputFilter.java | 43 +- .../upgrade/UpgradeServletInputStream.java | 11 +- .../upgrade/UpgradeServletOutputStream.java | 2 +- .../org/apache/coyote/http2/ByteUtil.java | 2 +- .../coyote/http2/ConnectionSettingsBase.java | 6 +- .../java/org/apache/coyote/http2/Flags.java | 10 +- .../org/apache/coyote/http2/HeaderSink.java | 7 + .../org/apache/coyote/http2/HpackDecoder.java | 17 +- .../http2/Http2AsyncUpgradeHandler.java | 220 ++- .../coyote/http2/Http2OutputBuffer.java | 79 + .../org/apache/coyote/http2/Http2Parser.java | 33 +- .../apache/coyote/http2/Http2Protocol.java | 94 +- .../coyote/http2/Http2UpgradeHandler.java | 195 +-- .../coyote/http2/LocalStrings.properties | 6 +- .../org/apache/coyote/http2/SendfileData.java | 34 + .../java/org/apache/coyote/http2/Stream.java | 208 ++- .../apache/coyote/http2/StreamProcessor.java | 101 +- .../coyote/http2/StreamStateMachine.java | 9 + .../org/apache/coyote/mbeans-descriptors.xml | 59 + .../java/org/apache/el/Messages_es.properties | 1 + .../org/apache/el/lang/ExpressionBuilder.java | 2 +- .../apache/el/parser/AstMethodParameters.java | 3 +- .../java/org/apache/el/parser/AstValue.java | 9 +- .../java/org/apache/el/parser/ELParser.java | 2 +- .../java/org/apache/el/parser/ELParser.jjt | 2 +- .../org/apache/el/parser/TokenMgrError.java | 4 +- .../el/stream/StreamELResolverImpl.java | 7 +- .../org/apache/el/util/ReflectionUtil.java | 79 +- .../apache/jasper/EmbeddedServletOptions.java | 19 +- .../src/main/java/org/apache/jasper/JspC.java | 93 +- .../apache/jasper/JspCompilationContext.java | 33 +- .../main/java/org/apache/jasper/Options.java | 9 +- .../org/apache/jasper/TrimSpacesOption.java | 23 + .../apache/jasper/compiler/AntCompiler.java | 13 +- .../jasper/compiler/AttributeParser.java | 4 +- .../org/apache/jasper/compiler/Compiler.java | 79 +- .../jasper/compiler/ELFunctionMapper.java | 3 +- .../jasper/compiler/ELInterpreterFactory.java | 2 +- .../org/apache/jasper/compiler/ELNode.java | 8 +- .../org/apache/jasper/compiler/ELParser.java | 10 +- .../jasper/compiler/EncodingDetector.java | 13 +- .../jasper/compiler/ErrorDispatcher.java | 3 +- .../org/apache/jasper/compiler/Generator.java | 17 +- .../apache/jasper/compiler/JDTCompiler.java | 14 +- .../jasper/compiler/JavacErrorDetail.java | 2 +- .../org/apache/jasper/compiler/JspConfig.java | 11 +- .../jasper/compiler/JspDocumentParser.java | 9 +- .../jasper/compiler/JspRuntimeContext.java | 20 +- .../org/apache/jasper/compiler/JspUtil.java | 34 +- .../org/apache/jasper/compiler/Localizer.java | 91 +- .../java/org/apache/jasper/compiler/Node.java | 5 +- .../apache/jasper/compiler/PageDataImpl.java | 9 +- .../org/apache/jasper/compiler/Parser.java | 5 +- .../jasper/compiler/ParserController.java | 10 +- .../apache/jasper/compiler/SmapGenerator.java | 173 --- .../org/apache/jasper/compiler/SmapInput.java | 39 + .../apache/jasper/compiler/SmapStratum.java | 125 +- .../org/apache/jasper/compiler/SmapUtil.java | 216 ++- .../jasper/compiler/TagFileProcessor.java | 20 +- .../jasper/compiler/TagLibraryInfoImpl.java | 4 +- .../jasper/compiler/TagPluginManager.java | 2 +- .../apache/jasper/compiler/TextOptimizer.java | 15 +- .../org/apache/jasper/compiler/Validator.java | 78 +- .../jasper/resources/LocalStrings.properties | 64 +- .../resources/LocalStrings_es.properties | 71 +- .../resources/LocalStrings_fr.properties | 61 +- .../resources/LocalStrings_ja.properties | 57 +- .../jasper/runtime/BodyContentImpl.java | 13 +- .../jasper/runtime/JspContextWrapper.java | 8 +- .../jasper/runtime/JspRuntimeLibrary.java | 7 +- .../jasper/runtime/PageContextImpl.java | 6 +- .../apache/jasper/runtime/TagHandlerPool.java | 4 +- .../apache/jasper/security/SecurityUtil.java | 40 - .../apache/jasper/servlet/JasperLoader.java | 5 +- .../jasper/servlet/JspCServletContext.java | 20 +- .../org/apache/jasper/servlet/JspServlet.java | 4 +- .../jasper/servlet/JspServletWrapper.java | 41 +- .../apache/jasper/tagplugins/jstl/Util.java | 4 +- .../org/apache/juli/AsyncFileHandler.java | 28 +- .../apache/juli/ClassLoaderLogManager.java | 26 +- .../java/org/apache/juli/FileHandler.java | 197 ++- .../org/apache/juli/OneLineFormatter.java | 34 +- .../org/apache/juli/WebappProperties.java | 11 + .../org/apache/juli/logging/DirectJDKLog.java | 5 +- .../org/apache/juli/logging/LogFactory.java | 10 +- .../java/org/apache/juli/logging/package.html | 2 +- .../org/apache/naming/ContextBindings.java | 2 +- .../java/org/apache/naming/NamingContext.java | 2 +- .../org/apache/naming/SelectorContext.java | 4 +- .../apache/naming/factory/BeanFactory.java | 18 +- .../naming/factory/DataSourceLinkFactory.java | 9 +- .../org/apache/naming/factory/EjbFactory.java | 2 +- .../apache/naming/factory/FactoryBase.java | 2 +- .../naming/factory/MailSessionFactory.java | 4 +- .../naming/factory/ResourceFactory.java | 6 +- .../org/apache/naming/factory/package.html | 2 - .../webservices/ServiceRefFactory.java | 41 +- .../java/org/apache/naming/java/package.html | 2 - .../main/java/org/apache/naming/package.html | 2 - core/src/main/java/org/apache/tomcat/Jar.java | 13 - .../apache/tomcat/SimpleInstanceManager.java | 14 +- .../org/apache/tomcat/buildutil/CheckEol.java | 2 +- .../org/apache/tomcat/buildutil/Txt2Html.java | 5 +- .../tomcat/dbcp/dbcp2/BasicDataSource.java | 91 +- .../dbcp2/DelegatingDatabaseMetaData.java | 2 +- .../dbcp/dbcp2/DelegatingResultSet.java | 2 +- .../dbcp/dbcp2/DelegatingStatement.java | 2 +- .../apache/tomcat/dbcp/dbcp2/PStmtKey.java | 267 +++- .../tomcat/dbcp/dbcp2/PoolableConnection.java | 9 +- .../dbcp/dbcp2/PoolableConnectionFactory.java | 7 +- .../tomcat/dbcp/dbcp2/PoolingConnection.java | 217 ++- .../tomcat/dbcp/dbcp2/PoolingDataSource.java | 4 + .../dbcp2/cpdsadapter/DriverAdapterCPDS.java | 2 +- .../dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java | 2 +- .../pool2/BaseKeyedPooledObjectFactory.java | 11 +- .../dbcp/pool2/BasePooledObjectFactory.java | 3 + .../tomcat/dbcp/pool2/KeyedObjectPool.java | 4 +- .../apache/tomcat/dbcp/pool2/ObjectPool.java | 4 +- .../apache/tomcat/dbcp/pool2/PoolUtils.java | 23 + .../tomcat/dbcp/pool2/PooledObject.java | 16 +- .../dbcp/pool2/impl/AbandonedConfig.java | 37 + .../pool2/impl/BaseGenericObjectPool.java | 41 +- .../dbcp/pool2/impl/BaseObjectPoolConfig.java | 50 +- .../tomcat/dbcp/pool2/impl/CallStack.java | 52 + .../dbcp/pool2/impl/CallStackUtils.java | 89 ++ .../dbcp/pool2/impl/DefaultPooledObject.java | 77 +- .../impl/DefaultPooledObjectInfoMBean.java | 2 +- .../tomcat/dbcp/pool2/impl/EvictionTimer.java | 164 +-- .../pool2/impl/GenericKeyedObjectPool.java | 51 +- .../dbcp/pool2/impl/GenericObjectPool.java | 23 +- .../dbcp/pool2/impl/LinkedBlockingDeque.java | 6 +- .../tomcat/dbcp/pool2/impl/NoOpCallStack.java | 48 + .../pool2/impl/SecurityManagerCallStack.java | 129 ++ .../pool2/impl/SoftReferenceObjectPool.java | 5 +- .../dbcp/pool2/impl/ThrowableCallStack.java | 86 ++ .../main/java/org/apache/tomcat/jni/SSL.java | 14 +- .../java/org/apache/tomcat/jni/SSLConf.java | 113 ++ .../org/apache/tomcat/jni/SSLContext.java | 18 + .../org/apache/tomcat/util/bcel/Const.java | 104 +- .../apache/tomcat/util/buf/AbstractChunk.java | 181 +++ .../org/apache/tomcat/util/buf/ByteChunk.java | 521 +++---- .../org/apache/tomcat/util/buf/CharChunk.java | 566 ++++--- .../tomcat/util/buf/LocalStrings.properties | 3 +- .../apache/tomcat/util/buf/MessageBytes.java | 5 + .../apache/tomcat/util/buf/StringUtils.java | 17 +- .../org/apache/tomcat/util/buf/UDecoder.java | 80 +- .../org/apache/tomcat/util/buf/UriUtil.java | 3 +- .../org/apache/tomcat/util/buf/package.html | 1 - .../tomcat/util/codec/binary/Base64.java | 4 +- .../tomcat/util/codec/binary/BaseNCodec.java | 16 +- .../tomcat/util/codec/binary/StringUtils.java | 18 +- .../apache/tomcat/util/compat/Jre9Compat.java | 151 +- .../apache/tomcat/util/compat/JreCompat.java | 90 +- .../tomcat/util/compat/JrePlatform.java | 59 + .../util/compat/LocalStrings.properties | 4 +- .../tomcat/util/descriptor/LocalResolver.java | 2 +- .../descriptor/tagplugin/TagPluginParser.java | 4 +- .../descriptor/tld/ImplicitTldRuleSet.java | 4 +- .../util/descriptor/tld/TldRuleSet.java | 4 +- .../descriptor/web/ApplicationParameter.java | 10 +- .../util/descriptor/web/ContextEjb.java | 8 +- .../descriptor/web/ContextEnvironment.java | 6 +- .../util/descriptor/web/ContextHandler.java | 12 +- .../util/descriptor/web/ContextLocalEjb.java | 8 +- .../util/descriptor/web/ContextResource.java | 6 +- .../descriptor/web/ContextResourceEnvRef.java | 4 +- .../descriptor/web/ContextResourceLink.java | 4 +- .../util/descriptor/web/ContextService.java | 17 +- .../descriptor/web/ContextTransaction.java | 7 +- .../tomcat/util/descriptor/web/ErrorPage.java | 20 +- .../tomcat/util/descriptor/web/FilterDef.java | 20 +- .../tomcat/util/descriptor/web/FilterMap.java | 23 +- .../descriptor/web/LocalStrings.properties | 1 + .../util/descriptor/web/LoginConfig.java | 12 +- .../descriptor/web/MessageDestination.java | 9 +- .../descriptor/web/MessageDestinationRef.java | 7 +- .../util/descriptor/web/ResourceBase.java | 12 +- .../descriptor/web/SecurityCollection.java | 44 +- .../descriptor/web/SecurityConstraint.java | 43 +- .../util/descriptor/web/SecurityRoleRef.java | 8 +- .../util/descriptor/web/ServletDef.java | 24 +- .../util/descriptor/web/WebRuleSet.java | 10 +- .../tomcat/util/descriptor/web/WebXml.java | 30 +- .../AbstractObjectCreationFactory.java | 6 +- .../tomcat/util/digester/CallMethodRule.java | 79 +- .../tomcat/util/digester/CallParamRule.java | 4 +- .../apache/tomcat/util/digester/Digester.java | 220 ++- .../util/digester/FactoryCreateRule.java | 4 +- .../util/digester/LocalStrings.properties | 4 +- .../util/digester/ObjectCreateRule.java | 8 +- .../apache/tomcat/util/digester/RuleSet.java | 21 +- .../tomcat/util/digester/RuleSetBase.java | 72 - .../apache/tomcat/util/digester/Rules.java | 28 - .../tomcat/util/digester/RulesBase.java | 91 +- .../tomcat/util/digester/SetNextRule.java | 4 +- .../util/digester/SetPropertiesRule.java | 4 +- .../apache/tomcat/util/digester/package.html | 52 +- .../tomcat/util/http/FastHttpDateFormat.java | 2 +- .../tomcat/util/http/ServerCookies.java | 2 +- .../fileupload/ByteArrayOutputStream.java | 52 +- .../fileupload/DeferredFileOutputStream.java | 34 +- .../util/http/fileupload/FileUploadBase.java | 9 - .../util/http/fileupload/FileUtils.java | 113 +- .../tomcat/util/http/fileupload/IOUtils.java | 47 +- .../util/http/fileupload/MultipartStream.java | 6 +- .../fileupload/ThresholdingOutputStream.java | 28 +- .../http/fileupload/disk/DiskFileItem.java | 29 +- .../fileupload/disk/DiskFileItemFactory.java | 28 +- .../fileupload/util/mime/MimeUtility.java | 2 +- .../tomcat/util/http/parser/Cookie.java | 1 - .../tomcat/util/http/parser/HttpParser.java | 108 +- .../util/http/parser/LocalStrings.properties | 22 +- .../tomcat/util/log/UserDataHelper.java | 4 +- .../tomcat/util/modeler/AttributeInfo.java | 16 +- .../util/modeler/BaseAttributeFilter.java | 5 +- .../tomcat/util/modeler/BaseModelMBean.java | 29 +- .../modeler/BaseNotificationBroadcaster.java | 14 +- .../tomcat/util/modeler/FeatureInfo.java | 6 +- .../tomcat/util/modeler/ManagedBean.java | 4 +- .../tomcat/util/modeler/NotificationInfo.java | 2 +- .../apache/tomcat/util/modeler/Registry.java | 19 +- .../MbeansDescriptorsDigesterSource.java | 8 +- .../tomcat/util/net/AbstractEndpoint.java | 196 ++- .../tomcat/util/net/AbstractJsseEndpoint.java | 11 +- .../apache/tomcat/util/net/AprEndpoint.java | 185 ++- .../apache/tomcat/util/net/AprSSLSupport.java | 53 +- .../tomcat/util/net/LocalStrings.properties | 22 +- .../util/net/LocalStrings_es.properties | 1 + .../apache/tomcat/util/net/Nio2Endpoint.java | 105 +- .../tomcat/util/net/NioBlockingSelector.java | 43 +- .../apache/tomcat/util/net/NioEndpoint.java | 73 +- .../apache/tomcat/util/net/SSLContext.java | 4 + .../apache/tomcat/util/net/SSLHostConfig.java | 74 +- .../util/net/SSLHostConfigCertificate.java | 19 +- .../tomcat/util/net/SSLImplementation.java | 2 +- .../apache/tomcat/util/net/SSLUtilBase.java | 3 + .../tomcat/util/net/SecureNio2Channel.java | 46 +- .../tomcat/util/net/SecureNioChannel.java | 32 +- .../tomcat/util/net/SocketWrapperBase.java | 14 +- .../util/net/TLSClientHelloExtractor.java | 90 +- .../tomcat/util/net/jsse/JSSESSLContext.java | 40 + .../apache/tomcat/util/net/jsse/JSSEUtil.java | 94 +- .../util/net/jsse/LocalStrings.properties | 1 + .../util/net/jsse/LocalStrings_es.properties | 1 + .../apache/tomcat/util/net/jsse/PEMFile.java | 7 +- .../util/net/openssl/LocalStrings.properties | 17 + .../tomcat/util/net/openssl/OpenSSLConf.java | 128 ++ .../util/net/openssl/OpenSSLConfCmd.java | 43 + .../util/net/openssl/OpenSSLContext.java | 221 ++- .../util/net/openssl/OpenSSLEngine.java | 172 ++- .../net/openssl/OpenSSLSessionContext.java | 31 +- .../net/openssl/OpenSSLX509Certificate.java | 4 +- .../util/net/openssl/ciphers/Cipher.java | 284 +++- .../util/net/openssl/ciphers/Encryption.java | 4 +- .../net/openssl/ciphers/EncryptionLevel.java | 2 +- .../util/net/openssl/ciphers/KeyExchange.java | 2 +- .../net/openssl/ciphers/MessageDigest.java | 2 +- .../OpenSSLCipherConfigurationParser.java | 90 +- .../util/scan/AbstractInputStreamJar.java | 130 +- .../tomcat/util/scan/JarFileUrlJar.java | 70 +- .../tomcat/util/scan/LocalStrings.properties | 1 + .../tomcat/util/scan/StandardJarScanner.java | 168 ++- .../apache/tomcat/util/security/Escape.java | 160 ++ .../util/security/PrivilegedSetTccl.java | 11 +- .../apache/tomcat/util/threads/TaskQueue.java | 2 +- .../util/threads/TaskThreadFactory.java | 37 +- .../threads/res/LocalStrings_es.properties | 1 + .../websocket/AuthenticationException.java | 35 + .../tomcat/websocket/Authenticator.java | 71 + .../websocket/AuthenticatorFactory.java | 68 + .../tomcat/websocket/BasicAuthenticator.java | 66 + .../apache/tomcat/websocket/Constants.java | 24 +- .../tomcat/websocket/DigestAuthenticator.java | 150 ++ .../tomcat/websocket/FutureToSendHandler.java | 17 +- .../tomcat/websocket/LocalStrings.properties | 16 +- .../tomcat/websocket/PerMessageDeflate.java | 18 +- .../org/apache/tomcat/websocket/Util.java | 6 +- .../apache/tomcat/websocket/WsFrameBase.java | 4 +- .../websocket/WsRemoteEndpointImplBase.java | 6 +- .../apache/tomcat/websocket/WsSession.java | 60 +- .../websocket/WsWebSocketContainer.java | 188 ++- .../websocket/pojo/PojoEndpointBase.java | 3 - .../pojo/PojoMessageHandlerWholeBinary.java | 9 +- .../pojo/PojoMessageHandlerWholeText.java | 6 +- .../websocket/pojo/PojoMethodMapping.java | 6 +- .../DefaultServerEndpointConfigurator.java | 6 +- .../websocket/server/LocalStrings.properties | 1 + .../tomcat/websocket/server/WsFilter.java | 2 +- .../websocket/server/WsHandshakeRequest.java | 2 +- .../server/WsRemoteEndpointImplServer.java | 30 +- .../apache/tomcat/websocket/server/WsSci.java | 4 +- .../websocket/server/WsServerContainer.java | 8 +- .../websocket/server/WsWriteTimeout.java | 5 +- core/tomcat-core.iml | 14 +- output/logs/catalina.2018-01-31.log | 114 ++ output/logs/host-manager.2018-01-31.log | 0 output/logs/localhost.2018-01-31.log | 68 + .../logs/localhost_access_log.2018-01-31.txt | 2 + output/logs/manager.2018-01-31.log | 0 pom.xml | 2 +- transport/pom.xml | 2 +- transport/tomcat-transport.iml | 14 +- 655 files changed, 15332 insertions(+), 9116 deletions(-) rename core/src/main/java/javax/servlet/http/{ServletMapping.java => HttpServletMapping.java} (93%) create mode 100644 core/src/main/java/javax/xml/ws/WebServiceRef.java create mode 100644 core/src/main/java/javax/xml/ws/WebServiceRefs.java create mode 100644 core/src/main/java/org/apache/catalina/filters/SessionInitializerFilter.java create mode 100644 core/src/main/java/org/apache/catalina/security/DeployXmlPermission.java create mode 100644 core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptorMBean.java create mode 100644 core/src/main/java/org/apache/catalina/util/TLSUtil.java create mode 100644 core/src/main/java/org/apache/catalina/valves/LoadBalancerDrainingValve.java create mode 100644 core/src/main/java/org/apache/catalina/webresources/ExtractingRoot.java create mode 100644 core/src/main/java/org/apache/catalina/webresources/TomcatJarInputStream.java create mode 100644 core/src/main/java/org/apache/coyote/CompressionConfig.java create mode 100644 core/src/main/java/org/apache/coyote/http11/HttpOutputBuffer.java create mode 100644 core/src/main/java/org/apache/coyote/http2/Http2OutputBuffer.java create mode 100644 core/src/main/java/org/apache/coyote/http2/SendfileData.java create mode 100644 core/src/main/java/org/apache/coyote/mbeans-descriptors.xml create mode 100644 core/src/main/java/org/apache/jasper/TrimSpacesOption.java delete mode 100644 core/src/main/java/org/apache/jasper/compiler/SmapGenerator.java create mode 100644 core/src/main/java/org/apache/jasper/compiler/SmapInput.java create mode 100644 core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/CallStack.java create mode 100644 core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/CallStackUtils.java create mode 100644 core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/NoOpCallStack.java create mode 100644 core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SecurityManagerCallStack.java create mode 100644 core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/ThrowableCallStack.java create mode 100644 core/src/main/java/org/apache/tomcat/jni/SSLConf.java create mode 100644 core/src/main/java/org/apache/tomcat/util/buf/AbstractChunk.java create mode 100644 core/src/main/java/org/apache/tomcat/util/compat/JrePlatform.java delete mode 100644 core/src/main/java/org/apache/tomcat/util/digester/RuleSetBase.java create mode 100644 core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLConf.java create mode 100644 core/src/main/java/org/apache/tomcat/util/net/openssl/OpenSSLConfCmd.java create mode 100644 core/src/main/java/org/apache/tomcat/util/security/Escape.java create mode 100644 core/src/main/java/org/apache/tomcat/websocket/AuthenticationException.java create mode 100644 core/src/main/java/org/apache/tomcat/websocket/Authenticator.java create mode 100644 core/src/main/java/org/apache/tomcat/websocket/AuthenticatorFactory.java create mode 100644 core/src/main/java/org/apache/tomcat/websocket/BasicAuthenticator.java create mode 100644 core/src/main/java/org/apache/tomcat/websocket/DigestAuthenticator.java create mode 100644 output/logs/catalina.2018-01-31.log create mode 100644 output/logs/host-manager.2018-01-31.log create mode 100644 output/logs/localhost.2018-01-31.log create mode 100644 output/logs/localhost_access_log.2018-01-31.txt create mode 100644 output/logs/manager.2018-01-31.log diff --git a/.gitignore b/.gitignore index d9d217d..6e0ea78 100755 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,4 @@ *.class */target/* .idea/* -*/output/logs/* -*/output/work/* -*/webapps/* + diff --git a/all/pom.xml b/all/pom.xml index 9daf039..65744d2 100644 --- a/all/pom.xml +++ b/all/pom.xml @@ -7,7 +7,7 @@ tomcat org.apache - 9.0.0.M21 + 9.0.4 tomcat-all tomcat-all diff --git a/all/tomcat-all.iml b/all/tomcat-all.iml index cf42eba..4fd5057 100644 --- a/all/tomcat-all.iml +++ b/all/tomcat-all.iml @@ -1,6 +1,6 @@ - + @@ -8,17 +8,5 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/core/pom.xml b/core/pom.xml index 14ced4b..c9318db 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -7,7 +7,7 @@ tomcat org.apache - 9.0.0.M21 + 9.0.4 tomcat-core tomcat-core diff --git a/core/src/main/java/javax/annotation/Generated.java b/core/src/main/java/javax/annotation/Generated.java index f441714..06d99bd 100644 --- a/core/src/main/java/javax/annotation/Generated.java +++ b/core/src/main/java/javax/annotation/Generated.java @@ -16,6 +16,7 @@ */ package javax.annotation; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE}) diff --git a/core/src/main/java/javax/annotation/PostConstruct.java b/core/src/main/java/javax/annotation/PostConstruct.java index 4382b25..3ecb25b 100644 --- a/core/src/main/java/javax/annotation/PostConstruct.java +++ b/core/src/main/java/javax/annotation/PostConstruct.java @@ -16,6 +16,7 @@ */ package javax.annotation; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PostConstruct { diff --git a/core/src/main/java/javax/annotation/PreDestroy.java b/core/src/main/java/javax/annotation/PreDestroy.java index a774b7b..eb1d578 100644 --- a/core/src/main/java/javax/annotation/PreDestroy.java +++ b/core/src/main/java/javax/annotation/PreDestroy.java @@ -16,6 +16,7 @@ */ package javax.annotation; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PreDestroy { diff --git a/core/src/main/java/javax/annotation/Priority.java b/core/src/main/java/javax/annotation/Priority.java index fe9d3f0..a4980da 100644 --- a/core/src/main/java/javax/annotation/Priority.java +++ b/core/src/main/java/javax/annotation/Priority.java @@ -16,6 +16,7 @@ */ package javax.annotation; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.2 */ +@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Priority { diff --git a/core/src/main/java/javax/annotation/Resources.java b/core/src/main/java/javax/annotation/Resources.java index 91bbb59..7b79dda 100644 --- a/core/src/main/java/javax/annotation/Resources.java +++ b/core/src/main/java/javax/annotation/Resources.java @@ -16,6 +16,7 @@ */ package javax.annotation; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Resources { diff --git a/core/src/main/java/javax/annotation/security/DeclareRoles.java b/core/src/main/java/javax/annotation/security/DeclareRoles.java index fb21081..d50e30d 100644 --- a/core/src/main/java/javax/annotation/security/DeclareRoles.java +++ b/core/src/main/java/javax/annotation/security/DeclareRoles.java @@ -16,6 +16,7 @@ */ package javax.annotation.security; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface DeclareRoles { diff --git a/core/src/main/java/javax/annotation/security/DenyAll.java b/core/src/main/java/javax/annotation/security/DenyAll.java index 7757236..069aca2 100644 --- a/core/src/main/java/javax/annotation/security/DenyAll.java +++ b/core/src/main/java/javax/annotation/security/DenyAll.java @@ -16,6 +16,7 @@ */ package javax.annotation.security; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface DenyAll { diff --git a/core/src/main/java/javax/annotation/security/PermitAll.java b/core/src/main/java/javax/annotation/security/PermitAll.java index 54335f3..db1d7b6 100644 --- a/core/src/main/java/javax/annotation/security/PermitAll.java +++ b/core/src/main/java/javax/annotation/security/PermitAll.java @@ -16,6 +16,7 @@ */ package javax.annotation.security; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface PermitAll { diff --git a/core/src/main/java/javax/annotation/security/RolesAllowed.java b/core/src/main/java/javax/annotation/security/RolesAllowed.java index 8739dfe..f916b6d 100644 --- a/core/src/main/java/javax/annotation/security/RolesAllowed.java +++ b/core/src/main/java/javax/annotation/security/RolesAllowed.java @@ -16,6 +16,7 @@ */ package javax.annotation.security; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface RolesAllowed { diff --git a/core/src/main/java/javax/annotation/security/RunAs.java b/core/src/main/java/javax/annotation/security/RunAs.java index 5479ba1..8a366e2 100644 --- a/core/src/main/java/javax/annotation/security/RunAs.java +++ b/core/src/main/java/javax/annotation/security/RunAs.java @@ -16,6 +16,7 @@ */ package javax.annotation.security; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,6 +25,7 @@ /** * @since Common Annotations 1.0 */ +@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface RunAs { diff --git a/core/src/main/java/javax/ejb/EJB.java b/core/src/main/java/javax/ejb/EJB.java index f9e98df..2b16782 100644 --- a/core/src/main/java/javax/ejb/EJB.java +++ b/core/src/main/java/javax/ejb/EJB.java @@ -33,4 +33,5 @@ Class beanInterface() default java.lang.Object.class; String beanName() default ""; String mappedName() default ""; + String lookup() default ""; } diff --git a/core/src/main/java/javax/el/ArrayELResolver.java b/core/src/main/java/javax/el/ArrayELResolver.java index 5bbb2a1..d500e85 100644 --- a/core/src/main/java/javax/el/ArrayELResolver.java +++ b/core/src/main/java/javax/el/ArrayELResolver.java @@ -138,7 +138,7 @@ private static final int coerce(Object property) { return ((Character) property).charValue(); } if (property instanceof Boolean) { - return (((Boolean) property).booleanValue() ? 1 : 0); + return ((Boolean) property).booleanValue() ? 1 : 0; } if (property instanceof String) { return Integer.parseInt((String) property); diff --git a/core/src/main/java/javax/el/ExpressionFactory.java b/core/src/main/java/javax/el/ExpressionFactory.java index fc29654..71cd789 100644 --- a/core/src/main/java/javax/el/ExpressionFactory.java +++ b/core/src/main/java/javax/el/ExpressionFactory.java @@ -175,17 +175,16 @@ public static ExpressionFactory newInstance(Properties properties) { (ExpressionFactory) constructor.newInstance(properties); } - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | - NoSuchMethodException e) { - throw new ELException( - "Unable to create ExpressionFactory of type: " + clazz.getName(), - e); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); Util.handleThrowable(cause); throw new ELException( "Unable to create ExpressionFactory of type: " + clazz.getName(), e); + } catch (ReflectiveOperationException | IllegalArgumentException e) { + throw new ELException( + "Unable to create ExpressionFactory of type: " + clazz.getName(), + e); } return result; diff --git a/core/src/main/java/javax/el/ListELResolver.java b/core/src/main/java/javax/el/ListELResolver.java index 749fdae..cd88620 100644 --- a/core/src/main/java/javax/el/ListELResolver.java +++ b/core/src/main/java/javax/el/ListELResolver.java @@ -144,7 +144,7 @@ private static final int coerce(Object property) { return ((Character) property).charValue(); } if (property instanceof Boolean) { - return (((Boolean) property).booleanValue() ? 1 : 0); + return ((Boolean) property).booleanValue() ? 1 : 0; } if (property instanceof String) { return Integer.parseInt((String) property); diff --git a/core/src/main/java/javax/el/LocalStrings_es.properties b/core/src/main/java/javax/el/LocalStrings_es.properties index 0b091e8..bb2692f 100644 --- a/core/src/main/java/javax/el/LocalStrings_es.properties +++ b/core/src/main/java/javax/el/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + propertyNotFound = Propiedad [{1}] no hallada en el tipo [{0}] propertyNotReadable = Propiedad [{1}] no legible para el tipo [{0}] propertyNotWritable = Propiedad [{1}] no grabable para el tipo [{0}] diff --git a/core/src/main/java/javax/el/StaticFieldELResolver.java b/core/src/main/java/javax/el/StaticFieldELResolver.java index 19911dc..f037f95 100644 --- a/core/src/main/java/javax/el/StaticFieldELResolver.java +++ b/core/src/main/java/javax/el/StaticFieldELResolver.java @@ -101,13 +101,12 @@ public Object invoke(ELContext context, Object base, Object method, try { result = match.newInstance(parameters); - } catch (IllegalArgumentException | IllegalAccessException | - InstantiationException e) { - throw new ELException(e); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); Util.handleThrowable(cause); throw new ELException(cause); + } catch (ReflectiveOperationException e) { + throw new ELException(e); } return result; diff --git a/core/src/main/java/javax/el/Util.java b/core/src/main/java/javax/el/Util.java index 5d6b4f5..0c444fc 100644 --- a/core/src/main/java/javax/el/Util.java +++ b/core/src/main/java/javax/el/Util.java @@ -37,6 +37,9 @@ class Util { + private static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; + private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0]; + /** * Checks whether the supplied Throwable is one that needs to be * rethrown and swallows all others. @@ -208,12 +211,8 @@ static Method findMethod(Class clazz, String methodName, List wrappers = Wrapper.wrap(methods, methodName); - Wrapper result = findWrapper( - clazz, wrappers, methodName, paramTypes, paramValues); + Wrapper result = findWrapper(clazz, wrappers, methodName, paramTypes, paramValues); - if (result == null) { - return null; - } return getMethod(clazz, (Method) result.unWrap()); } @@ -227,12 +226,7 @@ private static Wrapper findWrapper(Class clazz, List wrappers, Map candidates = new HashMap<>(); - int paramCount; - if (paramTypes == null) { - paramCount = 0; - } else { - paramCount = paramTypes.length; - } + int paramCount = paramTypes.length; for (Wrapper w : wrappers) { Class[] mParamTypes = w.getParameterTypes(); @@ -244,11 +238,29 @@ private static Wrapper findWrapper(Class clazz, List wrappers, } // Check the number of parameters - if (!(paramCount == mParamCount || - (w.isVarArgs() && paramCount >= mParamCount))) { + // Multiple tests to improve readability + if (!w.isVarArgs() && paramCount != mParamCount) { + // Method has wrong number of parameters + continue; + } + if (w.isVarArgs() && paramCount < mParamCount -1) { // Method has wrong number of parameters continue; } + if (w.isVarArgs() && paramCount == mParamCount && paramValues != null && + paramValues.length > paramCount && !paramTypes[mParamCount -1].isArray()) { + // Method arguments don't match + continue; + } + if (w.isVarArgs() && paramCount > mParamCount && paramValues != null && + paramValues.length != paramCount) { + // Might match a different varargs method + continue; + } + if (!w.isVarArgs() && paramValues != null && paramCount != paramValues.length) { + // Might match a different varargs method + continue; + } // Check the parameters match int exactMatch = 0; @@ -257,9 +269,12 @@ private static Wrapper findWrapper(Class clazz, List wrappers, boolean noMatch = false; for (int i = 0; i < mParamCount; i++) { // Can't be null - if (mParamTypes[i].equals(paramTypes[i])) { - exactMatch++; - } else if (i == (mParamCount - 1) && w.isVarArgs()) { + if (w.isVarArgs() && i == (mParamCount - 1)) { + if (i == paramCount || (paramValues != null && paramValues.length == i)) { + // Nothing is passed as varargs + assignableMatch++; + break; + } Class varType = mParamTypes[i].getComponentType(); for (int j = i; j < paramCount; j++) { if (isAssignableFrom(paramTypes[j], varType)) { @@ -281,18 +296,22 @@ private static Wrapper findWrapper(Class clazz, List wrappers, // lead to a varArgs method matching when the result // should be ambiguous } - } else if (isAssignableFrom(paramTypes[i], mParamTypes[i])) { - assignableMatch++; } else { - if (paramValues == null) { - noMatch = true; - break; + if (mParamTypes[i].equals(paramTypes[i])) { + exactMatch++; + } else if (paramTypes[i] != null && isAssignableFrom(paramTypes[i], mParamTypes[i])) { + assignableMatch++; } else { - if (isCoercibleFrom(paramValues[i], mParamTypes[i])) { - coercibleMatch++; - } else { + if (paramValues == null) { noMatch = true; break; + } else { + if (isCoercibleFrom(paramValues[i], mParamTypes[i])) { + coercibleMatch++; + } else { + noMatch = true; + break; + } } } } @@ -498,7 +517,7 @@ private static boolean isCoercibleFrom(Object src, Class target) { private static Class[] getTypesFromValues(Object[] values) { if (values == null) { - return null; + return EMPTY_CLASS_ARRAY; } Class result[] = new Class[values.length]; @@ -557,7 +576,7 @@ static Constructor findConstructor(Class clazz, Class[] paramTypes, if (clazz == null) { throw new MethodNotFoundException( - message(null, "util.method.notfound", clazz, methodName, + message(null, "util.method.notfound", null, methodName, paramString(paramTypes))); } @@ -569,12 +588,8 @@ static Constructor findConstructor(Class clazz, Class[] paramTypes, List wrappers = Wrapper.wrap(constructors); - Wrapper result = findWrapper( - clazz, wrappers, methodName, paramTypes, paramValues); + Wrapper result = findWrapper(clazz, wrappers, methodName, paramTypes, paramValues); - if (result == null) { - return null; - } return getConstructor(clazz, (Constructor) result.unWrap()); } @@ -606,7 +621,11 @@ static Object[] buildParameters(Class[] parameterTypes, Object[] parameters = null; if (parameterTypes.length > 0) { parameters = new Object[parameterTypes.length]; - int paramCount = params.length; + int paramCount; + if (params == null) { + params = EMPTY_OBJECT_ARRAY; + } + paramCount = params.length; if (isVarArgs) { int varArgIndex = parameterTypes.length - 1; // First argCount-1 parameters are standard @@ -772,5 +791,29 @@ public int compareTo(MatchResult o) { } return cmp; } + + @Override + public boolean equals(Object o) + { + return o == this + || (null != o + && this.getClass().equals(o.getClass()) + && ((MatchResult)o).getExact() == this.getExact() + && ((MatchResult)o).getAssignable() == this.getAssignable() + && ((MatchResult)o).getCoercible() == this.getCoercible() + && ((MatchResult)o).isBridge() == this.isBridge() + ) + ; + } + + @Override + public int hashCode() + { + return (this.isBridge() ? 1 << 24 : 0) + ^ this.getExact() << 16 + ^ this.getAssignable() << 8 + ^ this.getCoercible() + ; + } } } diff --git a/core/src/main/java/javax/security/auth/message/config/AuthConfigFactory.java b/core/src/main/java/javax/security/auth/message/config/AuthConfigFactory.java index 1cd117d..d98b2f2 100644 --- a/core/src/main/java/javax/security/auth/message/config/AuthConfigFactory.java +++ b/core/src/main/java/javax/security/auth/message/config/AuthConfigFactory.java @@ -16,7 +16,6 @@ */ package javax.security.auth.message.config; -import java.lang.reflect.InvocationTargetException; import java.security.AccessController; import java.security.Permission; import java.security.PrivilegedAction; @@ -49,41 +48,44 @@ public abstract class AuthConfigFactory { private static final String DEFAULT_JASPI_AUTHCONFIGFACTORYIMPL = "org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl"; - private static AuthConfigFactory factory; + private static volatile AuthConfigFactory factory; public AuthConfigFactory() { } - public static synchronized AuthConfigFactory getFactory() { + public static AuthConfigFactory getFactory() { checkPermission(getFactorySecurityPermission); if (factory != null) { return factory; } - final String className = getFactoryClassName(); - try { - factory = AccessController.doPrivileged( - new PrivilegedExceptionAction() { - @Override - public AuthConfigFactory run() throws ClassNotFoundException, - InstantiationException, IllegalAccessException, IllegalArgumentException, - InvocationTargetException, NoSuchMethodException, SecurityException { - // Load this class with the same class loader as used for - // this class. Note that the Thread context class loader - // should not be used since that would trigger a memory leak - // in container environments. - Class clazz = Class.forName(className); - return (AuthConfigFactory) clazz.getConstructor().newInstance(); + synchronized (AuthConfigFactory.class) { + if (factory == null) { + final String className = getFactoryClassName(); + try { + factory = AccessController.doPrivileged( + new PrivilegedExceptionAction() { + @Override + public AuthConfigFactory run() throws ReflectiveOperationException, + IllegalArgumentException, SecurityException { + // Load this class with the same class loader as used for + // this class. Note that the Thread context class loader + // should not be used since that would trigger a memory leak + // in container environments. + Class clazz = Class.forName(className); + return (AuthConfigFactory) clazz.getConstructor().newInstance(); + } + }); + } catch (PrivilegedActionException e) { + Exception inner = e.getException(); + if (inner instanceof InstantiationException) { + throw (SecurityException) new SecurityException("AuthConfigFactory error:" + + inner.getCause().getMessage()).initCause(inner.getCause()); + } else { + throw (SecurityException) new SecurityException( + "AuthConfigFactory error: " + inner).initCause(inner); + } } - }); - } catch (PrivilegedActionException e) { - Exception inner = e.getException(); - if (inner instanceof InstantiationException) { - throw (SecurityException) new SecurityException("AuthConfigFactory error:" + - inner.getCause().getMessage()).initCause(inner.getCause()); - } else { - throw (SecurityException) new SecurityException( - "AuthConfigFactory error: " + inner).initCause(inner); } } diff --git a/core/src/main/java/javax/servlet/LocalStrings_es.properties b/core/src/main/java/javax/servlet/LocalStrings_es.properties index 239fdfa..edbd318 100644 --- a/core/src/main/java/javax/servlet/LocalStrings_es.properties +++ b/core/src/main/java/javax/servlet/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + err.not_iso8859_1 = No es un car\u00E1cter ISO 8859-1: [{0}] value.true = true value.false = false diff --git a/core/src/main/java/javax/servlet/http/HttpServlet.java b/core/src/main/java/javax/servlet/http/HttpServlet.java index 9f3fe92..f7ea58a 100644 --- a/core/src/main/java/javax/servlet/http/HttpServlet.java +++ b/core/src/main/java/javax/servlet/http/HttpServlet.java @@ -593,7 +593,6 @@ protected void doTrace(HttpServletRequest req, HttpServletResponse resp) ServletOutputStream out = resp.getOutputStream(); out.print(buffer.toString()); out.close(); - return; } diff --git a/core/src/main/java/javax/servlet/http/ServletMapping.java b/core/src/main/java/javax/servlet/http/HttpServletMapping.java similarity index 93% rename from core/src/main/java/javax/servlet/http/ServletMapping.java rename to core/src/main/java/javax/servlet/http/HttpServletMapping.java index 36e4e6b..3d8bd92 100644 --- a/core/src/main/java/javax/servlet/http/ServletMapping.java +++ b/core/src/main/java/javax/servlet/http/HttpServletMapping.java @@ -24,7 +24,7 @@ * * @since 4.0 */ -public interface ServletMapping { +public interface HttpServletMapping { /** * @return The value that was matched or the empty String if not known. @@ -47,7 +47,7 @@ public interface ServletMapping { String getServletName(); /** - * @return The type of match ({@link MappingMatch#UNKNOWN} if not known) + * @return The type of match ({@code null} if not known) */ MappingMatch getMappingMatch(); } diff --git a/core/src/main/java/javax/servlet/http/HttpServletRequest.java b/core/src/main/java/javax/servlet/http/HttpServletRequest.java index 7ac03c0..3c12fa4 100644 --- a/core/src/main/java/javax/servlet/http/HttpServletRequest.java +++ b/core/src/main/java/javax/servlet/http/HttpServletRequest.java @@ -172,8 +172,8 @@ public interface HttpServletRequest extends ServletRequest { */ public int getIntHeader(String name); - public default ServletMapping getServletMapping() { - return new ServletMapping() { + public default HttpServletMapping getHttpServletMapping() { + return new HttpServletMapping() { @Override public String getMatchValue() { @@ -192,7 +192,7 @@ public String getServletName() { @Override public MappingMatch getMappingMatch() { - return MappingMatch.UNKNOWN; + return null; } }; } @@ -590,4 +590,23 @@ public T upgrade( public default Map getTrailerFields() { return Collections.emptyMap(); } + + /** + * Are trailer fields ready to be read (there may still be no trailers to + * read). This method always returns {@code true} if the underlying protocol + * does not support trailer fields. Otherwise, {@code true} is returned once + * all of the following are true: + *
      + *
    • The application has ready all the request data and an EOF has been + * received or the content-length is zero
    • + *
    • All trailer fields, if any, have been received
    • + *
    + * + * @return {@code true} if trailers are ready to be read + * + * @since Servlet 4.0 + */ + public default boolean isTrailerFieldsReady() { + return false; + } } diff --git a/core/src/main/java/javax/servlet/http/HttpServletRequestWrapper.java b/core/src/main/java/javax/servlet/http/HttpServletRequestWrapper.java index ecd84da..4102468 100644 --- a/core/src/main/java/javax/servlet/http/HttpServletRequestWrapper.java +++ b/core/src/main/java/javax/servlet/http/HttpServletRequestWrapper.java @@ -120,8 +120,8 @@ public int getIntHeader(String name) { * wrapped request object. */ @Override - public ServletMapping getServletMapping() { - return this._getHttpServletRequest().getServletMapping(); + public HttpServletMapping getHttpServletMapping() { + return this._getHttpServletRequest().getHttpServletMapping(); } /** @@ -389,7 +389,8 @@ public T upgrade( * {@inheritDoc} *

    * The default behavior of this method is to return - * {@link HttpServletRequest#newPushBuilder()} on the wrapped request object. + * {@link HttpServletRequest#newPushBuilder()} on the wrapped request + * object. * * @since Servlet 4.0 */ @@ -402,7 +403,8 @@ public PushBuilder newPushBuilder() { * {@inheritDoc} *

    * The default behavior of this method is to return - * {@link HttpServletRequest#getTrailerFields()} on the wrapped request object. + * {@link HttpServletRequest#getTrailerFields()} on the wrapped request + * object. * * @since Servlet 4.0 */ @@ -410,4 +412,19 @@ public PushBuilder newPushBuilder() { public Map getTrailerFields() { return this._getHttpServletRequest().getTrailerFields(); } + + + /** + * {@inheritDoc} + *

    + * The default behavior of this method is to return + * {@link HttpServletRequest#isTrailerFieldsReady()} on the wrapped request + * object. + * + * @since Servlet 4.0 + */ + @Override + public boolean isTrailerFieldsReady() { + return this._getHttpServletRequest().isTrailerFieldsReady(); + } } diff --git a/core/src/main/java/javax/servlet/http/HttpServletResponse.java b/core/src/main/java/javax/servlet/http/HttpServletResponse.java index 9d406d9..a108654 100644 --- a/core/src/main/java/javax/servlet/http/HttpServletResponse.java +++ b/core/src/main/java/javax/servlet/http/HttpServletResponse.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.util.Collection; +import java.util.Map; +import java.util.function.Supplier; import javax.servlet.ServletResponse; @@ -340,6 +342,40 @@ public interface HttpServletResponse extends ServletResponse { */ public Collection getHeaderNames(); + /** + * Configure the supplier of the trailer headers. The supplier will be + * called in the scope of the thread that completes the response. + *
    + * Trailers that don't meet the requirements of RFC 7230, section 4.1.2 will + * be ignored. + *
    + * The default implementation is a NO-OP. + * + * @param supplier The supplier for the trailer headers + * + * @throws IllegalStateException if this method is called when the + * underlying protocol does not support trailer headers or if using + * HTTP/1.1 and the response has already been committed + * + * @since Servlet 4.0 + */ + public default void setTrailerFields(Supplier> supplier) { + // NO-OP + } + + /** + * Obtain the supplier of the trailer headers. + *
    + * The default implementation returns null. + * + * @return The supplier for the trailer headers + * + * @since Servlet 4.0 + */ + public default Supplier> getTrailerFields() { + return null; + } + /* * Server status codes; see RFC 2068. */ diff --git a/core/src/main/java/javax/servlet/http/HttpServletResponseWrapper.java b/core/src/main/java/javax/servlet/http/HttpServletResponseWrapper.java index 90faa63..7d312d9 100644 --- a/core/src/main/java/javax/servlet/http/HttpServletResponseWrapper.java +++ b/core/src/main/java/javax/servlet/http/HttpServletResponseWrapper.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.util.Collection; +import java.util.Map; +import java.util.function.Supplier; import javax.servlet.ServletResponseWrapper; @@ -216,7 +218,7 @@ public void setStatus(int sc, String sm) { *

    * The default implementation is to call * {@link HttpServletResponse#getStatus()} - * on the wrapper {@link HttpServletResponse}. + * on the wrapped {@link HttpServletResponse}. * * @since Servlet 3.0 */ @@ -230,7 +232,7 @@ public int getStatus() { *

    * The default implementation is to call * {@link HttpServletResponse#getHeader(String)} - * on the wrapper {@link HttpServletResponse}. + * on the wrapped {@link HttpServletResponse}. * * @since Servlet 3.0 */ @@ -244,7 +246,7 @@ public String getHeader(String name) { *

    * The default implementation is to call * {@link HttpServletResponse#getHeaders(String)} - * on the wrapper {@link HttpServletResponse}. + * on the wrapped {@link HttpServletResponse}. * * @since Servlet 3.0 */ @@ -258,7 +260,7 @@ public Collection getHeaders(String name) { *

    * The default implementation is to call * {@link HttpServletResponse#getHeaderNames()} - * on the wrapper {@link HttpServletResponse}. + * on the wrapped {@link HttpServletResponse}. * * @since Servlet 3.0 */ @@ -266,4 +268,32 @@ public Collection getHeaders(String name) { public Collection getHeaderNames() { return this._getHttpServletResponse().getHeaderNames(); } + + /** + * {@inheritDoc} + *

    + * The default implementation is to call + * {@link HttpServletResponse#setTrailerFields(Supplier)} + * on the wrapped {@link HttpServletResponse}. + * + * @since Servlet 4.0 + */ + @Override + public void setTrailerFields(Supplier> supplier) { + this._getHttpServletResponse().setTrailerFields(supplier); + } + + /** + * {@inheritDoc} + *

    + * The default implementation is to call + * {@link HttpServletResponse#getTrailerFields()} + * on the wrapped {@link HttpServletResponse}. + * + * @since Servlet 4.0 + */ + @Override + public Supplier> getTrailerFields() { + return this._getHttpServletResponse().getTrailerFields(); + } } diff --git a/core/src/main/java/javax/servlet/http/HttpUtils.java b/core/src/main/java/javax/servlet/http/HttpUtils.java index 676c8ea..4356af1 100644 --- a/core/src/main/java/javax/servlet/http/HttpUtils.java +++ b/core/src/main/java/javax/servlet/http/HttpUtils.java @@ -18,6 +18,7 @@ package javax.servlet.http; import java.io.IOException; +import java.util.Arrays; import java.util.Hashtable; import java.util.ResourceBundle; import java.util.StringTokenizer; @@ -101,9 +102,7 @@ public static Hashtable parseQueryString(String s) { String val = parseName(pair.substring(pos+1, pair.length()), sb); if (ht.containsKey(key)) { String oldVals[] = ht.get(key); - valArray = new String[oldVals.length + 1]; - for (int i = 0; i < oldVals.length; i++) - valArray[i] = oldVals[i]; + valArray = Arrays.copyOf(oldVals, oldVals.length + 1); valArray[oldVals.length] = val; } else { valArray = new String[1]; diff --git a/core/src/main/java/javax/servlet/http/LocalStrings_es.properties b/core/src/main/java/javax/servlet/http/LocalStrings_es.properties index c61fc9f..cbdb4e6 100644 --- a/core/src/main/java/javax/servlet/http/LocalStrings_es.properties +++ b/core/src/main/java/javax/servlet/http/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + err.cookie_name_is_token = El nombre de Cookie [{0}] es una palabra reservada err.cookie_name_blank = El nombre del Cookie no puede ser nulo o de longitud cero err.io.negativelength = Longitud Negativa en el metodo write diff --git a/core/src/main/java/javax/servlet/http/MappingMatch.java b/core/src/main/java/javax/servlet/http/MappingMatch.java index 6e126c0..97d2d66 100644 --- a/core/src/main/java/javax/servlet/http/MappingMatch.java +++ b/core/src/main/java/javax/servlet/http/MappingMatch.java @@ -27,6 +27,5 @@ public enum MappingMatch { DEFAULT, EXACT, EXTENSION, - PATH, - UNKNOWN + PATH } diff --git a/core/src/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java b/core/src/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java index cd4d591..79eb9c2 100644 --- a/core/src/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java +++ b/core/src/main/java/javax/servlet/jsp/tagext/TagLibraryInfo.java @@ -230,13 +230,13 @@ public FunctionInfo getFunction(String name) { /** * The prefix assigned to this taglib from the taglib directive. */ - protected final String prefix; + protected String prefix; /** * The value of the uri attribute from the taglib directive for this * library. */ - protected final String uri; + protected String uri; /** * An array describing the tags that are defined in this tag library. diff --git a/core/src/main/java/javax/servlet/resources/javaee_8.xsd b/core/src/main/java/javax/servlet/resources/javaee_8.xsd index 47cc6a0..8346758 100644 --- a/core/src/main/java/javax/servlet/resources/javaee_8.xsd +++ b/core/src/main/java/javax/servlet/resources/javaee_8.xsd @@ -1,76 +1,85 @@ - - - + - + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright (c) 2009-2017 Oracle and/or its affiliates. All rights reserved. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 2 only ("GPL") or the Common Development + and Distribution License("CDDL") (collectively, the "License"). You + may not use this file except in compliance with the License. You can + obtain a copy of the License at + https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + or packager/legal/LICENSE.txt. See the License for the specific + language governing permissions and limitations under the License. + + When distributing the software, include this License Header Notice in each + file and include the License file at packager/legal/LICENSE.txt. + + GPL Classpath Exception: + Oracle designates this particular file as subject to the "Classpath" + exception as provided by Oracle in the GPL Version 2 section of the License + file that accompanied this code. + + Modifications: + If applicable, add the following below the License Header, with the fields + enclosed by brackets [] replaced by your own identifying information: + "Portions Copyright [year] [name of copyright owner]" + + Contributor(s): + If you wish your version of this file to be governed by only the CDDL or + only the GPL Version 2, indicate your decision by adding "[Contributor] + elects to include this software in this distribution under the [CDDL or GPL + Version 2] license." If you don't indicate a single choice of license, a + recipient has the option to distribute your version of this file under + either the CDDL, the GPL Version 2 or to extend the choice of license to + its licensees as provided above. However, if you add GPL Version 2 code + and therefore, elected the GPL Version 2 license, then the option applies + only if the new code is made subject to such option by the copyright + holder. + + The Apache Software Foundation elects to include this software under the + CDDL license. + - + + The following definitions that appear in the common + shareable schema(s) of Java EE deployment descriptors should be + interpreted with respect to the context they are included: + + Deployment Component may indicate one of the following: + java ee application; + application client; + web application; + enterprise bean; + resource adapter; + + Deployment File may indicate one of the following: + ear file; + war file; + jar file; + rar file; + - - - @@ -99,8 +108,6 @@ - - @@ -113,58 +120,72 @@ + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> + minOccurs="0" + maxOccurs="unbounded"/> - - @@ -175,26 +196,21 @@ - - - The JNDI name to be looked up to resolve a resource reference. + The JNDI name to be looked up to resolve a resource reference. - - - @@ -211,37 +227,34 @@ minOccurs="0"> - - - + @@ -281,7 +294,7 @@ - The administered object's interface type. + The administered object's interface type. @@ -291,7 +304,7 @@ - The administered object's class name. + The administered object's class name. @@ -324,6 +337,7 @@ type="xsd:ID"/> + @@ -365,7 +379,6 @@ The fully qualified class name of the connection factory interface. - @@ -433,7 +446,8 @@ type="xsd:ID"/> - + + @@ -466,7 +480,6 @@ - @@ -518,7 +531,6 @@ url property is specified along with other standard DataSource properties such as serverName, databaseName @@ -660,12 +672,13 @@ - - + - + + @@ -693,8 +706,6 @@ - - @@ -704,33 +715,32 @@ - - + + - Employee Self Service - + ... + + Employee Self Service + - The value of the xml:lang attribute is "en" (English) by default. + The value of the xml:lang attribute is "en" (English) by default. - ]]> + ]]> @@ -740,37 +750,37 @@ - + + EmployeeRecord - EmployeeRecord + ../products/product.jar#ProductEJB - ../products/product.jar#ProductEJB - - ]]> + ]]> @@ -778,7 +788,8 @@ - + + @@ -789,24 +800,23 @@ home or to the local business interface of a 3.0 bean. The declaration consists of: - - an optional description - - the EJB reference name used in the code of the Deployment - Component that's referencing the enterprise bean. - - the optional expected type of the referenced enterprise bean - - the optional expected local interface of the referenced - enterprise bean or the local business interface of the - referenced enterprise bean. - - the optional expected local home interface of the referenced - enterprise bean. Not applicable if this ejb-local-ref refers - to the local business interface of a 3.0 bean. - - optional ejb-link information, used to specify the - referenced enterprise bean - - optional elements to define injection of the named enterprise - bean into a component field or property. + - an optional description + - the EJB reference name used in the code of the Deployment + Component that's referencing the enterprise bean. + - the optional expected type of the referenced enterprise bean + - the optional expected local interface of the referenced + enterprise bean or the local business interface of the + referenced enterprise bean. + - the optional expected local home interface of the referenced + enterprise bean. Not applicable if this ejb-local-ref refers + to the local business interface of a 3.0 bean. + - optional ejb-link information, used to specify the + referenced enterprise bean + - optional elements to define injection of the named enterprise + bean into a component field or property. - - + - + + ejb/Payroll + ejb/Payroll - ]]> + ]]> @@ -858,7 +869,8 @@ - + + @@ -869,26 +881,24 @@ to the remote business interface of a 3.0 bean. The declaration consists of: - - an optional description - - the EJB reference name used in the code of - the Deployment Component that's referencing the enterprise - bean. - - the optional expected type of the referenced enterprise bean - - the optional remote interface of the referenced enterprise bean - or the remote business interface of the referenced enterprise - bean - - the optional expected home interface of the referenced - enterprise bean. Not applicable if this ejb-ref - refers to the remote business interface of a 3.0 bean. - - optional ejb-link information, used to specify the - referenced enterprise bean - - optional elements to define injection of the named enterprise - bean into a component field or property - + - an optional description + - the EJB reference name used in the code of + the Deployment Component that's referencing the enterprise + bean. + - the optional expected type of the referenced enterprise bean + - the optional remote interface of the referenced enterprise bean + or the remote business interface of the referenced enterprise + bean + - the optional expected home interface of the referenced + enterprise bean. Not applicable if this ejb-ref + refers to the remote business interface of a 3.0 bean. + - optional ejb-link information, used to specify the + referenced enterprise bean + - optional elements to define injection of the named enterprise + bean into a component field or property - - + - + + @@ -925,8 +937,8 @@ The ejb-ref-type designates a value that must be one of the following: - Entity - Session + Entity + Session @@ -938,7 +950,8 @@ - + + @@ -949,10 +962,12 @@ - + - + + @@ -980,7 +995,6 @@ - minAmount - minAmount - - ]]> + ]]> - java.lang.Integer + java.lang.Integer - ]]> + ]]> - 100.00 + 100.00 - ]]> + ]]> - - - + - + + java.lang.Boolean + java.lang.Class + com.example.Color - java.lang.Boolean - java.lang.Class - com.example.Color - - ]]> + ]]> @@ -1100,7 +1108,8 @@ - + + @@ -1120,7 +1129,8 @@ - + + @@ -1142,7 +1152,8 @@ - + + @@ -1159,62 +1170,60 @@ - - employee-service-icon16x16.jpg + employee-service-icon16x16.jpg - ]]> + ]]> - employee-service-icon32x32.jpg - employee-service-icon32x32.jpg - - ]]> + ]]> - - - - + - + + @@ -1248,18 +1257,16 @@ - - - The following transaction isolation levels are allowed - (see documentation for the java.sql.Connection interface): - TRANSACTION_READ_UNCOMMITTED - TRANSACTION_READ_COMMITTED - TRANSACTION_REPEATABLE_READ - TRANSACTION_SERIALIZABLE + The following transaction isolation levels are allowed + (see documentation for the java.sql.Connection interface): + TRANSACTION_READ_UNCOMMITTED + TRANSACTION_READ_COMMITTED + TRANSACTION_REPEATABLE_READ + TRANSACTION_SERIALIZABLE @@ -1271,7 +1278,8 @@ - + + @@ -1290,7 +1298,8 @@ - + + @@ -1309,33 +1318,34 @@ - + + - : + jdbc:: Example: - jdbc:mysql://localhost:3307/testdb + jdbc:mysql://localhost:3307/testdb - ]]> + ]]> - + + @@ -1375,11 +1385,11 @@ - Fully-qualified name of the JMS connection factory - interface. Permitted values are javax.jms.ConnectionFactory, - javax.jms.QueueConnectionFactory, or - javax.jms.TopicConnectionFactory. If not specified, - javax.jms.ConnectionFactory will be used. + Fully-qualified name of the JMS connection factory + interface. Permitted values are javax.jms.ConnectionFactory, + javax.jms.QueueConnectionFactory, or + javax.jms.TopicConnectionFactory. If not specified, + javax.jms.ConnectionFactory will be used. @@ -1390,9 +1400,9 @@ - Fully-qualified name of the JMS connection factory - implementation class. Ignored if a resource adapter - is used. + Fully-qualified name of the JMS connection factory + implementation class. Ignored if a resource adapter + is used. @@ -1536,8 +1546,8 @@ - Fully-qualified name of the JMS destination interface. - Permitted values are javax.jms.Queue and javax.jms.Topic + Fully-qualified name of the JMS destination interface. + Permitted values are javax.jms.Queue and javax.jms.Topic @@ -1548,10 +1558,10 @@ - Fully-qualified name of the JMS destination implementation - class. Ignored if a resource adapter is used unless the - resource adapter defines more than one destination implementation - class for the specified interface. + Fully-qualified name of the JMS destination implementation + class. Ignored if a resource adapter is used unless the + resource adapter defines more than one destination implementation + class for the specified interface. @@ -1599,8 +1609,7 @@ - - + @@ -1618,21 +1627,21 @@ - + + com.aardvark.payroll.PayrollHome + com.aardvark.payroll.PayrollHome - ]]> + ]]> @@ -1641,7 +1650,7 @@ - + @@ -1653,7 +1662,7 @@ method for any given event and that the method may not be overloaded. - If the lifecycle-callback-class element is missing then + If the lifefycle-callback-class element is missing then the class defining the callback is assumed to be the component class in scope at the place in the descriptor in which the callback definition appears. @@ -1669,7 +1678,8 @@ - + + @@ -1680,7 +1690,6 @@ - - + - + + @@ -1716,7 +1727,8 @@ - + + @@ -1732,6 +1744,7 @@ + @@ -1782,7 +1795,7 @@ - Service provider store protocol implementation class + Service provider store protocol implementation class @@ -1804,7 +1817,7 @@ - Service provider transport protocol implementation class + Service provider transport protocol implementation class @@ -1872,7 +1885,7 @@ - + @@ -1883,7 +1896,6 @@ - - @@ -1913,10 +1924,12 @@ - + - + + @@ -1941,48 +1954,48 @@ - + + - myPersistenceContext - - - - - myPersistenceContext - - PersistenceUnit1 - - Extended - - - ]]> + The persistence-context-ref element contains a declaration + of Deployment Component's reference to a persistence context + associated within a Deployment Component's + environment. It consists of: + + - an optional description + - the persistence context reference name + - an optional persistence unit name. If not specified, + the default persistence unit is assumed. + - an optional specification as to whether + the persistence context type is Transaction or + Extended. If not specified, Transaction is assumed. + - an optional specification as to whether + the persistence context synchronization with the current + transaction is Synchronized or Unsynchronized. If not + specified, Synchronized is assumed. + - an optional list of persistence properties + - optional injection targets + + Examples: + + + myPersistenceContext + + + + + myPersistenceContext + + PersistenceUnit1 + + Extended + + + ]]> @@ -2026,15 +2039,12 @@ - - - - - - - + - + + @@ -2073,8 +2082,8 @@ The value of the persistence-context-synchronization element must be one of the following: - Synchronized - Unsynchronized + Synchronized + Unsynchronized @@ -2085,7 +2094,9 @@ - + + + @@ -2096,8 +2107,8 @@ The value of the persistence-context-type element must be one of the following: - Transaction - Extended + Transaction + Extended @@ -2109,6 +2120,7 @@ + @@ -2119,7 +2131,6 @@ - @@ -2128,42 +2139,43 @@ type="javaee:xsdStringType"> - + - + + - myPersistenceUnit - - + + myPersistenceUnit + + - - myPersistenceUnit - - PersistenceUnit1 - - + + myPersistenceUnit + + PersistenceUnit1 + + - ]]> + ]]> @@ -2207,29 +2219,27 @@ - - - - + - + + com.wombat.empl.EmployeeService + com.wombat.empl.EmployeeService - ]]> + ]]> @@ -2237,44 +2247,43 @@ - + + - jms/StockQueue - - javax.jms.Queue - - + + jms/StockQueue + + javax.jms.Queue + + - ]]> + ]]> - - @@ -2310,52 +2318,50 @@ - - - + - + + - jdbc/EmployeeAppDB - javax.sql.DataSource - Container - Shareable - + + jdbc/EmployeeAppDB + javax.sql.DataSource + Container + Shareable + - ]]> + ]]> - - @@ -2390,22 +2395,20 @@ - - - - - + - + + @@ -2420,8 +2423,8 @@ The value must be one of the two following: - Application - Container + Application + Container @@ -2433,7 +2436,8 @@ - + + @@ -2444,8 +2448,8 @@ factory reference can be shared. The value, if specified, must be one of the two following: - Shareable - Unshareable + Shareable + Unshareable The default value is Shareable. @@ -2459,7 +2463,8 @@ - + + @@ -2471,7 +2476,6 @@ - - + - + + @@ -2495,37 +2501,35 @@ - - + + - - This role includes all employees who are authorized - to access the employee service application. - - employee - + + + This role includes all employees who are authorized + to access the employee service application. + + employee + - ]]> + ]]> - - + - + + @@ -2553,7 +2559,6 @@ - - @@ -2588,10 +2592,12 @@ - + - + + @@ -2603,12 +2609,14 @@ - + - + + @@ -2620,12 +2628,14 @@ - + - + + @@ -2637,12 +2647,14 @@ - + - + + @@ -2654,12 +2666,14 @@ - + - + + @@ -2671,12 +2685,14 @@ - + - + + @@ -2688,12 +2704,14 @@ - + - + + @@ -2705,12 +2723,14 @@ - + - + + @@ -2722,12 +2742,14 @@ - + - + + @@ -2743,12 +2765,14 @@ - + - + + @@ -2769,7 +2793,8 @@ - + + @@ -2790,36 +2815,36 @@ - + + - CorporateStocks - - + + CorporateStocks + + - ]]> + ]]> @@ -2842,89 +2867,85 @@ minOccurs="0"> - - - The JNDI name to be looked up to resolve the message destination. + The JNDI name to be looked up to resolve the message destination. - - + - + + - jms/StockQueue - - javax.jms.Queue - - Consumes - - CorporateStocks - - - - ]]> + The message-destination-ref element contains a declaration + of Deployment Component's reference to a message destination + associated with a resource in Deployment Component's + environment. It consists of: + + - an optional description + - the message destination reference name + - an optional message destination type + - an optional specification as to whether + the destination is used for + consuming or producing messages, or both. + if not specified, "both" is assumed. + - an optional link to the message destination + - optional injection targets + + The message destination type must be supplied unless an + injection target is specified, in which case the type + of the target is used. If both are specified, the type + must be assignment compatible with the type of the injection + target. + + Examples: + + + jms/StockQueue + + javax.jms.Queue + + Consumes + + CorporateStocks + + + + ]]> @@ -2954,15 +2975,14 @@ - - - - + - + + @@ -2977,9 +2997,9 @@ The value of the message-destination-usage element must be one of the following: - Consumes - Produces - ConsumesProduces + Consumes + Produces + ConsumesProduces @@ -2992,23 +3012,23 @@ - + + javax.jms.Queue - + javax.jms.Queue + - ]]> + ]]> @@ -3016,7 +3036,8 @@ - + + @@ -3049,7 +3070,8 @@ - + + @@ -3061,9 +3083,9 @@ The value must be one of the following: - NoTransaction - LocalTransaction - XATransaction + NoTransaction + LocalTransaction + XATransaction diff --git a/core/src/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd b/core/src/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd index e32c5b7..34e7219 100644 --- a/core/src/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd +++ b/core/src/main/java/javax/servlet/resources/javaee_web_services_1_4.xsd @@ -47,13 +47,9 @@ only if the new code is made subject to such option by the copyright holder. - - - - - The Apache Software Foundation elects to include this software under the CDDL license. + @@ -352,7 +348,7 @@ - To be used with JAX-RPC based runtime only. + To be used with JAX-RPC based runtime only. @@ -364,7 +360,7 @@ - To be used with JAX-WS based runtime only. + To be used with JAX-WS based runtime only. @@ -493,7 +489,7 @@ The jaxrpc-mapping-file element contains the name of a file that - describes the JAX-RPC mapping between the Java interfaces used by + describes the JAX-RPC mapping between the Java interaces used by the application and the WSDL description in the wsdl-file. The file name is a relative path within the module. @@ -538,17 +534,17 @@ EmployeeService - + Example: + EmployeeService + diff --git a/core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd b/core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd index fbd00ce..842d75e 100644 --- a/core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd +++ b/core/src/main/java/javax/servlet/resources/javaee_web_services_client_1_4.xsd @@ -47,13 +47,9 @@ only if the new code is made subject to such option by the copyright holder. - - - - - The Apache Software Foundation elects to include this software under the CDDL license. + @@ -153,7 +149,7 @@ The jaxrpc-mapping-file element contains the name of a file that - describes the JAX-RPC mapping between the Java interfaces used by + describes the JAX-RPC mapping between the Java interaces used by the application and the WSDL description in the wsdl-file. The file name is a relative path within the module file. @@ -200,13 +196,13 @@ - Declares the handler for a port-component. Handlers can - access the init-param name/value pairs using the - HandlerInfo interface. If port-name is not specified, the - handler is assumed to be associated with all ports of the - service. + Declares the handler for a port-component. Handlers can + access the init-param name/value pairs using the + HandlerInfo interface. If port-name is not specified, the + handler is assumed to be associated with all ports of the + service. - To be used with JAX-RPC based runtime only. + To be used with JAX-RPC based runtime only. @@ -218,7 +214,7 @@ - To be used with JAX-WS based runtime only. + To be used with JAX-WS based runtime only. @@ -488,31 +484,31 @@ Exact Name: service-name-pattern="ns1:EchoService" - In this case, handlers specified in this - handler-chain element will apply to all ports with - this exact service name. The namespace prefix must - have been declared in a namespace declaration - attribute in either the start-tag of the element - where the prefix is used or in an an ancestor - element (i.e. an element in whose content the - prefixed markup occurs) + In this case, handlers specified in this + handler-chain element will apply to all ports with + this exact service name. The namespace prefix must + have been declared in a namespace declaration + attribute in either the start-tag of the element + where the prefix is used or in an an ancestor + element (i.e. an element in whose content the + prefixed markup occurs) Pattern : service-name-pattern="ns1:EchoService*" - In this case, handlers specified in this - handler-chain element will apply to all ports whose - Service names are like EchoService1, EchoServiceFoo - etc. The namespace prefix must have been declared in - a namespace declaration attribute in either the - start-tag of the element where the prefix is used or - in an an ancestor element (i.e. an element in whose - content the prefixed markup occurs) + In this case, handlers specified in this + handler-chain element will apply to all ports whose + Service names are like EchoService1, EchoServiceFoo + etc. The namespace prefix must have been declared in + a namespace declaration attribute in either the + start-tag of the element where the prefix is used or + in an an ancestor element (i.e. an element in whose + content the prefixed markup occurs) Wild Card : service-name-pattern="*" - In this case, handlers specified in this handler-chain - element will apply to ports of all service names. + In this case, handlers specified in this handler-chain + element will apply to ports of all service names. The same can be applied to port-name attribute in handler-chain element. diff --git a/core/src/main/java/javax/servlet/resources/web-app_4_0.xsd b/core/src/main/java/javax/servlet/resources/web-app_4_0.xsd index ce26c8f..083252e 100644 --- a/core/src/main/java/javax/servlet/resources/web-app_4_0.xsd +++ b/core/src/main/java/javax/servlet/resources/web-app_4_0.xsd @@ -1,48 +1,4 @@ - - - + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright (c) 2009-2017 Oracle and/or its affiliates. All rights reserved. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 2 only ("GPL") or the Common Development + and Distribution License("CDDL") (collectively, the "License"). You + may not use this file except in compliance with the License. You can + obtain a copy of the License at + https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + or packager/legal/LICENSE.txt. See the License for the specific + language governing permissions and limitations under the License. + + When distributing the software, include this License Header Notice in each + file and include the License file at packager/legal/LICENSE.txt. + + GPL Classpath Exception: + Oracle designates this particular file as subject to the "Classpath" + exception as provided by Oracle in the GPL Version 2 section of the License + file that accompanied this code. + + Modifications: + If applicable, add the following below the License Header, with the fields + enclosed by brackets [] replaced by your own identifying information: + "Portions Copyright [year] [name of copyright owner]" + + Contributor(s): + If you wish your version of this file to be governed by only the CDDL or + only the GPL Version 2, indicate your decision by adding "[Contributor] + elects to include this software in this distribution under the [CDDL or GPL + Version 2] license." If you don't indicate a single choice of license, a + recipient has the option to distribute your version of this file under + either the CDDL, the GPL Version 2 or to extend the choice of license to + its licensees as provided above. However, if you add GPL Version 2 code + and therefore, elected the GPL Version 2 license, then the option applies + only if the new code is made subject to such option by the copyright + holder. + + The Apache Software Foundation elects to include this software under the + CDDL license. + + ... + - - ... - + The instance documents may indicate the published version of + the schema using the xsi:schemaLocation attribute for Java EE + namespace with the following location: - The instance documents may indicate the published version of - the schema using the xsi:schemaLocation attribute for Java EE - namespace with the following location: + http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd - http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd - - ]]> + ]]> - + + The following conventions apply to all Java EE + deployment descriptor elements unless indicated otherwise. + + - In elements that specify a pathname to a file within the + same JAR file, relative filenames (i.e., those not + starting with "/") are considered relative to the root of + the JAR file's namespace. Absolute filenames (i.e., those + starting with "/") also specify names in the root of the + JAR file's namespace. In general, relative names are + preferred. The exception is .war files where absolute + names are preferred for consistency with the Servlet API. + - - - - + + + @@ -122,7 +129,6 @@ - @@ -133,9 +139,8 @@ - + - @@ -146,9 +151,8 @@ - + - @@ -164,9 +168,8 @@ - + - @@ -182,9 +185,8 @@ - + - @@ -198,9 +200,8 @@ - + - @@ -214,10 +215,8 @@ - + - - @@ -230,9 +229,8 @@ - + - @@ -244,11 +242,9 @@ - - + - @@ -259,9 +255,8 @@ - + - @@ -273,10 +268,11 @@ - + + @@ -286,45 +282,53 @@ type="javaee:string" minOccurs="0"/> - + When specified, this element provides a default context path - of the web application. The default context path starts - with a / character. If it is not rooted at the root of the - server's name space, the path does not end with a / character. + of the web application. An empty value for this element must cause + the web application to be deployed at the root for the container. + Otherwise, the default context path must start with + a “/“ character but not end with a “/“ character. + Servlet containers may provide vendor specific configuration + options that allows specifying a value that overrides the value + specified here. - + When specified, this element provides a default request - encoding of the web application. + character encoding of the web application. - + When specified, this element provides a default response - encoding of the web application. + character encoding of the web application. - + When specified, this element causes uncovered http methods to be denied. For every url-pattern that is the target of a - security-constraint, this element causes all HTTP methods that + security-constrant, this element causes all HTTP methods that are NOT covered (by a security constraint) at the url-pattern to be denied. @@ -337,6 +341,7 @@ + diff --git a/core/src/main/java/javax/servlet/resources/web-common_4_0.xsd b/core/src/main/java/javax/servlet/resources/web-common_4_0.xsd index e87a1e0..35e077b 100644 --- a/core/src/main/java/javax/servlet/resources/web-common_4_0.xsd +++ b/core/src/main/java/javax/servlet/resources/web-common_4_0.xsd @@ -1,48 +1,4 @@ - - - + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright (c) 2009-2017 Oracle and/or its affiliates. All rights reserved. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 2 only ("GPL") or the Common Development + and Distribution License("CDDL") (collectively, the "License"). You + may not use this file except in compliance with the License. You can + obtain a copy of the License at + https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + or packager/legal/LICENSE.txt. See the License for the specific + language governing permissions and limitations under the License. + + When distributing the software, include this License Header Notice in each + file and include the License file at packager/legal/LICENSE.txt. + + GPL Classpath Exception: + Oracle designates this particular file as subject to the "Classpath" + exception as provided by Oracle in the GPL Version 2 section of the License + file that accompanied this code. + + Modifications: + If applicable, add the following below the License Header, with the fields + enclosed by brackets [] replaced by your own identifying information: + "Portions Copyright [year] [name of copyright owner]" + + Contributor(s): + If you wish your version of this file to be governed by only the CDDL or + only the GPL Version 2, indicate your decision by adding "[Contributor] + elects to include this software in this distribution under the [CDDL or GPL + Version 2] license." If you don't indicate a single choice of license, a + recipient has the option to distribute your version of this file under + either the CDDL, the GPL Version 2 or to extend the choice of license to + its licensees as provided above. However, if you add GPL Version 2 code + and therefore, elected the GPL Version 2 license, then the option applies + only if the new code is made subject to such option by the copyright + holder. + + The Apache Software Foundation elects to include this software under the + CDDL license. + - ... - + + ... + - The instance documents may indicate the published version of - the schema using the xsi:schemaLocation attribute for Java EE - namespace with the following location: + The instance documents may indicate the published version of + the schema using the xsi:schemaLocation attribute for Java EE + namespace with the following location: - http://xmlns.jcp.org/xml/ns/javaee/web-common_4_0.xsd + http://xmlns.jcp.org/xml/ns/javaee/web-common_4_0.xsd - ]]> + ]]> - - - + The following conventions apply to all Java EE + deployment descriptor elements unless indicated otherwise. - + - In elements that specify a pathname to a file within the + same JAR file, relative filenames (i.e., those not + starting with "/") are considered relative to the root of + the JAR file's namespace. Absolute filenames (i.e., those + starting with "/") also specify names in the root of the + JAR file's namespace. In general, relative names are + preferred. The exception is .war files where absolute + names are preferred for consistency with the Servlet API. + + + - - + @@ -120,7 +123,6 @@ - - - - @@ -192,6 +191,7 @@ + @@ -213,7 +213,6 @@ - + @@ -246,12 +246,12 @@ - + @@ -278,7 +278,6 @@ - @@ -290,6 +289,7 @@ + @@ -302,7 +302,6 @@ - @@ -312,6 +311,7 @@ + @@ -336,7 +336,6 @@ - @@ -354,7 +353,6 @@ - @@ -373,6 +371,7 @@ type="xsd:ID"/> + @@ -390,7 +389,6 @@ - - + @@ -453,7 +451,6 @@ - @@ -473,13 +470,16 @@ type="xsd:ID"/> + + This type defines a string which contains at least one character. + @@ -489,6 +489,7 @@ + @@ -504,12 +505,12 @@ - + @@ -524,9 +525,7 @@ - - @@ -540,7 +539,6 @@ - @@ -555,44 +553,35 @@ - - - - A HTTP method type as defined in HTTP 1.1 section 2.2. - - + - - - - - + @@ -608,7 +597,6 @@ - + @@ -646,7 +635,6 @@ - @@ -656,7 +644,6 @@ - + @@ -681,7 +669,6 @@ - @@ -689,6 +676,7 @@ + @@ -703,7 +691,6 @@ - + @@ -739,7 +727,6 @@ - - - - + @@ -828,7 +813,6 @@ - @@ -837,7 +821,8 @@ minOccurs="1" maxOccurs="unbounded"/> - + @@ -853,12 +838,12 @@ - + @@ -872,7 +857,6 @@ - + @@ -935,7 +920,6 @@ - + @@ -1047,12 +1032,12 @@ - + @@ -1066,12 +1051,12 @@ - + @@ -1085,12 +1070,12 @@ - + @@ -1104,12 +1089,12 @@ - + @@ -1123,7 +1108,6 @@ - @@ -1133,6 +1117,7 @@ + @@ -1156,7 +1141,6 @@ - @@ -1166,6 +1150,7 @@ + @@ -1180,7 +1165,6 @@ - - + + @@ -1212,8 +1197,6 @@ - - @@ -1229,6 +1212,7 @@ + @@ -1249,7 +1233,6 @@ - @@ -1277,8 +1260,10 @@ maxOccurs="unbounded"> + Each http-method names an HTTP method to which the constraint applies. + @@ -1288,8 +1273,10 @@ maxOccurs="unbounded"> + Each http-method-omission names an HTTP method to which the constraint does not apply. + @@ -1299,6 +1286,7 @@ type="xsd:ID"/> + @@ -1312,7 +1300,6 @@ - - - @@ -1342,14 +1327,11 @@ - - - @@ -1358,12 +1340,12 @@ - + @@ -1375,7 +1357,6 @@ - + @@ -1398,7 +1380,6 @@ - @@ -1409,6 +1390,7 @@ type="xsd:ID"/> + @@ -1427,6 +1409,7 @@ type="xsd:ID"/> + @@ -1445,7 +1428,9 @@ maxOccurs="1"> + The directory location where uploaded files will be stored + @@ -1455,7 +1440,9 @@ maxOccurs="1"> + The maximum size limit of uploaded files + @@ -1465,7 +1452,9 @@ maxOccurs="1"> + The maximum size limit of multipart/form-data requests + @@ -1475,8 +1464,10 @@ maxOccurs="1"> + The size threshold after which an uploaded file will be written to disk + diff --git a/core/src/main/java/javax/servlet/resources/web-fragment_4_0.xsd b/core/src/main/java/javax/servlet/resources/web-fragment_4_0.xsd index fd07ccb..c8fbdd8 100644 --- a/core/src/main/java/javax/servlet/resources/web-fragment_4_0.xsd +++ b/core/src/main/java/javax/servlet/resources/web-fragment_4_0.xsd @@ -1,48 +1,4 @@ - - - + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright (c) 2009-2017 Oracle and/or its affiliates. All rights reserved. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 2 only ("GPL") or the Common Development + and Distribution License("CDDL") (collectively, the "License"). You + may not use this file except in compliance with the License. You can + obtain a copy of the License at + https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + or packager/legal/LICENSE.txt. See the License for the specific + language governing permissions and limitations under the License. + + When distributing the software, include this License Header Notice in each + file and include the License file at packager/legal/LICENSE.txt. + + GPL Classpath Exception: + Oracle designates this particular file as subject to the "Classpath" + exception as provided by Oracle in the GPL Version 2 section of the License + file that accompanied this code. + + Modifications: + If applicable, add the following below the License Header, with the fields + enclosed by brackets [] replaced by your own identifying information: + "Portions Copyright [year] [name of copyright owner]" + + Contributor(s): + If you wish your version of this file to be governed by only the CDDL or + only the GPL Version 2, indicate your decision by adding "[Contributor] + elects to include this software in this distribution under the [CDDL or GPL + Version 2] license." If you don't indicate a single choice of license, a + recipient has the option to distribute your version of this file under + either the CDDL, the GPL Version 2 or to extend the choice of license to + its licensees as provided above. However, if you add GPL Version 2 code + and therefore, elected the GPL Version 2 license, then the option applies + only if the new code is made subject to such option by the copyright + holder. + + The Apache Software Foundation elects to include this software under the + CDDL license. + - ... - + + ... + - The instance documents may indicate the published version of - the schema using the xsi:schemaLocation attribute for Java EE - namespace with the following location: + The instance documents may indicate the published version of + the schema using the xsi:schemaLocation attribute for Java EE + namespace with the following location: - http://xmlns.jcp.org/xml/ns/javaee/web-fragment_4_0.xsd + http://xmlns.jcp.org/xml/ns/javaee/web-fragment_4_0.xsd - ]]> + ]]> - + + The following conventions apply to all Java EE + deployment descriptor elements unless indicated otherwise. + + - In elements that specify a pathname to a file within the + same JAR file, relative filenames (i.e., those not + starting with "/") are considered relative to the root of + the JAR file's namespace. Absolute filenames (i.e., those + starting with "/") also specify names in the root of the + JAR file's namespace. In general, relative names are + preferred. The exception is .war files where absolute + names are preferred for consistency with the Servlet API. + - - - - + + + @@ -122,7 +129,6 @@ - @@ -133,9 +139,8 @@ - + - @@ -146,9 +151,8 @@ - + - @@ -164,9 +168,8 @@ - + - @@ -182,9 +185,8 @@ - + - @@ -198,9 +200,8 @@ - + - @@ -214,10 +215,8 @@ - + - - @@ -230,9 +229,8 @@ - + - @@ -244,11 +242,9 @@ - - + - @@ -259,9 +255,8 @@ - + - @@ -273,10 +268,11 @@ - + + @@ -291,6 +287,7 @@ + @@ -313,6 +310,7 @@ + diff --git a/core/src/main/java/javax/websocket/ContainerProvider.java b/core/src/main/java/javax/websocket/ContainerProvider.java index 8bad8d1..f95c9ad 100644 --- a/core/src/main/java/javax/websocket/ContainerProvider.java +++ b/core/src/main/java/javax/websocket/ContainerProvider.java @@ -16,7 +16,6 @@ */ package javax.websocket; -import java.lang.reflect.InvocationTargetException; import java.util.Iterator; import java.util.ServiceLoader; @@ -52,8 +51,7 @@ public static WebSocketContainer getWebSocketContainer() { (Class) Class.forName( DEFAULT_PROVIDER_CLASS_NAME); result = clazz.getConstructor().newInstance(); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | - IllegalArgumentException | InvocationTargetException | NoSuchMethodException | + } catch (ReflectiveOperationException | IllegalArgumentException | SecurityException e) { // No options left. Just return null. } diff --git a/core/src/main/java/javax/websocket/server/ServerEndpointConfig.java b/core/src/main/java/javax/websocket/server/ServerEndpointConfig.java index c1ce558..50b6341 100644 --- a/core/src/main/java/javax/websocket/server/ServerEndpointConfig.java +++ b/core/src/main/java/javax/websocket/server/ServerEndpointConfig.java @@ -16,7 +16,6 @@ */ package javax.websocket.server; -import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -177,9 +176,8 @@ private static Configurator loadDefault() { (Class) Class.forName( DEFAULT_IMPL_CLASSNAME); result = clazz.getConstructor().newInstance(); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | - IllegalArgumentException | InvocationTargetException | - NoSuchMethodException | SecurityException e) { + } catch (ReflectiveOperationException | IllegalArgumentException | + SecurityException e) { // No options left. Just return null. } } diff --git a/core/src/main/java/javax/xml/ws/WebServiceRef.java b/core/src/main/java/javax/xml/ws/WebServiceRef.java new file mode 100644 index 0000000..28b150e --- /dev/null +++ b/core/src/main/java/javax/xml/ws/WebServiceRef.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 javax.xml.ws; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) + +public @interface WebServiceRef { + public String name() default ""; + @SuppressWarnings("rawtypes") // Can't use Class because API needs to match specification + public Class type() default java.lang.Object.class; + @SuppressWarnings("rawtypes") // Can't use Class because API needs to match specification + public Class value() default java.lang.Object.class; + public String wsdlLocation() default ""; + public String mappedName() default ""; +} diff --git a/core/src/main/java/javax/xml/ws/WebServiceRefs.java b/core/src/main/java/javax/xml/ws/WebServiceRefs.java new file mode 100644 index 0000000..e4f428c --- /dev/null +++ b/core/src/main/java/javax/xml/ws/WebServiceRefs.java @@ -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. + */ + + +package javax.xml.ws; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) + +public @interface WebServiceRefs { + public WebServiceRef[] value(); +} diff --git a/core/src/main/java/org/apache/catalina/ContainerEvent.java b/core/src/main/java/org/apache/catalina/ContainerEvent.java index f17d422..b651356 100644 --- a/core/src/main/java/org/apache/catalina/ContainerEvent.java +++ b/core/src/main/java/org/apache/catalina/ContainerEvent.java @@ -90,7 +90,7 @@ public String getType() { */ @Override public String toString() { - return ("ContainerEvent['" + getContainer() + "','" + - getType() + "','" + getData() + "']"); + return "ContainerEvent['" + getContainer() + "','" + + getType() + "','" + getData() + "']"; } } diff --git a/core/src/main/java/org/apache/catalina/SessionEvent.java b/core/src/main/java/org/apache/catalina/SessionEvent.java index 7f77a86..209121e 100644 --- a/core/src/main/java/org/apache/catalina/SessionEvent.java +++ b/core/src/main/java/org/apache/catalina/SessionEvent.java @@ -71,9 +71,7 @@ public SessionEvent(Session session, String type, Object data) { * @return the event data of this event. */ public Object getData() { - - return (this.data); - + return this.data; } @@ -81,9 +79,7 @@ public Object getData() { * @return the Session on which this event occurred. */ public Session getSession() { - - return (this.session); - + return this.session; } @@ -91,18 +87,13 @@ public Session getSession() { * @return the event type of this event. */ public String getType() { - - return (this.type); - + return this.type; } @Override public String toString() { - - return ("SessionEvent['" + getSession() + "','" + - getType() + "']"); - + return "SessionEvent['" + getSession() + "','" + getType() + "']"; } diff --git a/core/src/main/java/org/apache/catalina/WebResourceRoot.java b/core/src/main/java/org/apache/catalina/WebResourceRoot.java index 5a023c7..5acf0d1 100644 --- a/core/src/main/java/org/apache/catalina/WebResourceRoot.java +++ b/core/src/main/java/org/apache/catalina/WebResourceRoot.java @@ -430,7 +430,7 @@ void createWebResourceSet(ResourceSetType type, String webAppMount, */ void gc(); - static enum ResourceSetType { + enum ResourceSetType { PRE, RESOURCE_JAR, POST, diff --git a/core/src/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java b/core/src/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java index 8c2c491..07f0d3a 100644 --- a/core/src/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java +++ b/core/src/main/java/org/apache/catalina/ant/AbstractCatalinaTask.java @@ -20,12 +20,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.Authenticator; import java.net.HttpURLConnection; +import java.net.PasswordAuthentication; import java.net.URL; import java.net.URLConnection; -import java.nio.charset.StandardCharsets; -import org.apache.tomcat.util.codec.binary.Base64; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; @@ -200,10 +200,8 @@ public void execute(String command, InputStream istream, String contentType, lon } hconn.setRequestProperty("User-Agent", "Catalina-Ant-Task/1.0"); - // Set up an authorization header with our credentials - String input = username + ":" + password; - String output = Base64.encodeBase64String(input.getBytes(StandardCharsets.ISO_8859_1)); - hconn.setRequestProperty("Authorization", "Basic " + output); + // Set up authorization with our credentials + Authenticator.setDefault(new TaskAuthenticator(username, password)); // Establish the connection with the server hconn.connect(); @@ -211,7 +209,7 @@ public void execute(String command, InputStream istream, String contentType, lon // Send the request data (if any) if (istream != null) { try (BufferedOutputStream ostream = new BufferedOutputStream( - hconn.getOutputStream(), 1024);) { + hconn.getOutputStream(), 1024)) { byte buffer[] = new byte[1024]; while (true) { int n = istream.read(buffer); @@ -292,4 +290,21 @@ public void execute(String command, InputStream istream, String contentType, lon } } } + + + private static class TaskAuthenticator extends Authenticator { + + private final String user; + private final String password; + + private TaskAuthenticator(String user, String password) { + this.user = user; + this.password = password; + } + + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(user, password.toCharArray()); + } + } } diff --git a/core/src/main/java/org/apache/catalina/ant/ResourcesTask.java b/core/src/main/java/org/apache/catalina/ant/ResourcesTask.java index c0d57d6..db282cb 100644 --- a/core/src/main/java/org/apache/catalina/ant/ResourcesTask.java +++ b/core/src/main/java/org/apache/catalina/ant/ResourcesTask.java @@ -45,7 +45,7 @@ public class ResourcesTask extends AbstractCatalinaTask { protected String type = null; public String getType() { - return (this.type); + return this.type; } public void setType(String type) { diff --git a/core/src/main/java/org/apache/catalina/ant/ValidatorTask.java b/core/src/main/java/org/apache/catalina/ant/ValidatorTask.java index 3fa75cc..3fb8269 100644 --- a/core/src/main/java/org/apache/catalina/ant/ValidatorTask.java +++ b/core/src/main/java/org/apache/catalina/ant/ValidatorTask.java @@ -54,7 +54,7 @@ public class ValidatorTask extends BaseRedirectorHelperTask { protected String path = null; public String getPath() { - return (this.path); + return this.path; } public void setPath(String path) { @@ -93,7 +93,7 @@ public void execute() throws BuildException { // SecurityManager assume that untrusted applications may be deployed. Digester digester = DigesterFactory.newDigester( true, true, null, Globals.IS_SECURITY_ENABLED); - try (InputStream stream = new BufferedInputStream(new FileInputStream(file.getCanonicalFile()));) { + try (InputStream stream = new BufferedInputStream(new FileInputStream(file.getCanonicalFile()))) { InputSource is = new InputSource(file.toURI().toURL().toExternalForm()); is.setByteStream(stream); digester.parse(is); diff --git a/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java index 903bd3c..8d5d268 100644 --- a/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java +++ b/core/src/main/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java @@ -23,7 +23,6 @@ import java.net.MalformedURLException; import java.net.UnknownHostException; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; @@ -131,7 +130,7 @@ public class JMXAccessorTask extends BaseRedirectorHelperTask { * @return the name used at remote MbeanServer */ public String getName() { - return (this.name); + return this.name; } public void setName(String objectName) { @@ -200,7 +199,7 @@ public void setSeparatearrayresults(boolean separateArrayResults) { * @return The login password for the Manager application. */ public String getPassword() { - return (this.password); + return this.password; } public void setPassword(String password) { @@ -211,7 +210,7 @@ public void setPassword(String password) { * @return The login username for the JMX MBeanServer. */ public String getUsername() { - return (this.username); + return this.username; } public void setUsername(String username) { @@ -222,7 +221,7 @@ public void setUsername(String username) { * @return The URL of the JMX JSR 160 MBeanServer to be used. */ public String getUrl() { - return (this.url); + return this.url; } public void setUrl(String url) { @@ -233,7 +232,7 @@ public void setUrl(String url) { * @return The Host of the JMX JSR 160 MBeanServer to be used. */ public String getHost() { - return (this.host); + return this.host; } public void setHost(String host) { @@ -244,7 +243,7 @@ public void setHost(String host) { * @return The Port of the JMX JSR 160 MBeanServer to be used. */ public String getPort() { - return (this.port); + return this.port; } public void setPort(String port) { @@ -617,8 +616,7 @@ protected void createProperty(String propertyPrefix, Object result) { CompositeDataSupport data = (CompositeDataSupport) result; CompositeType compositeType = data.getCompositeType(); Set keys = compositeType.keySet(); - for (Iterator iter = keys.iterator(); iter.hasNext();) { - String key = iter.next(); + for (String key : keys) { Object value = data.get(key); OpenType type = compositeType.getType(key); if (type instanceof SimpleType) { @@ -629,10 +627,8 @@ protected void createProperty(String propertyPrefix, Object result) { } } else if (result instanceof TabularDataSupport) { TabularDataSupport data = (TabularDataSupport) result; - for (Iterator iter = data.keySet().iterator(); iter.hasNext();) { - Object key = iter.next(); - for (Iterator iter1 = ((List) key).iterator(); iter1.hasNext();) { - Object key1 = iter1.next(); + for (Object key : data.keySet()) { + for (Object key1 : ((List) key)) { CompositeData valuedata = data.get(new Object[] { key1 }); Object value = valuedata.get("value"); OpenType type = valuedata.getCompositeType().getType( diff --git a/core/src/main/java/org/apache/catalina/ant/jmx/package.html b/core/src/main/java/org/apache/catalina/ant/jmx/package.html index f3e057b..c9f65ae 100644 --- a/core/src/main/java/org/apache/catalina/ant/jmx/package.html +++ b/core/src/main/java/org/apache/catalina/ant/jmx/package.html @@ -27,42 +27,43 @@ existing one. The following attribute are exists in every tasks:

    + - - + + - + - + - + - + - + - + diff --git a/core/src/main/java/org/apache/catalina/ant/package.html b/core/src/main/java/org/apache/catalina/ant/package.html index 2d38417..d0f03f4 100644 --- a/core/src/main/java/org/apache/catalina/ant/package.html +++ b/core/src/main/java/org/apache/catalina/ant/package.html @@ -29,12 +29,13 @@

    Common task attributes
    AttributeDescriptionAttributeDescription
    urlurl The JMX Connection URL of the remote Tomcat MBeansServer.
    usernameusername The username of a MBeanServer auth, when configured.
    passwordpassword The password of a MBeanServer auth, when configured.
    hosthost The JMX Connection host.
    portport The JMX Connection port.
    refref The name of the ant internal reference for a jmx connection.
    + - - + + - + - + - + - + - + - + \n" + "\n" + + + "
    Task attributes
    AttributeDescriptionAttributeDescription
    urlurl The URL of the Manager web application you will use to perform the requested operations. If not specified, defaults to @@ -43,7 +44,7 @@
    usernameusername The username of a Tomcat user that has been configured with the manager-script role, as required to execute Manager @@ -51,7 +52,7 @@
    passwordpassword The password of a Tomcat user that has been configured with the manager-script role, as required to execute Manager @@ -59,7 +60,7 @@
    configconfig A URL pointing at the context configuration file (i.e. a file containing only the <Context> element, and @@ -70,7 +71,7 @@
    pathpath The context path (including the leading slash) of the web application this command is intended to manage, or a zero-length string for the @@ -81,7 +82,7 @@
    warwar A jar: URL that points at a web application archive (WAR) file, or a file: URL that points at an unpacked directory diff --git a/core/src/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java b/core/src/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java index c710893..4251b45 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java +++ b/core/src/main/java/org/apache/catalina/authenticator/AuthenticatorBase.java @@ -27,6 +27,7 @@ import java.util.Set; import javax.security.auth.Subject; +import javax.security.auth.callback.CallbackHandler; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; @@ -211,6 +212,13 @@ public AuthenticatorBase() { */ protected String secureRandomProvider = null; + /** + * The name of the JASPIC callback handler class. If none is specified the + * default {@link org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl} + * will be used. + */ + protected String jaspicCallbackHandlerClass = null; + protected SessionIdGeneratorBase sessionIdGenerator = null; /** @@ -407,6 +415,25 @@ public void setSecureRandomProvider(String secureRandomProvider) { this.secureRandomProvider = secureRandomProvider; } + /** + * Return the JASPIC callback handler class name + * + * @return The name of the JASPIC callback handler + */ + public String getJaspicCallbackHandlerClass() { + return jaspicCallbackHandlerClass; + } + + /** + * Set the JASPIC callback handler class name + * + * @param jaspicCallbackHandlerClass + * The new JASPIC callback handler class name + */ + public void setJaspicCallbackHandlerClass(String jaspicCallbackHandlerClass) { + this.jaspicCallbackHandlerClass = jaspicCallbackHandlerClass; + } + // --------------------------------------------------------- Public Methods /** @@ -640,8 +667,9 @@ private JaspicState getJaspicState(AuthConfigProvider jaspicProvider, Request re new MessageInfoImpl(request.getRequest(), response.getResponse(), authMandatory); try { + CallbackHandler callbackHandler = createCallbackHandler(); ServerAuthConfig serverAuthConfig = jaspicProvider.getServerAuthConfig( - "HttpServlet", jaspicAppContextID, CallbackHandlerImpl.getInstance()); + "HttpServlet", jaspicAppContextID, callbackHandler); String authContextID = serverAuthConfig.getAuthContextID(jaspicState.messageInfo); jaspicState.serverAuthContext = serverAuthConfig.getAuthContext(authContextID, null, null); } catch (AuthException e) { @@ -653,6 +681,32 @@ private JaspicState getJaspicState(AuthConfigProvider jaspicProvider, Request re return jaspicState; } + private CallbackHandler createCallbackHandler() { + CallbackHandler callbackHandler = null; + if (jaspicCallbackHandlerClass == null) { + callbackHandler = CallbackHandlerImpl.getInstance(); + } else { + Class clazz = null; + try { + clazz = Class.forName(jaspicCallbackHandlerClass, true, + Thread.currentThread().getContextClassLoader()); + } catch (ClassNotFoundException e) { + // Proceed with the retry below + } + + try { + if (clazz == null) { + clazz = Class.forName(jaspicCallbackHandlerClass); + } + callbackHandler = (CallbackHandler)clazz.getConstructor().newInstance(); + } catch (ReflectiveOperationException e) { + throw new SecurityException(e); + } + } + + return callbackHandler; + } + // ------------------------------------------------------ Protected Methods diff --git a/core/src/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java index 1a5742a..967927e 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java +++ b/core/src/main/java/org/apache/catalina/authenticator/BasicAuthenticator.java @@ -20,6 +20,7 @@ import java.io.IOException; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.Principal; @@ -43,10 +44,30 @@ * @author Craig R. McClanahan */ public class BasicAuthenticator extends AuthenticatorBase { + private static final Log log = LogFactory.getLog(BasicAuthenticator.class); + private Charset charset = StandardCharsets.ISO_8859_1; + private String charsetString = null; + + + public String getCharset() { + return charsetString; + } + + + public void setCharset(String charsetString) { + // Only acceptable options are null, "" or "UTF-8" (case insensitive) + if (charsetString == null || charsetString.isEmpty()) { + charset = StandardCharsets.ISO_8859_1; + } else if ("UTF-8".equalsIgnoreCase(charsetString)) { + charset = StandardCharsets.UTF_8; + } else { + throw new IllegalArgumentException(sm.getString("basicAuthenticator.invalidCharset")); + } + this.charsetString = charsetString; + } - // --------------------------------------------------------- Public Methods @Override protected boolean doAuthenticate(Request request, HttpServletResponse response) @@ -66,7 +87,7 @@ protected boolean doAuthenticate(Request request, HttpServletResponse response) ByteChunk authorizationBC = authorization.getByteChunk(); BasicCredentials credentials = null; try { - credentials = new BasicCredentials(authorizationBC); + credentials = new BasicCredentials(authorizationBC, charset); String username = credentials.getUsername(); String password = credentials.getPassword(); @@ -89,6 +110,10 @@ protected boolean doAuthenticate(Request request, HttpServletResponse response) value.append("Basic realm=\""); value.append(getRealmName(context)); value.append('\"'); + if (charsetString != null && !charsetString.isEmpty()) { + value.append(", charset="); + value.append(charsetString); + } response.setHeader(AUTH_HEADER_NAME, value.toString()); response.sendError(HttpServletResponse.SC_UNAUTHORIZED); return false; @@ -112,28 +137,31 @@ public static class BasicCredentials { // note: we include single white space as its delimiter private static final String METHOD = "basic "; - private ByteChunk authorization; - private int initialOffset; + private final Charset charset; + private final ByteChunk authorization; + private final int initialOffset; private int base64blobOffset; private int base64blobLength; private String username = null; private String password = null; - /** * Parse the HTTP Authorization header for BASIC authentication * as per RFC 2617 section 2, and the Base64 encoded credentials * as per RFC 2045 section 6.8. * - * @param input The header value to parse in-place + * @param input The header value to parse in-place + * @param charset The character set to use to convert the bytes to a + * string * * @throws IllegalArgumentException If the header does not conform * to RFC 2617 */ - public BasicCredentials(ByteChunk input) - throws IllegalArgumentException { + public BasicCredentials(ByteChunk input, Charset charset) throws IllegalArgumentException { authorization = input; initialOffset = input.getOffset(); + this.charset = charset; + parseMethod(); byte[] decoded = parseBase64(); parseCredentials(decoded); @@ -210,15 +238,12 @@ private void parseCredentials(byte[] decoded) } if (colon < 0) { - username = new String(decoded, StandardCharsets.ISO_8859_1); + username = new String(decoded, charset); // password will remain null! } else { - username = new String( - decoded, 0, colon, StandardCharsets.ISO_8859_1); - password = new String( - decoded, colon + 1, decoded.length - colon - 1, - StandardCharsets.ISO_8859_1); + username = new String(decoded, 0, colon, charset); + password = new String(decoded, colon + 1, decoded.length - colon - 1, charset); // tolerate surplus white space around credentials if (password.length() > 1) { password = password.trim(); diff --git a/core/src/main/java/org/apache/catalina/authenticator/FormAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/FormAuthenticator.java index 3920590..659060e 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/FormAuthenticator.java +++ b/core/src/main/java/org/apache/catalina/authenticator/FormAuthenticator.java @@ -652,21 +652,24 @@ protected void saveRequest(Request request, Session session) // May need to acknowledge a 100-continue expectation request.getResponse().sendAcknowledgement(); - ByteChunk body = new ByteChunk(); - body.setLimit(request.getConnector().getMaxSavePostSize()); + int maxSavePostSize = request.getConnector().getMaxSavePostSize(); + if (maxSavePostSize != 0) { + ByteChunk body = new ByteChunk(); + body.setLimit(maxSavePostSize); - byte[] buffer = new byte[4096]; - int bytesRead; - InputStream is = request.getInputStream(); + byte[] buffer = new byte[4096]; + int bytesRead; + InputStream is = request.getInputStream(); - while ( (bytesRead = is.read(buffer) ) >= 0) { - body.append(buffer, 0, bytesRead); - } + while ( (bytesRead = is.read(buffer) ) >= 0) { + body.append(buffer, 0, bytesRead); + } - // Only save the request body if there is something to save - if (body.getLength() > 0) { - saved.setContentType(request.getContentType()); - saved.setBody(body); + // Only save the request body if there is something to save + if (body.getLength() > 0) { + saved.setContentType(request.getContentType()); + saved.setBody(body); + } } saved.setMethod(request.getMethod()); @@ -687,19 +690,17 @@ protected void saveRequest(Request request, Session session) * @return the original request URL */ protected String savedRequestURL(Session session) { - SavedRequest saved = (SavedRequest) session.getNote(Constants.FORM_REQUEST_NOTE); if (saved == null) { - return (null); + return null; } StringBuilder sb = new StringBuilder(saved.getRequestURI()); if (saved.getQueryString() != null) { sb.append('?'); sb.append(saved.getQueryString()); } - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/catalina/authenticator/LocalStrings.properties b/core/src/main/java/org/apache/catalina/authenticator/LocalStrings.properties index c1d658a..ca5dd4c 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/authenticator/LocalStrings.properties @@ -32,6 +32,8 @@ authenticator.sessionExpired=The time allowed for the login process has been exc authenticator.unauthorized=Cannot authenticate with the provided credentials authenticator.tomcatPrincipalLogoutFail=Logout with TomcatPrincipal instance has failed +basicAuthenticator.invalidCharset=The only permitted values are null, the empty string or UTF-8 + digestAuthenticator.cacheRemove=A valid entry has been removed from client nonce cache to make room for new entries. A replay attack is now possible. To prevent the possibility of replay attacks, reduce nonceValidity or increase cnonceCacheSize. Further warnings of this type will be suppressed for 5 minutes. formAuthenticator.forwardErrorFail=Unexpected error forwarding to error page diff --git a/core/src/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties index 62acdd5..7a06653 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/authenticator/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + authenticator.certificates = No hay cadena de certificados del cliente en esta petici\u00F3n authenticator.formlogin = Referencia directa al formulario de conexi\u00F3n (p\u00E1gina de formulario de login) inv\u00E1lida authenticator.loginFail = No pude ingresar diff --git a/core/src/main/java/org/apache/catalina/authenticator/SavedRequest.java b/core/src/main/java/org/apache/catalina/authenticator/SavedRequest.java index bb3f6cf..4cf8c7c 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/SavedRequest.java +++ b/core/src/main/java/org/apache/catalina/authenticator/SavedRequest.java @@ -20,9 +20,12 @@ import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Locale; +import java.util.Map; import javax.servlet.http.Cookie; @@ -42,31 +45,30 @@ */ public final class SavedRequest { - /** * The set of Cookies associated with this Request. */ - private final ArrayList cookies = new ArrayList<>(); + private final List cookies = new ArrayList<>(); public void addCookie(Cookie cookie) { cookies.add(cookie); } public Iterator getCookies() { - return (cookies.iterator()); + return cookies.iterator(); } /** * The set of Headers associated with this Request. Each key is a header - * name, while the value is a ArrayList containing one or more actual + * name, while the value is a List containing one or more actual * values for this header. The values are returned as an Iterator when * you ask for them. */ - private final HashMap> headers = new HashMap<>(); + private final Map> headers = new HashMap<>(); public void addHeader(String name, String value) { - ArrayList values = headers.get(name); + List values = headers.get(name); if (values == null) { values = new ArrayList<>(); headers.put(name, values); @@ -75,29 +77,29 @@ public void addHeader(String name, String value) { } public Iterator getHeaderNames() { - return (headers.keySet().iterator()); + return headers.keySet().iterator(); } public Iterator getHeaderValues(String name) { - ArrayList values = headers.get(name); + List values = headers.get(name); if (values == null) - return ((new ArrayList()).iterator()); + return Collections.emptyIterator(); else - return (values.iterator()); + return values.iterator(); } /** * The set of Locales associated with this Request. */ - private final ArrayList locales = new ArrayList<>(); + private final List locales = new ArrayList<>(); public void addLocale(Locale locale) { locales.add(locale); } public Iterator getLocales() { - return (locales.iterator()); + return locales.iterator(); } @@ -107,7 +109,7 @@ public Iterator getLocales() { private String method = null; public String getMethod() { - return (this.method); + return this.method; } public void setMethod(String method) { @@ -121,7 +123,7 @@ public void setMethod(String method) { private String queryString = null; public String getQueryString() { - return (this.queryString); + return this.queryString; } public void setQueryString(String queryString) { @@ -135,7 +137,7 @@ public void setQueryString(String queryString) { private String requestURI = null; public String getRequestURI() { - return (this.requestURI); + return this.requestURI; } public void setRequestURI(String requestURI) { @@ -150,7 +152,7 @@ public void setRequestURI(String requestURI) { private String decodedRequestURI = null; public String getDecodedRequestURI() { - return (this.decodedRequestURI); + return this.decodedRequestURI; } public void setDecodedRequestURI(String decodedRequestURI) { @@ -164,7 +166,7 @@ public void setDecodedRequestURI(String decodedRequestURI) { private ByteChunk body = null; public ByteChunk getBody() { - return (this.body); + return this.body; } public void setBody(ByteChunk body) { @@ -177,7 +179,7 @@ public void setBody(ByteChunk body) { private String contentType = null; public String getContentType() { - return (this.contentType); + return this.contentType; } public void setContentType(String contentType) { diff --git a/core/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java b/core/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java index 8ff9af1..dad95d0 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java +++ b/core/src/main/java/org/apache/catalina/authenticator/SingleSignOn.java @@ -604,7 +604,7 @@ protected synchronized void startInternal() throws LifecycleException { while (c != null && !(c instanceof Engine)) { c = c.getParent(); } - if (c instanceof Engine) { + if (c != null) { engine = (Engine) c; } super.startInternal(); diff --git a/core/src/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java b/core/src/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java index 4ca5ac0..fb0ae49 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java +++ b/core/src/main/java/org/apache/catalina/authenticator/SpnegoAuthenticator.java @@ -45,7 +45,6 @@ import org.ietf.jgss.GSSManager; import org.ietf.jgss.Oid; - /** * A SPNEGO authenticator that uses the SPNEGO/Kerberos support built in to Java * 6. Successful Kerberos authentication depends on the correct configuration of diff --git a/core/src/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java index fa5e9aa..b32f108 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java +++ b/core/src/main/java/org/apache/catalina/authenticator/jaspic/AuthConfigFactoryImpl.java @@ -18,7 +18,6 @@ import java.io.File; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -61,7 +60,7 @@ public class AuthConfigFactoryImpl extends AuthConfigFactory { new ConcurrentHashMap<>(); // Note: Although there will only ever be a maximum of one entry in this // Map, use a ConcurrentHashMap for consistency - private volatile Map defaultRegistration = + private final Map defaultRegistration = new ConcurrentHashMap<>(1); @@ -76,9 +75,11 @@ public AuthConfigProvider getConfigProvider(String layer, String appContext, RegistrationContextImpl registrationContext = findRegistrationContextImpl(layer, appContext); if (registrationContext != null) { - RegistrationListenerWrapper wrapper = new RegistrationListenerWrapper( - layer, appContext, listener); - registrationContext.addListener(wrapper); + if (listener != null) { + RegistrationListenerWrapper wrapper = new RegistrationListenerWrapper( + layer, appContext, listener); + registrationContext.addListener(wrapper); + } return registrationContext.getProvider(); } return null; @@ -104,7 +105,23 @@ private String doRegisterConfigProvider(String className, log.debug(sm.getString("authConfigFactoryImpl.registerClass", className, layer, appContext)); } - Class clazz; + + AuthConfigProvider provider = null; + if (className != null) { + provider = createAuthConfigProvider(className, properties); + } + + String registrationID = getRegistrationID(layer, appContext); + RegistrationContextImpl registrationContextImpl = new RegistrationContextImpl( + layer, appContext, description, true, provider, properties); + addRegistrationContextImpl(layer, appContext, registrationID, registrationContextImpl); + return registrationID; + } + + + private AuthConfigProvider createAuthConfigProvider(String className, + @SuppressWarnings("rawtypes") Map properties) throws SecurityException { + Class clazz = null; AuthConfigProvider provider = null; try { clazz = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); @@ -112,19 +129,15 @@ private String doRegisterConfigProvider(String className, // Ignore so the re-try below can proceed } try { - clazz = Class.forName(className); + if (clazz == null) { + clazz = Class.forName(className); + } Constructor constructor = clazz.getConstructor(Map.class, AuthConfigFactory.class); provider = (AuthConfigProvider) constructor.newInstance(properties, null); - } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | - IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + } catch (ReflectiveOperationException | IllegalArgumentException e) { throw new SecurityException(e); } - - String registrationID = getRegistrationID(layer, appContext); - RegistrationContextImpl registrationContextImpl = new RegistrationContextImpl( - layer, appContext, description, true, provider, properties); - addRegistrationContextImpl(layer, appContext, registrationID, registrationContextImpl); - return registrationID; + return provider; } @@ -236,6 +249,9 @@ public boolean removeRegistration(String registrationID) { for (RegistrationListenerWrapper wrapper : registration.listeners) { wrapper.getListener().notify(wrapper.getMessageLayer(), wrapper.getAppContext()); } + if (registration.isPersistent()) { + savePersistentRegistrations(); + } return true; } } @@ -245,7 +261,7 @@ public boolean removeRegistration(String registrationID) { public String[] detachListener(RegistrationListener listener, String layer, String appContext) { String registrationID = getRegistrationID(layer, appContext); RegistrationContextImpl registrationContext = findRegistrationContextImpl(layer, appContext); - if (registrationContext.removeListener(listener)) { + if (registrationContext != null && registrationContext.removeListener(listener)) { return new String[] { registrationID }; } return EMPTY_STRING_ARRAY; @@ -259,7 +275,7 @@ public String[] getRegistrationIDs(AuthConfigProvider provider) { result.addAll(layerAppContextRegistrations.keySet()); result.addAll(appContextRegistrations.keySet()); result.addAll(layerRegistrations.keySet()); - if (defaultRegistration != null) { + if (!defaultRegistration.isEmpty()) { result.add(DEFAULT_REGISTRATION_ID); } } else { @@ -360,7 +376,9 @@ private void savePersistentProvider(Providers providers, if (registrationContextImpl != null && registrationContextImpl.isPersistent()) { Provider provider = new Provider(); provider.setAppContext(registrationContextImpl.getAppContext()); - provider.setClassName(registrationContextImpl.getProvider().getClass().getName()); + if (registrationContextImpl.getProvider() != null) { + provider.setClassName(registrationContextImpl.getProvider().getClass().getName()); + } provider.setDescription(registrationContextImpl.getDescription()); provider.setLayer(registrationContextImpl.getMessageLayer()); for (Entry property : registrationContextImpl.getProperties().entrySet()) { @@ -456,6 +474,7 @@ private boolean removeListener(RegistrationListener listener) { for (RegistrationListenerWrapper wrapper : listeners) { if (wrapper.getListener().equals(listener)) { listeners.remove(wrapper); + result = true; } } return result; diff --git a/core/src/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java index 05eb121..96578ff 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java +++ b/core/src/main/java/org/apache/catalina/authenticator/jaspic/PersistentProviderRegistrations.java @@ -121,17 +121,12 @@ static void writeProviders(Providers providers, File configFile) { " xsi:schemaLocation=\"http://tomcat.apache.org/xml jaspic-providers.xsd\"\n" + " version=\"1.0\">\n"); for (Provider provider : providers.providers) { - writer.write(" \n"); + writer.write(" \n"); for (Entry entry : provider.getProperties().entrySet()) { writer.write(" \n"); } catch (IOException e) { - configFileNew.delete(); + if (!configFileNew.delete()) { + log.warn(sm.getString("persistentProviderRegistrations.deleteFail", + configFileNew.getAbsolutePath())); + } throw new SecurityException(e); } @@ -169,6 +167,15 @@ static void writeProviders(Providers providers, File configFile) { } + private static void writeOptional(String name, String value, Writer writer) throws IOException { + if (value != null) { + writer.write(" " + name + "=\""); + writer.write(value); + writer.write("\""); + } + } + + public static class Providers { private final List providers = new ArrayList<>(); diff --git a/core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java b/core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java index 99b9b45..15d29e1 100644 --- a/core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java +++ b/core/src/main/java/org/apache/catalina/authenticator/jaspic/SimpleServerAuthConfig.java @@ -16,7 +16,6 @@ */ package org.apache.catalina.authenticator.jaspic; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -118,9 +117,7 @@ public ServerAuthContext getAuthContext(String authContextID, Subject serviceSub (ServerAuthModule) clazz.getConstructor().newInstance(); module.initialize(null, null, handler, mergedProperties); modules.add(module); - } catch (ClassNotFoundException | InstantiationException | - IllegalAccessException | IllegalArgumentException | - InvocationTargetException | NoSuchMethodException | + } catch (ReflectiveOperationException | IllegalArgumentException | SecurityException e) { AuthException ae = new AuthException(); ae.initCause(e); diff --git a/core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java b/core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java index e5fc1c1..ca6f191 100644 --- a/core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java +++ b/core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java @@ -127,7 +127,7 @@ public CoyoteAdapter(Connector connector) { @Override public boolean asyncDispatch(org.apache.coyote.Request req, org.apache.coyote.Response res, - SocketEvent socketEvent) throws Exception { + SocketEvent status) throws Exception { Request request = (Request) req.getNote(ADAPTER_NOTES); Response response = (Response) res.getNote(ADAPTER_NOTES); @@ -149,11 +149,11 @@ public boolean asyncDispatch(org.apache.coyote.Request req, org.apache.coyote.Re response.setSuspended(false); } - if (socketEvent==SocketEvent.TIMEOUT) { + if (status==SocketEvent.TIMEOUT) { if (!asyncConImpl.timeout()) { asyncConImpl.setErrorState(null, false); } - } else if (socketEvent==SocketEvent.ERROR) { + } else if (status==SocketEvent.ERROR) { // An I/O error occurred on a non-container thread which means // that the socket needs to be closed so set success to false to // trigger a close @@ -181,7 +181,7 @@ public boolean asyncDispatch(org.apache.coyote.Request req, org.apache.coyote.Re if (!request.isAsyncDispatching() && request.isAsync()) { WriteListener writeListener = res.getWriteListener(); ReadListener readListener = req.getReadListener(); - if (writeListener != null && socketEvent == SocketEvent.OPEN_WRITE) { + if (writeListener != null && status == SocketEvent.OPEN_WRITE) { ClassLoader oldCL = null; try { oldCL = request.getContext().bind(false, null); @@ -197,12 +197,12 @@ public boolean asyncDispatch(org.apache.coyote.Request req, org.apache.coyote.Re } finally { request.getContext().unbind(false, oldCL); } - } else if (readListener != null && socketEvent == SocketEvent.OPEN_READ) { + } else if (readListener != null && status == SocketEvent.OPEN_READ) { ClassLoader oldCL = null; try { oldCL = request.getContext().bind(false, null); // If data is being read on a non-container thread a - // dispatch with socketEvent OPEN_READ will be used to get + // dispatch with status OPEN_READ will be used to get // execution back on a container thread for the // onAllDataRead() event. Therefore, make sure // onDataAvailable() is not called in this case. @@ -225,7 +225,6 @@ public boolean asyncDispatch(org.apache.coyote.Request req, org.apache.coyote.Re // Has an error occurred during async processing that needs to be // processed by the application's error page mechanism (or Tomcat's // if the application doesn't define one)? - //处理过程中出错,跳转到指定出错页。 if (!request.isAsyncDispatching() && request.isAsync() && response.isErrorReportRequired()) { connector.getService().getContainer().getPipeline().getFirst().invoke( @@ -729,7 +728,7 @@ protected boolean postParseRequest(org.apache.coyote.Request req, Request reques // No session ID means no possibility of remap if (contexts != null && sessionID != null) { // Find the context associated with the session - for (int i = (contexts.length); i > 0; i--) { + for (int i = contexts.length; i > 0; i--) { Context ctxt = contexts[i - 1]; if (ctxt.getManager().findSession(sessionID) != null) { // We found a context. Is it the one that has @@ -987,7 +986,7 @@ protected void parseSessionSslId(Request request) { /** - * Parse session id in URL. + * Parse session id in Cookie. * * @param request The Servlet request object */ @@ -1298,8 +1297,6 @@ public static boolean checkNormalize(MessageBytes uriMB) { * @param len Length */ protected static void copyBytes(byte[] b, int dest, int src, int len) { - for (int pos = 0; pos < len; pos++) { - b[pos + dest] = b[pos + src]; - } + System.arraycopy(b, src, b, dest, len); } } diff --git a/core/src/main/java/org/apache/catalina/connector/CoyoteInputStream.java b/core/src/main/java/org/apache/catalina/connector/CoyoteInputStream.java index ff7cc4a..b0afed5 100644 --- a/core/src/main/java/org/apache/catalina/connector/CoyoteInputStream.java +++ b/core/src/main/java/org/apache/catalina/connector/CoyoteInputStream.java @@ -207,9 +207,7 @@ public void setReadListener(ReadListener listener) { ib.setReadListener(listener); } - /** - * 如果有读监听函数,每次读数据的时候,如果发现数据不够用就将连接注册到selector上。 - */ + private void checkNonBlockingRead() { if (!ib.isBlocking() && !ib.isReady()) { throw new IllegalStateException(sm.getString("coyoteInputStream.nbNotready")); diff --git a/core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java b/core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java index 8e8ca26..1ae5608 100644 --- a/core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java +++ b/core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java @@ -49,7 +49,7 @@ public CoyotePrincipal(String name) { @Override public String getName() { - return (this.name); + return this.name; } @@ -62,12 +62,10 @@ public String getName() { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("CoyotePrincipal["); sb.append(this.name); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/catalina/connector/InputBuffer.java b/core/src/main/java/org/apache/catalina/connector/InputBuffer.java index 09e94c7..a65a80d 100644 --- a/core/src/main/java/org/apache/catalina/connector/InputBuffer.java +++ b/core/src/main/java/org/apache/catalina/connector/InputBuffer.java @@ -272,7 +272,6 @@ public boolean isReady() { } return false; } - //通过content-length判断是否一个消息读取完 if (isFinished()) { // If this is a non-container thread, need to trigger a read // which will eventually lead to a call to onAllDataRead() via a @@ -283,7 +282,6 @@ public boolean isReady() { } return false; } - //注册读数据事件 boolean result = available() > 0; if (!result) { coyoteRequest.action(ActionCode.NB_READ_INTEREST, null); @@ -291,10 +289,7 @@ public boolean isReady() { return result; } - /** - * 通过是否有读监听函数来判断是否是阻塞的 - * @return - */ + boolean isBlocking() { return coyoteRequest.getReadListener() == null; } diff --git a/core/src/main/java/org/apache/catalina/connector/LocalStrings.properties b/core/src/main/java/org/apache/catalina/connector/LocalStrings.properties index c9e02be..86c6487 100644 --- a/core/src/main/java/org/apache/catalina/connector/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/connector/LocalStrings.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + coyoteAdapter.accesslogFail=Exception while attempting to add an entry to the access log coyoteAdapter.asyncDispatch=Exception while processing an asynchronous request coyoteAdapter.authenticate=Authenticated user [{0}] provided by connector @@ -56,6 +57,7 @@ coyoteRequest.filterAsyncSupportUnknown=Unable to determine if any filters do no coyoteRequest.maxPostSizeExceeded=The multi-part request contained parameter data (excluding uploaded files) that exceeded the limit for maxPostSize set on the associated connector coyoteRequest.noAsync=Unable to start async because the following classes in the processing chain do not support async [{0}] coyoteRequest.noMultipartConfig=Unable to process parts as no multi-part configuration has been provided +coyoteRequest.trailersNotReady=It is illegal to call getTrailerFields() before isTrailerFieldsReady() has returned true coyoteResponse.encoding.invalid=The encoding [{0}] is not recognised by the JRE coyoteResponse.getOutputStream.ise=getWriter() has already been called for this response diff --git a/core/src/main/java/org/apache/catalina/connector/Request.java b/core/src/main/java/org/apache/catalina/connector/Request.java index 4fa593e..2ec3b89 100644 --- a/core/src/main/java/org/apache/catalina/connector/Request.java +++ b/core/src/main/java/org/apache/catalina/connector/Request.java @@ -22,7 +22,6 @@ import java.io.InputStream; import java.io.StringReader; import java.io.UnsupportedEncodingException; -import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.Principal; @@ -33,7 +32,6 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -59,6 +57,7 @@ import javax.servlet.ServletResponse; import javax.servlet.SessionTrackingMode; import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; @@ -66,7 +65,6 @@ import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.Part; import javax.servlet.http.PushBuilder; -import javax.servlet.http.ServletMapping; import org.apache.catalina.Container; import org.apache.catalina.Context; @@ -86,6 +84,7 @@ import org.apache.catalina.mapper.MappingData; import org.apache.catalina.util.ParameterMap; import org.apache.catalina.util.RequestUtil; +import org.apache.catalina.util.TLSUtil; import org.apache.catalina.util.URLEncoder; import org.apache.coyote.ActionCode; import org.apache.coyote.UpgradeToken; @@ -170,7 +169,7 @@ public void setCoyoteRequest(org.apache.coyote.Request coyoteRequest) { * @return the Coyote request object */ public org.apache.coyote.Request getCoyoteRequest() { - return (this.coyoteRequest); + return this.coyoteRequest; } @@ -856,48 +855,46 @@ public void setServerPort(int port) { */ @Override public Object getAttribute(String name) { - // Special attributes SpecialAttributeAdapter adapter = specialAttributes.get(name); if (adapter != null) { return adapter.get(this, name); } - Object attr=attributes.get(name); + Object attr = attributes.get(name); - if(attr!=null) { - return(attr); + if (attr != null) { + return attr; } - attr = coyoteRequest.getAttribute(name); - if(attr != null) { + attr = coyoteRequest.getAttribute(name); + if (attr != null) { return attr; } - if( isSSLAttribute(name) || name.equals(SSLSupport.PROTOCOL_VERSION_KEY)) { - coyoteRequest.action(ActionCode.REQ_SSL_ATTRIBUTE, - coyoteRequest); + if (TLSUtil.isTLSRequestAttribute(name)) { + coyoteRequest.action(ActionCode.REQ_SSL_ATTRIBUTE, coyoteRequest); attr = coyoteRequest.getAttribute(Globals.CERTIFICATES_ATTR); - if( attr != null) { + if (attr != null) { attributes.put(Globals.CERTIFICATES_ATTR, attr); } attr = coyoteRequest.getAttribute(Globals.CIPHER_SUITE_ATTR); - if(attr != null) { + if (attr != null) { attributes.put(Globals.CIPHER_SUITE_ATTR, attr); } attr = coyoteRequest.getAttribute(Globals.KEY_SIZE_ATTR); - if(attr != null) { + if (attr != null) { attributes.put(Globals.KEY_SIZE_ATTR, attr); } attr = coyoteRequest.getAttribute(Globals.SSL_SESSION_ID_ATTR); - if(attr != null) { + if (attr != null) { attributes.put(Globals.SSL_SESSION_ID_ATTR, attr); } attr = coyoteRequest.getAttribute(Globals.SSL_SESSION_MGR_ATTR); - if(attr != null) { + if (attr != null) { attributes.put(Globals.SSL_SESSION_MGR_ATTR, attr); } attr = coyoteRequest.getAttribute(SSLSupport.PROTOCOL_VERSION_KEY); - if(attr != null) { + if (attr != null) { attributes.put(SSLSupport.PROTOCOL_VERSION_KEY, attr); } attr = attributes.get(name); @@ -912,18 +909,6 @@ public long getContentLengthLong() { return coyoteRequest.getContentLengthLong(); } - /** - * Test if a given name is one of the special Servlet-spec SSL attributes. - * - * @return true if this is a special SSL attribute - */ - static boolean isSSLAttribute(String name) { - return Globals.CERTIFICATES_ATTR.equals(name) || - Globals.CIPHER_SUITE_ATTR.equals(name) || - Globals.KEY_SIZE_ATTR.equals(name) || - Globals.SSL_SESSION_ID_ATTR.equals(name) || - Globals.SSL_SESSION_MGR_ATTR.equals(name); - } /** * Return the names of all request attributes for this Request, or an @@ -971,9 +956,9 @@ public Enumeration getAttributeNames() { */ @Override public String getCharacterEncoding() { - Charset charset = coyoteRequest.getCharset(); - if (charset != null) { - return charset.name(); + String characterEncoding = coyoteRequest.getCharacterEncoding(); + if (characterEncoding != null) { + return characterEncoding; } Context context = getContext(); @@ -986,7 +971,12 @@ public String getCharacterEncoding() { private Charset getCharset() { - Charset charset = coyoteRequest.getCharset(); + Charset charset = null; + try { + charset = coyoteRequest.getCharset(); + } catch (UnsupportedEncodingException e) { + // Ignore + } if (charset != null) { return charset; } @@ -1247,7 +1237,7 @@ public String getRealPath(String path) { } try { - return (servletContext.getRealPath(path)); + return servletContext.getRealPath(path); } catch (IllegalArgumentException e) { return null; } @@ -1360,7 +1350,7 @@ public RequestDispatcher getRequestDispatcher(String path) { if (path == null) { return null; } else if (path.startsWith("/")) { - return (context.getServletContext().getRequestDispatcher(path)); + return context.getServletContext().getRequestDispatcher(path); } // Convert a request-relative path to a context-relative one @@ -1457,8 +1447,6 @@ public void removeAttribute(String name) { // Notify interested application event listeners notifyAttributeRemoved(name, value); - } else { - return; } } @@ -1776,8 +1764,8 @@ public void addCookie(Cookie cookie) { } Cookie[] newCookies = new Cookie[size + 1]; - for (int i = 0; i < size; i++) { - newCookies[i] = cookies[i]; + if (cookies != null) { + System.arraycopy(cookies, 0, newCookies, 0, size); } newCookies[size] = cookie; @@ -1955,36 +1943,40 @@ private Subject newSubject(final Principal principal) { // --------------------------------------------- HttpServletRequest Methods + @Override + public boolean isTrailerFieldsReady() { + return coyoteRequest.isTrailerFieldsReady(); + } + + @Override public Map getTrailerFields() { + if (!isTrailerFieldsReady()) { + throw new IllegalStateException(sm.getString("coyoteRequest.trailersNotReady")); + } Map result = new HashMap<>(); result.putAll(coyoteRequest.getTrailerFields()); return result; } - /** - * {@inheritDoc} - * - * @since Servlet 4.0 - */ @Override public PushBuilder newPushBuilder() { + return newPushBuilder(this); + } + + + public PushBuilder newPushBuilder(HttpServletRequest request) { AtomicBoolean result = new AtomicBoolean(); coyoteRequest.action(ActionCode.IS_PUSH_SUPPORTED, result); if (result.get()) { - return new ApplicationPushBuilder(this); + return new ApplicationPushBuilder(this, request); } else { return null; } } - /** - * {@inheritDoc} - * - * @since Servlet 3.1 - */ @SuppressWarnings("unchecked") @Override public T upgrade( @@ -2000,8 +1992,7 @@ public T upgrade( instanceManager = getContext().getInstanceManager(); handler = (T) instanceManager.newInstance(httpUpgradeHandlerClass); } - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | - NamingException | IllegalArgumentException | NoSuchMethodException | + } catch (ReflectiveOperationException | NamingException | IllegalArgumentException | SecurityException e) { throw new ServletException(e); } @@ -2175,7 +2166,7 @@ public long getDateHeader(String name) { String value = getHeader(name); if (value == null) { - return (-1L); + return -1L; } // Attempt to convert the date header in a variety of formats @@ -2238,7 +2229,7 @@ public int getIntHeader(String name) { String value = getHeader(name); if (value == null) { - return (-1); + return -1; } return Integer.parseInt(value); @@ -2246,8 +2237,8 @@ public int getIntHeader(String name) { @Override - public ServletMapping getServletMapping() { - return applicationMapping.getServletMapping(); + public HttpServletMapping getHttpServletMapping() { + return applicationMapping.getHttpServletMapping(); } @@ -2353,7 +2344,7 @@ public StringBuffer getRequestURL() { */ @Override public String getServletPath() { - return (mappingData.wrapperPath.toString()); + return mappingData.wrapperPath.toString(); } @@ -2429,7 +2420,7 @@ public boolean isRequestedSessionIdFromURL() { @Override @Deprecated public boolean isRequestedSessionIdFromUrl() { - return (isRequestedSessionIdFromURL()); + return isRequestedSessionIdFromURL(); } @@ -2523,7 +2514,7 @@ public boolean isUserInRole(String role) { } // Check for a role defined directly as a - return (realm.hasRole(getWrapper(), userPrincipal, role)); + return realm.hasRole(getWrapper(), userPrincipal, role); } @@ -2869,6 +2860,10 @@ private void parseParts(boolean explicit) { partsParseException = e; } } finally { + // This might look odd but is correct. setParseFailedReason() only + // sets the failure reason if none is currently set. This code could + // be more efficient but it is written this way to be robust with + // respect to changes in the remainder of the method. if (partsParseException != null || !success) { parameters.setParseFailedReason(FailReason.UNKNOWN); } @@ -2882,10 +2877,7 @@ private void parseParts(boolean explicit) { @Override public Part getPart(String name) throws IOException, IllegalStateException, ServletException { - Collection c = getParts(); - Iterator iterator = c.iterator(); - while (iterator.hasNext()) { - Part part = iterator.next(); + for (Part part : getParts()) { if (name.equals(part.getName())) { return part; } @@ -2901,7 +2893,7 @@ protected Session doGetSession(boolean create) { // There cannot be a session if no context has been assigned yet Context context = getContext(); if (context == null) { - return (null); + return null; } // Return the current session if it exists and is valid @@ -2909,13 +2901,13 @@ protected Session doGetSession(boolean create) { session = null; } if (session != null) { - return (session); + return session; } // Return the requested session if it exists and is valid Manager manager = context.getManager(); if (manager == null) { - return (null); // Sessions are not supported + return null; // Sessions are not supported } if (requestedSessionId != null) { try { @@ -2928,13 +2920,13 @@ protected Session doGetSession(boolean create) { } if (session != null) { session.access(); - return (session); + return session; } } // Create a new session if requested and the response is not committed if (!create) { - return (null); + return null; } if (response != null && context.getServletContext() diff --git a/core/src/main/java/org/apache/catalina/connector/RequestFacade.java b/core/src/main/java/org/apache/catalina/connector/RequestFacade.java index b9fdc16..11ad088 100644 --- a/core/src/main/java/org/apache/catalina/connector/RequestFacade.java +++ b/core/src/main/java/org/apache/catalina/connector/RequestFacade.java @@ -34,13 +34,13 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.Part; import javax.servlet.http.PushBuilder; -import javax.servlet.http.ServletMapping; import org.apache.catalina.Globals; import org.apache.catalina.security.SecurityUtil; @@ -738,14 +738,14 @@ public int getIntHeader(String name) { @Override - public ServletMapping getServletMapping() { + public HttpServletMapping getHttpServletMapping() { if (request == null) { throw new IllegalStateException( sm.getString("requestFacade.nullRequest")); } - return request.getServletMapping(); + return request.getHttpServletMapping(); } @@ -1068,11 +1068,13 @@ public AsyncContext getAsyncContext() { return request.getAsyncContext(); } + @Override public DispatcherType getDispatcherType() { return request.getDispatcherType(); } + @Override public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { @@ -1096,31 +1098,25 @@ public Collection getParts() throws IllegalStateException, return request.getParts(); } + @Override public Part getPart(String name) throws IllegalStateException, IOException, ServletException { return request.getPart(name); } + public boolean getAllowTrace() { return request.getConnector().getAllowTrace(); } - /** - * {@inheritDoc} - * - * @since Servlet 3.1 - */ + @Override public long getContentLengthLong() { return request.getContentLengthLong(); } - /** - * {@inheritDoc} - * - * @since Servlet 3.1 - */ + @Override public T upgrade( Class httpUpgradeHandlerClass) throws java.io.IOException, ServletException { @@ -1128,22 +1124,23 @@ public T upgrade( } - /** - * {@inheritDoc} - * - * @since Servlet 4.0 - */ @Override public PushBuilder newPushBuilder() { return request.newPushBuilder(); } - /** - * {@inheritDoc} - * - * @since Servlet 4.0 - */ + public PushBuilder newPushBuilder(HttpServletRequest request) { + return this.request.newPushBuilder(request); + } + + + @Override + public boolean isTrailerFieldsReady() { + return request.isTrailerFieldsReady(); + } + + @Override public Map getTrailerFields() { return request.getTrailerFields(); diff --git a/core/src/main/java/org/apache/catalina/connector/Response.java b/core/src/main/java/org/apache/catalina/connector/Response.java index c6d8f64..cf57aef 100644 --- a/core/src/main/java/org/apache/catalina/connector/Response.java +++ b/core/src/main/java/org/apache/catalina/connector/Response.java @@ -33,9 +33,11 @@ import java.util.Enumeration; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.TimeZone; import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; import javax.servlet.ServletOutputStream; import javax.servlet.ServletResponse; @@ -49,12 +51,10 @@ import org.apache.catalina.Session; import org.apache.catalina.Wrapper; import org.apache.catalina.security.SecurityUtil; -import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.SessionConfig; import org.apache.coyote.ActionCode; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; -import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.buf.CharChunk; import org.apache.tomcat.util.buf.UEncoder; import org.apache.tomcat.util.buf.UEncoder.SafeCharsSet; @@ -63,6 +63,7 @@ import org.apache.tomcat.util.http.MimeHeaders; import org.apache.tomcat.util.http.parser.MediaTypeCache; import org.apache.tomcat.util.res.StringManager; +import org.apache.tomcat.util.security.Escape; /** * Wrapper object for the Coyote response. @@ -139,7 +140,7 @@ public org.apache.coyote.Response getCoyoteResponse() { * @return the Context within which this Request is being processed. */ public Context getContext() { - return (request.getContext()); + return request.getContext(); } @@ -330,9 +331,9 @@ public void setAppCommitted(boolean appCommitted) { * @return true if the application has committed the response */ public boolean isAppCommitted() { - return (this.appCommitted || isCommitted() || isSuspended() + return this.appCommitted || isCommitted() || isSuspended() || ((getContentLength() > 0) - && (getContentWritten() >= getContentLength()))); + && (getContentWritten() >= getContentLength())); } @@ -345,7 +346,7 @@ public boolean isAppCommitted() { * @return the Request with which this Response is associated. */ public org.apache.catalina.connector.Request getRequest() { - return (this.request); + return this.request; } /** @@ -551,9 +552,9 @@ public int getBufferSize() { */ @Override public String getCharacterEncoding() { - Charset charset = getCoyoteResponse().getCharset(); + String charset = getCoyoteResponse().getCharacterEncoding(); if (charset != null) { - return charset.name(); + return charset; } Context context = getContext(); @@ -600,7 +601,7 @@ public ServletOutputStream getOutputStream() */ @Override public Locale getLocale() { - return (getCoyoteResponse().getLocale()); + return getCoyoteResponse().getLocale(); } @@ -802,7 +803,7 @@ public void setContentType(String type) { // Ignore charset if getWriter() has already been called if (!usingWriter) { try { - getCoyoteResponse().setCharset(B2CConverter.getCharset(m[1])); + getCoyoteResponse().setCharacterEncoding(m[1]); } catch (UnsupportedEncodingException e) { log.warn(sm.getString("coyoteResponse.encoding.invalid", m[1]), e); } @@ -839,7 +840,7 @@ public void setCharacterEncoding(String charset) { } try { - getCoyoteResponse().setCharset(B2CConverter.getCharset(charset)); + getCoyoteResponse().setCharacterEncoding(charset); } catch (UnsupportedEncodingException e) { log.warn(sm.getString("coyoteResponse.encoding.invalid", charset), e); return; @@ -881,7 +882,7 @@ public void setLocale(Locale locale) { String charset = getContext().getCharset(locale); if (charset != null) { try { - getCoyoteResponse().setCharset(B2CConverter.getCharset(charset)); + getCoyoteResponse().setCharacterEncoding(charset); } catch (UnsupportedEncodingException e) { log.warn(sm.getString("coyoteResponse.encoding.invalid", charset), e); } @@ -1152,6 +1153,18 @@ public boolean containsHeader(String name) { } + @Override + public void setTrailerFields(Supplier> supplier) { + getCoyoteResponse().setTrailerFields(supplier); + } + + + @Override + public Supplier> getTrailerFields() { + return getCoyoteResponse().getTrailerFields(); + } + + /** * Encode the session identifier associated with this response * into the specified redirect URL, if necessary. @@ -1161,13 +1174,11 @@ public boolean containsHeader(String name) { */ @Override public String encodeRedirectURL(String url) { - if (isEncodeable(toAbsolute(url))) { - return (toEncoded(url, request.getSessionInternal().getIdInternal())); + return toEncoded(url, request.getSessionInternal().getIdInternal()); } else { - return (url); + return url; } - } @@ -1184,7 +1195,7 @@ public String encodeRedirectURL(String url) { @Override @Deprecated public String encodeRedirectUrl(String url) { - return (encodeRedirectURL(url)); + return encodeRedirectURL(url); } @@ -1213,9 +1224,9 @@ public String encodeURL(String url) { } else if (url.equals(absolute) && !hasPath(url)) { url += '/'; } - return (toEncoded(url, request.getSessionInternal().getIdInternal())); + return toEncoded(url, request.getSessionInternal().getIdInternal()); } else { - return (url); + return url; } } @@ -1234,7 +1245,7 @@ public String encodeURL(String url) { @Override @Deprecated public String encodeUrl(String url) { - return (encodeURL(url)); + return encodeURL(url); } @@ -1363,7 +1374,7 @@ public void sendRedirect(String location, int status) throws IOException { if (getContext().getSendRedirectBody()) { PrintWriter writer = getWriter(); writer.print(sm.getString("coyoteResponse.sendRedirect.note", - RequestUtil.filter(locationUri))); + Escape.htmlElementContent(locationUri))); flushBuffer(); } } catch (IllegalArgumentException e) { @@ -1630,7 +1641,7 @@ private static boolean doIsEncodeable(Context context, Request hreq, Session ses protected String toAbsolute(String location) { if (location == null) { - return (location); + return location; } boolean leadingSlash = location.startsWith("/"); @@ -1705,7 +1716,7 @@ protected String toAbsolute(String location) { } else { - return (location); + return location; } @@ -1801,9 +1812,7 @@ private void normalize(CharChunk cc) { } private void copyChars(char[] c, int dest, int src, int len) { - for (int pos = 0; pos < len; pos++) { - c[pos + dest] = c[pos + src]; - } + System.arraycopy(c, src, c, dest, len); } @@ -1834,9 +1843,8 @@ private boolean hasPath(String uri) { * @return the encoded URL */ protected String toEncoded(String url, String sessionId) { - if ((url == null) || (sessionId == null)) { - return (url); + return url; } String path = url; @@ -1862,8 +1870,7 @@ protected String toEncoded(String url, String sessionId) { } sb.append(anchor); sb.append(query); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/catalina/connector/ResponseFacade.java b/core/src/main/java/org/apache/catalina/connector/ResponseFacade.java index 6767885..6c04b17 100644 --- a/core/src/main/java/org/apache/catalina/connector/ResponseFacade.java +++ b/core/src/main/java/org/apache/catalina/connector/ResponseFacade.java @@ -24,6 +24,8 @@ import java.security.PrivilegedExceptionAction; import java.util.Collection; import java.util.Locale; +import java.util.Map; +import java.util.function.Supplier; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; @@ -209,7 +211,7 @@ public ServletOutputStream getOutputStream() if (isFinished()) { response.setSuspended(true); } - return (sos); + return sos; } @@ -226,7 +228,7 @@ public PrintWriter getWriter() if (isFinished()) { response.setSuspended(true); } - return (writer); + return writer; } @@ -333,7 +335,7 @@ public boolean isCommitted() { sm.getString("responseFacade.nullResponse")); } - return (response.isAppCommitted()); + return response.isAppCommitted(); } @@ -640,4 +642,16 @@ public Collection getHeaderNames() { public Collection getHeaders(String name) { return response.getHeaders(name); } + + + @Override + public void setTrailerFields(Supplier> supplier) { + response.setTrailerFields(supplier); + } + + + @Override + public Supplier> getTrailerFields() { + return response.getTrailerFields(); + } } diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationContext.java b/core/src/main/java/org/apache/catalina/core/ApplicationContext.java index 0ac897c..09d6110 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationContext.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationContext.java @@ -30,7 +30,6 @@ import java.util.EventListener; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -53,10 +52,10 @@ import javax.servlet.SessionCookieConfig; import javax.servlet.SessionTrackingMode; import javax.servlet.descriptor.JspConfigDescriptor; +import javax.servlet.http.HttpServletMapping; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionIdListener; import javax.servlet.http.HttpSessionListener; -import javax.servlet.http.ServletMapping; import org.apache.catalina.Container; import org.apache.catalina.Context; @@ -213,7 +212,7 @@ public ApplicationContext(StandardContext context) { @Override public Object getAttribute(String name) { - return (attributes.get(name)); + return attributes.get(name); } @@ -348,14 +347,14 @@ public int getMinorVersion() { public String getMimeType(String file) { if (file == null) - return (null); + return null; int period = file.lastIndexOf('.'); if (period < 0) - return (null); + return null; String extension = file.substring(period + 1); if (extension.length() < 1) - return (null); - return (context.findMimeMapping(extension)); + return null; + return context.findMimeMapping(extension); } @@ -371,12 +370,12 @@ public RequestDispatcher getNamedDispatcher(String name) { // Validate the name argument if (name == null) - return (null); + return null; // Create and return a corresponding request dispatcher Wrapper wrapper = (Wrapper) context.findChild(name); if (wrapper == null) - return (null); + return null; return new ApplicationDispatcher(wrapper, null, null, null, null, null, name); @@ -391,28 +390,35 @@ public String getRealPath(String path) { @Override - public RequestDispatcher getRequestDispatcher(String path) { + public RequestDispatcher getRequestDispatcher(final String path) { // Validate the path argument - if (path == null) - return (null); - if (!path.startsWith("/")) - throw new IllegalArgumentException - (sm.getString - ("applicationContext.requestDispatcher.iae", path)); + if (path == null) { + return null; + } + if (!path.startsWith("/")) { + throw new IllegalArgumentException( + sm.getString("applicationContext.requestDispatcher.iae", path)); + } - // Get query string - String queryString = null; - String normalizedPath = path; - int pos = normalizedPath.indexOf('?'); + // Need to separate the query string and the uri. This is required for + // the ApplicationDispatcher constructor. Mapping also requires the uri + // without the query string. + String uri; + String queryString; + int pos = path.indexOf('?'); if (pos >= 0) { - queryString = normalizedPath.substring(pos + 1); - normalizedPath = normalizedPath.substring(0, pos); + uri = path.substring(0, pos); + queryString = path.substring(pos + 1); + } else { + uri = path; + queryString = null; } - normalizedPath = RequestUtil.normalize(normalizedPath); - if (normalizedPath == null) - return (null); + String normalizedPath = RequestUtil.normalize(uri); + if (normalizedPath == null) { + return null; + } if (getContext().getDispatchersUseEncodedPaths()) { // Decode @@ -432,6 +438,15 @@ public RequestDispatcher getRequestDispatcher(String path) { new IllegalArgumentException()); return null; } + + // URI needs to include the context path + uri = URLEncoder.DEFAULT.encode(getContextPath(), StandardCharsets.UTF_8) + uri; + } else { + // uri is passed to the constructor for ApplicationDispatcher and is + // ultimately used as the value for getRequestURI() which returns + // encoded values. Therefore, since the value passed in for path + // was decoded, encode uri here. + uri = URLEncoder.DEFAULT.encode(getContextPath() + uri, StandardCharsets.UTF_8); } pos = normalizedPath.length(); @@ -464,7 +479,7 @@ public RequestDispatcher getRequestDispatcher(String path) { uriCC.append(normalizedPath, 0, semicolon > 0 ? semicolon : pos); service.getMapper().map(context, uriMB, mappingData); if (mappingData.wrapper == null) { - return (null); + return null; } /* * Append any trailing path params (separated by ';') that were @@ -477,20 +492,18 @@ public RequestDispatcher getRequestDispatcher(String path) { } catch (Exception e) { // Should never happen log(sm.getString("applicationContext.mapping.error"), e); - return (null); + return null; } Wrapper wrapper = mappingData.wrapper; String wrapperPath = mappingData.wrapperPath.toString(); String pathInfo = mappingData.pathInfo.toString(); - ServletMapping mapping = (new ApplicationMapping(mappingData)).getServletMapping(); + HttpServletMapping mapping = new ApplicationMapping(mappingData).getHttpServletMapping(); mappingData.recycle(); - String encodedUri = URLEncoder.DEFAULT.encode(uriCC.toString(), StandardCharsets.UTF_8); - // Construct a RequestDispatcher to process this request - return new ApplicationDispatcher(wrapper, encodedUri, wrapperPath, pathInfo, + return new ApplicationDispatcher(wrapper, uri, wrapperPath, pathInfo, queryString, mapping, null); } @@ -677,9 +690,10 @@ public void removeAttribute(String name) { @Override public void setAttribute(String name, Object value) { // Name cannot be null - if (name == null) - throw new IllegalArgumentException + if (name == null) { + throw new NullPointerException (sm.getString("applicationContext.setAttribute.namenull")); + } // Null value is the same as removeAttribute() if (value == null) { @@ -812,8 +826,7 @@ public T createFilter(Class c) throws ServletException { } catch (InvocationTargetException e) { ExceptionUtils.handleThrowable(e.getCause()); throw new ServletException(e); - } catch (IllegalAccessException | NamingException | InstantiationException | - ClassNotFoundException | NoSuchMethodException e) { + } catch (ReflectiveOperationException | NamingException e) { throw new ServletException(e); } } @@ -946,8 +959,7 @@ public T createServlet(Class c) } catch (InvocationTargetException e) { ExceptionUtils.handleThrowable(e.getCause()); throw new ServletException(e); - } catch (IllegalAccessException | NamingException | InstantiationException | - ClassNotFoundException | NoSuchMethodException e) { + } catch (ReflectiveOperationException | NamingException e) { throw new ServletException(e); } } @@ -1042,6 +1054,11 @@ public void setSessionTrackingModes(Set sessionTrackingMode @Override public boolean setInitParameter(String name, String value) { + // Name cannot be null + if (name == null) { + throw new NullPointerException + (sm.getString("applicationContext.setAttribute.namenull")); + } if (!context.getState().equals(LifecycleState.STARTING_PREP)) { throw new IllegalStateException( sm.getString("applicationContext.setInitParam.ise", @@ -1087,8 +1104,7 @@ public void addListener(String className) { throw new IllegalArgumentException(sm.getString( "applicationContext.addListener.iae.cnfe", className), e); - } catch (IllegalAccessException | NamingException | InstantiationException | - ClassNotFoundException | NoSuchMethodException e) { + } catch (ReflectiveOperationException| NamingException e) { throw new IllegalArgumentException(sm.getString( "applicationContext.addListener.iae.cnfe", className), e); @@ -1160,8 +1176,7 @@ public T createListener(Class c) } catch (InvocationTargetException e) { ExceptionUtils.handleThrowable(e.getCause()); throw new ServletException(e); - } catch (IllegalAccessException | NamingException | InstantiationException | - NoSuchMethodException e) { + } catch (ReflectiveOperationException | NamingException e) { throw new ServletException(e); } } @@ -1254,7 +1269,7 @@ public JspConfigDescriptor getJspConfigDescriptor() { Container[] wrappers = context.findChildren(); for (Container wrapper : wrappers) { - result.put(((Wrapper) wrapper).getName(), + result.put(wrapper.getName(), new ApplicationServletRegistration( (Wrapper) wrapper, context)); } @@ -1337,17 +1352,14 @@ protected StandardContext getContext() { protected void clearAttributes() { // Create list of attributes to be removed - ArrayList list = new ArrayList<>(); - Iterator iter = attributes.keySet().iterator(); - while (iter.hasNext()) { - list.add(iter.next()); + List list = new ArrayList<>(); + for (String s : attributes.keySet()) { + list.add(s); } // Remove application originated attributes // (read only attributes will be left in place) - Iterator keys = list.iterator(); - while (keys.hasNext()) { - String key = keys.next(); + for (String key : list) { removeAttribute(key); } @@ -1358,9 +1370,7 @@ protected void clearAttributes() { * @return the facade associated with this ApplicationContext. */ protected ServletContext getFacade() { - - return (this.facade); - + return this.facade; } diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationContextFacade.java b/core/src/main/java/org/apache/catalina/core/ApplicationContextFacade.java index ed623f7..8d506b9 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationContextFacade.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationContextFacade.java @@ -145,7 +145,7 @@ public ServletContext getContext(String uripath) { (theContext instanceof ApplicationContext)){ theContext = ((ApplicationContext)theContext).getFacade(); } - return (theContext); + return theContext; } diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java b/core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java index e88ed38..a1062ae 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java @@ -33,9 +33,9 @@ import javax.servlet.ServletResponse; import javax.servlet.ServletResponseWrapper; import javax.servlet.UnavailableException; +import javax.servlet.http.HttpServletMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.ServletMapping; import org.apache.catalina.AsyncDispatcher; import org.apache.catalina.Context; @@ -207,7 +207,7 @@ private static class State { */ public ApplicationDispatcher (Wrapper wrapper, String requestURI, String servletPath, - String pathInfo, String queryString, ServletMapping mapping, String name) { + String pathInfo, String queryString, HttpServletMapping mapping, String name) { super(); @@ -264,7 +264,7 @@ private static class State { /** * The mapping for this RequestDispatcher. */ - private final ServletMapping mapping; + private final HttpServletMapping mapping; /** @@ -368,7 +368,7 @@ private void doForward(ServletRequest request, ServletResponse response) hrequest.getPathInfo()); wrequest.setAttribute(RequestDispatcher.FORWARD_QUERY_STRING, hrequest.getQueryString()); - wrequest.setAttribute(RequestDispatcher.FORWARD_MAPPING, hrequest.getServletMapping()); + wrequest.setAttribute(RequestDispatcher.FORWARD_MAPPING, hrequest.getHttpServletMapping()); } wrequest.setContextPath(context.getPath()); @@ -616,7 +616,7 @@ private void doDispatch(ServletRequest request, ServletResponse response) wrequest.setAttribute(Globals.DISPATCHER_TYPE_ATTR, DispatcherType.ASYNC); wrequest.setAttribute(Globals.DISPATCHER_REQUEST_PATH_ATTR, getCombinedPath()); - wrequest.setAttribute(AsyncContext.ASYNC_MAPPING, hrequest.getServletMapping()); + wrequest.setAttribute(AsyncContext.ASYNC_MAPPING, hrequest.getHttpServletMapping()); wrequest.setContextPath(context.getPath()); wrequest.setRequestURI(requestURI); @@ -626,7 +626,9 @@ private void doDispatch(ServletRequest request, ServletResponse response) wrequest.setQueryString(queryString); wrequest.setQueryParams(queryString); } - wrequest.setMapping(mapping); + if (!Globals.STRICT_SERVLET_COMPLIANCE) { + wrequest.setMapping(mapping); + } invoke(state.outerRequest, state.outerResponse, state); } @@ -922,7 +924,7 @@ private ServletRequest wrapRequest(State state) { else ((ServletRequestWrapper) previous).setRequest(wrapper); state.wrapRequest = wrapper; - return (wrapper); + return wrapper; } @@ -967,7 +969,7 @@ private ServletResponse wrapResponse(State state) { else ((ServletResponseWrapper) previous).setResponse(wrapper); state.wrapResponse = wrapper; - return (wrapper); + return wrapper; } diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationFilterConfig.java b/core/src/main/java/org/apache/catalina/core/ApplicationFilterConfig.java index 96d36f3..e8861a2 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationFilterConfig.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationFilterConfig.java @@ -20,7 +20,6 @@ import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; @@ -89,15 +88,12 @@ public final class ApplicationFilterConfig implements FilterConfig, Serializable * instantiating the filter object * @exception ServletException if thrown by the filter's init() method * @throws NamingException - * @throws InvocationTargetException * @throws SecurityException - * @throws NoSuchMethodException * @throws IllegalArgumentException */ ApplicationFilterConfig(Context context, FilterDef filterDef) - throws ClassCastException, ClassNotFoundException, IllegalAccessException, - InstantiationException, ServletException, InvocationTargetException, NamingException, - IllegalArgumentException, NoSuchMethodException, SecurityException { + throws ClassCastException, ReflectiveOperationException, ServletException, + NamingException, IllegalArgumentException, SecurityException { super(); @@ -152,7 +148,7 @@ public final class ApplicationFilterConfig implements FilterConfig, Serializable */ @Override public String getFilterName() { - return (filterDef.getFilterName()); + return filterDef.getFilterName(); } /** @@ -174,7 +170,7 @@ public String getInitParameter(String name) { Map map = filterDef.getParameterMap(); if (map == null) { - return (null); + return null; } return map.get(name); @@ -214,15 +210,13 @@ public ServletContext getServletContext() { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("ApplicationFilterConfig["); sb.append("name="); sb.append(filterDef.getFilterName()); sb.append(", filterClass="); sb.append(filterDef.getFilterClass()); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } // --------------------------------------------------------- Public Methods @@ -246,18 +240,16 @@ public Map getFilterInitParameterMap() { * instantiating the filter object * @exception ServletException if thrown by the filter's init() method * @throws NamingException - * @throws InvocationTargetException + * @throws ReflectiveOperationException * @throws SecurityException - * @throws NoSuchMethodException * @throws IllegalArgumentException */ - Filter getFilter() throws ClassCastException, ClassNotFoundException, IllegalAccessException, - InstantiationException, ServletException, InvocationTargetException, NamingException, - IllegalArgumentException, NoSuchMethodException, SecurityException { + Filter getFilter() throws ClassCastException, ReflectiveOperationException, ServletException, + NamingException, IllegalArgumentException, SecurityException { // Return the existing filter instance, if any if (this.filter != null) - return (this.filter); + return this.filter; // Identify the class loader we will be using String filterClass = filterDef.getFilterClass(); @@ -265,7 +257,7 @@ Filter getFilter() throws ClassCastException, ClassNotFoundException, IllegalAcc initFilter(); - return (this.filter); + return this.filter; } @@ -293,9 +285,7 @@ private void initFilter() throws ServletException { * Return the filter definition we are configured for. */ FilterDef getFilterDef() { - - return (this.filterDef); - + return this.filterDef; } /** @@ -326,7 +316,7 @@ void release() { } if (!context.getIgnoreAnnotations()) { try { - ((StandardContext) context).getInstanceManager().destroyInstance(this.filter); + context.getInstanceManager().destroyInstance(this.filter); } catch (Exception e) { Throwable t = ExceptionUtils .unwrapInvocationTargetException(e); @@ -347,7 +337,7 @@ void release() { private InstanceManager getInstanceManager() { if (instanceManager == null) { if (context instanceof StandardContext) { - instanceManager = ((StandardContext)context).getInstanceManager(); + instanceManager = context.getInstanceManager(); } else { instanceManager = new DefaultInstanceManager(null, new HashMap>(), diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationFilterFactory.java b/core/src/main/java/org/apache/catalina/core/ApplicationFilterFactory.java index 977eec7..e066f94 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationFilterFactory.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationFilterFactory.java @@ -85,7 +85,7 @@ public static ApplicationFilterChain createFilterChain(ServletRequest request, // If there are no filter mappings, we are done if ((filterMaps == null) || (filterMaps.length == 0)) - return (filterChain); + return filterChain; // Acquire the information we will need to match filter mappings DispatcherType dispatcher = @@ -212,8 +212,8 @@ private static boolean matchFiltersURL(String testPath, String requestPath) { && (period != requestPath.length() - 1) && ((requestPath.length() - period) == (testPath.length() - 1))) { - return (testPath.regionMatches(2, requestPath, period + 1, - testPath.length() - 2)); + return testPath.regionMatches(2, requestPath, period + 1, + testPath.length() - 2); } } @@ -260,27 +260,27 @@ else if (filterMap.getMatchAllServletNames()) { private static boolean matchDispatcher(FilterMap filterMap, DispatcherType type) { switch (type) { case FORWARD : - if ((filterMap.getDispatcherMapping() & FilterMap.FORWARD) > 0) { - return true; + if ((filterMap.getDispatcherMapping() & FilterMap.FORWARD) != 0) { + return true; } break; case INCLUDE : - if ((filterMap.getDispatcherMapping() & FilterMap.INCLUDE) > 0) { + if ((filterMap.getDispatcherMapping() & FilterMap.INCLUDE) != 0) { return true; } break; case REQUEST : - if ((filterMap.getDispatcherMapping() & FilterMap.REQUEST) > 0) { + if ((filterMap.getDispatcherMapping() & FilterMap.REQUEST) != 0) { return true; } break; case ERROR : - if ((filterMap.getDispatcherMapping() & FilterMap.ERROR) > 0) { + if ((filterMap.getDispatcherMapping() & FilterMap.ERROR) != 0) { return true; } break; case ASYNC : - if ((filterMap.getDispatcherMapping() & FilterMap.ASYNC) > 0) { + if ((filterMap.getDispatcherMapping() & FilterMap.ASYNC) != 0) { return true; } break; diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationHttpRequest.java b/core/src/main/java/org/apache/catalina/core/ApplicationHttpRequest.java index 9be932c..fc3a1d6 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationHttpRequest.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationHttpRequest.java @@ -26,22 +26,26 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; +import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletRequestWrapper; +import javax.servlet.http.HttpServletMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpSession; import javax.servlet.http.PushBuilder; -import javax.servlet.http.ServletMapping; import org.apache.catalina.Context; import org.apache.catalina.Globals; import org.apache.catalina.Manager; import org.apache.catalina.Session; +import org.apache.catalina.connector.RequestFacade; import org.apache.catalina.util.ParameterMap; import org.apache.catalina.util.RequestUtil; import org.apache.tomcat.util.buf.B2CConverter; @@ -192,7 +196,7 @@ public ApplicationHttpRequest(HttpServletRequest request, Context context, /** * The mapping for this request. */ - private ServletMapping mapping = null; + private HttpServletMapping mapping = null; /** @@ -261,7 +265,7 @@ public Object getAttribute(String name) { */ @Override public Enumeration getAttributeNames() { - return (new AttributeNamesEnumerator()); + return new AttributeNamesEnumerator(); } @@ -315,13 +319,13 @@ public void setAttribute(String name, Object value) { public RequestDispatcher getRequestDispatcher(String path) { if (context == null) - return (null); + return null; // If the path is already context-relative, just pass it through if (path == null) - return (null); + return null; else if (path.startsWith("/")) - return (context.getServletContext().getRequestDispatcher(path)); + return context.getServletContext().getRequestDispatcher(path); // Convert a request-relative path to a context-relative one String servletPath = @@ -347,7 +351,7 @@ else if (path.startsWith("/")) relative = requestPath + path; } - return (context.getServletContext().getRequestDispatcher(relative)); + return context.getServletContext().getRequestDispatcher(relative); } @@ -371,9 +375,7 @@ public DispatcherType getDispatcherType() { */ @Override public String getContextPath() { - - return (this.contextPath); - + return this.contextPath; } @@ -384,7 +386,6 @@ public String getContextPath() { */ @Override public String getParameter(String name) { - parseParameters(); String[] value = parameters.get(name); @@ -392,7 +393,6 @@ public String getParameter(String name) { return null; } return value[0]; - } @@ -402,10 +402,8 @@ public String getParameter(String name) { */ @Override public Map getParameterMap() { - parseParameters(); - return (parameters); - + return parameters; } @@ -415,7 +413,6 @@ public Map getParameterMap() { */ @Override public Enumeration getParameterNames() { - parseParameters(); return Collections.enumeration(parameters.keySet()); } @@ -429,10 +426,8 @@ public Enumeration getParameterNames() { */ @Override public String[] getParameterValues(String name) { - parseParameters(); return parameters.get(name); - } @@ -441,9 +436,7 @@ public String[] getParameterValues(String name) { */ @Override public String getPathInfo() { - - return (this.pathInfo); - + return this.pathInfo; } @@ -467,9 +460,7 @@ public String getPathTranslated() { */ @Override public String getQueryString() { - - return (this.queryString); - + return this.queryString; } @@ -479,9 +470,7 @@ public String getQueryString() { */ @Override public String getRequestURI() { - - return (this.requestURI); - + return this.requestURI; } @@ -501,14 +490,12 @@ public StringBuffer getRequestURL() { */ @Override public String getServletPath() { - - return (this.servletPath); - + return this.servletPath; } @Override - public ServletMapping getServletMapping() { + public HttpServletMapping getHttpServletMapping() { return mapping; } @@ -519,7 +506,7 @@ public ServletMapping getServletMapping() { */ @Override public HttpSession getSession() { - return (getSession(true)); + return getSession(true); } @@ -536,11 +523,11 @@ public HttpSession getSession(boolean create) { // There cannot be a session if no context has been assigned yet if (context == null) - return (null); + return null; // Return the current session if it exists and is valid if (session != null && session.isValid()) { - return (session.getSession()); + return session.getSession(); } HttpSession other = super.getSession(false); @@ -620,7 +607,15 @@ public boolean isRequestedSessionIdValid() { @Override public PushBuilder newPushBuilder() { - return new ApplicationPushBuilder(this); + ServletRequest current = getRequest(); + while (current instanceof ServletRequestWrapper) { + current = ((ServletRequestWrapper) current).getRequest(); + } + if (current instanceof RequestFacade) { + return ((RequestFacade) current).newPushBuilder(this); + } else { + return null; + } } @@ -692,7 +687,7 @@ void setRequest(HttpServletRequest request) { queryString = request.getQueryString(); requestURI = request.getRequestURI(); servletPath = request.getServletPath(); - mapping = request.getServletMapping(); + mapping = request.getHttpServletMapping(); } @@ -751,7 +746,7 @@ void setQueryParams(String queryString) { } - void setMapping(ServletMapping mapping) { + void setMapping(HttpServletMapping mapping) { this.mapping = mapping; } @@ -784,10 +779,10 @@ protected boolean isSpecial(String name) { protected int getSpecial(String name) { for (int i = 0; i < specials.length; i++) { if (specials[i].equals(name)) { - return (i); + return i; } } - return (-1); + return -1; } @@ -831,7 +826,7 @@ protected boolean removeSpecial(String name) { */ private String[] mergeValues(String[] values1, String[] values2) { - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); if (values1 == null) { // Skip - nothing to merge @@ -948,7 +943,7 @@ public String nextElement() { for (int i = pos + 1; i <= last; i++) { if (getAttribute(specials[i]) != null) { pos = i; - return (specials[i]); + return specials[i]; } } } diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationMapping.java b/core/src/main/java/org/apache/catalina/core/ApplicationMapping.java index 42a5865..c6e4f0f 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationMapping.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationMapping.java @@ -16,8 +16,8 @@ */ package org.apache.catalina.core; +import javax.servlet.http.HttpServletMapping; import javax.servlet.http.MappingMatch; -import javax.servlet.http.ServletMapping; import org.apache.catalina.mapper.MappingData; @@ -25,13 +25,13 @@ public class ApplicationMapping { private final MappingData mappingData; - private volatile ServletMapping mapping = null; + private volatile HttpServletMapping mapping = null; public ApplicationMapping(MappingData mappingData) { this.mappingData = mappingData; } - public ServletMapping getServletMapping() { + public HttpServletMapping getHttpServletMapping() { if (mapping == null) { String servletName; if (mappingData.wrapper == null) { @@ -39,36 +39,37 @@ public ServletMapping getServletMapping() { } else { servletName = mappingData.wrapper.getName(); } - switch (mappingData.matchType) { - case CONTEXT_ROOT: - mapping = new MappingImpl("", "", mappingData.matchType, servletName); - break; - case DEFAULT: - mapping = new MappingImpl("", "/", mappingData.matchType, servletName); - break; - case EXACT: - mapping = new MappingImpl(mappingData.wrapperPath.toString().substring(1), - mappingData.wrapperPath.toString(), mappingData.matchType, servletName); - break; - case EXTENSION: - String path = mappingData.wrapperPath.toString(); - int extIndex = path.lastIndexOf('.'); - mapping = new MappingImpl(path.substring(1, extIndex), - "*" + path.substring(extIndex), mappingData.matchType, servletName); - break; - case PATH: - String matchValue; - if (mappingData.pathInfo.isNull()) { - matchValue = null; - } else { - matchValue = mappingData.pathInfo.toString().substring(1); - } - mapping = new MappingImpl(matchValue, mappingData.wrapperPath.toString() + "/*", - mappingData.matchType, servletName); - break; - case UNKNOWN: - mapping = new MappingImpl("", "", mappingData.matchType, servletName); - break; + if (mappingData.matchType == null) { + mapping = new MappingImpl("", "", null, servletName); + } else { + switch (mappingData.matchType) { + case CONTEXT_ROOT: + mapping = new MappingImpl("", "", mappingData.matchType, servletName); + break; + case DEFAULT: + mapping = new MappingImpl("", "/", mappingData.matchType, servletName); + break; + case EXACT: + mapping = new MappingImpl(mappingData.wrapperPath.toString().substring(1), + mappingData.wrapperPath.toString(), mappingData.matchType, servletName); + break; + case EXTENSION: + String path = mappingData.wrapperPath.toString(); + int extIndex = path.lastIndexOf('.'); + mapping = new MappingImpl(path.substring(1, extIndex), + "*" + path.substring(extIndex), mappingData.matchType, servletName); + break; + case PATH: + String matchValue; + if (mappingData.pathInfo.isNull()) { + matchValue = null; + } else { + matchValue = mappingData.pathInfo.toString().substring(1); + } + mapping = new MappingImpl(matchValue, mappingData.wrapperPath.toString() + "/*", + mappingData.matchType, servletName); + break; + } } } @@ -79,7 +80,7 @@ public void recycle() { mapping = null; } - private static class MappingImpl implements ServletMapping { + private static class MappingImpl implements HttpServletMapping { private final String matchValue; private final String pattern; diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationPart.java b/core/src/main/java/org/apache/catalina/core/ApplicationPart.java index 9f1ec4e..d6400b5 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationPart.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationPart.java @@ -62,7 +62,7 @@ public String getContentType() { @Override public String getHeader(String name) { if (fileItem instanceof DiskFileItem) { - return ((DiskFileItem) fileItem).getHeaders().getHeader(name); + return fileItem.getHeaders().getHeader(name); } return null; } @@ -72,7 +72,7 @@ public Collection getHeaderNames() { if (fileItem instanceof DiskFileItem) { LinkedHashSet headerNames = new LinkedHashSet<>(); Iterator iter = - ((DiskFileItem) fileItem).getHeaders().getHeaderNames(); + fileItem.getHeaders().getHeaderNames(); while (iter.hasNext()) { headerNames.add(iter.next()); } @@ -86,7 +86,7 @@ public Collection getHeaders(String name) { if (fileItem instanceof DiskFileItem) { LinkedHashSet headers = new LinkedHashSet<>(); Iterator iter = - ((DiskFileItem) fileItem).getHeaders().getHeaders(name); + fileItem.getHeaders().getHeaders(name); while (iter.hasNext()) { headers.add(iter.next()); } diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java b/core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java index cfa474d..a2f163e 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java @@ -26,8 +26,6 @@ import java.util.Map; import java.util.Set; -import javax.servlet.ServletRequest; -import javax.servlet.ServletRequestWrapper; import javax.servlet.SessionTrackingMode; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; @@ -35,6 +33,7 @@ import javax.servlet.http.PushBuilder; import org.apache.catalina.Context; +import org.apache.catalina.authenticator.AuthenticatorBase; import org.apache.catalina.connector.Request; import org.apache.catalina.util.SessionConfig; import org.apache.coyote.ActionCode; @@ -72,22 +71,14 @@ public class ApplicationPushBuilder implements PushBuilder { private String path; private String queryString; private String sessionId; + private String userName; - public ApplicationPushBuilder(HttpServletRequest request) { + public ApplicationPushBuilder(Request catalinaRequest, HttpServletRequest request) { + baseRequest = request; - // Need a reference to the CoyoteRequest in order to process the push - ServletRequest current = request; - while (current instanceof ServletRequestWrapper) { - current = ((ServletRequestWrapper) current).getRequest(); - } - if (current instanceof Request) { - catalinaRequest = ((Request) current); - coyoteRequest = catalinaRequest.getCoyoteRequest(); - } else { - throw new UnsupportedOperationException(sm.getString( - "applicationPushBuilder.noCoyoteRequest", current.getClass().getName())); - } + this.catalinaRequest = catalinaRequest; + coyoteRequest = catalinaRequest.getCoyoteRequest(); // Populate the initial list of HTTP headers Enumeration headerNames = request.getHeaderNames(); @@ -119,7 +110,6 @@ public ApplicationPushBuilder(HttpServletRequest request) { if (request.getQueryString() != null) { referer.append('?'); referer.append(request.getQueryString()); - } addHeader("referer", referer.toString()); @@ -167,8 +157,18 @@ public ApplicationPushBuilder(HttpServletRequest request) { cookies.add(new Cookie(responseCookie.getName(), responseCookie.getValue())); } } - } + // Authentication + if (catalinaRequest.getPrincipal() != null) { + if ((session == null) || catalinaRequest.getSessionInternal(false).getPrincipal() == null + || !(context.getAuthenticator() instanceof AuthenticatorBase) + || !((AuthenticatorBase) context.getAuthenticator()).getCache()) { + // Set a username only if there is no session cache for the principal + userName = catalinaRequest.getPrincipal().getName(); + } + setHeader("authorization", "x-push"); + } + } @Override public PushBuilder path(String path) { @@ -196,7 +196,7 @@ public String getPath() { @Override public PushBuilder method(String method) { String upperMethod = method.trim().toUpperCase(); - if (DISALLOWED_METHODS.contains(upperMethod)) { + if (DISALLOWED_METHODS.contains(upperMethod) || upperMethod.length() == 0) { throw new IllegalArgumentException( sm.getString("applicationPushBuilder.methodInvalid", upperMethod)); } @@ -357,9 +357,16 @@ public void push() { } // Cookies - setHeader("cookie", generateCookieHeader(cookies, + pushTarget.getMimeHeaders().addValue("cookie") + .setString(generateCookieHeader(cookies, catalinaRequest.getContext().getCookieProcessor())); + // Authorization + if (userName != null) { + pushTarget.getRemoteUser().setString(userName); + pushTarget.setRemoteUserNeedsAuthorization(true); + } + coyoteRequest.action(ActionCode.PUSH_REQUEST, pushTarget); // Reset for next call to this method @@ -382,7 +389,7 @@ static String decode(String input, Charset charset) { StringBuilder result = new StringBuilder(input.length()); while (start != -1) { - // Found the start of a %nn sequence. Copy everything form the last + // Found the start of a %nn sequence. Copy everything from the last // end to this start to the output. result.append(input.substring(end, start)); // Advance the end 3 characters: %nn @@ -403,7 +410,7 @@ static String decode(String input, Charset charset) { private static String decodePercentSequence(String sequence, Charset charset) { byte[] bytes = new byte[sequence.length()/3]; for (int i = 0; i < bytes.length; i += 3) { - bytes[i] = (byte) (HexUtils.getDec(sequence.charAt(1 + 3 * i)) << 4 + + bytes[i] = (byte) ((HexUtils.getDec(sequence.charAt(1 + 3 * i)) << 4) + HexUtils.getDec(sequence.charAt(2 + 3 * i))); } diff --git a/core/src/main/java/org/apache/catalina/core/ApplicationRequest.java b/core/src/main/java/org/apache/catalina/core/ApplicationRequest.java index 0c0125a..87c6c17 100644 --- a/core/src/main/java/org/apache/catalina/core/ApplicationRequest.java +++ b/core/src/main/java/org/apache/catalina/core/ApplicationRequest.java @@ -104,7 +104,7 @@ public ApplicationRequest(ServletRequest request) { public Object getAttribute(String name) { synchronized (attributes) { - return (attributes.get(name)); + return attributes.get(name); } } diff --git a/core/src/main/java/org/apache/catalina/core/AprLifecycleListener.java b/core/src/main/java/org/apache/catalina/core/AprLifecycleListener.java index b3d6534..5687c29 100644 --- a/core/src/main/java/org/apache/catalina/core/AprLifecycleListener.java +++ b/core/src/main/java/org/apache/catalina/core/AprLifecycleListener.java @@ -66,9 +66,9 @@ public class AprLifecycleListener protected static final int TCN_REQUIRED_MAJOR = 1; protected static final int TCN_REQUIRED_MINOR = 2; - protected static final int TCN_REQUIRED_PATCH = 6; + protected static final int TCN_REQUIRED_PATCH = 14; protected static final int TCN_RECOMMENDED_MINOR = 2; - protected static final int TCN_RECOMMENDED_PV = 8; + protected static final int TCN_RECOMMENDED_PV = 14; // ---------------------------------------------- Properties diff --git a/core/src/main/java/org/apache/catalina/core/AsyncContextImpl.java b/core/src/main/java/org/apache/catalina/core/AsyncContextImpl.java index f4d9632..722b752 100644 --- a/core/src/main/java/org/apache/catalina/core/AsyncContextImpl.java +++ b/core/src/main/java/org/apache/catalina/core/AsyncContextImpl.java @@ -42,7 +42,6 @@ import org.apache.catalina.Host; import org.apache.catalina.Valve; import org.apache.catalina.connector.Request; -import org.apache.catalina.util.URLEncoder; import org.apache.coyote.ActionCode; import org.apache.coyote.AsyncContextCallback; import org.apache.coyote.RequestInfo; @@ -50,6 +49,7 @@ import org.apache.juli.logging.LogFactory; import org.apache.tomcat.InstanceManager; import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.buf.UDecoder; import org.apache.tomcat.util.res.StringManager; public class AsyncContextImpl implements AsyncContext, AsyncContextCallback { @@ -123,6 +123,8 @@ public void fireOnComplete() { public boolean timeout() { AtomicBoolean result = new AtomicBoolean(); request.getCoyoteRequest().action(ActionCode.ASYNC_TIMEOUT, result); + // Avoids NPEs during shutdown. A call to recycle will null this field. + Context context = this.context; if (result.get()) { ClassLoader oldCL = context.bind(false, null); @@ -151,21 +153,21 @@ public boolean timeout() { public void dispatch() { check(); String path; - String pathInfo; + String cpath; ServletRequest servletRequest = getRequest(); if (servletRequest instanceof HttpServletRequest) { HttpServletRequest sr = (HttpServletRequest) servletRequest; - path = sr.getServletPath(); - pathInfo = sr.getPathInfo(); + path = sr.getRequestURI(); + cpath = sr.getContextPath(); } else { - path = request.getServletPath(); - pathInfo = request.getPathInfo(); + path = request.getRequestURI(); + cpath = request.getContextPath(); } - if (pathInfo != null) { - path += pathInfo; + if (cpath.length() > 1) { + path = path.substring(cpath.length()); } - if (this.context.getDispatchersUseEncodedPaths()) { - path = URLEncoder.DEFAULT.encode(path, StandardCharsets.UTF_8); + if (!context.getDispatchersUseEncodedPaths()) { + path = UDecoder.URLDecode(path, StandardCharsets.UTF_8); } dispatch(path); } @@ -268,8 +270,7 @@ public T createListener(Class clazz) try { listener = (T) getInstanceManager().newInstance(clazz.getName(), clazz.getClassLoader()); - } catch (InstantiationException | IllegalAccessException | NamingException | - ClassNotFoundException e) { + } catch (ReflectiveOperationException | NamingException e) { ServletException se = new ServletException(e); throw se; } catch (Exception e) { @@ -394,7 +395,7 @@ public void setErrorState(Throwable t, boolean fireOnError) { try { listener.fireOnError(errorEvent); } catch (Throwable t2) { - ExceptionUtils.handleThrowable(t); + ExceptionUtils.handleThrowable(t2); log.warn("onError() failed for listener of type [" + listener.getClass().getName() + "]", t2); } @@ -407,6 +408,10 @@ public void setErrorState(Throwable t, boolean fireOnError) { if (result.get()) { // No listener called dispatch() or complete(). This is an error. // SRV.2.3.3.3 (search for "error dispatch") + // Take a local copy to avoid threading issues if another thread + // clears this (can happen during error handling with non-container + // threads) + ServletResponse servletResponse = this.servletResponse; if (servletResponse instanceof HttpServletResponse) { ((HttpServletResponse) servletResponse).setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR); @@ -486,7 +491,7 @@ private void logDebug(String method) { private InstanceManager getInstanceManager() { if (instanceManager == null) { if (context instanceof StandardContext) { - instanceManager = ((StandardContext)context).getInstanceManager(); + instanceManager = context.getInstanceManager(); } else { instanceManager = new DefaultInstanceManager(null, new HashMap>(), diff --git a/core/src/main/java/org/apache/catalina/core/ContainerBase.java b/core/src/main/java/org/apache/catalina/core/ContainerBase.java index 494fad0..04dcd71 100644 --- a/core/src/main/java/org/apache/catalina/core/ContainerBase.java +++ b/core/src/main/java/org/apache/catalina/core/ContainerBase.java @@ -23,7 +23,6 @@ import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; @@ -354,12 +353,10 @@ public void setBackgroundProcessorDelay(int delay) { */ @Override public Log getLogger() { - if (logger != null) - return (logger); + return logger; logger = LogFactory.getLog(getLogName()); - return (logger); - + return logger; } @@ -484,9 +481,7 @@ public void setCluster(Cluster cluster) { */ @Override public String getName() { - - return (name); - + return name; } @@ -517,9 +512,7 @@ public void setName(String name) { * @return true if the children will be started */ public boolean getStartChildren() { - - return (startChildren); - + return startChildren; } @@ -543,9 +536,7 @@ public void setStartChildren(boolean startChildren) { */ @Override public Container getParent() { - - return (parent); - + return parent; } @@ -578,12 +569,11 @@ public void setParent(Container container) { @Override public ClassLoader getParentClassLoader() { if (parentClassLoader != null) - return (parentClassLoader); + return parentClassLoader; if (parent != null) { - return (parent.getParentClassLoader()); + return parent.getParentClassLoader(); } - return (ClassLoader.getSystemClassLoader()); - + return ClassLoader.getSystemClassLoader(); } @@ -612,9 +602,7 @@ public void setParentClassLoader(ClassLoader parent) { */ @Override public Pipeline getPipeline() { - - return (this.pipeline); - + return this.pipeline; } @@ -630,9 +618,9 @@ public Realm getRealm() { l.lock(); try { if (realm != null) - return (realm); + return realm; if (parent != null) - return (parent.getRealm()); + return parent.getRealm(); return null; } finally { l.unlock(); @@ -1284,11 +1272,9 @@ public String getMBeanKeyProperties() { public ObjectName[] getChildren() { List names = new ArrayList<>(children.size()); - Iterator it = children.values().iterator(); - while (it.hasNext()) { - Object next = it.next(); + for (Container next : children.values()) { if (next instanceof ContainerBase) { - names.add(((ContainerBase)next).getObjectName()); + names.add(next.getObjectName()); } } return names.toArray(new ObjectName[names.size()]); diff --git a/core/src/main/java/org/apache/catalina/core/DefaultInstanceManager.java b/core/src/main/java/org/apache/catalina/core/DefaultInstanceManager.java index 93bef7d..ea70795 100644 --- a/core/src/main/java/org/apache/catalina/core/DefaultInstanceManager.java +++ b/core/src/main/java/org/apache/catalina/core/DefaultInstanceManager.java @@ -67,6 +67,37 @@ public class DefaultInstanceManager implements InstanceManager { protected static final StringManager sm = StringManager.getManager(Constants.Package); + private static final boolean EJB_PRESENT; + private static final boolean JPA_PRESENT; + private static final boolean WS_PRESENT; + + static { + Class clazz = null; + try { + clazz = Class.forName("javax.ejb.EJB"); + } catch (ClassNotFoundException cnfe) { + // Expected + } + EJB_PRESENT = (clazz != null); + + clazz = null; + try { + clazz = Class.forName("javax.persistence.PersistenceContext"); + } catch (ClassNotFoundException cnfe) { + // Expected + } + JPA_PRESENT = (clazz != null); + + clazz = null; + try { + clazz = Class.forName("javax.xml.ws.WebServiceRef"); + } catch (ClassNotFoundException cnfe) { + // Expected + } + WS_PRESENT = (clazz != null); + } + + private final Context context; private final Map> injectionMap; protected final ClassLoader classLoader; @@ -283,10 +314,10 @@ protected void populateAnnotationsCache(Class clazz, Field[] fields = Introspection.getDeclaredFields(clazz); for (Field field : fields) { Resource resourceAnnotation; - EJB ejbAnnotation; - WebServiceRef webServiceRefAnnotation; - PersistenceContext persistenceContextAnnotation; - PersistenceUnit persistenceUnitAnnotation; + Annotation ejbAnnotation; + Annotation webServiceRefAnnotation; + Annotation persistenceContextAnnotation; + Annotation persistenceUnitAnnotation; if (injections != null && injections.containsKey(field.getName())) { annotations.add(new AnnotationCacheEntry( field.getName(), null, @@ -296,24 +327,24 @@ protected void populateAnnotationsCache(Class clazz, field.getAnnotation(Resource.class)) != null) { annotations.add(new AnnotationCacheEntry(field.getName(), null, resourceAnnotation.name(), AnnotationCacheEntryType.FIELD)); - } else if ((ejbAnnotation = - field.getAnnotation(EJB.class)) != null) { + } else if (EJB_PRESENT && + (ejbAnnotation = field.getAnnotation(EJB.class)) != null) { annotations.add(new AnnotationCacheEntry(field.getName(), null, - ejbAnnotation.name(), AnnotationCacheEntryType.FIELD)); - } else if ((webServiceRefAnnotation = + ((EJB) ejbAnnotation).name(), AnnotationCacheEntryType.FIELD)); + } else if (WS_PRESENT && (webServiceRefAnnotation = field.getAnnotation(WebServiceRef.class)) != null) { annotations.add(new AnnotationCacheEntry(field.getName(), null, - webServiceRefAnnotation.name(), + ((WebServiceRef) webServiceRefAnnotation).name(), AnnotationCacheEntryType.FIELD)); - } else if ((persistenceContextAnnotation = + } else if (JPA_PRESENT && (persistenceContextAnnotation = field.getAnnotation(PersistenceContext.class)) != null) { annotations.add(new AnnotationCacheEntry(field.getName(), null, - persistenceContextAnnotation.name(), + ((PersistenceContext) persistenceContextAnnotation).name(), AnnotationCacheEntryType.FIELD)); - } else if ((persistenceUnitAnnotation = + } else if (JPA_PRESENT && (persistenceUnitAnnotation = field.getAnnotation(PersistenceUnit.class)) != null) { annotations.add(new AnnotationCacheEntry(field.getName(), null, - persistenceUnitAnnotation.name(), + ((PersistenceUnit) persistenceUnitAnnotation).name(), AnnotationCacheEntryType.FIELD)); } } @@ -341,10 +372,10 @@ protected void populateAnnotationsCache(Class clazz, } } Resource resourceAnnotation; - EJB ejbAnnotation; - WebServiceRef webServiceRefAnnotation; - PersistenceContext persistenceContextAnnotation; - PersistenceUnit persistenceUnitAnnotation; + Annotation ejbAnnotation; + Annotation webServiceRefAnnotation; + Annotation persistenceContextAnnotation; + Annotation persistenceUnitAnnotation; if ((resourceAnnotation = method.getAnnotation(Resource.class)) != null) { annotations.add(new AnnotationCacheEntry( @@ -352,32 +383,33 @@ protected void populateAnnotationsCache(Class clazz, method.getParameterTypes(), resourceAnnotation.name(), AnnotationCacheEntryType.SETTER)); - } else if ((ejbAnnotation = - method.getAnnotation(EJB.class)) != null) { + } else if (EJB_PRESENT && + (ejbAnnotation = method.getAnnotation(EJB.class)) != null) { annotations.add(new AnnotationCacheEntry( method.getName(), method.getParameterTypes(), - ejbAnnotation.name(), + ((EJB) ejbAnnotation).name(), AnnotationCacheEntryType.SETTER)); - } else if ((webServiceRefAnnotation = + } else if (WS_PRESENT && (webServiceRefAnnotation = method.getAnnotation(WebServiceRef.class)) != null) { annotations.add(new AnnotationCacheEntry( method.getName(), method.getParameterTypes(), - webServiceRefAnnotation.name(), + ((WebServiceRef) webServiceRefAnnotation).name(), AnnotationCacheEntryType.SETTER)); - } else if ((persistenceContextAnnotation = + } else if (JPA_PRESENT && (persistenceContextAnnotation = method.getAnnotation(PersistenceContext.class)) != null) { annotations.add(new AnnotationCacheEntry( method.getName(), method.getParameterTypes(), - persistenceContextAnnotation.name(), + ((PersistenceContext) persistenceContextAnnotation).name(), AnnotationCacheEntryType.SETTER)); - } else if ((persistenceUnitAnnotation = method.getAnnotation(PersistenceUnit.class)) != null) { + } else if (JPA_PRESENT && (persistenceUnitAnnotation = + method.getAnnotation(PersistenceUnit.class)) != null) { annotations.add(new AnnotationCacheEntry( method.getName(), method.getParameterTypes(), - persistenceUnitAnnotation.name(), + ((PersistenceUnit) persistenceUnitAnnotation).name(), AnnotationCacheEntryType.SETTER)); } } @@ -736,7 +768,7 @@ public AnnotationCacheEntryType getType() { } - private static enum AnnotationCacheEntryType { + private enum AnnotationCacheEntryType { FIELD, SETTER, POST_CONSTRUCT, PRE_DESTROY } diff --git a/core/src/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java b/core/src/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java index bc96f02..1823687 100644 --- a/core/src/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java +++ b/core/src/main/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java @@ -20,8 +20,6 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URL; import java.net.URLConnection; import java.sql.DriverManager; import java.util.StringTokenizer; @@ -289,22 +287,17 @@ public void lifecycleEvent(LifecycleEvent event) { * - javax.xml.bind.JAXBContext.newInstance() * * https://bugs.openjdk.java.net/browse/JDK-8163449 + * + * Java 9 onwards disables caching for JAR URLConnections + * Java 8 and earlier disables caching for all URLConnections */ // Set the default URL caching policy to not to cache if (urlCacheProtection) { try { - // Doesn't matter that this JAR doesn't exist - just as - // long as the URL is well-formed - URL url = new URL("jar:file://dummy.jar!/"); - URLConnection uConn = url.openConnection(); - uConn.setDefaultUseCaches(false); - } catch (MalformedURLException e) { - log.error(sm.getString( - "jreLeakListener.jarUrlConnCacheFail"), e); + JreCompat.getInstance().disableCachingForJarUrlConnections(); } catch (IOException e) { - log.error(sm.getString( - "jreLeakListener.jarUrlConnCacheFail"), e); + log.error(sm.getString("jreLeakListener.jarUrlConnCacheFail"), e); } } diff --git a/core/src/main/java/org/apache/catalina/core/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/core/LocalStrings_es.properties index f78ea8a..f138d17 100644 --- a/core/src/main/java/org/apache/catalina/core/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/core/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + applicationContext.addFilter.ise = No se pueden a\u00F1adir filtros al contexto [{0}] ya que \u00E9ste ha sido inicializado applicationContext.addListener.iae.cnfe = No puedo crear una instancia del tipo [{0}] applicationContext.addListener.iae.wrongType = El tipo especificado [{0}] no es uno de los tipos de escuchador esperados diff --git a/core/src/main/java/org/apache/catalina/core/NamingContextListener.java b/core/src/main/java/org/apache/catalina/core/NamingContextListener.java index ebfbc4a..bd8b5ac 100644 --- a/core/src/main/java/org/apache/catalina/core/NamingContextListener.java +++ b/core/src/main/java/org/apache/catalina/core/NamingContextListener.java @@ -179,7 +179,7 @@ public void setExceptionOnFailedWrite(boolean exceptionOnFailedWrite) { * @return the "name" property. */ public String getName() { - return (this.name); + return this.name; } @@ -761,7 +761,7 @@ protected ObjectName createObjectName(ContextResource resource) ",name=" + quotedResourceName); } - return (name); + return name; } diff --git a/core/src/main/java/org/apache/catalina/core/RestrictedListeners.properties b/core/src/main/java/org/apache/catalina/core/RestrictedListeners.properties index ae1e83e..09697dc 100644 --- a/core/src/main/java/org/apache/catalina/core/RestrictedListeners.properties +++ b/core/src/main/java/org/apache/catalina/core/RestrictedListeners.properties @@ -12,3 +12,4 @@ # WITHOUT 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/core/src/main/java/org/apache/catalina/core/StandardContext.java b/core/src/main/java/org/apache/catalina/core/StandardContext.java index 869d46c..fea74eb 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardContext.java +++ b/core/src/main/java/org/apache/catalina/core/StandardContext.java @@ -370,22 +370,21 @@ public StandardContext() { * The exception pages for this web application, keyed by fully qualified * class name of the Java exception. */ - private HashMap exceptionPages = new HashMap<>(); + private Map exceptionPages = new HashMap<>(); /** * The set of filter configurations (and associated filter instances) we * have initialized, keyed by filter name. */ - private HashMap filterConfigs = - new HashMap<>(); + private Map filterConfigs = new HashMap<>(); /** * The set of filter definitions for this application, keyed by * filter name. */ - private HashMap filterDefs = new HashMap<>(); + private Map filterDefs = new HashMap<>(); /** @@ -443,7 +442,7 @@ public StandardContext() { /** * The MIME mappings for this web application, keyed by extension. */ - private HashMap mimeMappings = new HashMap<>(); + private Map mimeMappings = new HashMap<>(); /** @@ -517,7 +516,7 @@ public StandardContext() { * The security role mappings for this application, keyed by role * name (as used within the application). */ - private HashMap roleMappings = new HashMap<>(); + private Map roleMappings = new HashMap<>(); /** @@ -532,7 +531,7 @@ public StandardContext() { * The servlet mappings for this web application, keyed by * matching pattern. */ - private HashMap servletMappings = new HashMap<>(); + private Map servletMappings = new HashMap<>(); private final Object servletMappingsLock = new Object(); @@ -552,7 +551,7 @@ public StandardContext() { * HTTP status code (as an Integer). Note status code zero is used for the * default error page. */ - private HashMap statusPages = new HashMap<>(); + private Map statusPages = new HashMap<>(); /** @@ -835,7 +834,17 @@ public String getResponseCharacterEncoding() { @Override public void setResponseCharacterEncoding(String responseEncoding) { - this.responseEncoding = responseEncoding; + /* + * This ensures that the context response encoding is represented by a + * unique String object. This enables the Default Servlet to + * differentiate between a Response using this default encoding and one + * that has been explicitly configured. + */ + if (responseEncoding == null) { + this.responseEncoding = null; + } else { + this.responseEncoding = new String(responseEncoding); + } } @@ -1208,9 +1217,7 @@ public void addServletContainerInitializer( * @return true if classloading delegates to the parent classloader first */ public boolean getDelegate() { - - return (this.delegate); - + return this.delegate; } @@ -1234,9 +1241,7 @@ public void setDelegate(boolean delegate) { * @return true if the internal naming support is used. */ public boolean isUseNaming() { - - return (useNaming); - + return useNaming; } @@ -1285,7 +1290,7 @@ public void addApplicationEventListener(Object listener) { @Override public Object[] getApplicationLifecycleListeners() { - return (applicationLifecycleListenersObjects); + return applicationLifecycleListenersObjects; } @@ -1321,9 +1326,7 @@ public void addApplicationLifecycleListener(Object listener) { * @return the antiResourceLocking flag for this Context. */ public boolean getAntiResourceLocking() { - - return (this.antiResourceLocking); - + return this.antiResourceLocking; } @@ -1359,7 +1362,7 @@ public CharsetMapper getCharsetMapper() { } } - return (this.charsetMapper); + return this.charsetMapper; } @@ -1664,9 +1667,7 @@ public void setDenyUncoveredHttpMethods(boolean denyUncoveredHttpMethods) { */ @Override public String getDisplayName() { - - return (this.displayName); - + return this.displayName; } @@ -1713,9 +1714,7 @@ public void setDisplayName(String displayName) { */ @Override public boolean getDistributable() { - - return (this.distributable); - + return this.distributable; } /** @@ -1739,9 +1738,7 @@ public void setDistributable(boolean distributable) { */ @Override public String getDocBase() { - - return (this.docBase); - + return this.docBase; } @@ -1753,9 +1750,7 @@ public String getDocBase() { */ @Override public void setDocBase(String docBase) { - this.docBase = docBase; - } public String getJ2EEApplication() { @@ -1913,9 +1908,7 @@ public void setIgnoreAnnotations(boolean ignoreAnnotations) { */ @Override public LoginConfig getLoginConfig() { - - return (this.loginConfig); - + return this.loginConfig; } @@ -1972,12 +1965,10 @@ public void setLoginConfig(LoginConfig config) { */ @Override public NamingResourcesImpl getNamingResources() { - if (namingResources == null) { setNamingResources(new NamingResourcesImpl()); } - return (namingResources); - + return namingResources; } @@ -2038,7 +2029,7 @@ public void setNamingResources(NamingResourcesImpl namingResources) { */ @Override public String getPath() { - return (path); + return path; } @@ -2080,9 +2071,7 @@ public void setPath(String path) { */ @Override public String getPublicId() { - - return (this.publicId); - + return this.publicId; } @@ -2111,9 +2100,7 @@ public void setPublicId(String publicId) { */ @Override public boolean getReloadable() { - - return (this.reloadable); - + return this.reloadable; } @@ -2122,9 +2109,7 @@ public boolean getReloadable() { */ @Override public boolean getOverride() { - - return (this.override); - + return this.override; } @@ -2134,9 +2119,7 @@ public boolean getOverride() { * Is only set as deployment has change docRoot! */ public String getOriginalDocBase() { - - return (this.originalDocBase); - + return this.originalDocBase; } /** @@ -2159,13 +2142,13 @@ public void setOriginalDocBase(String docBase) { @Override public ClassLoader getParentClassLoader() { if (parentClassLoader != null) - return (parentClassLoader); + return parentClassLoader; if (getPrivileged()) { return this.getClass().getClassLoader(); } else if (parent != null) { - return (parent.getParentClassLoader()); + return parent.getParentClassLoader(); } - return (ClassLoader.getSystemClassLoader()); + return ClassLoader.getSystemClassLoader(); } @@ -2174,9 +2157,7 @@ public ClassLoader getParentClassLoader() { */ @Override public boolean getPrivileged() { - - return (this.privileged); - + return this.privileged; } @@ -2252,14 +2233,12 @@ public void setReplaceWelcomeFiles(boolean replaceWelcomeFiles) { */ @Override public ServletContext getServletContext() { - if (context == null) { context = new ApplicationContext(this); if (altDDName != null) context.setAttribute(Globals.ALT_DD_ATTR,altDDName); } - return (context.getFacade()); - + return context.getFacade(); } @@ -2269,9 +2248,7 @@ public ServletContext getServletContext() { */ @Override public int getSessionTimeout() { - - return (this.sessionTimeout); - + return this.sessionTimeout; } @@ -2303,9 +2280,7 @@ public void setSessionTimeout(int timeout) { */ @Override public boolean getSwallowOutput() { - - return (this.swallowOutput); - + return this.swallowOutput; } @@ -2332,9 +2307,7 @@ public void setSwallowOutput(boolean swallowOutput) { * @return the value of the unloadDelay flag. */ public long getUnloadDelay() { - - return (this.unloadDelay); - + return this.unloadDelay; } @@ -2361,9 +2334,7 @@ public void setUnloadDelay(long unloadDelay) { * @return unpack WAR flag. */ public boolean getUnpackWAR() { - - return (unpackWAR); - + return unpackWAR; } @@ -2373,9 +2344,7 @@ public boolean getUnpackWAR() { * @param unpackWAR true to unpack WARs on deployment */ public void setUnpackWAR(boolean unpackWAR) { - this.unpackWAR = unpackWAR; - } @@ -2408,9 +2377,7 @@ public void setCopyXML(boolean copyXML) { */ @Override public String getWrapperClass() { - - return (this.wrapperClassName); - + return this.wrapperClassName; } @@ -2533,9 +2500,7 @@ public void setJndiExceptionOnFailedWrite( * @return the Locale to character set mapper class for this Context. */ public String getCharsetMapperClass() { - - return (this.charsetMapperClass); - + return this.charsetMapperClass; } @@ -2581,9 +2546,7 @@ public String getWorkPath() { * @return the work directory for this Context. */ public String getWorkDir() { - - return (this.workDir); - + return this.workDir; } @@ -2619,9 +2582,7 @@ public void setClearReferencesRmiTargets(boolean clearReferencesRmiTargets) { * @return the clearReferencesStopThreads flag for this Context. */ public boolean getClearReferencesStopThreads() { - - return (this.clearReferencesStopThreads); - + return this.clearReferencesStopThreads; } @@ -2646,7 +2607,7 @@ public void setClearReferencesStopThreads( * @return the clearReferencesStopTimerThreads flag for this Context. */ public boolean getClearReferencesStopTimerThreads() { - return (this.clearReferencesStopTimerThreads); + return this.clearReferencesStopTimerThreads; } @@ -2672,7 +2633,7 @@ public void setClearReferencesStopTimerThreads( * Context. */ public boolean getClearReferencesHttpClientKeepAliveThread() { - return (this.clearReferencesHttpClientKeepAliveThread); + return this.clearReferencesHttpClientKeepAliveThread; } @@ -2855,10 +2816,7 @@ public void addConstraint(SecurityConstraint constraint) { // Add this constraint to the set for our web application synchronized (constraintsLock) { - SecurityConstraint results[] = - new SecurityConstraint[constraints.length + 1]; - for (int i = 0; i < constraints.length; i++) - results[i] = constraints[i]; + SecurityConstraint[] results = Arrays.copyOf(constraints, constraints.length + 1); results[constraints.length] = constraint; constraints = results; } @@ -3113,9 +3071,7 @@ public void addRoleMapping(String role, String link) { public void addSecurityRole(String role) { synchronized (securityRolesLock) { - String results[] =new String[securityRoles.length + 1]; - for (int i = 0; i < securityRoles.length; i++) - results[i] = securityRoles[i]; + String[] results = Arrays.copyOf(securityRoles, securityRoles.length + 1); results[securityRoles.length] = role; securityRoles = results; } @@ -3174,9 +3130,7 @@ public void addServletMappingDecoded(String pattern, String name, public void addWatchedResource(String name) { synchronized (watchedResourcesLock) { - String results[] = new String[watchedResources.length + 1]; - for (int i = 0; i < watchedResources.length; i++) - results[i] = watchedResources[i]; + String[] results = Arrays.copyOf(watchedResources, watchedResources.length + 1); results[watchedResources.length] = name; watchedResources = results; } @@ -3200,9 +3154,7 @@ public void addWelcomeFile(String name) { welcomeFiles = new String[0]; setReplaceWelcomeFiles(false); } - String results[] =new String[welcomeFiles.length + 1]; - for (int i = 0; i < welcomeFiles.length; i++) - results[i] = welcomeFiles[i]; + String[] results = Arrays.copyOf(welcomeFiles, welcomeFiles.length + 1); results[welcomeFiles.length] = name; welcomeFiles = results; } @@ -3221,9 +3173,7 @@ public void addWelcomeFile(String name) { public void addWrapperLifecycle(String listener) { synchronized (wrapperLifecyclesLock) { - String results[] =new String[wrapperLifecycles.length + 1]; - for (int i = 0; i < wrapperLifecycles.length; i++) - results[i] = wrapperLifecycles[i]; + String[] results = Arrays.copyOf(wrapperLifecycles, wrapperLifecycles.length + 1); results[wrapperLifecycles.length] = listener; wrapperLifecycles = results; } @@ -3242,9 +3192,7 @@ public void addWrapperLifecycle(String listener) { public void addWrapperListener(String listener) { synchronized (wrapperListenersLock) { - String results[] =new String[wrapperListeners.length + 1]; - for (int i = 0; i < wrapperListeners.length; i++) - results[i] = wrapperListeners[i]; + String[] results = Arrays.copyOf(wrapperListeners, wrapperListeners.length + 1); results[wrapperListeners.length] = listener; wrapperListeners = results; } @@ -3326,7 +3274,7 @@ public String[] findApplicationListeners() { public ApplicationParameter[] findApplicationParameters() { synchronized (applicationParametersLock) { - return (applicationParameters); + return applicationParameters; } } @@ -3338,9 +3286,7 @@ public ApplicationParameter[] findApplicationParameters() { */ @Override public SecurityConstraint[] findConstraints() { - - return (constraints); - + return constraints; } @@ -3364,11 +3310,9 @@ public ErrorPage findErrorPage(int errorCode) { */ @Override public ErrorPage findErrorPage(String exceptionType) { - synchronized (exceptionPages) { - return (exceptionPages.get(exceptionType)); + return exceptionPages.get(exceptionType); } - } @@ -3391,7 +3335,7 @@ public ErrorPage[] findErrorPages() { results[i] = results1[i]; for (int i = results1.length; i < results.length; i++) results[i] = results2[i - results1.length]; - return (results); + return results; } } @@ -3406,11 +3350,9 @@ public ErrorPage[] findErrorPages() { */ @Override public FilterDef findFilterDef(String filterName) { - synchronized (filterDefs) { - return (filterDefs.get(filterName)); + return filterDefs.get(filterName); } - } @@ -3419,12 +3361,10 @@ public FilterDef findFilterDef(String filterName) { */ @Override public FilterDef[] findFilterDefs() { - synchronized (filterDefs) { FilterDef results[] = new FilterDef[filterDefs.size()]; - return (filterDefs.values().toArray(results)); + return filterDefs.values().toArray(results); } - } @@ -3444,11 +3384,9 @@ public FilterMap[] findFilterMaps() { * @param name Name of the desired message destination */ public MessageDestination findMessageDestination(String name) { - synchronized (messageDestinations) { - return (messageDestinations.get(name)); + return messageDestinations.get(name); } - } @@ -3458,13 +3396,11 @@ public MessageDestination findMessageDestination(String name) { * is returned. */ public MessageDestination[] findMessageDestinations() { - synchronized (messageDestinations) { MessageDestination results[] = new MessageDestination[messageDestinations.size()]; - return (messageDestinations.values().toArray(results)); + return messageDestinations.values().toArray(results); } - } @@ -3475,9 +3411,7 @@ public MessageDestination[] findMessageDestinations() { * @param name Name of the desired message destination ref */ public MessageDestinationRef findMessageDestinationRef(String name) { - return namingResources.findMessageDestinationRef(name); - } @@ -3487,9 +3421,7 @@ public MessageDestinationRef findMessageDestinationRef(String name) { * is returned. */ public MessageDestinationRef[] findMessageDestinationRefs() { - return namingResources.findMessageDestinationRefs(); - } @@ -3501,9 +3433,7 @@ public MessageDestinationRef[] findMessageDestinationRefs() { */ @Override public String findMimeMapping(String extension) { - - return (mimeMappings.get(extension.toLowerCase(Locale.ENGLISH))); - + return mimeMappings.get(extension.toLowerCase(Locale.ENGLISH)); } @@ -3513,13 +3443,10 @@ public String findMimeMapping(String extension) { */ @Override public String[] findMimeMappings() { - synchronized (mimeMappings) { String results[] = new String[mimeMappings.size()]; - return - (mimeMappings.keySet().toArray(results)); + return mimeMappings.keySet().toArray(results); } - } @@ -3558,16 +3485,14 @@ public String[] findParameters() { */ @Override public String findRoleMapping(String role) { - String realRole = null; synchronized (roleMappings) { realRole = roleMappings.get(role); } if (realRole != null) - return (realRole); + return realRole; else - return (role); - + return role; } @@ -3597,11 +3522,9 @@ public boolean findSecurityRole(String role) { */ @Override public String[] findSecurityRoles() { - synchronized (securityRolesLock) { - return (securityRoles); + return securityRoles; } - } @@ -3613,11 +3536,9 @@ public String[] findSecurityRoles() { */ @Override public String findServletMapping(String pattern) { - synchronized (servletMappingsLock) { - return (servletMappings.get(pattern)); + return servletMappings.get(pattern); } - } @@ -3627,13 +3548,10 @@ public String findServletMapping(String pattern) { */ @Override public String[] findServletMappings() { - synchronized (servletMappingsLock) { String results[] = new String[servletMappings.size()]; - return - (servletMappings.keySet().toArray(results)); + return servletMappings.keySet().toArray(results); } - } @@ -3662,16 +3580,14 @@ public String findStatusPage(int status) { */ @Override public int[] findStatusPages() { - synchronized (statusPages) { int results[] = new int[statusPages.size()]; Iterator elements = statusPages.keySet().iterator(); int i = 0; while (elements.hasNext()) results[i++] = elements.next().intValue(); - return (results); + return results; } - } @@ -3713,11 +3629,9 @@ public String[] findWatchedResources() { */ @Override public String[] findWelcomeFiles() { - synchronized (welcomeFilesLock) { - return (welcomeFiles); + return welcomeFiles; } - } @@ -3727,11 +3641,9 @@ public String[] findWelcomeFiles() { */ @Override public String[] findWrapperLifecycles() { - synchronized (wrapperLifecyclesLock) { - return (wrapperLifecycles); + return wrapperLifecycles; } - } @@ -3741,11 +3653,9 @@ public String[] findWrapperLifecycles() { */ @Override public String[] findWrapperListeners() { - synchronized (wrapperListenersLock) { - return (wrapperListeners); + return wrapperListeners; } - } @@ -4627,9 +4537,7 @@ public boolean filterStop() { * @return the filter config object */ public FilterConfig findFilterConfig(String name) { - - return (filterConfigs.get(name)); - + return filterConfigs.get(name); } @@ -4669,8 +4577,8 @@ public boolean listenerStart() { } // Sort listeners in two arrays - ArrayList eventListeners = new ArrayList<>(); - ArrayList lifecycleListeners = new ArrayList<>(); + List eventListeners = new ArrayList<>(); + List lifecycleListeners = new ArrayList<>(); for (int i = 0; i < results.length; i++) { if ((results[i] instanceof ServletContextAttributeListener) || (results[i] instanceof ServletRequestAttributeListener) @@ -4744,7 +4652,7 @@ public boolean listenerStart() { ok = false; } } - return (ok); + return ok; } @@ -4966,6 +4874,9 @@ protected synchronized void startInternal() throws LifecycleException { namingResources.start(); } + // Post work directory + postWorkDirectory(); + // Add missing components as necessary if (getResources() == null) { // (1) Required by Loader if (log.isDebugEnabled()) @@ -4996,9 +4907,6 @@ protected synchronized void startInternal() throws LifecycleException { // Initialize character set mapper getCharsetMapper(); - // Post work directory - postWorkDirectory(); - // Validate required extensions boolean dependencyCheck = true; try { @@ -5638,15 +5546,15 @@ private void resetContext() throws Exception { protected String adjustURLPattern(String urlPattern) { if (urlPattern == null) - return (urlPattern); + return urlPattern; if (urlPattern.startsWith("/") || urlPattern.startsWith("*.")) - return (urlPattern); + return urlPattern; if (!isServlet22()) - return (urlPattern); + return urlPattern; if(log.isDebugEnabled()) log.debug(sm.getString("standardContext.urlPattern.patternWarning", urlPattern)); - return ("/" + urlPattern); + return "/" + urlPattern; } @@ -5902,9 +5810,7 @@ public void setNamingContextListener(NamingContextListener namingContextListener */ @Override public boolean getPaused() { - - return (this.paused); - + return this.paused; } @@ -6149,8 +6055,7 @@ private boolean validateURLPattern(String urlPattern) { } else return false; } - if ( (urlPattern.startsWith("/")) && - (urlPattern.indexOf("*.") < 0)) { + if (urlPattern.startsWith("/") && !urlPattern.contains("*.")) { checkUnusualURLPattern(urlPattern); return true; } else diff --git a/core/src/main/java/org/apache/catalina/core/StandardEngine.java b/core/src/main/java/org/apache/catalina/core/StandardEngine.java index c3e403b..2522de6 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardEngine.java +++ b/core/src/main/java/org/apache/catalina/core/StandardEngine.java @@ -131,9 +131,7 @@ public Realm getRealm() { */ @Override public String getDefaultHost() { - - return (defaultHost); - + return defaultHost; } @@ -184,9 +182,7 @@ public String getJvmRoute() { */ @Override public Service getService() { - - return (this.service); - + return this.service; } @@ -337,11 +333,11 @@ public void logAccess(Request request, Response response, long time, @Override public ClassLoader getParentClassLoader() { if (parentClassLoader != null) - return (parentClassLoader); + return parentClassLoader; if (service != null) { - return (service.getParentClassLoader()); + return service.getParentClassLoader(); } - return (ClassLoader.getSystemClassLoader()); + return ClassLoader.getSystemClassLoader(); } diff --git a/core/src/main/java/org/apache/catalina/core/StandardHost.java b/core/src/main/java/org/apache/catalina/core/StandardHost.java index 89ceb97..33eb501 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardHost.java +++ b/core/src/main/java/org/apache/catalina/core/StandardHost.java @@ -19,6 +19,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Map; @@ -212,7 +213,7 @@ public ExecutorService getStartStopExecutor() { */ @Override public String getAppBase() { - return (this.appBase); + return this.appBase; } @@ -272,9 +273,7 @@ public void setAppBase(String appBase) { */ @Override public String getXmlBase() { - - return (this.xmlBase); - + return this.xmlBase; } @@ -288,11 +287,9 @@ public String getXmlBase() { */ @Override public void setXmlBase(String xmlBase) { - String oldXmlBase = this.xmlBase; this.xmlBase = xmlBase; support.firePropertyChange("xmlBase", oldXmlBase, this.xmlBase); - } @@ -354,9 +351,7 @@ public void setCreateDirs(boolean createDirs) { */ @Override public boolean getAutoDeploy() { - - return (this.autoDeploy); - + return this.autoDeploy; } @@ -382,9 +377,7 @@ public void setAutoDeploy(boolean autoDeploy) { */ @Override public String getConfigClass() { - - return (this.configClass); - + return this.configClass; } @@ -410,9 +403,7 @@ public void setConfigClass(String configClass) { * for new web applications. */ public String getContextClass() { - - return (this.contextClass); - + return this.contextClass; } @@ -439,9 +430,7 @@ public void setContextClass(String contextClass) { */ @Override public boolean getDeployOnStartup() { - - return (this.deployOnStartup); - + return this.deployOnStartup; } @@ -465,9 +454,7 @@ public void setDeployOnStartup(boolean deployOnStartup) { * @return true if XML context descriptors should be deployed. */ public boolean isDeployXML() { - return deployXML; - } @@ -477,9 +464,7 @@ public boolean isDeployXML() { * @param deployXML true if context descriptors should be deployed */ public void setDeployXML(boolean deployXML) { - this.deployXML = deployXML; - } @@ -487,9 +472,7 @@ public void setDeployXML(boolean deployXML) { * @return the copy XML config file flag for this component. */ public boolean isCopyXML() { - return this.copyXML; - } @@ -499,9 +482,7 @@ public boolean isCopyXML() { * @param copyXML The new copy XML flag */ public void setCopyXML(boolean copyXML) { - this.copyXML = copyXML; - } @@ -510,9 +491,7 @@ public void setCopyXML(boolean copyXML) { * for new web applications. */ public String getErrorReportValveClass() { - - return (this.errorReportValveClass); - + return this.errorReportValveClass; } @@ -539,9 +518,7 @@ public void setErrorReportValveClass(String errorReportValveClass) { */ @Override public String getName() { - - return (name); - + return name; } @@ -573,9 +550,7 @@ public void setName(String name) { * @return true if WARs should be unpacked on deployment. */ public boolean isUnpackWARs() { - - return (unpackWARs); - + return unpackWARs; } @@ -585,9 +560,7 @@ public boolean isUnpackWARs() { * @param unpackWARs true to unpack WARs on deployment */ public void setUnpackWARs(boolean unpackWARs) { - this.unpackWARs = unpackWARs; - } @@ -595,8 +568,7 @@ public void setUnpackWARs(boolean unpackWARs) { * @return host work directory base. */ public String getWorkDir() { - - return (workDir); + return workDir; } @@ -606,7 +578,6 @@ public String getWorkDir() { * @param workDir the new base work folder for this host */ public void setWorkDir(String workDir) { - this.workDir = workDir; } @@ -705,9 +676,7 @@ public void addAlias(String alias) { return; } // Add this alias to the list - String newAliases[] = new String[aliases.length + 1]; - for (int i = 0; i < aliases.length; i++) - newAliases[i] = aliases[i]; + String newAliases[] = Arrays.copyOf(aliases, aliases.length + 1); newAliases[aliases.length] = alias; aliases = newAliases; } @@ -787,11 +756,9 @@ public String[] findReloadedContextMemoryLeaks() { */ @Override public String[] findAliases() { - synchronized (aliasesLock) { - return (this.aliases); + return this.aliases; } - } diff --git a/core/src/main/java/org/apache/catalina/core/StandardHostValve.java b/core/src/main/java/org/apache/catalina/core/StandardHostValve.java index 6b164fe..7b6ea52 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardHostValve.java +++ b/core/src/main/java/org/apache/catalina/core/StandardHostValve.java @@ -424,14 +424,14 @@ private boolean custom(Request request, Response response, (Context context, Throwable exception) { if (exception == null) { - return (null); + return null; } Class clazz = exception.getClass(); String name = clazz.getName(); while (!Object.class.equals(clazz)) { ErrorPage errorPage = context.findErrorPage(name); if (errorPage != null) { - return (errorPage); + return errorPage; } clazz = clazz.getSuperclass(); if (clazz == null) { @@ -439,7 +439,7 @@ private boolean custom(Request request, Response response, } name = clazz.getName(); } - return (null); + return null; } } diff --git a/core/src/main/java/org/apache/catalina/core/StandardPipeline.java b/core/src/main/java/org/apache/catalina/core/StandardPipeline.java index add2ccc..1c3354f 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardPipeline.java +++ b/core/src/main/java/org/apache/catalina/core/StandardPipeline.java @@ -20,6 +20,7 @@ import java.util.ArrayList; +import java.util.List; import java.util.Set; import javax.management.ObjectName; @@ -137,9 +138,7 @@ public void findNonAsyncValves(Set result) { */ @Override public Container getContainer() { - - return (this.container); - + return this.container; } @@ -150,9 +149,7 @@ public Container getContainer() { */ @Override public void setContainer(Container container) { - this.container = container; - } @@ -239,9 +236,7 @@ public String toString() { */ @Override public Valve getBasic() { - - return (this.basic); - + return this.basic; } @@ -378,7 +373,7 @@ public void addValve(Valve valve) { @Override public Valve[] getValves() { - ArrayList valveList = new ArrayList<>(); + List valveList = new ArrayList<>(); Valve current = first; if (current == null) { current = basic; @@ -394,7 +389,7 @@ public Valve[] getValves() { public ObjectName[] getValveObjectNames() { - ArrayList valveList = new ArrayList<>(); + List valveList = new ArrayList<>(); Valve current = first; if (current == null) { current = basic; diff --git a/core/src/main/java/org/apache/catalina/core/StandardServer.java b/core/src/main/java/org/apache/catalina/core/StandardServer.java index 9a3c9ec..82f4ff7 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardServer.java +++ b/core/src/main/java/org/apache/catalina/core/StandardServer.java @@ -187,9 +187,7 @@ public Object getNamingToken() { */ @Override public javax.naming.Context getGlobalNamingContext() { - - return (this.globalNamingContext); - + return this.globalNamingContext; } @@ -198,11 +196,8 @@ public javax.naming.Context getGlobalNamingContext() { * * @param globalNamingContext The new global naming resource context */ - public void setGlobalNamingContext - (javax.naming.Context globalNamingContext) { - + public void setGlobalNamingContext(javax.naming.Context globalNamingContext) { this.globalNamingContext = globalNamingContext; - } @@ -211,9 +206,7 @@ public javax.naming.Context getGlobalNamingContext() { */ @Override public NamingResourcesImpl getGlobalNamingResources() { - - return (this.globalNamingResources); - + return this.globalNamingResources; } @@ -269,9 +262,7 @@ public String getServerNumber() { */ @Override public int getPort() { - - return (this.port); - + return this.port; } @@ -282,9 +273,7 @@ public int getPort() { */ @Override public void setPort(int port) { - this.port = port; - } @@ -293,9 +282,7 @@ public void setPort(int port) { */ @Override public String getAddress() { - - return (this.address); - + return this.address; } @@ -306,9 +293,7 @@ public String getAddress() { */ @Override public void setAddress(String address) { - this.address = address; - } /** @@ -316,9 +301,7 @@ public void setAddress(String address) { */ @Override public String getShutdown() { - - return (this.shutdown); - + return this.shutdown; } @@ -329,9 +312,7 @@ public String getShutdown() { */ @Override public void setShutdown(String shutdown) { - this.shutdown = shutdown; - } @@ -552,19 +533,17 @@ public void await() { */ @Override public Service findService(String name) { - if (name == null) { - return (null); + return null; } synchronized (servicesLock) { for (int i = 0; i < services.length; i++) { if (name.equals(services[i].getName())) { - return (services[i]); + return services[i]; } } } - return (null); - + return null; } @@ -689,12 +668,10 @@ public void removePropertyChangeListener(PropertyChangeListener listener) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("StandardServer["); sb.append(getPort()); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } @@ -898,11 +875,11 @@ protected void destroyInternal() throws LifecycleException { @Override public ClassLoader getParentClassLoader() { if (parentClassLoader != null) - return (parentClassLoader); + return parentClassLoader; if (catalina != null) { - return (catalina.getParentClassLoader()); + return catalina.getParentClassLoader(); } - return (ClassLoader.getSystemClassLoader()); + return ClassLoader.getSystemClassLoader(); } /** diff --git a/core/src/main/java/org/apache/catalina/core/StandardService.java b/core/src/main/java/org/apache/catalina/core/StandardService.java index 6f1e805..b8852f8 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardService.java +++ b/core/src/main/java/org/apache/catalina/core/StandardService.java @@ -327,7 +327,7 @@ public String toString() { StringBuilder sb = new StringBuilder("StandardService["); sb.append(getName()); sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/catalina/core/StandardWrapper.java b/core/src/main/java/org/apache/catalina/core/StandardWrapper.java index a0715c5..0d0a6c3 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardWrapper.java +++ b/core/src/main/java/org/apache/catalina/core/StandardWrapper.java @@ -25,6 +25,7 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; +import java.util.Set; import java.util.Stack; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -298,9 +299,7 @@ public void setOverridable(boolean overridable) { */ @Override public long getAvailable() { - - return (this.available); - + return this.available; } @@ -315,7 +314,6 @@ public long getAvailable() { */ @Override public void setAvailable(long available) { - long oldAvailable = this.available; if (available > System.currentTimeMillis()) this.available = available; @@ -323,7 +321,6 @@ public void setAvailable(long available) { this.available = 0L; support.firePropertyChange("available", Long.valueOf(oldAvailable), Long.valueOf(this.available)); - } @@ -352,7 +349,7 @@ public int getLoadOnStartup() { */ return Integer.MAX_VALUE; } else { - return (this.loadOnStartup); + return this.loadOnStartup; } } @@ -406,9 +403,7 @@ public String getLoadOnStartupString() { * thread model servlet is used. */ public int getMaxInstances() { - - return (this.maxInstances); - + return this.maxInstances; } @@ -454,9 +449,7 @@ public void setParent(Container container) { */ @Override public String getRunAs() { - - return (this.runAs); - + return this.runAs; } @@ -480,9 +473,7 @@ public void setRunAs(String runAs) { */ @Override public String getServletClass() { - - return (this.servletClass); - + return this.servletClass; } @@ -570,7 +561,7 @@ public String[] getServletMethods() throws ServletException { return DEFAULT_SERVLET_METHODS; } - HashSet allow = new HashSet<>(); + Set allow = new HashSet<>(); allow.add("TRACE"); allow.add("OPTIONS"); @@ -1081,9 +1072,9 @@ public synchronized Servlet loadServlet() throws ServletException { processServletSecurityAnnotation(servlet.getClass()); // Special handling for ContainerServlet instances - if ((servlet instanceof ContainerServlet) && - (isContainerProvidedServlet(servletClass) || - ((Context) getParent()).getPrivileged() )) { + // Note: The InstanceManager checks if the application is permitted + // to load ContainerServlets + if (servlet instanceof ContainerServlet) { ((ContainerServlet) servlet).setWrapper(this); } @@ -1435,9 +1426,7 @@ public synchronized void unload() throws ServletException { */ @Override public String getInitParameter(String name) { - - return (findInitParameter(name)); - + return findInitParameter(name); } @@ -1463,14 +1452,12 @@ public Enumeration getInitParameterNames() { */ @Override public ServletContext getServletContext() { - if (parent == null) - return (null); + return null; else if (!(parent instanceof Context)) - return (null); + return null; else - return (((Context) parent).getServletContext()); - + return ((Context) parent).getServletContext(); } @@ -1479,9 +1466,7 @@ else if (!(parent instanceof Context)) */ @Override public String getServletName() { - - return (getName()); - + return getName(); } public long getProcessingTime() { @@ -1557,30 +1542,6 @@ public void setEnabled(boolean enabled) { // -------------------------------------------------------- protected Methods - /** - * @return true if the specified class name represents a - * container provided servlet class that should be loaded by the - * server class loader. - * - * @param classname Name of the class to be checked - */ - protected boolean isContainerProvidedServlet(String classname) { - - if (classname.startsWith("org.apache.catalina.")) { - return true; - } - try { - Class clazz = - this.getClass().getClassLoader().loadClass(classname); - return (ContainerServlet.class.isAssignableFrom(clazz)); - } catch (Throwable t) { - ExceptionUtils.handleThrowable(t); - return false; - } - - } - - protected Method[] getAllDeclaredMethods(Class c) { if (c.equals(javax.servlet.http.HttpServlet.class)) { @@ -1726,7 +1687,7 @@ private String getWebModuleKeyProperties() { keyProperties.append(hostName); } - String contextName = ((Context) getParent()).getName(); + String contextName = getParent().getName(); if (!contextName.startsWith("/")) { keyProperties.append('/'); } diff --git a/core/src/main/java/org/apache/catalina/core/StandardWrapperFacade.java b/core/src/main/java/org/apache/catalina/core/StandardWrapperFacade.java index f48b303..7dc506f 100644 --- a/core/src/main/java/org/apache/catalina/core/StandardWrapperFacade.java +++ b/core/src/main/java/org/apache/catalina/core/StandardWrapperFacade.java @@ -81,7 +81,7 @@ public ServletContext getServletContext() { context = ((ApplicationContext) context).getFacade(); } } - return (context); + return context; } diff --git a/core/src/main/java/org/apache/catalina/core/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/core/mbeans-descriptors.xml index e156ade..d606e7c 100644 --- a/core/src/main/java/org/apache/catalina/core/mbeans-descriptors.xml +++ b/core/src/main/java/org/apache/catalina/core/mbeans-descriptors.xml @@ -264,11 +264,6 @@ description="The J2EE Server this module is deployed on" type="java.lang.String"/> - - @@ -1670,11 +1665,11 @@ diff --git a/core/src/main/java/org/apache/catalina/deploy/LocalStrings.properties b/core/src/main/java/org/apache/catalina/deploy/LocalStrings.properties index 3393e52..ddcdf76 100644 --- a/core/src/main/java/org/apache/catalina/deploy/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/deploy/LocalStrings.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + namingResources.cleanupCloseFailed=Failed to invoke method [{0}] for resource [{1}] in container [{2}] so no cleanup was performed for that resource namingResources.cleanupCloseSecurity=Unable to retrieve method [{0}] for resource [{1}] in container [{2}] so no cleanup was performed for that resource namingResources.cleanupNoClose=Resource [{0}] in container [{1}] does not have a [{2}] method so no cleanup was performed for that resource diff --git a/core/src/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java b/core/src/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java index 0817523..50aec72 100644 --- a/core/src/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java +++ b/core/src/main/java/org/apache/catalina/deploy/NamingResourcesImpl.java @@ -24,6 +24,7 @@ import java.lang.reflect.Method; import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import javax.naming.NamingException; @@ -103,27 +104,27 @@ public NamingResourcesImpl() { /** * The EJB resource references for this web application, keyed by name. */ - private final HashMap ejbs = new HashMap<>(); + private final Map ejbs = new HashMap<>(); /** * The environment entries for this web application, keyed by name. */ - private final HashMap envs = new HashMap<>(); + private final Map envs = new HashMap<>(); /** * The local EJB resource references for this web application, keyed by * name. */ - private final HashMap localEjbs = new HashMap<>(); + private final Map localEjbs = new HashMap<>(); /** * The message destination references for this web application, * keyed by name. */ - private final HashMap mdrs = new HashMap<>(); + private final Map mdrs = new HashMap<>(); /** diff --git a/core/src/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java b/core/src/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java index 930093c..c7469df 100644 --- a/core/src/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java +++ b/core/src/main/java/org/apache/catalina/filters/AddDefaultCharsetFilter.java @@ -108,7 +108,7 @@ public ResponseWrapper(HttpServletResponse response, String encoding) { public void setContentType(String ct) { if (ct != null && ct.startsWith("text/")) { - if (ct.indexOf("charset=") < 0) { + if (!ct.contains("charset=")) { super.setContentType(ct + ";charset=" + encoding); } else { super.setContentType(ct); @@ -120,6 +120,24 @@ public void setContentType(String ct) { } + @Override + public void setHeader(String name, String value) { + if (name.trim().equalsIgnoreCase("content-type")) { + setContentType(value); + } else { + super.setHeader(name, value); + } + } + + @Override + public void addHeader(String name, String value) { + if (name.trim().equalsIgnoreCase("content-type")) { + setContentType(value); + } else { + super.addHeader(name, value); + } + } + @Override public void setCharacterEncoding(String charset) { super.setCharacterEncoding(charset); diff --git a/core/src/main/java/org/apache/catalina/filters/CorsFilter.java b/core/src/main/java/org/apache/catalina/filters/CorsFilter.java index 0c1b2e9..9fa4c96 100644 --- a/core/src/main/java/org/apache/catalina/filters/CorsFilter.java +++ b/core/src/main/java/org/apache/catalina/filters/CorsFilter.java @@ -178,24 +178,40 @@ public void doFilter(final ServletRequest servletRequest, @Override public void init() throws ServletException { - // Initialize defaults - parseAndStore(DEFAULT_ALLOWED_ORIGINS, DEFAULT_ALLOWED_HTTP_METHODS, - DEFAULT_ALLOWED_HTTP_HEADERS, DEFAULT_EXPOSED_HEADERS, - DEFAULT_SUPPORTS_CREDENTIALS, DEFAULT_PREFLIGHT_MAXAGE, - DEFAULT_DECORATE_REQUEST); - - String configAllowedOrigins = getInitParameter(PARAM_CORS_ALLOWED_ORIGINS); - String configAllowedHttpMethods = getInitParameter(PARAM_CORS_ALLOWED_METHODS); - String configAllowedHttpHeaders = getInitParameter(PARAM_CORS_ALLOWED_HEADERS); - String configExposedHeaders = getInitParameter(PARAM_CORS_EXPOSED_HEADERS); - String configSupportsCredentials = getInitParameter(PARAM_CORS_SUPPORT_CREDENTIALS); - String configPreflightMaxAge = getInitParameter(PARAM_CORS_PREFLIGHT_MAXAGE); - String configDecorateRequest = getInitParameter(PARAM_CORS_REQUEST_DECORATE); - - parseAndStore(configAllowedOrigins, configAllowedHttpMethods, - configAllowedHttpHeaders, configExposedHeaders, - configSupportsCredentials, configPreflightMaxAge, - configDecorateRequest); + parseAndStore( + getInitParameter(PARAM_CORS_ALLOWED_ORIGINS, DEFAULT_ALLOWED_ORIGINS), + getInitParameter(PARAM_CORS_ALLOWED_METHODS, DEFAULT_ALLOWED_HTTP_METHODS), + getInitParameter(PARAM_CORS_ALLOWED_HEADERS, DEFAULT_ALLOWED_HTTP_HEADERS), + getInitParameter(PARAM_CORS_EXPOSED_HEADERS, DEFAULT_EXPOSED_HEADERS), + getInitParameter(PARAM_CORS_SUPPORT_CREDENTIALS, DEFAULT_SUPPORTS_CREDENTIALS), + getInitParameter(PARAM_CORS_PREFLIGHT_MAXAGE, DEFAULT_PREFLIGHT_MAXAGE), + getInitParameter(PARAM_CORS_REQUEST_DECORATE, DEFAULT_DECORATE_REQUEST) + ); + } + + + /** + * This method returns the parameter's value if it exists, or defaultValue + * if not. + * + * @param filterConfig The configuration for the filter + * + * @param name The parameter's name + * + * @param defaultValue The default value to return if the parameter does + * not exist + * + * @return The parameter's value or the default value if the parameter does + * not exist + */ + private String getInitParameter(String name, String defaultValue){ + + String value = getInitParameter(name); + if (value != null) { + return value; + } + + return defaultValue; } @@ -277,6 +293,10 @@ protected void handleSimpleCORS(final HttpServletRequest request, exposedHeadersString); } + // Indicate the response depends on the origin + response.addHeader(CorsFilter.REQUEST_HEADER_VARY, + CorsFilter.REQUEST_HEADER_ORIGIN); + // Forward the request down the filter chain. filterChain.doFilter(request, response); } @@ -714,66 +734,49 @@ private void parseAndStore(final String allowedOrigins, final String exposedHeaders, final String supportsCredentials, final String preflightMaxAge, final String decorateRequest) throws ServletException { - if (allowedOrigins != null) { - if (allowedOrigins.trim().equals("*")) { - this.anyOriginAllowed = true; - } else { - this.anyOriginAllowed = false; - Set setAllowedOrigins = - parseStringToSet(allowedOrigins); - this.allowedOrigins.clear(); - this.allowedOrigins.addAll(setAllowedOrigins); - } - } - if (allowedHttpMethods != null) { - Set setAllowedHttpMethods = - parseStringToSet(allowedHttpMethods); - this.allowedHttpMethods.clear(); - this.allowedHttpMethods.addAll(setAllowedHttpMethods); + if (allowedOrigins.trim().equals("*")) { + this.anyOriginAllowed = true; + } else { + this.anyOriginAllowed = false; + Set setAllowedOrigins = parseStringToSet(allowedOrigins); + this.allowedOrigins.clear(); + this.allowedOrigins.addAll(setAllowedOrigins); } - if (allowedHttpHeaders != null) { - Set setAllowedHttpHeaders = - parseStringToSet(allowedHttpHeaders); - Set lowerCaseHeaders = new HashSet<>(); - for (String header : setAllowedHttpHeaders) { - String lowerCase = header.toLowerCase(Locale.ENGLISH); - lowerCaseHeaders.add(lowerCase); - } - this.allowedHttpHeaders.clear(); - this.allowedHttpHeaders.addAll(lowerCaseHeaders); - } + Set setAllowedHttpMethods = parseStringToSet(allowedHttpMethods); + this.allowedHttpMethods.clear(); + this.allowedHttpMethods.addAll(setAllowedHttpMethods); - if (exposedHeaders != null) { - Set setExposedHeaders = parseStringToSet(exposedHeaders); - this.exposedHeaders.clear(); - this.exposedHeaders.addAll(setExposedHeaders); + Set setAllowedHttpHeaders = parseStringToSet(allowedHttpHeaders); + Set lowerCaseHeaders = new HashSet<>(); + for (String header : setAllowedHttpHeaders) { + String lowerCase = header.toLowerCase(Locale.ENGLISH); + lowerCaseHeaders.add(lowerCase); } + this.allowedHttpHeaders.clear(); + this.allowedHttpHeaders.addAll(lowerCaseHeaders); - if (supportsCredentials != null) { - // For any value other then 'true' this will be false. - this.supportsCredentials = Boolean - .parseBoolean(supportsCredentials); - } + Set setExposedHeaders = parseStringToSet(exposedHeaders); + this.exposedHeaders.clear(); + this.exposedHeaders.addAll(setExposedHeaders); - if (preflightMaxAge != null) { - try { - if (!preflightMaxAge.isEmpty()) { - this.preflightMaxAge = Long.parseLong(preflightMaxAge); - } else { - this.preflightMaxAge = 0L; - } - } catch (NumberFormatException e) { - throw new ServletException( - sm.getString("corsFilter.invalidPreflightMaxAge"), e); + // For any value other then 'true' this will be false. + this.supportsCredentials = Boolean.parseBoolean(supportsCredentials); + + try { + if (!preflightMaxAge.isEmpty()) { + this.preflightMaxAge = Long.parseLong(preflightMaxAge); + } else { + this.preflightMaxAge = 0L; } + } catch (NumberFormatException e) { + throw new ServletException( + sm.getString("corsFilter.invalidPreflightMaxAge"), e); } - if (decorateRequest != null) { - // For any value other then 'true' this will be false. - this.decorateRequest = Boolean.parseBoolean(decorateRequest); - } + // For any value other then 'true' this will be false. + this.decorateRequest = Boolean.parseBoolean(decorateRequest); } /** @@ -966,6 +969,13 @@ public Collection getAllowedHttpHeaders() { "Access-Control-Allow-Headers"; // -------------------------------------------------- CORS Request Headers + + /** + * The Vary header indicates allows disabling proxy caching by indicating + * the the response depends on the origin. + */ + public static final String REQUEST_HEADER_VARY = "Vary"; + /** * The Origin header indicates where the cross-origin request or preflight * request originates from. @@ -1022,7 +1032,7 @@ public Collection getAllowedHttpHeaders() { * Enumerates varies types of CORS requests. Also, provides utility methods * to determine the request type. */ - protected static enum CORSRequestType { + protected enum CORSRequestType { /** * A simple HTTP request, i.e. it shouldn't be pre-flighted. */ diff --git a/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java b/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java index 434a110..ed6517c 100644 --- a/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java +++ b/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilter.java @@ -178,7 +178,7 @@ public String encodeURL(String url) { private String addNonce(String url) { if ((url == null) || (nonce == null)) { - return (url); + return url; } String path = url; @@ -205,7 +205,7 @@ private String addNonce(String url) { sb.append('='); sb.append(nonce); sb.append(anchor); - return (sb.toString()); + return sb.toString(); } } diff --git a/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java b/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java index ab642f4..53ac9d0 100644 --- a/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java +++ b/core/src/main/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java @@ -78,8 +78,8 @@ public void init(FilterConfig filterConfig) throws ServletException { try { Class clazz = Class.forName(randomClass); - randomSource = (Random) clazz.newInstance(); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { + randomSource = (Random) clazz.getConstructor().newInstance(); + } catch (ReflectiveOperationException e) { ServletException se = new ServletException(sm.getString( "csrfPrevention.invalidRandomClass", randomClass), e); throw se; diff --git a/core/src/main/java/org/apache/catalina/filters/ExpiresFilter.java b/core/src/main/java/org/apache/catalina/filters/ExpiresFilter.java index f20649a..eb4f6b5 100644 --- a/core/src/main/java/org/apache/catalina/filters/ExpiresFilter.java +++ b/core/src/main/java/org/apache/catalina/filters/ExpiresFilter.java @@ -1104,7 +1104,7 @@ protected static boolean contains(String str, String searchStr) { if (str == null || searchStr == null) { return false; } - return str.indexOf(searchStr) >= 0; + return str.contains(searchStr); } /** diff --git a/core/src/main/java/org/apache/catalina/filters/FilterBase.java b/core/src/main/java/org/apache/catalina/filters/FilterBase.java index b7044e1..6513136 100644 --- a/core/src/main/java/org/apache/catalina/filters/FilterBase.java +++ b/core/src/main/java/org/apache/catalina/filters/FilterBase.java @@ -29,9 +29,6 @@ /** * Base class for filters that provides generic initialisation and a simple * no-op destruction. - * - * @author xxd - * */ public abstract class FilterBase implements Filter { @@ -39,6 +36,19 @@ public abstract class FilterBase implements Filter { protected abstract Log getLogger(); + + /** + * Iterates over the configuration parameters and either logs a warning, + * or throws an exception for any parameter that does not have a matching + * setter in this filter. + * + * @param filterConfig The configuration information associated with the + * filter instance being initialised + * + * @throws ServletException if {@link #isConfigProblemFatal()} returns + * {@code true} and a configured parameter does not + * have a matching setter + */ @Override public void init(FilterConfig filterConfig) throws ServletException { Enumeration paramNames = filterConfig.getInitParameterNames(); diff --git a/core/src/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java b/core/src/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java index 48b7cf6..a6e6f0f 100644 --- a/core/src/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java +++ b/core/src/main/java/org/apache/catalina/filters/HttpHeaderSecurityFilter.java @@ -247,7 +247,7 @@ public void setXssProtectionEnabled(boolean xssProtectionEnabled) { } - private static enum XFrameOption { + private enum XFrameOption { DENY("DENY"), SAME_ORIGIN("SAMEORIGIN"), ALLOW_FROM("ALLOW-FROM"); diff --git a/core/src/main/java/org/apache/catalina/filters/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/filters/LocalStrings_es.properties index 44de8bb..80630b3 100644 --- a/core/src/main/java/org/apache/catalina/filters/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/filters/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + addDefaultCharset.unsupportedCharset = El conjunto especificado de caracteres [{0}] no se encuentra soportado csrfPrevention.invalidRandomClass = No pude crear fuente al azar usando la clase [{0}] filterbase.noSuchProperty = La propiedad [{0}] no est\u00E1 definida para los filtros del tipo [{1}] diff --git a/core/src/main/java/org/apache/catalina/filters/RemoteIpFilter.java b/core/src/main/java/org/apache/catalina/filters/RemoteIpFilter.java index 0e61673..ddcde7d 100644 --- a/core/src/main/java/org/apache/catalina/filters/RemoteIpFilter.java +++ b/core/src/main/java/org/apache/catalina/filters/RemoteIpFilter.java @@ -18,8 +18,8 @@ import java.io.IOException; import java.text.DateFormat; +import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.Enumeration; @@ -35,6 +35,7 @@ import javax.servlet.GenericFilter; import javax.servlet.ServletException; import javax.servlet.ServletRequest; +import javax.servlet.ServletRequestWrapper; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; @@ -43,7 +44,7 @@ import org.apache.catalina.AccessLog; import org.apache.catalina.Globals; -import org.apache.catalina.core.ApplicationPushBuilder; +import org.apache.catalina.connector.RequestFacade; import org.apache.catalina.util.RequestUtil; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -497,7 +498,7 @@ public long getDateHeader(String name) { DateFormat dateFormat = dateFormats[i]; try { date = dateFormat.parse(value); - } catch (Exception ParseException) { + } catch (ParseException ex) { // Ignore } } @@ -586,7 +587,7 @@ public void removeHeader(String name) { } public void setHeader(String name, String value) { - List values = Arrays.asList(value); + List values = Collections.singletonList(value); Map.Entry> header = getHeaderEntry(name); if (header == null) { headers.put(name, values); @@ -627,7 +628,15 @@ public StringBuffer getRequestURL() { @Override public PushBuilder newPushBuilder() { - return new ApplicationPushBuilder(this); + ServletRequest current = getRequest(); + while (current instanceof ServletRequestWrapper) { + current = ((ServletRequestWrapper) current).getRequest(); + } + if (current instanceof RequestFacade) { + return ((RequestFacade) current).newPushBuilder(this); + } else { + return null; + } } } diff --git a/core/src/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java b/core/src/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java index 3606989..649464b 100644 --- a/core/src/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java +++ b/core/src/main/java/org/apache/catalina/filters/RestCsrfPreventionFilter.java @@ -76,7 +76,7 @@ * */ public class RestCsrfPreventionFilter extends CsrfPreventionFilterBase { - private static enum MethodType { + private enum MethodType { NON_MODIFYING_METHOD, MODIFYING_METHOD } diff --git a/core/src/main/java/org/apache/catalina/filters/SessionInitializerFilter.java b/core/src/main/java/org/apache/catalina/filters/SessionInitializerFilter.java new file mode 100644 index 0000000..dafc288 --- /dev/null +++ b/core/src/main/java/org/apache/catalina/filters/SessionInitializerFilter.java @@ -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. + */ +package org.apache.catalina.filters; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +/** + * A {@link javax.servlet.Filter} that initializes the {@link HttpSession} for + * the {@link HttpServletRequest} by calling its getSession() method. + *

    + * This is required for some operations with WebSocket requests, where it is + * too late to initialize the HttpSession object, and the current Java WebSocket + * specification does not provide a way to do so. + */ +public class SessionInitializerFilter implements Filter { + + /** + * Calls {@link HttpServletRequest}'s getSession() to initialize the + * HttpSession and continues processing the chain. + * + * @param request The request to process + * @param response The response associated with the request + * @param chain Provides access to the next filter in the chain for this + * filter to pass the request and response to for further + * processing + * @throws IOException if an I/O error occurs during this filter's + * processing of the request + * @throws ServletException if the processing fails for any other reason + */ + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + ((HttpServletRequest)request).getSession(); + + chain.doFilter(request, response); + } + +} diff --git a/core/src/main/java/org/apache/catalina/ha/ClusterRuleSet.java b/core/src/main/java/org/apache/catalina/ha/ClusterRuleSet.java index b35c26b..219bce2 100644 --- a/core/src/main/java/org/apache/catalina/ha/ClusterRuleSet.java +++ b/core/src/main/java/org/apache/catalina/ha/ClusterRuleSet.java @@ -14,14 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.ha; - import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.digester.RuleSetBase; - +import org.apache.tomcat.util.digester.RuleSet; /** *

    RuleSet for processing the contents of a @@ -29,7 +25,7 @@ * * @author Peter Rossbach */ -public class ClusterRuleSet extends RuleSetBase { +public class ClusterRuleSet implements RuleSet { // ----------------------------------------------------- Instance Variables @@ -49,9 +45,7 @@ public class ClusterRuleSet extends RuleSetBase { * matching pattern prefix. */ public ClusterRuleSet() { - this(""); - } @@ -63,8 +57,6 @@ public ClusterRuleSet() { * trailing slash character) */ public ClusterRuleSet(String prefix) { - super(); - this.namespaceURI = null; this.prefix = prefix; } diff --git a/core/src/main/java/org/apache/catalina/ha/backend/CollectedInfo.java b/core/src/main/java/org/apache/catalina/ha/backend/CollectedInfo.java index c166ecf..6cb05c7 100644 --- a/core/src/main/java/org/apache/catalina/ha/backend/CollectedInfo.java +++ b/core/src/main/java/org/apache/catalina/ha/backend/CollectedInfo.java @@ -20,7 +20,6 @@ /* for MBean to read ready and busy */ -import java.util.Iterator; import java.util.Set; import javax.management.MBeanServer; @@ -58,9 +57,7 @@ public void init(String host, int port) throws Exception { String onStr = "*:type=ThreadPool,*"; ObjectName objectName = new ObjectName(onStr); Set set = mBeanServer.queryMBeans(objectName, null); - Iterator iterator = set.iterator(); - while (iterator.hasNext()) { - ObjectInstance oi = iterator.next(); + for (ObjectInstance oi : set) { objName = oi.getObjectName(); String name = objName.getKeyProperty("name"); @@ -83,7 +80,7 @@ public void init(String host, int port) throws Exception { break; /* Done port and host are the expected ones */ } if (objName == null) - throw(new Exception("Can't find connector for " + host + ":" + port)); + throw new Exception("Can't find connector for " + host + ":" + port); this.port = iport; this.host = shost; @@ -91,7 +88,7 @@ public void init(String host, int port) throws Exception { public void refresh() throws Exception { if (mBeanServer == null || objName == null) { - throw(new Exception("Not initialized!!!")); + throw new Exception("Not initialized!!!"); } Integer imax = (Integer) mBeanServer.getAttribute(objName, "maxThreads"); diff --git a/core/src/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java b/core/src/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java index ef87c92..a65adb6 100644 --- a/core/src/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java +++ b/core/src/main/java/org/apache/catalina/ha/deploy/FarmWarDeployer.java @@ -700,9 +700,7 @@ public void setWatchEnabled(boolean watchEnabled) { * @return the frequency of watcher checks. */ public int getProcessDeployFrequency() { - - return (this.processDeployFrequency); - + return this.processDeployFrequency; } /** @@ -748,7 +746,7 @@ protected boolean copy(File from, File to) { } try (java.io.FileInputStream is = new java.io.FileInputStream(from); - java.io.FileOutputStream os = new java.io.FileOutputStream(to, false);) { + java.io.FileOutputStream os = new java.io.FileOutputStream(to, false)) { byte[] buf = new byte[4096]; while (true) { int len = is.read(buf); diff --git a/core/src/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java b/core/src/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java index 5f999ec..6d79c26 100644 --- a/core/src/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java +++ b/core/src/main/java/org/apache/catalina/ha/deploy/FileMessageFactory.java @@ -310,12 +310,12 @@ public void cleanup() { if (in != null) try { in.close(); - } catch (Exception ignore) { + } catch (IOException ignore) { } if (out != null) try { out.close(); - } catch (Exception ignore) { + } catch (IOException ignore) { } in = null; out = null; @@ -396,7 +396,9 @@ public boolean isValid() { int timeIdle = (int) ((timeNow - creationTime) / 1000L); if (timeIdle > maxValidTime) { cleanup(); - if (file.exists()) file.delete(); + if (file.exists() && !file.delete()) { + log.warn(sm.getString("fileMessageFactory.deleteFail", file)); + } return false; } } diff --git a/core/src/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties b/core/src/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties index c3da251..a6f1c36 100644 --- a/core/src/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/ha/deploy/LocalStrings.properties @@ -46,6 +46,8 @@ farmWarDeployer.undeployEnd=Undeployment from [{0}] finished. farmWarDeployer.undeployLocal=Undeploy local context [{0}] farmWarDeployer.watchDir=Cluster deployment is watching [{0}] for changes. +fileMessageFactory.deleteFail=Failed to delete [{0}] + warWatcher.checkingWars=Checking WARs in [{0}] warWatcher.listedFileDoesNotExist=[{0}] was detected in [{1}] but does not exist. Check directory permissions on [{1}]? warWatcher.checkingWar=Checking WAR file [{0}] diff --git a/core/src/main/java/org/apache/catalina/ha/session/BackupManager.java b/core/src/main/java/org/apache/catalina/ha/session/BackupManager.java index 0773017..4bdcf6d 100644 --- a/core/src/main/java/org/apache/catalina/ha/session/BackupManager.java +++ b/core/src/main/java/org/apache/catalina/ha/session/BackupManager.java @@ -17,7 +17,6 @@ package org.apache.catalina.ha.session; import java.util.HashSet; -import java.util.Iterator; import java.util.Set; import org.apache.catalina.DistributedManager; @@ -201,10 +200,26 @@ public void setMapSendOptions(int mapSendOptions) { this.mapSendOptions = mapSendOptions; } + public void setMapSendOptions(String mapSendOptions) { + + int value = Channel.parseSendOptions(mapSendOptions); + if (value > 0) { + this.setMapSendOptions(value); + } + } + public int getMapSendOptions() { return mapSendOptions; } + /** + * returns the SendOptions as a comma separated list of names + * @return a comma separated list of the option names + */ + public String getMapSendOptionsName(){ + return Channel.getSendOptionsAsString(mapSendOptions); + } + public void setRpcTimeout(long rpcTimeout) { this.rpcTimeout = rpcTimeout; } @@ -257,9 +272,8 @@ public Set getSessionIdsFull() { Set sessionIds = new HashSet<>(); LazyReplicatedMap map = (LazyReplicatedMap)sessions; - Iterator keys = map.keySetFull().iterator(); - while (keys.hasNext()) { - sessionIds.add(keys.next()); + for (String id : map.keySetFull()) { + sessionIds.add(id); } return sessionIds; } diff --git a/core/src/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java b/core/src/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java index ede180a..751e58b 100644 --- a/core/src/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java +++ b/core/src/main/java/org/apache/catalina/ha/session/ClusterManagerBase.java @@ -153,12 +153,12 @@ protected void clone(ClusterManagerBase copy) { copy.setSecureRandomAlgorithm(getSecureRandomAlgorithm()); if (getSessionIdGenerator() != null) { try { - SessionIdGenerator copyIdGenerator = sessionIdGeneratorClass.newInstance(); + SessionIdGenerator copyIdGenerator = sessionIdGeneratorClass.getConstructor().newInstance(); copyIdGenerator.setSessionIdLength(getSessionIdGenerator().getSessionIdLength()); copyIdGenerator.setJvmRoute(getSessionIdGenerator().getJvmRoute()); copy.setSessionIdGenerator(copyIdGenerator); - } catch (InstantiationException | IllegalAccessException e) { - // Ignore + } catch (ReflectiveOperationException e) { + // Ignore } } copy.setRecordAllActions(isRecordAllActions()); diff --git a/core/src/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java b/core/src/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java index e9f5d28..c2c36b4 100644 --- a/core/src/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java +++ b/core/src/main/java/org/apache/catalina/ha/session/ClusterSessionListener.java @@ -91,7 +91,6 @@ public void messageReceived(ClusterMessage myobj) { } } - return; } /** @@ -105,7 +104,7 @@ public void messageReceived(ClusterMessage myobj) { */ @Override public boolean accept(ClusterMessage msg) { - return (msg instanceof SessionMessage); + return msg instanceof SessionMessage; } } diff --git a/core/src/main/java/org/apache/catalina/ha/session/DeltaManager.java b/core/src/main/java/org/apache/catalina/ha/session/DeltaManager.java index 7b7dd69..e7344e0 100644 --- a/core/src/main/java/org/apache/catalina/ha/session/DeltaManager.java +++ b/core/src/main/java/org/apache/catalina/ha/session/DeltaManager.java @@ -24,7 +24,6 @@ import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Date; -import java.util.Iterator; import org.apache.catalina.Engine; import org.apache.catalina.Host; @@ -426,7 +425,7 @@ public Session createSession(String sessionId, boolean distribute) { if (log.isDebugEnabled()) log.debug(sm.getString("deltaManager.createSession.newSession", session.getId(), Integer.valueOf(sessions.size()))); - return (session); + return session; } /** @@ -756,19 +755,17 @@ public synchronized void getAllClusterSessions() { waitForSendAllSessions(beforeSendTime); } finally { synchronized(receivedMessageQueue) { - for (Iterator iter = receivedMessageQueue.iterator(); - iter.hasNext();) { - SessionMessage smsg = iter.next(); + for (SessionMessage smsg : receivedMessageQueue) { if (!stateTimestampDrop) { messageReceived(smsg, - smsg.getAddress() != null ? (Member) smsg.getAddress() : null); + smsg.getAddress() != null ? smsg.getAddress() : null); } else { if (smsg.getEventType() != SessionMessage.EVT_GET_ALL_SESSIONS && smsg.getTimestamp() >= stateTransferCreateSendTime) { // FIXME handle EVT_GET_ALL_SESSIONS later messageReceived(smsg, smsg.getAddress() != null ? - (Member) smsg.getAddress() : + smsg.getAddress() : null); } else { if (log.isWarnEnabled()) { @@ -920,7 +917,7 @@ public void messageDataReceived(ClusterMessage cmsg) { break; } //switch - messageReceived(msg, msg.getAddress() != null ? (Member) msg.getAddress() : null); + messageReceived(msg, msg.getAddress() != null ? msg.getAddress() : null); } } diff --git a/core/src/main/java/org/apache/catalina/ha/session/DeltaSession.java b/core/src/main/java/org/apache/catalina/ha/session/DeltaSession.java index 3e375f3..d61817e 100644 --- a/core/src/main/java/org/apache/catalina/ha/session/DeltaSession.java +++ b/core/src/main/java/org/apache/catalina/ha/session/DeltaSession.java @@ -28,6 +28,7 @@ import java.security.Principal; import java.util.ArrayList; import java.util.Hashtable; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; @@ -401,7 +402,8 @@ public boolean isValid() { } } } - return (this.isValid); + + return this.isValid; } /** @@ -498,7 +500,7 @@ public String toString() { sb.append("DeltaSession["); sb.append(id); sb.append("]"); - return (sb.toString()); + return sb.toString(); } @Override @@ -832,8 +834,8 @@ private void doWriteObject(ObjectOutput stream) throws IOException { // Accumulate the names of serializable and non-serializable attributes String keys[] = keys(); - ArrayList saveNames = new ArrayList<>(); - ArrayList saveValues = new ArrayList<>(); + List saveNames = new ArrayList<>(); + List saveValues = new ArrayList<>(); for (int i = 0; i < keys.length; i++) { Object value = null; value = attributes.get(keys[i]); diff --git a/core/src/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties index f2586a6..5f96a65 100644 --- a/core/src/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/ha/session/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + deltaManager.createSession.newSession = Creada una DeltaSession con Id [{0}] Total contador=[{1}] deltaManager.createMessage.access = Gestor [{0}]: creado mensaje de sesi\u00F3n [{1}] acceso. deltaManager.createMessage.accessChangePrimary = Gestor [{0}]: creado mensaje de sesi\u00F3n [{1}] acceso para cambiar el primario. diff --git a/core/src/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml index 33bdba0..5ad0bce 100644 --- a/core/src/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml +++ b/core/src/main/java/org/apache/catalina/ha/session/mbeans-descriptors.xml @@ -453,6 +453,11 @@ description="mapSendOptions" type="int" writeable="false"/> + sessions = crossContextSessions.get(); if(sessions != null && sessions.size() >0) { - for(Iterator iter = sessions.iterator(); iter.hasNext() ;) { - Session session = iter.next(); + for (DeltaSession session : sessions) { if(log.isDebugEnabled()) { log.debug(sm.getString("ReplicationValve.crossContext.sendDelta", session.getManager().getContext().getName() )); diff --git a/core/src/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java b/core/src/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java index 302bf8a..6d1db1e 100644 --- a/core/src/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java +++ b/core/src/main/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java @@ -21,7 +21,6 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -224,7 +223,7 @@ public void setContainer(Container container) { */ @Override public Container getContainer() { - return (this.container); + return this.container; } /** @@ -340,6 +339,14 @@ public void setChannelSendOptions(int channelSendOptions) { this.channelSendOptions = channelSendOptions; } + public void setChannelSendOptions(String channelSendOptions) { + + int value = Channel.parseSendOptions(channelSendOptions); + if (value > 0) { + this.setChannelSendOptions(value); + } + } + /** * has members */ @@ -392,6 +399,14 @@ public int getChannelSendOptions() { return channelSendOptions; } + /** + * returns the SendOptions as a comma separated list of names for use by JMX + * @return a comma separated list of the option names + */ + public String getChannelSendOptionsName(){ + return Channel.getSendOptionsAsString(channelSendOptions); + } + /** * Create new Manager without add to cluster (comes with start the manager) * @@ -568,8 +583,8 @@ protected void checkDefaults() { */ protected void registerClusterValve() { if(container != null ) { - for (Iterator iter = valves.iterator(); iter.hasNext();) { - ClusterValve valve = (ClusterValve) iter.next(); + for (Valve v : valves) { + ClusterValve valve = (ClusterValve) v; if (log.isDebugEnabled()) log.debug("Invoking addValve on " + getContainer() + " with class=" + valve.getClass().getName()); @@ -585,8 +600,8 @@ protected void registerClusterValve() { * unregister all cluster valve to host or engine */ protected void unregisterClusterValve() { - for (Iterator iter = valves.iterator(); iter.hasNext();) { - ClusterValve valve = (ClusterValve) iter.next(); + for (Valve v : valves) { + ClusterValve valve = (ClusterValve) v; if (log.isDebugEnabled()) log.debug("Invoking removeValve on " + getContainer() + " with class=" + valve.getClass().getName()); @@ -768,9 +783,7 @@ public void messageReceived(ClusterMessage message) { //invoke all the listeners boolean accepted = false; if (message != null) { - for (Iterator iter = clusterListeners.iterator(); - iter.hasNext();) { - ClusterListener listener = iter.next(); + for (ClusterListener listener : clusterListeners) { if (listener.accept(message)) { accepted = true; listener.messageReceived(message); @@ -788,7 +801,6 @@ public void messageReceived(ClusterMessage message) { } } } - return; } public int getChannelStartOptions() { diff --git a/core/src/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml index 332652d..40a019c 100644 --- a/core/src/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml +++ b/core/src/main/java/org/apache/catalina/ha/tcp/mbeans-descriptors.xml @@ -28,7 +28,12 @@ + type="java.lang.String"/> + clearJdbcDriverRegistrations() throws SQLException { * ensuring that both original drivers and any loaded as a result of the * side-effects are all de-registered. */ - HashSet originalDrivers = new HashSet<>(); + Set originalDrivers = new HashSet<>(); Enumeration drivers = DriverManager.getDrivers(); while (drivers.hasMoreElements()) { originalDrivers.add(drivers.nextElement()); diff --git a/core/src/main/java/org/apache/catalina/loader/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/loader/LocalStrings_es.properties index f22104e..55b7e1f 100644 --- a/core/src/main/java/org/apache/catalina/loader/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/loader/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + webappClassLoader.illegalJarPath = Detectada entrada ilegal de JAR con nombre [{0}] webappClassLoader.jdbcRemoveFailed = Ha fallado el desregistro del conductor JDBC para la aplicaci\u00F3n web [{0}] webappClassLoader.stopped = Acceso ilegal: esta instancia de aplicaci\u00F3n web ya ha sido parada. Could not load [{0}]. La eventual traza de pila que sigue ha sido motivada por un error lanzado con motivos de depuraci\u00F3n as\u00ED como para intentar terminar el hilo que motiv\u00F3 el acceso ilegal y no tiene impacto funcional. diff --git a/core/src/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java b/core/src/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java index 2d3d767..451b376 100644 --- a/core/src/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java +++ b/core/src/main/java/org/apache/catalina/loader/WebappClassLoaderBase.java @@ -280,7 +280,7 @@ protected WebappClassLoaderBase(ClassLoader parent) { protected boolean delegate = false; - private final HashMap jarModificationTimes = new HashMap<>(); + private final Map jarModificationTimes = new HashMap<>(); /** @@ -426,9 +426,7 @@ public String getContextName() { * the parent first. The default in Tomcat is false. */ public boolean getDelegate() { - - return (this.delegate); - + return this.delegate; } @@ -522,7 +520,7 @@ public void setClearReferencesRmiTargets(boolean clearReferencesRmiTargets) { * @return the clearReferencesStopThreads flag for this Context. */ public boolean getClearReferencesStopThreads() { - return (this.clearReferencesStopThreads); + return this.clearReferencesStopThreads; } @@ -541,7 +539,7 @@ public void setClearReferencesStopThreads( * @return the clearReferencesStopTimerThreads flag for this Context. */ public boolean getClearReferencesStopTimerThreads() { - return (this.clearReferencesStopTimerThreads); + return this.clearReferencesStopTimerThreads; } @@ -560,7 +558,7 @@ public void setClearReferencesStopTimerThreads( * @return the clearReferencesLogFactoryRelease flag for this Context. */ public boolean getClearReferencesLogFactoryRelease() { - return (this.clearReferencesLogFactoryRelease); + return this.clearReferencesLogFactoryRelease; } @@ -581,7 +579,7 @@ public void setClearReferencesLogFactoryRelease( * Context. */ public boolean getClearReferencesHttpClientKeepAliveThread() { - return (this.clearReferencesHttpClientKeepAliveThread); + return this.clearReferencesHttpClientKeepAliveThread; } @@ -645,9 +643,7 @@ public void removeTransformer(ClassFileTransformer transformer) { if (this.transformers.remove(transformer)) { log.info(sm.getString("webappClassLoader.removeTransformer", transformer, getContextName())); - return; } - } protected void copyStateWithoutTransformers(WebappClassLoaderBase base) { @@ -743,7 +739,7 @@ public String toString() { sb.append(transformer).append("\r\n"); } } - return (sb.toString()); + return sb.toString(); } @@ -849,7 +845,7 @@ public Class findClass(String name) throws ClassNotFoundException { } log.debug(" Loaded by " + cl.toString()); } - return (clazz); + return clazz; } @@ -987,7 +983,7 @@ public URL getResource(String name) { if (url != null) { if (log.isDebugEnabled()) log.debug(" --> Returning '" + url.toString() + "'"); - return (url); + return url; } } @@ -996,7 +992,7 @@ public URL getResource(String name) { if (url != null) { if (log.isDebugEnabled()) log.debug(" --> Returning '" + url.toString() + "'"); - return (url); + return url; } // (3) Delegate to parent unconditionally if not already attempted @@ -1005,14 +1001,14 @@ public URL getResource(String name) { if (url != null) { if (log.isDebugEnabled()) log.debug(" --> Returning '" + url.toString() + "'"); - return (url); + return url; } } // (4) Resource was not found if (log.isDebugEnabled()) log.debug(" --> Resource not found, returning null"); - return (null); + return null; } @@ -1105,9 +1101,7 @@ public InputStream getResourceAsStream(String name) { */ @Override public Class loadClass(String name) throws ClassNotFoundException { - - return (loadClass(name, false)); - + return loadClass(name, false); } @@ -1154,7 +1148,7 @@ public Class loadClass(String name, boolean resolve) throws ClassNotFoundExce log.debug(" Returning class from cache"); if (resolve) resolveClass(clazz); - return (clazz); + return clazz; } // (0.1) Check our previously loaded class cache @@ -1164,7 +1158,7 @@ public Class loadClass(String name, boolean resolve) throws ClassNotFoundExce log.debug(" Returning class from cache"); if (resolve) resolveClass(clazz); - return (clazz); + return clazz; } // (0.2) Try loading the class with the system class loader, to prevent @@ -1181,8 +1175,14 @@ public Class loadClass(String name, boolean resolve) throws ClassNotFoundExce // https://bz.apache.org/bugzilla/show_bug.cgi?id=58125 for // details) when running under a security manager in rare cases // this call may trigger a ClassCircularityError. + // See https://bz.apache.org/bugzilla/show_bug.cgi?id=61424 for + // details of how this may trigger a StackOverflowError + // Given these reported errors, catch Throwable to ensure any + // other edge cases are also caught tryLoadingFromJavaseLoader = (javaseLoader.getResource(resourceName) != null); - } catch (ClassCircularityError cce) { + } catch (Throwable t) { + // Swallow all exceptions apart from those that must be re-thrown + ExceptionUtils.handleThrowable(t); // The getResource() trick won't work for this class. We have to // try loading it directly and accept that we might get a // ClassNotFoundException. @@ -1195,7 +1195,7 @@ public Class loadClass(String name, boolean resolve) throws ClassNotFoundExce if (clazz != null) { if (resolve) resolveClass(clazz); - return (clazz); + return clazz; } } catch (ClassNotFoundException e) { // Ignore @@ -1230,7 +1230,7 @@ public Class loadClass(String name, boolean resolve) throws ClassNotFoundExce log.debug(" Loading class from parent"); if (resolve) resolveClass(clazz); - return (clazz); + return clazz; } } catch (ClassNotFoundException e) { // Ignore @@ -1247,7 +1247,7 @@ public Class loadClass(String name, boolean resolve) throws ClassNotFoundExce log.debug(" Loading class from local repository"); if (resolve) resolveClass(clazz); - return (clazz); + return clazz; } } catch (ClassNotFoundException e) { // Ignore @@ -1264,7 +1264,7 @@ public Class loadClass(String name, boolean resolve) throws ClassNotFoundExce log.debug(" Loading class from parent"); if (resolve) resolveClass(clazz); - return (clazz); + return clazz; } } catch (ClassNotFoundException e) { // Ignore @@ -1308,22 +1308,18 @@ protected void checkStateForResourceLoading(String resource) throws IllegalState */ @Override protected PermissionCollection getPermissions(CodeSource codeSource) { - String codeUrl = codeSource.getLocation().toString(); PermissionCollection pc; if ((pc = loaderPC.get(codeUrl)) == null) { pc = super.getPermissions(codeSource); if (pc != null) { - Iterator perms = permissionList.iterator(); - while (perms.hasNext()) { - Permission p = perms.next(); + for (Permission p : permissionList) { pc.add(p); } loaderPC.put(codeUrl,pc); } } - return (pc); - + return pc; } @@ -1580,7 +1576,7 @@ private final void clearReferencesJdbc() { Class lpClass = defineClass("org.apache.catalina.loader.JdbcLeakPrevention", classBytes, 0, offset, this.getClass().getProtectionDomain()); - Object obj = lpClass.newInstance(); + Object obj = lpClass.getConstructor().newInstance(); @SuppressWarnings("unchecked") List driverNames = (List) obj.getClass().getMethod( "clearJdbcDriverRegistrations").invoke(obj); @@ -2495,4 +2491,24 @@ public String getServiceName() { } return null; } + + + @Override + public boolean hasLoggingConfig() { + if (Globals.IS_SECURITY_ENABLED) { + Boolean result = AccessController.doPrivileged(new PrivilegedHasLoggingConfig()); + return result.booleanValue(); + } else { + return findResource("logging.properties") != null; + } + } + + + private class PrivilegedHasLoggingConfig implements PrivilegedAction { + + @Override + public Boolean run() { + return Boolean.valueOf(findResource("logging.properties") != null); + } + } } diff --git a/core/src/main/java/org/apache/catalina/loader/WebappLoader.java b/core/src/main/java/org/apache/catalina/loader/WebappLoader.java index 91c6dc5..ad9bccd 100644 --- a/core/src/main/java/org/apache/catalina/loader/WebappLoader.java +++ b/core/src/main/java/org/apache/catalina/loader/WebappLoader.java @@ -33,7 +33,6 @@ import org.apache.catalina.Context; import org.apache.catalina.Globals; -import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleState; import org.apache.catalina.Loader; @@ -224,7 +223,7 @@ public void setDelegate(boolean delegate) { * @return the ClassLoader class name. */ public String getLoaderClass() { - return (this.loaderClass); + return this.loaderClass; } @@ -396,7 +395,7 @@ protected void startInternal() throws LifecycleException { setPermissions(); - ((Lifecycle) classLoader).start(); + classLoader.start(); String contextName = context.getName(); if (!contextName.startsWith("/")) { diff --git a/core/src/main/java/org/apache/catalina/manager/Constants.java b/core/src/main/java/org/apache/catalina/manager/Constants.java index 921a7e5..204e439 100644 --- a/core/src/main/java/org/apache/catalina/manager/Constants.java +++ b/core/src/main/java/org/apache/catalina/manager/Constants.java @@ -201,7 +201,7 @@ public class Constants { HTML_TAIL_SECTION = "
    \n" + "
    \n" + - " Copyright © 1999-2017, Apache Software Foundation" + + " Copyright © 1999-2018, Apache Software Foundation" + "
    \n" + "\n" + "\n" + diff --git a/core/src/main/java/org/apache/catalina/manager/HTMLManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/HTMLManagerServlet.java index 7bae2d0..f0260cd 100644 --- a/core/src/main/java/org/apache/catalina/manager/HTMLManagerServlet.java +++ b/core/src/main/java/org/apache/catalina/manager/HTMLManagerServlet.java @@ -49,10 +49,10 @@ import org.apache.catalina.manager.util.BaseSessionComparator; import org.apache.catalina.manager.util.SessionUtils; import org.apache.catalina.util.ContextName; -import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; import org.apache.catalina.util.URLEncoder; import org.apache.tomcat.util.res.StringManager; +import org.apache.tomcat.util.security.Escape; /** * Servlet that enables remote management of the web applications deployed @@ -85,6 +85,8 @@ public final class HTMLManagerServlet extends ManagerServlet { static final String sessionsListJspPath = "/WEB-INF/jsp/sessionsList.jsp"; static final String sessionDetailJspPath = "/WEB-INF/jsp/sessionDetail.jsp"; static final String connectorCiphersJspPath = "/WEB-INF/jsp/connectorCiphers.jsp"; + static final String connectorCertsJspPath = "/WEB-INF/jsp/connectorCerts.jsp"; + static final String connectorTrustedCertsJspPath = "/WEB-INF/jsp/connectorTrustedCerts.jsp"; private boolean showProxySessions = false; @@ -138,6 +140,10 @@ public void doGet(HttpServletRequest request, } } else if (command.equals("/sslConnectorCiphers")) { sslConnectorCiphers(request, response); + } else if (command.equals("/sslConnectorCerts")) { + sslConnectorCerts(request, response); + } else if (command.equals("/sslConnectorTrustedCerts")) { + sslConnectorTrustedCerts(request, response); } else if (command.equals("/upload") || command.equals("/deploy") || command.equals("/reload") || command.equals("/undeploy") || command.equals("/expire") || command.equals("/start") || @@ -187,6 +193,7 @@ public void doPost(HttpServletRequest request, } String deployConfig = request.getParameter("deployConfig"); String deployWar = request.getParameter("deployWar"); + String tlsHostName = request.getParameter("tlsHostName"); // Prepare our output writer to generate the response message response.setContentType("text/html; charset=" + Constants.CHARSET); @@ -213,6 +220,8 @@ public void doPost(HttpServletRequest request, message = stop(cn, smClient); } else if (command.equals("/findleaks")) { message = findleaks(smClient); + } else if (command.equals("/sslReload")) { + message = sslReload(tlsHostName, smClient); } else { // Try GET doGet(request,response); @@ -222,6 +231,7 @@ public void doPost(HttpServletRequest request, list(request, response, message, smClient); } + protected String upload(HttpServletRequest request, StringManager smClient) { String message = ""; @@ -349,7 +359,7 @@ protected void list(HttpServletRequest request, if (message == null || message.length() == 0) { args[1] = "OK"; } else { - args[1] = RequestUtil.filter(message); + args[1] = Escape.htmlElementContent(message); } writer.print(MessageFormat.format(Constants.MESSAGE_SECTION, args)); @@ -442,19 +452,19 @@ protected void list(HttpServletRequest request, args = new Object[7]; args[0] = "" + RequestUtil.filter(displayPath) + ""; + "\">" + Escape.htmlElementContent(displayPath) + ""; if ("".equals(ctxt.getWebappVersion())) { args[1] = noVersion; } else { - args[1] = RequestUtil.filter(ctxt.getWebappVersion()); + args[1] = Escape.htmlElementContent(ctxt.getWebappVersion()); } if (ctxt.getDisplayName() == null) { args[2] = " "; } else { - args[2] = RequestUtil.filter(ctxt.getDisplayName()); + args[2] = Escape.htmlElementContent(ctxt.getDisplayName()); } args[3] = Boolean.valueOf(ctxt.getState().isAvailable()); - args[4] = RequestUtil.filter(response.encodeURL(request.getContextPath() + + args[4] = Escape.htmlElementContent(response.encodeURL(request.getContextPath() + "/html/sessions?" + pathVersion)); Manager manager = ctxt.getManager(); if (manager instanceof DistributedManager && showProxySessions) { @@ -472,19 +482,19 @@ protected void list(HttpServletRequest request, (MessageFormat.format(APPS_ROW_DETAILS_SECTION, args)); args = new Object[14]; - args[0] = RequestUtil.filter(response.encodeURL(request + args[0] = Escape.htmlElementContent(response.encodeURL(request .getContextPath() + "/html/start?" + pathVersion)); args[1] = appsStart; - args[2] = RequestUtil.filter(response.encodeURL(request + args[2] = Escape.htmlElementContent(response.encodeURL(request .getContextPath() + "/html/stop?" + pathVersion)); args[3] = appsStop; - args[4] = RequestUtil.filter(response.encodeURL(request + args[4] = Escape.htmlElementContent(response.encodeURL(request .getContextPath() + "/html/reload?" + pathVersion)); args[5] = appsReload; - args[6] = RequestUtil.filter(response.encodeURL(request + args[6] = Escape.htmlElementContent(response.encodeURL(request .getContextPath() + "/html/undeploy?" + pathVersion)); args[7] = appsUndeploy; - args[8] = RequestUtil.filter(response.encodeURL(request + args[8] = Escape.htmlElementContent(response.encodeURL(request .getContextPath() + "/html/expire?" + pathVersion)); args[9] = appsExpire; args[10] = smClient.getString("htmlManagerServlet.expire.explain"); @@ -534,8 +544,17 @@ protected void list(HttpServletRequest request, args[3] = smClient.getString("htmlManagerServlet.deployButton"); writer.print(MessageFormat.format(UPLOAD_SECTION, args)); + // Config section + args = new Object[5]; + args[0] = smClient.getString("htmlManagerServlet.configTitle"); + args[1] = smClient.getString("htmlManagerServlet.configSslReloadTitle"); + args[2] = response.encodeURL(request.getContextPath() + "/html/sslReload"); + args[3] = smClient.getString("htmlManagerServlet.configSslHostName"); + args[4] = smClient.getString("htmlManagerServlet.configReloadButton"); + writer.print(MessageFormat.format(CONFIG_SECTION, args)); + // Diagnostics section - args = new Object[9]; + args = new Object[15]; args[0] = smClient.getString("htmlManagerServlet.diagnosticsTitle"); args[1] = smClient.getString("htmlManagerServlet.diagnosticsLeak"); args[2] = response.encodeURL( @@ -547,6 +566,14 @@ protected void list(HttpServletRequest request, request.getContextPath() + "/html/sslConnectorCiphers"); args[7] = smClient.getString("htmlManagerServlet.diagnosticsSslConnectorCipherButton"); args[8] = smClient.getString("htmlManagerServlet.diagnosticsSslConnectorCipherText"); + args[9] = response.encodeURL( + request.getContextPath() + "/html/sslConnectorCerts"); + args[10] = smClient.getString("htmlManagerServlet.diagnosticsSslConnectorCertsButton"); + args[11] = smClient.getString("htmlManagerServlet.diagnosticsSslConnectorCertsText"); + args[12] = response.encodeURL( + request.getContextPath() + "/html/sslConnectorTrustedCerts"); + args[13] = smClient.getString("htmlManagerServlet.diagnosticsSslConnectorTrustedCertsButton"); + args[14] = smClient.getString("htmlManagerServlet.diagnosticsSslConnectorTrustedCertsText"); writer.print(MessageFormat.format(DIAGNOSTICS_SECTION, args)); // Server Header Section @@ -720,6 +747,16 @@ protected String findleaks(StringManager smClient) { } + protected String sslReload(String tlsHostName, StringManager smClient) { + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + + super.sslReload(printWriter, tlsHostName, smClient); + + return stringWriter.toString(); + } + + protected void sslConnectorCiphers(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("cipherList", getConnectorCiphers()); @@ -727,12 +764,29 @@ protected void sslConnectorCiphers(HttpServletRequest request, connectorCiphersJspPath).forward(request, response); } + + protected void sslConnectorCerts(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + request.setAttribute("certList", getConnectorCerts()); + getServletContext().getRequestDispatcher( + connectorCertsJspPath).forward(request, response); + } + + + protected void sslConnectorTrustedCerts(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + request.setAttribute("trustedCertList", getConnectorTrustedCerts()); + getServletContext().getRequestDispatcher( + connectorTrustedCertsJspPath).forward(request, response); + } + + /** * @see javax.servlet.Servlet#getServletInfo() */ @Override public String getServletInfo() { - return "HTMLManagerServlet, Copyright (c) 1999-2017, The Apache Software Foundation"; + return "HTMLManagerServlet, Copyright (c) 1999-2018, The Apache Software Foundation"; } /** @@ -824,14 +878,14 @@ protected List getSessionsForName(ContextName cn, } throw new IllegalArgumentException(smClient.getString( "managerServlet.invalidPath", - RequestUtil.filter(path))); + Escape.htmlElementContent(path))); } Context ctxt = (Context) host.findChild(cn.getName()); if (null == ctxt) { throw new IllegalArgumentException(smClient.getString( "managerServlet.noContext", - RequestUtil.filter(cn.getDisplayName()))); + Escape.htmlElementContent(cn.getDisplayName()))); } Manager manager = ctxt.getManager(); List sessions = new ArrayList<>(); @@ -1287,11 +1341,12 @@ public Comparable getComparableObject(Session session) { "
    \n" + "\n"; - private static final String DIAGNOSTICS_SECTION = + private static final String CONFIG_SECTION = "\n" + "\n" + " \n" + "\n" + + "\n" + " \n" + "\n" + @@ -1300,36 +1355,87 @@ public Comparable getComparableObject(Session session) { "
    \n" + "
    {0}
    {1}
    \n" + "\n" + + " \n" + " \n" + + "\n" + + "\n" + + " \n" + " \n" + "\n" + "
    \n" + + " {3}\n" + + " \n" + - " \n" + + " \n" + + "
    \n" + + "  \n" + " \n" + - " {3}\n" + + " \n" + "
    \n" + "\n" + "

    \n" + + "
    "; + + private static final String DIAGNOSTICS_SECTION = + "\n" + + "\n" + + " \n" + + "\n" + + "\n" + - " \n" + + " \n" + "\n" + + "\n" + - " \n" + + + "\n" + + " \n" + + " \n" + + "\n" + + + "\n" + + " \n" + + " \n" + "\n" + + "
    {0}
    {5}{1}
    \n" + - "
    \n" + - "\n" + + " \n" + + " \n" + + "\n" + + + "\n" + + " \n" + + "\n" + + "\n" + " \n" + " \n" + "\n" + - "
    \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " {3}\n" + + "
    {5}
    \n" + - " \n" + + "
    \n" + + " \n" + + "
    \n" + "
    \n" + " {8}\n" + "
    \n" + - "\n" + - "
    \n" + + "
    \n" + + " \n" + + "
    \n" + + "
    \n" + + " {11}\n" + + "
    \n" + + "
    \n" + + " \n" + + "
    \n" + + "
    \n" + + " {14}\n" + + "
    \n" + "
    "; } diff --git a/core/src/main/java/org/apache/catalina/manager/LocalStrings.properties b/core/src/main/java/org/apache/catalina/manager/LocalStrings.properties index e6f6971..a73232d 100644 --- a/core/src/main/java/org/apache/catalina/manager/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/manager/LocalStrings.properties @@ -32,6 +32,10 @@ htmlManagerServlet.helpHtmlManager=HTML Manager Help htmlManagerServlet.helpHtmlManagerFile=../docs/html-manager-howto.html htmlManagerServlet.helpManager=Manager Help htmlManagerServlet.helpManagerFile=../docs/manager-howto.html +htmlManagerServlet.configTitle=Configuration +htmlManagerServlet.configSslReloadTitle=Re-read TLS configuration files +htmlManagerServlet.configSslHostName=TLS host name (optional) +htmlManagerServlet.configReloadButton=Re-read htmlManagerServlet.deployButton=Deploy htmlManagerServlet.deployConfig=XML Configuration file URL: htmlManagerServlet.deployPath=Context Path (required): @@ -48,9 +52,13 @@ htmlManagerServlet.deployWar=WAR or Directory URL: htmlManagerServlet.diagnosticsLeak=Check to see if a web application has caused a memory leak on stop, reload or undeploy htmlManagerServlet.diagnosticsLeakButton=Find leaks htmlManagerServlet.diagnosticsLeakWarning=This diagnostic check will trigger a full garbage collection. Use it with extreme caution on production systems. -htmlManagerServlet.diagnosticsSsl=SSL connector configuration diagnostics -htmlManagerServlet.diagnosticsSslConnectorCipherButton=Connector ciphers -htmlManagerServlet.diagnosticsSslConnectorCipherText=List the configured ciphers for each connector +htmlManagerServlet.diagnosticsSsl=TLS connector configuration diagnostics +htmlManagerServlet.diagnosticsSslConnectorCipherButton=Ciphers +htmlManagerServlet.diagnosticsSslConnectorCipherText=List the configured TLS virtual hosts and the ciphers for each. +htmlManagerServlet.diagnosticsSslConnectorCertsButton=Certificates +htmlManagerServlet.diagnosticsSslConnectorCertsText=List the configured TLS virtual hosts and the certificate chain for each. +htmlManagerServlet.diagnosticsSslConnectorTrustedCertsButton=Trusted Certificates +htmlManagerServlet.diagnosticsSslConnectorTrustedCertsText=List the configured TLS virtual hosts and the trusted certificates for each. htmlManagerServlet.diagnosticsTitle=Diagnostics htmlManagerServlet.findleaksList=\ The following web applications were stopped (reloaded, undeployed), but their\n\ @@ -72,6 +80,7 @@ htmlManagerServlet.serverTitle=Server Information htmlManagerServlet.serverVersion=Tomcat Version htmlManagerServlet.title=Tomcat Web Application Manager managerServlet.alreadyContext=FAIL - Application already exists at path [{0}] +managerServlet.certsNotAvailable=Certificate information cannot be obtained from this connector at runtime managerServlet.deleteFail=FAIL - Unable to delete [{0}]. The continued presence of this file may cause problems. managerServlet.deployed=OK - Deployed application at context path [{0}] managerServlet.deployFailed=FAIL - Failed to deploy application at context path [{0}] @@ -97,6 +106,7 @@ managerServlet.notSslConnector=SSL is not enabled for this connector managerServlet.objectNameFail=FAIL - Unable to register object name [{0}] for Manager Servlet managerServlet.postCommand=FAIL - Tried to use command [{0}] via a GET request but POST is required managerServlet.reloaded=OK - Reloaded application at context path [{0}] +managerServlet.renameFail=FAIL - Unable to rename [{0}] to [{1}]. This may cause problems for future deployments. managerServlet.resourcesAll=OK - Listed global resources of all types managerServlet.resourcesType=OK - Listed global resources of type [{0}] managerServlet.saveFail=FAIL - Configuration save failed: [{0}] @@ -108,12 +118,18 @@ managerServlet.sessiontimeout.unlimited=unlimited time: [{0}] sessions managerServlet.sessiontimeout.expired=[{0}] minutes: [{1}] sessions were expired managerServlet.sessions=OK - Session information for application at context path [{0}] managerServlet.sslConnectorCiphers=OK - Connector / SSL Cipher information +managerServlet.sslConnectorCerts=OK - Connector / Certificate Chain information +managerServlet.sslConnectorTrustedCerts=OK - Connector / Trusted Certificate information +managerServlet.sslReload=OK - Reloaded TLS configuration for [{0}] +managerServlet.sslReloadAll=OK - Reloaded TLS configuration for all TLS virtual hosts +managerServlet.sslReloadFail=FAIL - Failed to reload TLS configuration managerServlet.started=OK - Started application at context path [{0}] managerServlet.startFailed=FAIL - Application at context path [{0}] could not be started managerServlet.stopped=OK - Stopped application at context path [{0}] managerServlet.storeConfig.invalidMBean=FAIL - Unable to find the StoreConfig Mbean. [{0}] is not a valid name for an MBean. managerServlet.storeConfig.noMBean=FAIL - No StoreConfig MBean registered at [{0}]. Registration is typically performed by the StoreConfigLifecycleListener. managerServlet.threaddump=OK - JVM thread dump +managerServlet.trustedCertsNotConfigured=No trusted certificates are configured for this virtual host managerServlet.undeployed=OK - Undeployed application at context path [{0}] managerServlet.unknownCommand=FAIL - Unknown command [{0}] managerServlet.vminfo=OK - VM info diff --git a/core/src/main/java/org/apache/catalina/manager/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/manager/LocalStrings_es.properties index 510cd92..950870b 100644 --- a/core/src/main/java/org/apache/catalina/manager/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/manager/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + htmlManagerServlet.appsAvailable = Ejecut\u00E1ndose htmlManagerServlet.appsName = Nombre a Mostrar htmlManagerServlet.appsPath = Trayectoria @@ -74,7 +75,7 @@ managerServlet.findleaksFail = FALLO - Ha fallado la b\u00FAsqueda de fallos: La managerServlet.findleaksList = OK - Hallados fallos potenciales de memoria en las siguientes aplicaciones: managerServlet.findleaksNone = OK - No se han hallado fallos de memoria managerServlet.invalidPath = FALLO - Se ha especificado una trayectoria inv\u00E1lida de contexto [{0}] -managerServlet.listed = OK - Aplicaciones listadas para m\u00E1quinda virutal [{0}] +managerServlet.listed = OK - Aplicaciones listadas para m\u00E1quina virtual [{0}] managerServlet.listitem = {0}:{1}:{2}:{3} managerServlet.mkdirFail = FALLO - No pude crear directorio [{0}] managerServlet.noCommand = FALLO - No se ha especificado comando diff --git a/core/src/main/java/org/apache/catalina/manager/ManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/ManagerServlet.java index c10d1c9..478d06a 100644 --- a/core/src/main/java/org/apache/catalina/manager/ManagerServlet.java +++ b/core/src/main/java/org/apache/catalina/manager/ManagerServlet.java @@ -22,9 +22,14 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -56,13 +61,17 @@ import org.apache.catalina.core.StandardHost; import org.apache.catalina.startup.ExpandWar; import org.apache.catalina.util.ContextName; -import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; +import org.apache.coyote.ProtocolHandler; +import org.apache.coyote.http11.AbstractHttp11Protocol; import org.apache.tomcat.util.Diagnostics; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.modeler.Registry; +import org.apache.tomcat.util.net.SSLContext; import org.apache.tomcat.util.net.SSLHostConfig; +import org.apache.tomcat.util.net.SSLHostConfigCertificate; import org.apache.tomcat.util.res.StringManager; +import org.apache.tomcat.util.security.Escape; /** @@ -231,9 +240,7 @@ public class ManagerServlet extends HttpServlet implements ContainerServlet { */ @Override public Wrapper getWrapper() { - - return (this.wrapper); - + return this.wrapper; } @@ -318,6 +325,7 @@ public void doGet(HttpServletRequest request, && (request.getParameter("update").equals("true"))) { update = true; } + String tlsHostName = request.getParameter("tlsHostName"); boolean statusLine = false; if ("true".equals(request.getParameter("statusLine"))) { @@ -368,6 +376,12 @@ public void doGet(HttpServletRequest request, threadDump(writer, smClient, request.getLocales()); } else if (command.equals("/sslConnectorCiphers")) { sslConnectorCiphers(writer, smClient); + } else if (command.equals("/sslConnectorCerts")) { + sslConnectorCerts(writer, smClient); + } else if (command.equals("/sslConnectorTrustedCerts")) { + sslConnectorTrustedCerts(writer, smClient); + } else if (command.equals("/sslReload")) { + sslReload(writer, tlsHostName, smClient); } else { writer.println(smClient.getString("managerServlet.unknownCommand", command)); @@ -534,6 +548,41 @@ protected void findleaks(boolean statusLine, PrintWriter writer, } + protected void sslReload(PrintWriter writer, String tlsHostName, StringManager smClient) { + Connector connectors[] = getConnectors(); + boolean found = false; + for (Connector connector : connectors) { + if (Boolean.TRUE.equals(connector.getProperty("SSLEnabled"))) { + ProtocolHandler protocol = connector.getProtocolHandler(); + if (protocol instanceof AbstractHttp11Protocol) { + AbstractHttp11Protocol http11Protoocol = (AbstractHttp11Protocol) protocol; + if (tlsHostName == null || tlsHostName.length() == 0) { + found = true; + http11Protoocol.reloadSsslHostConfigs(); + } else { + SSLHostConfig[] sslHostConfigs = http11Protoocol.findSslHostConfigs(); + for (SSLHostConfig sslHostConfig : sslHostConfigs) { + if (sslHostConfig.getHostName().equalsIgnoreCase(tlsHostName)) { + found = true; + http11Protoocol.reloadSsslHostConfig(tlsHostName); + } + } + } + } + } + } + if (found) { + if (tlsHostName == null || tlsHostName.length() == 0) { + writer.println(smClient.getString("managerServlet.sslReloadAll")); + } else { + writer.println(smClient.getString("managerServlet.sslReload", tlsHostName)); + } + } else { + writer.println(smClient.getString("managerServlet.sslReloadFail")); + } + } + + /** * Write some VM info. * @@ -560,12 +609,11 @@ protected void threadDump(PrintWriter writer, StringManager smClient, writer.print(Diagnostics.getThreadDump(requestedLocales)); } - protected void sslConnectorCiphers(PrintWriter writer, - StringManager smClient) { - writer.println(smClient.getString( - "managerServlet.sslConnectorCiphers")); - Map> connectorCiphers = getConnectorCiphers(); - for (Map.Entry> entry : connectorCiphers.entrySet()) { + + protected void sslConnectorCiphers(PrintWriter writer, StringManager smClient) { + writer.println(smClient.getString("managerServlet.sslConnectorCiphers")); + Map> connectorCiphers = getConnectorCiphers(); + for (Map.Entry> entry : connectorCiphers.entrySet()) { writer.println(entry.getKey()); for (String cipher : entry.getValue()) { writer.print(" "); @@ -575,6 +623,30 @@ protected void sslConnectorCiphers(PrintWriter writer, } + private void sslConnectorCerts(PrintWriter writer, StringManager smClient) { + writer.println(smClient.getString("managerServlet.sslConnectorCerts")); + Map> connectorCerts = getConnectorCerts(); + for (Map.Entry> entry : connectorCerts.entrySet()) { + writer.println(entry.getKey()); + for (String cert : entry.getValue()) { + writer.println(cert); + } + } + } + + + private void sslConnectorTrustedCerts(PrintWriter writer, StringManager smClient) { + writer.println(smClient.getString("managerServlet.sslConnectorTrustedCerts")); + Map> connectorTrustedCerts = getConnectorTrustedCerts(); + for (Map.Entry> entry : connectorTrustedCerts.entrySet()) { + writer.println(entry.getKey()); + for (String cert : entry.getValue()) { + writer.println(cert); + } + } + } + + /** * Store server configuration. * @@ -609,7 +681,6 @@ protected synchronized void save(PrintWriter writer, String path, StringManager log("managerServlet.storeConfig", e); writer.println(smClient.getString("managerServlet.exception", e.toString())); - return; } } else { String contextPath = path; @@ -632,7 +703,6 @@ protected synchronized void save(PrintWriter writer, String path, StringManager log("managerServlet.save[" + path + "]", e); writer.println(smClient.getString("managerServlet.exception", e.toString())); - return; } } } @@ -721,7 +791,11 @@ protected synchronized void save(PrintWriter writer, String path, StringManager return; } // Rename uploaded WAR file - uploadedWar.renameTo(deployedWar); + if (!uploadedWar.renameTo(deployedWar)) { + writer.println(smClient.getString("managerServlet.renameFail", + uploadedWar, deployedWar)); + return; + } } if (tag != null) { // Copy WAR to the host's appBase @@ -995,7 +1069,7 @@ protected void reload(PrintWriter writer, ContextName cn, Context context = (Context) host.findChild(cn.getName()); if (context == null) { writer.println(smClient.getString("managerServlet.noContext", - RequestUtil.filter(cn.getDisplayName()))); + Escape.htmlElementContent(cn.getDisplayName()))); return; } // It isn't possible for the manager to reload itself @@ -1175,13 +1249,13 @@ protected void sessions(PrintWriter writer, ContextName cn, int idle, Context context = (Context) host.findChild(cn.getName()); if (context == null) { writer.println(smClient.getString("managerServlet.noContext", - RequestUtil.filter(displayPath))); + Escape.htmlElementContent(displayPath))); return; } Manager manager = context.getManager() ; if(manager == null) { writer.println(smClient.getString("managerServlet.noManager", - RequestUtil.filter(displayPath))); + Escape.htmlElementContent(displayPath))); return; } int maxCount = 60; @@ -1301,7 +1375,7 @@ protected void start(PrintWriter writer, ContextName cn, Context context = (Context) host.findChild(cn.getName()); if (context == null) { writer.println(smClient.getString("managerServlet.noContext", - RequestUtil.filter(displayPath))); + Escape.htmlElementContent(displayPath))); return; } context.start(); @@ -1347,7 +1421,7 @@ protected void stop(PrintWriter writer, ContextName cn, Context context = (Context) host.findChild(cn.getName()); if (context == null) { writer.println(smClient.getString("managerServlet.noContext", - RequestUtil.filter(displayPath))); + Escape.htmlElementContent(displayPath))); return; } // It isn't possible for the manager to stop itself @@ -1395,13 +1469,13 @@ protected void undeploy(PrintWriter writer, ContextName cn, Context context = (Context) host.findChild(name); if (context == null) { writer.println(smClient.getString("managerServlet.noContext", - RequestUtil.filter(displayPath))); + Escape.htmlElementContent(displayPath))); return; } if (!isDeployed(name)) { writer.println(smClient.getString("managerServlet.notDeployed", - RequestUtil.filter(displayPath))); + Escape.htmlElementContent(displayPath))); return; } @@ -1612,7 +1686,7 @@ protected static boolean validateContextName(ContextName cn, String path = null; if (cn != null) { - path = RequestUtil.filter(cn.getPath()); + path = Escape.htmlElementContent(cn.getPath()); } writer.println(sm.getString("managerServlet.invalidPath", path)); return false; @@ -1687,30 +1761,108 @@ public static boolean copyInternal(File src, File dest, byte[] buf) { } - protected Map> getConnectorCiphers() { - Map> result = new HashMap<>(); + protected Map> getConnectorCiphers() { + Map> result = new HashMap<>(); - Engine e = (Engine) host.getParent(); - Service s = e.getService(); - Connector connectors[] = s.findConnectors(); + Connector connectors[] = getConnectors(); for (Connector connector : connectors) { if (Boolean.TRUE.equals(connector.getProperty("SSLEnabled"))) { SSLHostConfig[] sslHostConfigs = connector.getProtocolHandler().findSslHostConfigs(); for (SSLHostConfig sslHostConfig : sslHostConfigs) { String name = connector.toString() + "-" + sslHostConfig.getHostName(); - Set cipherList = new HashSet<>(); - String[] cipherNames = sslHostConfig.getEnabledCiphers(); - for (String cipherName : cipherNames) { - cipherList.add(cipherName); - } - result.put(name, cipherList); + /* Add cipher list, keep order but remove duplicates */ + result.put(name, new ArrayList<>(new LinkedHashSet<>( + Arrays.asList(sslHostConfig.getEnabledCiphers())))); } } else { - Set cipherList = new HashSet<>(); + ArrayList cipherList = new ArrayList<>(1); cipherList.add(sm.getString("managerServlet.notSslConnector")); result.put(connector.toString(), cipherList); } } return result; } + + + protected Map> getConnectorCerts() { + Map> result = new HashMap<>(); + + Connector connectors[] = getConnectors(); + for (Connector connector : connectors) { + if (Boolean.TRUE.equals(connector.getProperty("SSLEnabled"))) { + SSLHostConfig[] sslHostConfigs = connector.getProtocolHandler().findSslHostConfigs(); + for (SSLHostConfig sslHostConfig : sslHostConfigs) { + Set sslHostConfigCerts = + sslHostConfig.getCertificates(); + for (SSLHostConfigCertificate sslHostConfigCert : sslHostConfigCerts) { + String name = connector.toString() + "-" + sslHostConfig.getHostName() + + "-" + sslHostConfigCert.getType(); + List certList = new ArrayList<>(); + SSLContext sslContext = sslHostConfigCert.getSslContext(); + String alias = sslHostConfigCert.getCertificateKeyAlias(); + if (alias == null) { + alias = "tomcat"; + } + X509Certificate[] certs = sslContext.getCertificateChain(alias); + if (certs == null) { + certList.add(sm.getString("managerServlet.certsNotAvailable")); + } else { + for (Certificate cert : certs) { + certList.add(cert.toString()); + } + } + result.put(name, certList); + } + } + } else { + List certList = new ArrayList<>(1); + certList.add(sm.getString("managerServlet.notSslConnector")); + result.put(connector.toString(), certList); + } + } + + return result; + } + + + protected Map> getConnectorTrustedCerts() { + Map> result = new HashMap<>(); + + Connector connectors[] = getConnectors(); + for (Connector connector : connectors) { + if (Boolean.TRUE.equals(connector.getProperty("SSLEnabled"))) { + SSLHostConfig[] sslHostConfigs = connector.getProtocolHandler().findSslHostConfigs(); + for (SSLHostConfig sslHostConfig : sslHostConfigs) { + String name = connector.toString() + "-" + sslHostConfig.getHostName(); + List certList = new ArrayList<>(); + SSLContext sslContext = + sslHostConfig.getCertificates().iterator().next().getSslContext(); + X509Certificate[] certs = sslContext.getAcceptedIssuers(); + if (certs == null) { + certList.add(sm.getString("managerServlet.certsNotAvailable")); + } else if (certs.length == 0) { + certList.add(sm.getString("managerServlet.trustedCertsNotConfigured")); + } else { + for (Certificate cert : certs) { + certList.add(cert.toString()); + } + } + result.put(name, certList); + } + } else { + List certList = new ArrayList<>(1); + certList.add(sm.getString("managerServlet.notSslConnector")); + result.put(connector.toString(), certList); + } + } + + return result; + } + + + private Connector[] getConnectors() { + Engine e = (Engine) host.getParent(); + Service s = e.getService(); + return s.findConnectors(); + } } diff --git a/core/src/main/java/org/apache/catalina/manager/StatusTransformer.java b/core/src/main/java/org/apache/catalina/manager/StatusTransformer.java index b95818d..a241bd1 100644 --- a/core/src/main/java/org/apache/catalina/manager/StatusTransformer.java +++ b/core/src/main/java/org/apache/catalina/manager/StatusTransformer.java @@ -37,8 +37,8 @@ import javax.management.ObjectName; import javax.servlet.http.HttpServletResponse; -import org.apache.catalina.util.RequestUtil; import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.security.Escape; /** * This is a refactoring of the servlet to externalize @@ -260,7 +260,7 @@ public static void writeVMState(PrintWriter writer, int mode) for (MemoryPoolMXBean memoryPoolMBean : memoryPoolMBeans.values()) { MemoryUsage usage = memoryPoolMBean.getUsage(); writer.write(""); writer.write(""); - writer.print(filter(mBeanServer.getAttribute + writer.print(Escape.htmlElementContext(mBeanServer.getAttribute (pName, "remoteAddrForwarded"))); writer.write(""); writer.write(""); - writer.print(filter(mBeanServer.getAttribute + writer.print(Escape.htmlElementContext(mBeanServer.getAttribute (pName, "remoteAddr"))); writer.write(""); writer.write(""); - writer.write(filter(mBeanServer.getAttribute + writer.write(Escape.htmlElementContext(mBeanServer.getAttribute (pName, "virtualHost"))); writer.write(""); writer.write(""); if (showRequest) { - writer.write(filter(mBeanServer.getAttribute + writer.write(Escape.htmlElementContext(mBeanServer.getAttribute (pName, "method"))); writer.write(" "); - writer.write(filter(mBeanServer.getAttribute + writer.write(Escape.htmlElementContext(mBeanServer.getAttribute (pName, "currentUri"))); String queryString = (String) mBeanServer.getAttribute (pName, "currentQueryString"); if ((queryString != null) && (!queryString.equals(""))) { writer.write("?"); - writer.print(RequestUtil.filter(queryString)); + writer.print(Escape.htmlElementContent(queryString)); } writer.write(" "); - writer.write(filter(mBeanServer.getAttribute + writer.write(Escape.htmlElementContext(mBeanServer.getAttribute (pName, "protocol"))); } else { writer.write("?"); @@ -559,30 +559,30 @@ protected static void writeProcessorState(PrintWriter writer, } writer.write("\""); writer.write(" remoteAddr=\"" - + filter(mBeanServer.getAttribute + + Escape.htmlElementContext(mBeanServer.getAttribute (pName, "remoteAddr")) + "\""); writer.write(" virtualHost=\"" - + filter(mBeanServer.getAttribute + + Escape.htmlElementContext(mBeanServer.getAttribute (pName, "virtualHost")) + "\""); if (showRequest) { writer.write(" method=\"" - + filter(mBeanServer.getAttribute + + Escape.htmlElementContext(mBeanServer.getAttribute (pName, "method")) + "\""); writer.write(" currentUri=\"" - + filter(mBeanServer.getAttribute + + Escape.htmlElementContext(mBeanServer.getAttribute (pName, "currentUri")) + "\""); String queryString = (String) mBeanServer.getAttribute (pName, "currentQueryString"); if ((queryString != null) && (!queryString.equals(""))) { writer.write(" currentQueryString=\"" - + RequestUtil.filter(queryString) + "\""); + + Escape.htmlElementContent(queryString) + "\""); } else { writer.write(" currentQueryString=\"?\""); } writer.write(" protocol=\"" - + filter(mBeanServer.getAttribute + + Escape.htmlElementContext(mBeanServer.getAttribute (pName, "protocol")) + "\""); } else { writer.write(" method=\"?\""); @@ -644,7 +644,7 @@ public static void writeDetailedState(PrintWriter writer, } writer.print(""); - writer.print(filter(webModuleName)); + writer.print(Escape.htmlElementContext(webModuleName)); writer.print(""); if (iterator.hasNext()) { writer.print("
    "); @@ -710,9 +710,8 @@ protected static void writeContext(PrintWriter writer, Set managersON = mBeanServer.queryNames(queryManager, null); ObjectName managerON = null; - Iterator iterator2 = managersON.iterator(); - while (iterator2.hasNext()) { - managerON = iterator2.next(); + for (ObjectName aManagersON : managersON) { + managerON = aManagersON; } ObjectName queryJspMonitor = new ObjectName @@ -727,7 +726,7 @@ protected static void writeContext(PrintWriter writer, } writer.print("

    "); - writer.print(filter(name)); + writer.print(Escape.htmlElementContext(name)); writer.print("

    "); writer.print(""); @@ -755,9 +754,7 @@ protected static void writeContext(PrintWriter writer, ObjectName servletObjectName = new ObjectName(onStr); Set set = mBeanServer.queryMBeans(servletObjectName, null); - Iterator iterator = set.iterator(); - while (iterator.hasNext()) { - ObjectInstance oi = iterator.next(); + for (ObjectInstance oi : set) { writeWrapper(writer, oi.getObjectName(), mBeanServer, mode); } @@ -833,9 +830,7 @@ public static void writeJspMonitor(PrintWriter writer, int jspCount = 0; int jspReloadCount = 0; - Iterator iter = jspMonitorONs.iterator(); - while (iter.hasNext()) { - ObjectName jspMonitorON = iter.next(); + for (ObjectName jspMonitorON : jspMonitorONs) { Object obj = mBeanServer.getAttribute(jspMonitorON, "jspCount"); jspCount += ((Integer) obj).intValue(); obj = mBeanServer.getAttribute(jspMonitorON, "jspReloadCount"); @@ -874,11 +869,11 @@ public static void writeWrapper(PrintWriter writer, ObjectName objectName, mBeanServer.invoke(objectName, "findMappings", null, null); writer.print("

    "); - writer.print(filter(servletName)); + writer.print(Escape.htmlElementContext(servletName)); if ((mappings != null) && (mappings.length > 0)) { writer.print(" [ "); for (int i = 0; i < mappings.length; i++) { - writer.print(filter(mappings[i])); + writer.print(Escape.htmlElementContext(mappings[i])); if (i < mappings.length - 1) { writer.print(" , "); } @@ -912,46 +907,6 @@ public static void writeWrapper(PrintWriter writer, ObjectName objectName, } - /** - * 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 obj The message string to be filtered - * @return filtered HTML content - */ - public static String filter(Object obj) { - - if (obj == null) - return ("?"); - String message = obj.toString(); - - char content[] = new char[message.length()]; - message.getChars(0, message.length(), content, 0); - StringBuilder result = new StringBuilder(content.length + 50); - for (int i = 0; i < content.length; i++) { - switch (content[i]) { - case '<': - result.append("<"); - break; - case '>': - result.append(">"); - break; - case '&': - result.append("&"); - break; - case '"': - result.append("""); - break; - default: - result.append(content[i]); - } - } - return (result.toString()); - - } - - /** * Display the given size in bytes, either as KB or MB. * diff --git a/core/src/main/java/org/apache/catalina/manager/host/Constants.java b/core/src/main/java/org/apache/catalina/manager/host/Constants.java index 5990e3d..904b5f4 100644 --- a/core/src/main/java/org/apache/catalina/manager/host/Constants.java +++ b/core/src/main/java/org/apache/catalina/manager/host/Constants.java @@ -79,7 +79,7 @@ public class Constants { public static final String HTML_TAIL_SECTION = "
    \n" + "
    \n" + - " Copyright © 1999-2017, Apache Software Foundation" + + " Copyright © 1999-2018, Apache Software Foundation" + "
    \n" + "\n" + "\n" + diff --git a/core/src/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java index 87334eb..9bb0d3b 100644 --- a/core/src/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java +++ b/core/src/main/java/org/apache/catalina/manager/host/HTMLHostManagerServlet.java @@ -23,7 +23,6 @@ import java.io.StringWriter; import java.net.URLEncoder; import java.text.MessageFormat; -import java.util.Iterator; import java.util.Map; import java.util.TreeMap; @@ -33,9 +32,9 @@ import org.apache.catalina.Container; import org.apache.catalina.Host; -import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; import org.apache.tomcat.util.res.StringManager; +import org.apache.tomcat.util.security.Escape; /** * Servlet that enables remote management of the virtual hosts deployed @@ -283,7 +282,7 @@ public void list(HttpServletRequest request, if (message == null || message.length() == 0) { args[1] = "OK"; } else { - args[1] = RequestUtil.filter(message); + args[1] = Escape.htmlElementContent(message); } writer.print(MessageFormat.format(Constants.MESSAGE_SECTION, args)); @@ -332,16 +331,13 @@ public void list(HttpServletRequest request, String hostsRemove = smClient.getString("htmlHostManagerServlet.hostsRemove"); - Iterator> iterator = - sortedHostNamesMap.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); + for (Map.Entry entry : sortedHostNamesMap.entrySet()) { String hostName = entry.getKey(); Host host = (Host) engine.findChild(hostName); if (host != null ) { args = new Object[2]; - args[0] = RequestUtil.filter(hostName); + args[0] = Escape.htmlElementContent(hostName); String[] aliases = host.findAliases(); StringBuilder buf = new StringBuilder(); if (aliases.length > 0) { @@ -355,7 +351,7 @@ public void list(HttpServletRequest request, buf.append(" "); args[1] = buf.toString(); } else { - args[1] = RequestUtil.filter(buf.toString()); + args[1] = Escape.htmlElementContent(buf.toString()); } writer.print diff --git a/core/src/main/java/org/apache/catalina/manager/host/HostManagerServlet.java b/core/src/main/java/org/apache/catalina/manager/host/HostManagerServlet.java index 605c102..96adb41 100644 --- a/core/src/main/java/org/apache/catalina/manager/host/HostManagerServlet.java +++ b/core/src/main/java/org/apache/catalina/manager/host/HostManagerServlet.java @@ -141,9 +141,7 @@ public class HostManagerServlet */ @Override public Wrapper getWrapper() { - - return (this.wrapper); - + return this.wrapper; } @@ -481,7 +479,7 @@ protected synchronized void remove(PrintWriter writer, String name, try { Container child = engine.findChild(name); engine.removeChild(child); - if ( child instanceof ContainerBase ) ((ContainerBase)child).destroy(); + if ( child instanceof ContainerBase ) child.destroy(); } catch (Exception e) { writer.println(smClient.getString("hostManagerServlet.exception", e.toString())); @@ -582,9 +580,7 @@ protected void start(PrintWriter writer, String name, "hostManagerServlet.startFailed", name)); writer.println(smClient.getString( "hostManagerServlet.exception", e.toString())); - return; } - } @@ -644,9 +640,7 @@ protected void stop(PrintWriter writer, String name, name)); writer.println(smClient.getString("hostManagerServlet.exception", e.toString())); - return; } - } @@ -677,7 +671,6 @@ protected void persist(PrintWriter writer, StringManager smClient) { } else { writer.println(smClient.getString("hostManagerServlet.exception", e.toString())); } - return; } } diff --git a/core/src/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties index eefe69b..b339126 100644 --- a/core/src/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/manager/host/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + hostManagerServlet.alreadyStarted = FALLO - La m\u00E1qiuina [{0}] ya ha arrancado hostManagerServlet.alreadyStopped = FALLO - La m\u00E1quina [{0}] ya se ha parado hostManagerServlet.appBaseCreateFail = FALLO - No pude crear appBase [{0}] para la m\u00E1quina [{1}] diff --git a/core/src/main/java/org/apache/catalina/manager/util/SessionUtils.java b/core/src/main/java/org/apache/catalina/manager/util/SessionUtils.java index a28c06e..fda10f9 100644 --- a/core/src/main/java/org/apache/catalina/manager/util/SessionUtils.java +++ b/core/src/main/java/org/apache/catalina/manager/util/SessionUtils.java @@ -112,7 +112,7 @@ public static Locale guessLocaleFromSession(final HttpSession in_session) { final List tapestryArray = new ArrayList<>(); for (Enumeration enumeration = in_session.getAttributeNames(); enumeration.hasMoreElements();) { String name = enumeration.nextElement(); - if (name.indexOf("tapestry") > -1 && name.indexOf("engine") > -1 && null != in_session.getAttribute(name)) {//$NON-NLS-1$ //$NON-NLS-2$ + if (name.contains("tapestry") && name.contains("engine") && null != in_session.getAttribute(name)) {//$NON-NLS-1$ //$NON-NLS-2$ tapestryArray.add(in_session.getAttribute(name)); } } diff --git a/core/src/main/java/org/apache/catalina/mapper/Mapper.java b/core/src/main/java/org/apache/catalina/mapper/Mapper.java index 091c34d..38aed36 100644 --- a/core/src/main/java/org/apache/catalina/mapper/Mapper.java +++ b/core/src/main/java/org/apache/catalina/mapper/Mapper.java @@ -1207,7 +1207,7 @@ private static final int find(MapElement[] map, CharChunk name, int i = 0; while (true) { - i = (b + a) / 2; + i = (b + a) >>> 1; int result = compare(name, start, end, map[i].name); if (result == 1) { a = i; @@ -1262,7 +1262,7 @@ private static final int findIgnoreCase(MapElement[] map, CharChunk name, int i = 0; while (true) { - i = (b + a) / 2; + i = (b + a) >>> 1; int result = compareIgnoreCase(name, start, end, map[i].name); if (result == 1) { a = i; @@ -1309,7 +1309,7 @@ private static final int find(MapElement[] map, String name) { int i = 0; while (true) { - i = (b + a) / 2; + i = (b + a) >>> 1; int result = name.compareTo(map[i].name); if (result > 0) { a = i; @@ -1449,7 +1449,6 @@ private static final int compareIgnoreCase(CharChunk name, int start, int end, * Find the position of the last slash in the given char chunk. */ private static final int lastSlash(CharChunk name) { - char[] c = name.getBuffer(); int end = name.getEnd(); int start = name.getStart(); @@ -1461,8 +1460,7 @@ private static final int lastSlash(CharChunk name) { } } - return (pos); - + return pos; } @@ -1470,7 +1468,6 @@ private static final int lastSlash(CharChunk name) { * Find the position of the nth slash, in the given char chunk. */ private static final int nthSlash(CharChunk name, int n) { - char[] c = name.getBuffer(); int end = name.getEnd(); int start = name.getStart(); @@ -1484,8 +1481,7 @@ private static final int nthSlash(CharChunk name, int n) { } } - return (pos); - + return pos; } diff --git a/core/src/main/java/org/apache/catalina/mapper/MapperListener.java b/core/src/main/java/org/apache/catalina/mapper/MapperListener.java index 4df71ce..b2a97d6 100644 --- a/core/src/main/java/org/apache/catalina/mapper/MapperListener.java +++ b/core/src/main/java/org/apache/catalina/mapper/MapperListener.java @@ -131,7 +131,7 @@ public void stopInternal() throws LifecycleException { @Override protected String getDomainInternal() { if (service instanceof LifecycleMBeanBase) { - return ((LifecycleMBeanBase) service).getDomain(); + return service.getDomain(); } else { return null; } @@ -141,7 +141,7 @@ protected String getDomainInternal() { @Override protected String getObjectNameKeyProperties() { // Same as connector but Mapper rather than Connector - return ("type=Mapper"); + return "type=Mapper"; } // --------------------------------------------- Container Listener methods diff --git a/core/src/main/java/org/apache/catalina/mapper/MappingData.java b/core/src/main/java/org/apache/catalina/mapper/MappingData.java index 61b65f5..bee1669 100644 --- a/core/src/main/java/org/apache/catalina/mapper/MappingData.java +++ b/core/src/main/java/org/apache/catalina/mapper/MappingData.java @@ -46,7 +46,7 @@ public class MappingData { public final MessageBytes redirectPath = MessageBytes.newInstance(); // Fields used by ApplicationMapping to implement javax.servlet.http.Mapping - public MappingMatch matchType = MappingMatch.UNKNOWN; + public MappingMatch matchType = null; public void recycle() { host = null; @@ -60,6 +60,6 @@ public void recycle() { wrapperPath.recycle(); pathInfo.recycle(); redirectPath.recycle(); - matchType = MappingMatch.UNKNOWN; + matchType = null; } } diff --git a/core/src/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java b/core/src/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java index fa59262..b483991 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/BaseCatalinaMBean.java @@ -25,11 +25,6 @@ public abstract class BaseCatalinaMBean extends BaseModelMBean { - protected BaseCatalinaMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - protected T doGetManagedResource() throws MBeanException { try { @SuppressWarnings("unchecked") @@ -44,8 +39,8 @@ protected T doGetManagedResource() throws MBeanException { protected static Object newInstance(String type) throws MBeanException { try { - return Class.forName(type).newInstance(); - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + return Class.forName(type).getConstructor().newInstance(); + } catch (ReflectiveOperationException e) { throw new MBeanException(e); } } diff --git a/core/src/main/java/org/apache/catalina/mbeans/ClassNameMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ClassNameMBean.java index 99e840f..4d87b29 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/ClassNameMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/ClassNameMBean.java @@ -16,9 +16,6 @@ */ package org.apache.catalina.mbeans; -import javax.management.MBeanException; -import javax.management.RuntimeOperationsException; - /** *

    A convenience base class for ModelMBean implementations * where the underlying base class (and therefore the set of supported @@ -34,20 +31,6 @@ */ public class ClassNameMBean extends BaseCatalinaMBean { - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initialize of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public ClassNameMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * Return the fully qualified Java class name of the managed object * for this MBean. diff --git a/core/src/main/java/org/apache/catalina/mbeans/ConnectorMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ConnectorMBean.java index af22539..2e94bf0 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/ConnectorMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/ConnectorMBean.java @@ -33,20 +33,6 @@ */ public class ConnectorMBean extends ClassNameMBean { - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public ConnectorMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * Obtain and return the value of a specific attribute of this MBean. * diff --git a/core/src/main/java/org/apache/catalina/mbeans/ContainerMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContainerMBean.java index e17d48c..511b117 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/ContainerMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/ContainerMBean.java @@ -22,7 +22,6 @@ import javax.management.MBeanException; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import javax.management.RuntimeOperationsException; import org.apache.catalina.Container; import org.apache.catalina.ContainerListener; @@ -38,20 +37,6 @@ public class ContainerMBean extends BaseCatalinaMBean { - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public ContainerMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * Add a new child Container to those associated with this Container, * if supported. Won't start the child yet. Has to be started with a call to diff --git a/core/src/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java index 836841b..8cfb95c 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/ContextEnvironmentMBean.java @@ -20,7 +20,6 @@ import javax.management.AttributeNotFoundException; import javax.management.MBeanException; import javax.management.ReflectionException; -import javax.management.RuntimeOperationsException; import org.apache.tomcat.util.descriptor.web.ContextEnvironment; import org.apache.tomcat.util.descriptor.web.NamingResources; @@ -34,20 +33,6 @@ public class ContextEnvironmentMBean extends BaseCatalinaMBean { - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public ContextEnvironmentMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * Set the value of a specific attribute of this MBean. * diff --git a/core/src/main/java/org/apache/catalina/mbeans/ContextMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContextMBean.java index a456ac9..7d1f6b6 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/ContextMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/ContextMBean.java @@ -17,7 +17,6 @@ package org.apache.catalina.mbeans; import javax.management.MBeanException; -import javax.management.RuntimeOperationsException; import org.apache.catalina.Context; import org.apache.tomcat.util.descriptor.web.ApplicationParameter; @@ -28,11 +27,6 @@ public class ContextMBean extends BaseCatalinaMBean { - public ContextMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * Return the set of application parameters for this application. * @return a string array with a representation of each parameter diff --git a/core/src/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java index 061dce1..f6edc91 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/ContextResourceLinkMBean.java @@ -33,21 +33,6 @@ */ public class ContextResourceLinkMBean extends BaseCatalinaMBean { - - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public ContextResourceLinkMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * Obtain and return the value of a specific attribute of this MBean. * @@ -75,13 +60,13 @@ public Object getAttribute(String name) throws AttributeNotFoundException, MBean String value = null; if ("global".equals(name)) { - return (cl.getGlobal()); + return cl.getGlobal(); } else if ("description".equals(name)) { - return (cl.getDescription()); + return cl.getDescription(); } else if ("name".equals(name)) { - return (cl.getName()); + return cl.getName(); } else if ("type".equals(name)) { - return (cl.getType()); + return cl.getType(); } else { value = (String) cl.getProperty(name); if (value == null) { diff --git a/core/src/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java index 7721d0a..0edd7fa 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/ContextResourceMBean.java @@ -33,20 +33,6 @@ */ public class ContextResourceMBean extends BaseCatalinaMBean { - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public ContextResourceMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * Obtain and return the value of a specific attribute of this MBean. * @@ -74,15 +60,15 @@ public Object getAttribute(String name) throws AttributeNotFoundException, MBean String value = null; if ("auth".equals(name)) { - return (cr.getAuth()); + return cr.getAuth(); } else if ("description".equals(name)) { - return (cr.getDescription()); + return cr.getDescription(); } else if ("name".equals(name)) { - return (cr.getName()); + return cr.getName(); } else if ("scope".equals(name)) { - return (cr.getScope()); + return cr.getScope(); } else if ("type".equals(name)) { - return (cr.getType()); + return cr.getType(); } else { value = (String) cr.getProperty(name); if (value == null) { diff --git a/core/src/main/java/org/apache/catalina/mbeans/GroupMBean.java b/core/src/main/java/org/apache/catalina/mbeans/GroupMBean.java index eb44fca..1105e8d 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/GroupMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/GroupMBean.java @@ -18,11 +18,10 @@ import java.util.ArrayList; import java.util.Iterator; +import java.util.List; -import javax.management.MBeanException; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import javax.management.RuntimeOperationsException; import org.apache.catalina.Group; import org.apache.catalina.Role; @@ -39,20 +38,6 @@ */ public class GroupMBean extends BaseModelMBean { - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public GroupMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * The configuration information registry for our managed beans. */ @@ -71,7 +56,7 @@ public GroupMBean() throws MBeanException, RuntimeOperationsException { public String[] getRoles() { Group group = (Group) this.resource; - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); Iterator roles = group.getRoles(); while (roles.hasNext()) { Role role = null; @@ -96,7 +81,7 @@ public String[] getRoles() { public String[] getUsers() { Group group = (Group) this.resource; - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); Iterator users = group.getUsers(); while (users.hasNext()) { User user = null; diff --git a/core/src/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java b/core/src/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java index 5795ec5..992b6a2 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java +++ b/core/src/main/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java @@ -36,6 +36,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXServiceURL; @@ -211,7 +212,7 @@ public void lifecycleEvent(LifecycleEvent event) { System.setProperty("java.rmi.server.randomIDs", "true"); // Create the environment - HashMap env = new HashMap<>(); + Map env = new HashMap<>(); RMIClientSocketFactory registryCsf = null; RMIServerSocketFactory registrySsf = null; @@ -296,7 +297,7 @@ public void lifecycleEvent(LifecycleEvent event) { private JMXConnectorServer createServer(String serverName, String bindAddress, int theRmiRegistryPort, int theRmiServerPort, - HashMap theEnv, + Map theEnv, RMIClientSocketFactory registryCsf, RMIServerSocketFactory registrySsf, RMIClientSocketFactory serverCsf, RMIServerSocketFactory serverSsf) { diff --git a/core/src/main/java/org/apache/catalina/mbeans/MBeanDumper.java b/core/src/main/java/org/apache/catalina/mbeans/MBeanDumper.java index 5f95199..96c7a3f 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/MBeanDumper.java +++ b/core/src/main/java/org/apache/catalina/mbeans/MBeanDumper.java @@ -17,14 +17,16 @@ package org.apache.catalina.mbeans; import java.lang.reflect.Array; -import java.util.Iterator; import java.util.Set; +import java.util.StringJoiner; import javax.management.JMRuntimeException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanServer; import javax.management.ObjectName; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.TabularData; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -32,7 +34,6 @@ /** * General helper to dump MBean contents to the log. - * */ public class MBeanDumper { @@ -40,111 +41,106 @@ public class MBeanDumper { private static final String CRLF = "\r\n"; + /** * The following code to dump MBeans has been copied from JMXProxyServlet. + * * @param mbeanServer the MBean server * @param names a set of object names for which to dump the info * @return a string representation of the MBeans */ - public static String dumpBeans(MBeanServer mbeanServer, Set names) - { + public static String dumpBeans(MBeanServer mbeanServer, Set names) { StringBuilder buf = new StringBuilder(); - Iterator it=names.iterator(); - while( it.hasNext()) { - ObjectName oname=it.next(); + for (ObjectName oname : names) { buf.append("Name: "); buf.append(oname.toString()); buf.append(CRLF); try { - MBeanInfo minfo=mbeanServer.getMBeanInfo(oname); + MBeanInfo minfo = mbeanServer.getMBeanInfo(oname); // can't be null - I think - String code=minfo.getClassName(); + String code = minfo.getClassName(); if ("org.apache.commons.modeler.BaseModelMBean".equals(code)) { - code=(String)mbeanServer.getAttribute(oname, "modelerType"); + code = (String) mbeanServer.getAttribute(oname, "modelerType"); } buf.append("modelerType: "); buf.append(code); buf.append(CRLF); - MBeanAttributeInfo attrs[]=minfo.getAttributes(); - Object value=null; + MBeanAttributeInfo attrs[] = minfo.getAttributes(); + Object value = null; - for (int i=0; i< attrs.length; i++) { - if (! attrs[i].isReadable()) continue; - String attName=attrs[i].getName(); - if ("modelerType".equals(attName)) continue; - if (attName.indexOf('=') >=0 || - attName.indexOf(':') >=0 || - attName.indexOf(' ') >=0 ) { + for (MBeanAttributeInfo attr : attrs) { + if (!attr.isReadable()) + continue; + String attName = attr.getName(); + if ("modelerType".equals(attName)) + continue; + if (attName.indexOf('=') >= 0 || attName.indexOf(':') >= 0 + || attName.indexOf(' ') >= 0) { continue; } try { - value=mbeanServer.getAttribute(oname, attName); + value = mbeanServer.getAttribute(oname, attName); } catch (JMRuntimeException rme) { Throwable cause = rme.getCause(); if (cause instanceof UnsupportedOperationException) { if (log.isDebugEnabled()) { - log.debug("Error getting attribute " + oname - + " " + attName, rme); + log.debug("Error getting attribute " + oname + " " + attName, rme); } } else if (cause instanceof NullPointerException) { if (log.isDebugEnabled()) { - log.debug("Error getting attribute " + oname - + " " + attName, rme); + log.debug("Error getting attribute " + oname + " " + attName, rme); } } else { - log.error("Error getting attribute " + oname + - " " + attName, rme); + log.error("Error getting attribute " + oname + " " + attName, rme); } continue; } catch (Throwable t) { ExceptionUtils.handleThrowable(t); - log.error("Error getting attribute " + oname + - " " + attName, t); + log.error("Error getting attribute " + oname + " " + attName, t); + continue; + } + if (value == null) { continue; } - if (value==null) continue; String valueString; try { Class c = value.getClass(); if (c.isArray()) { int len = Array.getLength(value); - StringBuilder sb = new StringBuilder("Array[" + - c.getComponentType().getName() + "] of length " + len); + StringBuilder sb = new StringBuilder("Array[" + + c.getComponentType().getName() + "] of length " + len); if (len > 0) { sb.append(CRLF); } for (int j = 0; j < len; j++) { - sb.append("\t"); Object item = Array.get(value, j); - if (item == null) { - sb.append("NULL VALUE"); - } else { - try { - sb.append(escape(item.toString())); - } - catch (Throwable t) { - ExceptionUtils.handleThrowable(t); - sb.append("NON-STRINGABLE VALUE"); - } - } + sb.append(tableItemToString(item)); if (j < len - 1) { sb.append(CRLF); } } valueString = sb.toString(); - } - else { - valueString = escape(value.toString()); + } else if (TabularData.class.isInstance(value)) { + TabularData tab = TabularData.class.cast(value); + StringJoiner joiner = new StringJoiner(CRLF); + joiner.add( + "TabularData[" + tab.getTabularType().getRowType().getTypeName() + + "] of length " + tab.size()); + for (Object item : tab.values()) { + joiner.add(tableItemToString(item)); + } + valueString = joiner.toString(); + } else { + valueString = valueToString(value); } buf.append(attName); buf.append(": "); buf.append(valueString); buf.append(CRLF); - } - catch (Throwable t) { + } catch (Throwable t) { ExceptionUtils.handleThrowable(t); } } @@ -154,41 +150,80 @@ public static String dumpBeans(MBeanServer mbeanServer, Set names) buf.append(CRLF); } return buf.toString(); - } + public static String escape(String value) { // The only invalid char is \n // We also need to keep the string short and split it with \nSPACE // XXX TODO - int idx=value.indexOf( "\n" ); - if( idx < 0 ) return value; + int idx = value.indexOf("\n"); + if (idx < 0) { + return value; + } - int prev=0; - StringBuilder sb=new StringBuilder(); - while( idx >= 0 ) { + int prev = 0; + StringBuilder sb = new StringBuilder(); + while (idx >= 0) { appendHead(sb, value, prev, idx); - - sb.append( "\\n\n "); - prev=idx+1; - if( idx==value.length() -1 ) break; - idx=value.indexOf('\n', idx+1); + sb.append("\\n\n "); + prev = idx + 1; + if (idx == value.length() - 1) + break; + idx = value.indexOf('\n', idx + 1); + } + if (prev < value.length()) { + appendHead(sb, value, prev, value.length()); } - if( prev < value.length() ) - appendHead( sb, value, prev, value.length()); return sb.toString(); } - private static void appendHead( StringBuilder sb, String value, int start, int end) { - if (end < 1) return; - int pos=start; - while( end-pos > 78 ) { - sb.append( value.substring(pos, pos+78)); - sb.append( "\n "); - pos=pos+78; + private static void appendHead(StringBuilder sb, String value, int start, int end) { + if (end < 1) { + return; + } + + int pos = start; + while (end - pos > 78) { + sb.append(value.substring(pos, pos + 78)); + sb.append("\n "); + pos = pos + 78; } - sb.append( value.substring(pos,end)); + sb.append(value.substring(pos, end)); } + + private static String tableItemToString(Object item) { + if (item == null) { + return "\t" + "NULL VALUE"; + } else { + try { + return "\t" + valueToString(item); + } catch (Throwable t) { + ExceptionUtils.handleThrowable(t); + return "\t" + "NON-STRINGABLE VALUE"; + } + } + } + + + private static String valueToString(Object value) { + String valueString; + if (CompositeData.class.isInstance(value)) { + StringBuilder sb = new StringBuilder("{"); + String sep = ""; + CompositeData composite = CompositeData.class.cast(value); + Set keys = composite.getCompositeType().keySet(); + for (String key : keys) { + sb.append(sep).append(key).append("=").append(composite.get(key)); + sep = ", "; + } + sb.append("}"); + valueString = sb.toString(); + } else { + valueString = value.toString(); + } + return escape(valueString); + } } diff --git a/core/src/main/java/org/apache/catalina/mbeans/MBeanFactory.java b/core/src/main/java/org/apache/catalina/mbeans/MBeanFactory.java index d7360e5..47d3858 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/MBeanFactory.java +++ b/core/src/main/java/org/apache/catalina/mbeans/MBeanFactory.java @@ -247,7 +247,7 @@ private String addRealmToParent(String parent, Realm realm) throws Exception { oname = ((JmxEnabled) realm).getObjectName(); } if (oname != null) { - return (oname.toString()); + return oname.toString(); } else { return null; } @@ -303,7 +303,7 @@ private String createConnector(String parent, String address, int port, boolean // Return the corresponding MBean name ObjectName coname = retobj.getObjectName(); - return (coname.toString()); + return coname.toString(); } @@ -515,7 +515,7 @@ public String createStandardHost(String parent, String name, engine.addChild(host); // Return the corresponding MBean name - return (host.getObjectName().toString()); + return host.getObjectName().toString(); } @@ -576,7 +576,7 @@ public String createStandardManager(String parent) } ObjectName oname = manager.getObjectName(); if (oname != null) { - return (oname.toString()); + return oname.toString(); } else { return null; } @@ -631,7 +631,7 @@ public String createValve(String className, String parent) throw new IllegalArgumentException(); } - Valve valve = (Valve) Class.forName(className).newInstance(); + Valve valve = (Valve) Class.forName(className).getConstructor().newInstance(); container.getPipeline().addValve(valve); @@ -667,7 +667,7 @@ public String createWebappLoader(String parent) //ObjectName oname = loader.getObjectName(); ObjectName oname = MBeanUtils.createObjectName(pname.getDomain(), loader); - return (oname.toString()); + return oname.toString(); } @@ -752,7 +752,7 @@ public void removeContext(String contextName) throws Exception { host.removeChild(context); if(context instanceof StandardContext) try { - ((StandardContext)context).destroy(); + context.destroy(); } catch (Exception e) { log.warn("Error during context [" + context.getName() + "] destroy ", e); } diff --git a/core/src/main/java/org/apache/catalina/mbeans/MBeanUtils.java b/core/src/main/java/org/apache/catalina/mbeans/MBeanUtils.java index 765424c..0992662 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/MBeanUtils.java +++ b/core/src/main/java/org/apache/catalina/mbeans/MBeanUtils.java @@ -91,7 +91,7 @@ static String createManagedName(Object component) { String className = component.getClass().getName(); for (int i = 0; i < exceptions.length; i++) { if (className.equals(exceptions[i][0])) { - return (exceptions[i][1]); + return exceptions[i][1]; } } @@ -99,7 +99,7 @@ static String createManagedName(Object component) { int period = className.lastIndexOf('.'); if (period >= 0) className = className.substring(period + 1); - return (className); + return className; } @@ -130,7 +130,7 @@ public static DynamicMBean createMBean(ContextEnvironment environment) mserver.unregisterMBean(oname); } mserver.registerMBean(mbean, oname); - return (mbean); + return mbean; } @@ -161,7 +161,7 @@ public static DynamicMBean createMBean(ContextResource resource) mserver.unregisterMBean(oname); } mserver.registerMBean(mbean, oname); - return (mbean); + return mbean; } @@ -192,7 +192,7 @@ public static DynamicMBean createMBean(ContextResourceLink resourceLink) mserver.unregisterMBean(oname); } mserver.registerMBean(mbean, oname); - return (mbean); + return mbean; } @@ -223,7 +223,7 @@ static DynamicMBean createMBean(Group group) mserver.unregisterMBean(oname); } mserver.registerMBean(mbean, oname); - return (mbean); + return mbean; } @@ -254,7 +254,7 @@ static DynamicMBean createMBean(Role role) mserver.unregisterMBean(oname); } mserver.registerMBean(mbean, oname); - return (mbean); + return mbean; } @@ -285,7 +285,7 @@ static DynamicMBean createMBean(User user) mserver.unregisterMBean(oname); } mserver.registerMBean(mbean, oname); - return (mbean); + return mbean; } @@ -316,7 +316,7 @@ static DynamicMBean createMBean(UserDatabase userDatabase) mserver.unregisterMBean(oname); } mserver.registerMBean(mbean, oname); - return (mbean); + return mbean; } @@ -349,7 +349,7 @@ public static ObjectName createObjectName(String domain, ",context=" + cn.getDisplayName() + ",name=" + environment.getName()); } - return (name); + return name; } @@ -386,7 +386,7 @@ public static ObjectName createObjectName(String domain, ",name=" + quotedResourceName); } - return (name); + return name; } @@ -423,7 +423,7 @@ public static ObjectName createObjectName(String domain, ",name=" + quotedResourceLinkName); } - return (name); + return name; } @@ -445,7 +445,7 @@ static ObjectName createObjectName(String domain, name = new ObjectName(domain + ":type=Group,groupname=" + ObjectName.quote(group.getGroupname()) + ",database=" + group.getUserDatabase().getId()); - return (name); + return name; } @@ -528,7 +528,7 @@ static ObjectName createObjectName(String domain, ObjectName name = null; name = new ObjectName(domain + ":type=UserDatabase,database=" + userDatabase.getId()); - return (name); + return name; } @@ -538,7 +538,6 @@ static ObjectName createObjectName(String domain, * @return the singleton registry */ public static synchronized Registry createRegistry() { - if (registry == null) { registry = Registry.getRegistry(null, null); ClassLoader cl = MBeanUtils.class.getClassLoader(); @@ -559,8 +558,7 @@ public static synchronized Registry createRegistry() { registry.loadDescriptors("org.apache.catalina.storeconfig", cl); registry.loadDescriptors("org.apache.tomcat.util.descriptor.web", cl); } - return (registry); - + return registry; } @@ -571,12 +569,10 @@ public static synchronized Registry createRegistry() { * @return the singleton MBean server */ public static synchronized MBeanServer createServer() { - if (mserver == null) { mserver = Registry.getRegistry(null, null).getMBeanServer(); } - return (mserver); - + return mserver; } diff --git a/core/src/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java b/core/src/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java index b9b56f6..a81b9a2 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java @@ -18,11 +18,10 @@ import java.util.ArrayList; import java.util.Iterator; +import java.util.List; -import javax.management.MBeanException; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import javax.management.RuntimeOperationsException; import org.apache.catalina.Group; import org.apache.catalina.Role; @@ -40,22 +39,6 @@ */ public class MemoryUserDatabaseMBean extends BaseModelMBean { - // ----------------------------------------------------------- Constructors - - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public MemoryUserDatabaseMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - // ----------------------------------------------------- Instance Variables /** @@ -95,7 +78,7 @@ public MemoryUserDatabaseMBean() throws MBeanException, RuntimeOperationsExcepti */ public String[] getGroups() { UserDatabase database = (UserDatabase) this.resource; - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); Iterator groups = database.getGroups(); while (groups.hasNext()) { Group group = groups.next(); @@ -110,7 +93,7 @@ public String[] getGroups() { */ public String[] getRoles() { UserDatabase database = (UserDatabase) this.resource; - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); Iterator roles = database.getRoles(); while (roles.hasNext()) { Role role = roles.next(); @@ -125,7 +108,7 @@ public String[] getRoles() { */ public String[] getUsers() { UserDatabase database = (UserDatabase) this.resource; - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); Iterator users = database.getUsers(); while (users.hasNext()) { User user = users.next(); diff --git a/core/src/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java b/core/src/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java index 61014cf..9576a28 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/NamingResourcesMBean.java @@ -17,11 +17,10 @@ package org.apache.catalina.mbeans; import java.util.ArrayList; +import java.util.List; -import javax.management.MBeanException; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import javax.management.RuntimeOperationsException; import org.apache.catalina.deploy.NamingResourcesImpl; import org.apache.tomcat.util.descriptor.web.ContextEnvironment; @@ -39,22 +38,6 @@ */ public class NamingResourcesMBean extends BaseModelMBean { - // ----------------------------------------------------------- Constructors - - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public NamingResourcesMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - // ----------------------------------------------------- Instance Variables /** @@ -78,7 +61,7 @@ public NamingResourcesMBean() throws MBeanException, RuntimeOperationsException */ public String[] getEnvironments() { ContextEnvironment[] envs = ((NamingResourcesImpl)this.resource).findEnvironments(); - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); for (int i = 0; i < envs.length; i++) { try { ObjectName oname = MBeanUtils.createObjectName(managed.getDomain(), envs[i]); @@ -101,7 +84,7 @@ public String[] getEnvironments() { */ public String[] getResources() { ContextResource[] resources = ((NamingResourcesImpl)this.resource).findResources(); - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); for (int i = 0; i < resources.length; i++) { try { ObjectName oname = MBeanUtils.createObjectName(managed.getDomain(), resources[i]); @@ -125,7 +108,7 @@ public String[] getResources() { public String[] getResourceLinks() { ContextResourceLink[] resourceLinks = ((NamingResourcesImpl)this.resource).findResourceLinks(); - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); for (int i = 0; i < resourceLinks.length; i++) { try { ObjectName oname = diff --git a/core/src/main/java/org/apache/catalina/mbeans/RoleMBean.java b/core/src/main/java/org/apache/catalina/mbeans/RoleMBean.java index 2cad79d..41999d8 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/RoleMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/RoleMBean.java @@ -16,9 +16,6 @@ */ package org.apache.catalina.mbeans; -import javax.management.MBeanException; -import javax.management.RuntimeOperationsException; - import org.apache.tomcat.util.modeler.BaseModelMBean; import org.apache.tomcat.util.modeler.ManagedBean; import org.apache.tomcat.util.modeler.Registry; @@ -31,22 +28,6 @@ */ public class RoleMBean extends BaseModelMBean { - // ----------------------------------------------------------- Constructors - - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public RoleMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - // ----------------------------------------------------- Instance Variables /** diff --git a/core/src/main/java/org/apache/catalina/mbeans/ServiceMBean.java b/core/src/main/java/org/apache/catalina/mbeans/ServiceMBean.java index 4131ca2..02c6db9 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/ServiceMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/ServiceMBean.java @@ -17,7 +17,6 @@ package org.apache.catalina.mbeans; import javax.management.MBeanException; -import javax.management.RuntimeOperationsException; import org.apache.catalina.Executor; import org.apache.catalina.Service; @@ -25,11 +24,6 @@ public class ServiceMBean extends BaseCatalinaMBean { - public ServiceMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - /** * Add a new Connector to the set of defined Connectors, and associate it * with this Service's Container. diff --git a/core/src/main/java/org/apache/catalina/mbeans/UserMBean.java b/core/src/main/java/org/apache/catalina/mbeans/UserMBean.java index abb8708..90b0044 100644 --- a/core/src/main/java/org/apache/catalina/mbeans/UserMBean.java +++ b/core/src/main/java/org/apache/catalina/mbeans/UserMBean.java @@ -18,11 +18,10 @@ import java.util.ArrayList; import java.util.Iterator; +import java.util.List; -import javax.management.MBeanException; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; -import javax.management.RuntimeOperationsException; import org.apache.catalina.Group; import org.apache.catalina.Role; @@ -40,22 +39,6 @@ public class UserMBean extends BaseModelMBean { - // ----------------------------------------------------------- Constructors - - /** - * Construct a ModelMBean with default - * ModelMBeanInfo information. - * - * @exception MBeanException if the initializer of an object - * throws an exception - * @exception RuntimeOperationsException if an IllegalArgumentException - * occurs - */ - public UserMBean() throws MBeanException, RuntimeOperationsException { - super(); - } - - // ----------------------------------------------------- Instance Variables /** @@ -79,7 +62,7 @@ public UserMBean() throws MBeanException, RuntimeOperationsException { public String[] getGroups() { User user = (User) this.resource; - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); Iterator groups = user.getGroups(); while (groups.hasNext()) { Group group = null; @@ -105,7 +88,7 @@ public String[] getGroups() { public String[] getRoles() { User user = (User) this.resource; - ArrayList results = new ArrayList<>(); + List results = new ArrayList<>(); Iterator roles = user.getRoles(); while (roles.hasNext()) { Role role = null; diff --git a/core/src/main/java/org/apache/catalina/realm/DataSourceRealm.java b/core/src/main/java/org/apache/catalina/realm/DataSourceRealm.java index 6549ce8..3e3b92c 100644 --- a/core/src/main/java/org/apache/catalina/realm/DataSourceRealm.java +++ b/core/src/main/java/org/apache/catalina/realm/DataSourceRealm.java @@ -456,9 +456,9 @@ protected Principal getPrincipal(String username) { return new GenericPrincipal(username, null, null); } try { - return (new GenericPrincipal(username, + return new GenericPrincipal(username, getPassword(dbConnection, username), - getRoles(dbConnection, username))); + getRoles(dbConnection, username)); } finally { close(dbConnection); } @@ -540,7 +540,7 @@ private PreparedStatement credentials(Connection dbConnection, dbConnection.prepareStatement(preparedCredentials); credentials.setString(1, username); - return (credentials); + return credentials; } @@ -560,7 +560,7 @@ private PreparedStatement roles(Connection dbConnection, String username) dbConnection.prepareStatement(preparedRoles); roles.setString(1, username); - return (roles); + return roles; } diff --git a/core/src/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java b/core/src/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java index 281d537..b6a33d5 100644 --- a/core/src/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java +++ b/core/src/main/java/org/apache/catalina/realm/DigestCredentialHandlerBase.java @@ -165,7 +165,7 @@ protected boolean matchesSaltIterationsEncoded(String inputCredentials, if (storedCredentials == null) { // Stored credentials are invalid // This may be expected if nested credential handlers are being used - logInvalidStoredCredentials(storedCredentials); + logInvalidStoredCredentials(null); return false; } diff --git a/core/src/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java b/core/src/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java index 361de3a..4429fe0 100644 --- a/core/src/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java +++ b/core/src/main/java/org/apache/catalina/realm/JAASMemoryLoginModule.java @@ -243,8 +243,8 @@ public void initialize(Subject subject, CallbackHandler callbackHandler, if (option instanceof String) { try { Class clazz = Class.forName((String) option); - credentialHandler = (CredentialHandler) clazz.newInstance(); - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + credentialHandler = (CredentialHandler) clazz.getConstructor().newInstance(); + } catch (ReflectiveOperationException e) { throw new IllegalArgumentException(e); } } @@ -400,7 +400,6 @@ protected void load() { digester.parse(file); } catch (Exception e) { log.warn("Error processing configuration file " + file.getAbsolutePath(), e); - return; } finally { digester.reset(); } diff --git a/core/src/main/java/org/apache/catalina/realm/JAASRealm.java b/core/src/main/java/org/apache/catalina/realm/JAASRealm.java index b13ec62..729222f 100644 --- a/core/src/main/java/org/apache/catalina/realm/JAASRealm.java +++ b/core/src/main/java/org/apache/catalina/realm/JAASRealm.java @@ -23,7 +23,6 @@ import java.net.URL; import java.security.Principal; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import javax.security.auth.Subject; @@ -247,7 +246,7 @@ public void setContainer(Container container) { protected String roleClassNames = null; public String getRoleClassNames() { - return (this.roleClassNames); + return this.roleClassNames; } /** @@ -303,7 +302,7 @@ protected void parseClassNames(String classNamesString, List classNamesL protected String userClassNames = null; public String getUserClassNames() { - return (this.userClassNames); + return this.userClassNames; } /** @@ -401,7 +400,7 @@ protected Principal authenticate(String username, } catch (Throwable e) { ExceptionUtils.handleThrowable(e); log.error(sm.getString("jaasRealm.unexpectedError"), e); - return (null); + return null; } finally { if(!isUseContextClassLoader()) { Thread.currentThread().setContextClassLoader(ocl); @@ -419,27 +418,27 @@ protected Principal authenticate(String username, if (subject == null) { if( log.isDebugEnabled()) log.debug(sm.getString("jaasRealm.failedLogin", username)); - return (null); + return null; } } catch (AccountExpiredException e) { if (log.isDebugEnabled()) log.debug(sm.getString("jaasRealm.accountExpired", username)); - return (null); + return null; } catch (CredentialExpiredException e) { if (log.isDebugEnabled()) log.debug(sm.getString("jaasRealm.credentialExpired", username)); - return (null); + return null; } catch (FailedLoginException e) { if (log.isDebugEnabled()) log.debug(sm.getString("jaasRealm.failedLogin", username)); - return (null); + return null; } catch (LoginException e) { log.warn(sm.getString("jaasRealm.loginException", username), e); - return (null); + return null; } catch (Throwable e) { ExceptionUtils.handleThrowable(e); log.error(sm.getString("jaasRealm.unexpectedError"), e); - return (null); + return null; } if( log.isDebugEnabled()) @@ -449,13 +448,13 @@ protected Principal authenticate(String username, Principal principal = createPrincipal(username, subject, loginContext); if (principal == null) { log.debug(sm.getString("jaasRealm.authenticateFailure", username)); - return (null); + return null; } if (log.isDebugEnabled()) { log.debug(sm.getString("jaasRealm.authenticateSuccess", username)); } - return (principal); + return principal; } catch( Throwable t) { log.error( "error ", t); return null; @@ -470,9 +469,7 @@ protected Principal authenticate(String username, */ @Override protected String getPassword(String username) { - - return (null); - + return null; } @@ -513,10 +510,7 @@ protected Principal createPrincipal(String username, Subject subject, Principal userPrincipal = null; // Scan the Principals for this Subject - Iterator principals = subject.getPrincipals().iterator(); - while (principals.hasNext()) { - Principal principal = principals.next(); - + for (Principal principal : subject.getPrincipals()) { String principalClass = principal.getClass().getName(); if( log.isDebugEnabled() ) { @@ -634,23 +628,11 @@ protected Configuration getConfig() { this.jaasConfigurationLoaded = true; return this.jaasConfiguration; } - } catch (URISyntaxException ex) { - throw new RuntimeException(ex); - } catch (NoSuchMethodException ex) { - throw new RuntimeException(ex); - } catch (SecurityException ex) { - throw new RuntimeException(ex); - } catch (InstantiationException ex) { - throw new RuntimeException(ex); - } catch (IllegalAccessException ex) { - throw new RuntimeException(ex); - } catch (IllegalArgumentException ex) { - throw new RuntimeException(ex); } catch (InvocationTargetException ex) { throw new RuntimeException(ex.getCause()); - } catch (ClassNotFoundException ex) { + } catch (SecurityException | URISyntaxException | ReflectiveOperationException | + IllegalArgumentException ex) { throw new RuntimeException(ex); } - } } diff --git a/core/src/main/java/org/apache/catalina/realm/JDBCRealm.java b/core/src/main/java/org/apache/catalina/realm/JDBCRealm.java index 70ff20d..6a2d645 100644 --- a/core/src/main/java/org/apache/catalina/realm/JDBCRealm.java +++ b/core/src/main/java/org/apache/catalina/realm/JDBCRealm.java @@ -322,7 +322,7 @@ public synchronized Principal authenticate(String username, String credentials) // Return the Principal (if any) - return (principal); + return principal; } catch (SQLException e) { @@ -404,7 +404,7 @@ public synchronized Principal authenticate(Connection dbConnection, ArrayList roles = getRoles(username); // Create and return a suitable Principal for this user - return (new GenericPrincipal(username, credentials, roles)); + return new GenericPrincipal(username, credentials, roles); } @@ -490,7 +490,7 @@ protected PreparedStatement credentials(Connection dbConnection, preparedCredentials.setString(1, username); } - return (preparedCredentials); + return preparedCredentials; } @@ -557,9 +557,9 @@ protected synchronized String getPassword(String username) { @Override protected synchronized Principal getPrincipal(String username) { - return (new GenericPrincipal(username, + return new GenericPrincipal(username, getPassword(username), - getRoles(username))); + getRoles(username)); } @@ -633,13 +633,13 @@ protected Connection open() throws SQLException { // Do nothing if there is a database connection already open if (dbConnection != null) - return (dbConnection); + return dbConnection; // Instantiate our database driver if necessary if (driver == null) { try { Class clazz = Class.forName(driverName); - driver = (Driver) clazz.newInstance(); + driver = (Driver) clazz.getConstructor().newInstance(); } catch (Throwable e) { ExceptionUtils.handleThrowable(e); throw new SQLException(e.getMessage(), e); @@ -658,7 +658,7 @@ protected Connection open() throws SQLException { "jdbcRealm.open.invalidurl",driverName, connectionURL)); } dbConnection.setAutoCommit(false); - return (dbConnection); + return dbConnection; } @@ -689,7 +689,7 @@ protected synchronized PreparedStatement roles(Connection dbConnection, } preparedRoles.setString(1, username); - return (preparedRoles); + return preparedRoles; } diff --git a/core/src/main/java/org/apache/catalina/realm/JNDIRealm.java b/core/src/main/java/org/apache/catalina/realm/JNDIRealm.java index 11c164a..e980bdf 100644 --- a/core/src/main/java/org/apache/catalina/realm/JNDIRealm.java +++ b/core/src/main/java/org/apache/catalina/realm/JNDIRealm.java @@ -416,6 +416,12 @@ public class JNDIRealm extends RealmBase { */ protected String connectionTimeout = "5000"; + /** + * The timeout, in milliseconds, to use when trying to read from a connection + * to the directory. The default is 5000 (5 seconds). + */ + protected String readTimeout = "5000"; + /** * The sizeLimit (also known as the countLimit) to use when the realm is * configured with {@link #userSearch}. Zero for no limit. @@ -1037,6 +1043,27 @@ public void setConnectionTimeout(String timeout) { } + /** + * @return the read timeout. + */ + public String getReadTimeout() { + + return readTimeout; + + } + + + /** + * Set the read timeout. + * + * @param timeout The new read timeout + */ + public void setReadTimeout(String timeout) { + + this.readTimeout = timeout; + + } + public long getSizeLimit() { return sizeLimit; @@ -1174,8 +1201,7 @@ public HostnameVerifier getHostnameVerifier() { "jndiRealm.invalidHostnameVerifier", hostNameVerifierClassName)); } - } catch (ClassNotFoundException | SecurityException - | InstantiationException | IllegalAccessException e) { + } catch (ReflectiveOperationException | SecurityException e) { throw new IllegalArgumentException(sm.getString( "jndiRealm.invalidHostnameVerifier", hostNameVerifierClassName), e); @@ -1219,10 +1245,9 @@ private String[] getSupportedSslProtocols() { } private Object constructInstance(String className) - throws ClassNotFoundException, InstantiationException, - IllegalAccessException { + throws ReflectiveOperationException { Class clazz = Class.forName(className); - return clazz.newInstance(); + return clazz.getConstructor().newInstance(); } // ---------------------------------------------------------- Realm Methods @@ -1259,11 +1284,22 @@ public Principal authenticate(String username, String credentials) { // Authenticate the specified username if possible principal = authenticate(context, username, credentials); - } catch (NullPointerException | CommunicationException - | ServiceUnavailableException e) { - /* BZ 42449 - Catch NPE - Kludge Sun's LDAP provider - with broken SSL - */ + } catch (NullPointerException | NamingException e) { + /* + * BZ 61313 + * NamingException may or may not indicate an error that is + * recoverable via fail over. Therefore a decision needs to be + * made whether to fail over or not. Generally, attempting to + * fail over when it is not appropriate is better than not + * failing over when it is appropriate so the code always + * attempts to fail over for NamingExceptions. + */ + + /* + * BZ 42449 + * Catch NPE - Kludge Sun's LDAP provider with broken SSL. + */ + // log the exception so we know it's there. containerLog.info(sm.getString("jndiRealm.exception.retry"), e); @@ -1349,7 +1385,7 @@ public synchronized Principal authenticate(DirContext context, if (containerLog.isDebugEnabled()) { containerLog.debug("Found roles: " + roles.toString()); } - return (new GenericPrincipal(username, credentials, roles)); + return new GenericPrincipal(username, credentials, roles); } } catch (InvalidNameException ine) { // Log the problem for posterity @@ -1448,7 +1484,7 @@ protected User getUser(DirContext context, String username, User user = null; // Get attributes to retrieve from user entry - ArrayList list = new ArrayList<>(); + List list = new ArrayList<>(); if (userPassword != null) list.add(userPassword); if (userRoleName != null) @@ -1934,7 +1970,7 @@ protected List getRoles(DirContext context, User user) if (results == null) return list; // Should never happen, but just in case ... - HashMap groupMap = new HashMap<>(); + Map groupMap = new HashMap<>(); try { while (results.hasMore()) { SearchResult result = results.next(); @@ -2401,8 +2437,7 @@ private SSLSocketFactory createSSLSocketFactoryFromClassName(String className) { "jndiRealm.invalidSslSocketFactory", className)); } - } catch (ClassNotFoundException | SecurityException - | InstantiationException | IllegalAccessException e) { + } catch (ReflectiveOperationException | SecurityException e) { throw new IllegalArgumentException(sm.getString( "jndiRealm.invalidSslSocketFactory", className), e); @@ -2511,6 +2546,8 @@ else if (alternateURL != null && connectionAttempt > 0) env.put(JNDIRealm.DEREF_ALIASES, derefAliases); if (connectionTimeout != null) env.put("com.sun.jndi.ldap.connect.timeout", connectionTimeout); + if (readTimeout != null) + env.put("com.sun.jndi.ldap.read.timeout", readTimeout); return env; @@ -2589,7 +2626,7 @@ protected void stopInternal() throws LifecycleException { protected String[] parseUserPatternString(String userPatternString) { if (userPatternString != null) { - ArrayList pathList = new ArrayList<>(); + List pathList = new ArrayList<>(); int startParenLoc = userPatternString.indexOf('('); if (startParenLoc == -1) { // no parens here; return whole thing diff --git a/core/src/main/java/org/apache/catalina/realm/LocalStrings.properties b/core/src/main/java/org/apache/catalina/realm/LocalStrings.properties index 591fb57..1a96cc4 100644 --- a/core/src/main/java/org/apache/catalina/realm/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/realm/LocalStrings.properties @@ -68,9 +68,7 @@ realmBase.authenticateSuccess=Username [{0}] successfully authenticated realmBase.gssNameFail=Failed to extract name from established GSSContext realmBase.gotX509Username=Got user name from X509 certificate: [{0}] realmBase.createUsernameRetriever.ClassCastException=Class [{0}] is not an X509UsernameRetriever. -realmBase.createUsernameRetriever.ClassNotFoundException=Cannot find class [{0}]. -realmBase.createUsernameRetriever.InstantiationException=Cannot create object of type [{0}]. -realmBase.createUsernameRetriever.IllegalAccessException=Cannot create object of type [{0}]. +realmBase.createUsernameRetriever.newInstance=Cannot create object of type [{0}]. realmBase.credentialHandler.customCredentialHandler=Unable to set the property [{0}] to value [{1}] as a custom CredentialHandler has been configured realmBase.cannotGetRoles=Cannot get roles from principal [{0}] realmBase.gssContextNotEstablished=Authenticator implementation error: the passed security context is not fully established diff --git a/core/src/main/java/org/apache/catalina/realm/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/realm/LocalStrings_es.properties index b3d790d..0ed1722 100644 --- a/core/src/main/java/org/apache/catalina/realm/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/realm/LocalStrings_es.properties @@ -1,4 +1,3 @@ -jaasRealm.beginLogin = JAASRealm login requerido para nombre de usuario [{0}] usando LoginContext para aplicaci\u00F3n [{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. @@ -19,6 +18,7 @@ jaasRealm.beginLogin = JAASRealm login requerido para nombre de usuario [{0}] us jaasRealm.accountExpired = El usuario [{0}] NO ha sido autentificado porque ha expirado su cuenta jaasRealm.authenticateFailure = Nombre de usuario [{0}] NO autenticado con \u00E9xito jaasRealm.authenticateSuccess = Nombre de usuario [{0}] autenticado con \u00E9xito como Principal [{1}] -- Tambi\u00E9n se ha creado el Asunto +jaasRealm.beginLogin = JAASRealm login requerido para nombre de usuario [{0}] usando LoginContext para aplicaci\u00F3n [{1}] jaasRealm.credentialExpired = El usuario [{0}] NO ha sido autentificado porque ha expirado su credencial jaasRealm.failedLogin = El usuario [{0}] NO ha sido autentificado porque ha fallado el login jaasRealm.loginException = Excepci\u00F3n de Login autenticando nombre de usuario [{0}] diff --git a/core/src/main/java/org/apache/catalina/realm/MemoryRealm.java b/core/src/main/java/org/apache/catalina/realm/MemoryRealm.java index 7944240..21bae6d 100644 --- a/core/src/main/java/org/apache/catalina/realm/MemoryRealm.java +++ b/core/src/main/java/org/apache/catalina/realm/MemoryRealm.java @@ -21,6 +21,7 @@ import java.security.Principal; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.catalina.LifecycleException; @@ -155,7 +156,7 @@ public Principal authenticate(String username, String credentials) { void addUser(String username, String password, String roles) { // Accumulate the list of roles for this user - ArrayList list = new ArrayList<>(); + List list = new ArrayList<>(); roles += ","; while (true) { int comma = roles.indexOf(','); @@ -182,7 +183,6 @@ void addUser(String username, String password, String roles) { * the XML input file, creating a new one if necessary. */ protected synchronized Digester getDigester() { - if (digester == null) { digester = new Digester(); digester.setValidating(false); @@ -195,8 +195,7 @@ protected synchronized Digester getDigester() { } digester.addRuleSet(new MemoryRuleSet()); } - return (digester); - + return digester; } @@ -208,9 +207,9 @@ protected String getPassword(String username) { GenericPrincipal principal = principals.get(username); if (principal != null) { - return (principal.getPassword()); + return principal.getPassword(); } else { - return (null); + return null; } } diff --git a/core/src/main/java/org/apache/catalina/realm/MemoryRuleSet.java b/core/src/main/java/org/apache/catalina/realm/MemoryRuleSet.java index 6c43aaf..9a114e9 100644 --- a/core/src/main/java/org/apache/catalina/realm/MemoryRuleSet.java +++ b/core/src/main/java/org/apache/catalina/realm/MemoryRuleSet.java @@ -14,29 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.realm; - import org.apache.tomcat.util.digester.Digester; import org.apache.tomcat.util.digester.Rule; -import org.apache.tomcat.util.digester.RuleSetBase; +import org.apache.tomcat.util.digester.RuleSet; import org.xml.sax.Attributes; - /** *

    RuleSet for recognizing the users defined in the * XML file processed by MemoryRealm.

    * * @author Craig R. McClanahan */ -public class MemoryRuleSet extends RuleSetBase { +public class MemoryRuleSet implements RuleSet { // ----------------------------------------------------- Instance Variables - /** * The matching pattern prefix to use for recognizing our elements. */ @@ -45,15 +40,12 @@ public class MemoryRuleSet extends RuleSetBase { // ------------------------------------------------------------ Constructor - /** * Construct an instance of this RuleSet with the default * matching pattern prefix. */ public MemoryRuleSet() { - this("tomcat-users/"); - } @@ -65,11 +57,7 @@ public MemoryRuleSet() { * trailing slash character) */ public MemoryRuleSet(String prefix) { - - super(); - this.namespaceURI = null; this.prefix = prefix; - } diff --git a/core/src/main/java/org/apache/catalina/realm/RealmBase.java b/core/src/main/java/org/apache/catalina/realm/RealmBase.java index 608f39a..644cd2f 100644 --- a/core/src/main/java/org/apache/catalina/realm/RealmBase.java +++ b/core/src/main/java/org/apache/catalina/realm/RealmBase.java @@ -23,7 +23,6 @@ import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Principal; import java.security.cert.X509Certificate; @@ -54,7 +53,6 @@ import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.IntrospectionUtils; import org.apache.tomcat.util.buf.B2CConverter; -import org.apache.tomcat.util.buf.HexUtils; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.apache.tomcat.util.res.StringManager; @@ -191,9 +189,7 @@ public void setCredentialHandler(CredentialHandler credentialHandler) { */ @Override public Container getContainer() { - - return (container); - + return container; } @@ -446,7 +442,7 @@ public Principal authenticate(String username, String clientDigest, public Principal authenticate(X509Certificate certs[]) { if ((certs == null) || (certs.length < 1)) - return (null); + return null; // Check the validity of each certificate in the chain if (log.isDebugEnabled()) @@ -461,14 +457,13 @@ public Principal authenticate(X509Certificate certs[]) { } catch (Exception e) { if (log.isDebugEnabled()) log.debug(" Validity exception", e); - return (null); + return null; } } } // Check the existence of the client Principal in our database - return (getPrincipal(certs[0])); - + return getPrincipal(certs[0]); } @@ -546,7 +541,7 @@ public void backgroundProcess() { if ((constraints == null) || (constraints.length == 0)) { if (log.isDebugEnabled()) log.debug(" No applicable constraints defined"); - return (null); + return null; } // Check each defined security constraint @@ -1209,7 +1204,7 @@ protected Principal getPrincipal(X509Certificate usercert) { if(log.isDebugEnabled()) log.debug(sm.getString("realmBase.gotX509Username", username)); - return(getPrincipal(username)); + return getPrincipal(username); } @@ -1259,44 +1254,6 @@ protected Server getServer() { // --------------------------------------------------------- Static Methods - /** - * Digest password using the algorithm specified and convert the result to a - * corresponding hex string. - * - * @param credentials Password or other credentials to use in authenticating - * this username - * @param algorithm Algorithm used to do the digest - * @param encoding Character encoding of the string to digest - * - * @return The digested credentials as a hex string or the original plain - * text credentials if an error occurs. - */ - public static final String Digest(String credentials, String algorithm, - String encoding) { - - try { - // Obtain a new message digest with "digest" encryption - MessageDigest md = - (MessageDigest) MessageDigest.getInstance(algorithm).clone(); - - // encode the credentials - // Should use the digestEncoding, but that's not a static field - if (encoding == null) { - md.update(credentials.getBytes()); - } else { - md.update(credentials.getBytes(encoding)); - } - - // Digest the credentials and return as hexadecimal - return (HexUtils.toHexString(md.digest())); - } catch(Exception ex) { - log.error(ex); - return credentials; - } - - } - - /** * Generate a stored credential string for the given password and associated * parameters. @@ -1405,11 +1362,11 @@ public static void main(String args[]) { if (handlerClassName == null) { for (Class clazz : credentialHandlerClasses) { try { - handler = clazz.newInstance(); + handler = clazz.getConstructor().newInstance(); if (IntrospectionUtils.setProperty(handler, "algorithm", algorithm)) { break; } - } catch (InstantiationException | IllegalAccessException e) { + } catch (ReflectiveOperationException e) { // This isn't good. throw new RuntimeException(e); } @@ -1417,10 +1374,9 @@ public static void main(String args[]) { } else { try { Class clazz = Class.forName(handlerClassName); - handler = (DigestCredentialHandlerBase) clazz.newInstance(); + handler = (DigestCredentialHandlerBase) clazz.getConstructor().newInstance(); IntrospectionUtils.setProperty(handler, "algorithm", algorithm); - } catch (InstantiationException | IllegalAccessException - | ClassNotFoundException e) { + } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } @@ -1551,13 +1507,9 @@ private static X509UsernameRetriever createUsernameRetriever(String className) try { @SuppressWarnings("unchecked") Class clazz = (Class)Class.forName(className); - return clazz.newInstance(); - } catch (ClassNotFoundException e) { - throw new LifecycleException(sm.getString("realmBase.createUsernameRetriever.ClassNotFoundException", className), e); - } catch (InstantiationException e) { - throw new LifecycleException(sm.getString("realmBase.createUsernameRetriever.InstantiationException", className), e); - } catch (IllegalAccessException e) { - throw new LifecycleException(sm.getString("realmBase.createUsernameRetriever.IllegalAccessException", className), e); + return clazz.getConstructor().newInstance(); + } catch (ReflectiveOperationException e) { + throw new LifecycleException(sm.getString("realmBase.createUsernameRetriever.newInstance", className), e); } catch (ClassCastException e) { throw new LifecycleException(sm.getString("realmBase.createUsernameRetriever.ClassCastException", className), e); } diff --git a/core/src/main/java/org/apache/catalina/realm/UserDatabaseRealm.java b/core/src/main/java/org/apache/catalina/realm/UserDatabaseRealm.java index 50fc2f0..cb6e871 100644 --- a/core/src/main/java/org/apache/catalina/realm/UserDatabaseRealm.java +++ b/core/src/main/java/org/apache/catalina/realm/UserDatabaseRealm.java @@ -154,15 +154,13 @@ public boolean hasRole(Wrapper wrapper, Principal principal, String role) { */ @Override protected String getPassword(String username) { - User user = database.findUser(username); if (user == null) { return null; } - return (user.getPassword()); - + return user.getPassword(); } diff --git a/core/src/main/java/org/apache/catalina/security/DeployXmlPermission.java b/core/src/main/java/org/apache/catalina/security/DeployXmlPermission.java new file mode 100644 index 0000000..bf8ca27 --- /dev/null +++ b/core/src/main/java/org/apache/catalina/security/DeployXmlPermission.java @@ -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. + */ +package org.apache.catalina.security; + +import java.security.BasicPermission; + +/** + * Grant this permission to a docBase to permit the web application to use any + * META-INF/context.xml that might be present with in the + * application when deployXML has been disabled at the Host level. + * The name of the permission should be the base name for the web application. + */ +public class DeployXmlPermission extends BasicPermission { + + private static final long serialVersionUID = 1L; + + public DeployXmlPermission(String name) { + super(name); + } + + public DeployXmlPermission(String name, String actions) { + super(name, actions); + } +} diff --git a/core/src/main/java/org/apache/catalina/security/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/security/LocalStrings_es.properties index bf9b9cd..39a79c6 100644 --- a/core/src/main/java/org/apache/catalina/security/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/security/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + SecurityUtil.doAsPrivilege = Ha tenido lugar una excepci\u00F3n al ejecutar el bloque PrivilegedExceptionAction. SecurityListener.checkUmaskFail = Intentado arranque con valor de umask de [{0}]. Ejecutando Tomcat sin umask al menos tan restrictivo como [{1}] ha sido bloqueado por el oyente de Ciclo de Vida org.apache.catalina.security.SecurityListener (normalmente configurado en CATALINA_BASE/conf/server.xml) SecurityListener.checkUmaskNone = No se ha hallado valor de umask en propiedad de sistema [{0}]. Si embargo, parece que Tomcat est\u00E1 siendo ejecutado en una plataforma que soporta umask. La propiedad del sistema se pone normalmente en CATALINA_HOME/bin/catalina.sh. El oyente de Ciclo de Vida org.apache.catalina.security.SecurityListener (normalmente configurado en CATALINA_BASE/conf/server.xml) espera un umask al menos tan restrictivo como [{1}] diff --git a/core/src/main/java/org/apache/catalina/security/SecurityClassLoad.java b/core/src/main/java/org/apache/catalina/security/SecurityClassLoad.java index e6600d3..2d902bc 100644 --- a/core/src/main/java/org/apache/catalina/security/SecurityClassLoad.java +++ b/core/src/main/java/org/apache/catalina/security/SecurityClassLoad.java @@ -74,6 +74,7 @@ private static final void loadCorePackage(ClassLoader loader) throws Exception { private static final void loadLoaderPackage(ClassLoader loader) throws Exception { final String basePackage = "org.apache.catalina.loader."; loader.loadClass(basePackage + "WebappClassLoaderBase$PrivilegedFindClassByName"); + loader.loadClass(basePackage + "WebappClassLoaderBase$PrivilegedHasLoggingConfig"); } @@ -106,6 +107,7 @@ private static final void loadUtilPackage(ClassLoader loader) throws Exception { final String basePackage = "org.apache.catalina.util."; loader.loadClass(basePackage + "ParameterMap"); loader.loadClass(basePackage + "RequestUtil"); + loader.loadClass(basePackage + "TLSUtil"); } @@ -114,7 +116,7 @@ private static final void loadCoyotePackage(ClassLoader loader) throws Exception loader.loadClass(basePackage + "http11.Constants"); // Make sure system property is read at this point Class clazz = loader.loadClass(basePackage + "Constants"); - clazz.newInstance(); + clazz.getConstructor().newInstance(); loader.loadClass(basePackage + "http2.Stream$PrivilegedPush"); } @@ -177,7 +179,7 @@ private static final void loadTomcatPackage(ClassLoader loader) throws Exception loader.loadClass(basePackage + "util.http.NamesEnumerator"); // Make sure system property is read at this point Class clazz = loader.loadClass(basePackage + "util.http.FastHttpDateFormat"); - clazz.newInstance(); + clazz.getConstructor().newInstance(); loader.loadClass(basePackage + "util.http.parser.HttpParser"); loader.loadClass(basePackage + "util.http.parser.MediaType"); loader.loadClass(basePackage + "util.http.parser.MediaTypeCache"); diff --git a/core/src/main/java/org/apache/catalina/security/SecurityUtil.java b/core/src/main/java/org/apache/catalina/security/SecurityUtil.java index c08361c..74ec443 100644 --- a/core/src/main/java/org/apache/catalina/security/SecurityUtil.java +++ b/core/src/main/java/org/apache/catalina/security/SecurityUtil.java @@ -153,7 +153,7 @@ public static void doAsPrivilege(final String methodName, Method method = null; Method[] methodsCache = classCache.get(Servlet.class); if(methodsCache == null) { - method = createMethodAndCacheIt(methodsCache, + method = createMethodAndCacheIt(null, Servlet.class, methodName, targetParameterTypes); @@ -236,7 +236,7 @@ public static void doAsPrivilege(final String methodName, Method method = null; Method[] methodsCache = classCache.get(Filter.class); if(methodsCache == null) { - method = createMethodAndCacheIt(methodsCache, + method = createMethodAndCacheIt(null, Filter.class, methodName, targetParameterTypes); diff --git a/core/src/main/java/org/apache/catalina/servlets/CGIServlet.java b/core/src/main/java/org/apache/catalina/servlets/CGIServlet.java index aea980b..bfc27cd 100644 --- a/core/src/main/java/org/apache/catalina/servlets/CGIServlet.java +++ b/core/src/main/java/org/apache/catalina/servlets/CGIServlet.java @@ -282,6 +282,13 @@ public final class CGIServlet extends HttpServlet { /** the shell environment variables to be passed to the CGI script */ private final Hashtable shellEnv = new Hashtable<>(); + /** + * Enable creation of script command line arguments from query-string. + * See https://tools.ietf.org/html/rfc3875#section-4.4 + * 4.4. The Script Command Line + */ + private boolean enableCmdLineArguments = false; + /** * Sets instance variables. *

    @@ -311,6 +318,17 @@ public void init(ServletConfig config) throws ServletException { shellEnv.putAll(System.getenv()); } + Enumeration e = config.getInitParameterNames(); + while(e.hasMoreElements()) { + String initParamName = e.nextElement(); + if (initParamName.startsWith("environment-variable-")) { + if (initParamName.length() == 21) { + throw new ServletException(sm.getString("cgiServlet.emptyEnvVarName")); + } + shellEnv.put(initParamName.substring(21), config.getInitParameter(initParamName)); + } + } + if (getServletConfig().getInitParameter("executable") != null) { cgiExecutable = getServletConfig().getInitParameter("executable"); } @@ -341,6 +359,11 @@ public void init(ServletConfig config) throws ServletException { envHttpHeadersPattern = Pattern.compile(getServletConfig().getInitParameter("envHttpHeaders")); } + + if (getServletConfig().getInitParameter("enableCmdLineArguments") != null) { + enableCmdLineArguments = + Boolean.parseBoolean(config.getInitParameter("enableCmdLineArguments")); + } } @@ -670,9 +693,8 @@ protected void setupFromRequest(HttpServletRequest req) // does not contain an unencoded "=" this is an indexed query. // The parsed query string becomes the command line parameters // for the cgi command. - if (req.getMethod().equals("GET") - || req.getMethod().equals("POST") - || req.getMethod().equals("HEAD")) { + if (enableCmdLineArguments && (req.getMethod().equals("GET") + || req.getMethod().equals("POST") || req.getMethod().equals("HEAD"))) { String qs; if (isIncluded) { qs = (String) req.getAttribute( @@ -799,13 +821,10 @@ protected String[] findCGI(String pathInfo, String webAppRootDir, path = currentLocation.getAbsolutePath(); name = currentLocation.getName(); - if (".".equals(contextPath)) { - scriptname = servletPath; + if (servletPath.startsWith(cginame)) { + scriptname = contextPath + cginame; } else { - scriptname = contextPath + servletPath; - } - if (!servletPath.equals(cginame)) { - scriptname = scriptname + cginame; + scriptname = contextPath + servletPath + cginame; } if (log.isDebugEnabled()) { @@ -1467,9 +1486,9 @@ protected void run() throws IOException { log.debug("envp: [" + env + "], command: [" + command + "]"); } - if ((command.indexOf(File.separator + "." + File.separator) >= 0) - || (command.indexOf(File.separator + "..") >= 0) - || (command.indexOf(".." + File.separator) >= 0)) { + if ((command.contains(File.separator + "." + File.separator)) + || (command.contains(File.separator + "..")) + || (command.contains(".." + File.separator))) { throw new IOException(this.getClass().getName() + "Illegal Character in CGI command " + "path ('.' or '..') detected. Not " diff --git a/core/src/main/java/org/apache/catalina/servlets/DefaultServlet.java b/core/src/main/java/org/apache/catalina/servlets/DefaultServlet.java index 7a6711e..a5da7ab 100644 --- a/core/src/main/java/org/apache/catalina/servlets/DefaultServlet.java +++ b/core/src/main/java/org/apache/catalina/servlets/DefaultServlet.java @@ -32,6 +32,8 @@ import java.io.Serializable; import java.io.StringReader; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.AccessController; import java.util.ArrayList; @@ -70,10 +72,11 @@ import org.apache.catalina.WebResourceRoot; import org.apache.catalina.connector.RequestFacade; import org.apache.catalina.connector.ResponseFacade; -import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; import org.apache.catalina.util.URLEncoder; +import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.res.StringManager; +import org.apache.tomcat.util.security.Escape; import org.apache.tomcat.util.security.PrivilegedGetTccl; import org.apache.tomcat.util.security.PrivilegedSetTccl; import org.w3c.dom.Document; @@ -230,6 +233,12 @@ public class DefaultServlet extends HttpServlet { * the platform default is used. */ protected String fileEncoding = null; + private transient Charset fileEncodingCharset = null; + + /** + * If a file has a BOM, should that be used in preference to fileEncoding? + */ + private boolean useBomIfPresent = true; /** * Minimum size for sendfile usage in bytes. @@ -287,6 +296,20 @@ public void init() throws ServletException { Integer.parseInt(getServletConfig().getInitParameter("sendfileSize")) * 1024; fileEncoding = getServletConfig().getInitParameter("fileEncoding"); + if (fileEncoding == null) { + fileEncodingCharset = Charset.defaultCharset(); + fileEncoding = fileEncodingCharset.name(); + } else { + try { + fileEncodingCharset = B2CConverter.getCharset(fileEncoding); + } catch (UnsupportedEncodingException e) { + throw new ServletException(e); + } + } + + if (getServletConfig().getInitParameter("useBomIfPresent") != null) + useBomIfPresent = Boolean.parseBoolean( + getServletConfig().getInitParameter("useBomIfPresent")); globalXsltFile = getServletConfig().getInitParameter("globalXsltFile"); contextXsltFile = getServletConfig().getInitParameter("contextXsltFile"); @@ -476,24 +499,35 @@ protected void doHead(HttpServletRequest request, HttpServletResponse response) protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setHeader("Allow", determineMethodsAllowed(req)); + } + + + protected String determineMethodsAllowed(HttpServletRequest req) { StringBuilder allow = new StringBuilder(); - // There is a doGet method - allow.append("GET, HEAD"); - // There is a doPost - allow.append(", POST"); - // There is a doPut - allow.append(", PUT"); - // There is a doDelete - allow.append(", DELETE"); + + // Start with methods that are always allowed + allow.append("OPTIONS, GET, HEAD, POST"); + + // PUT and DELETE depend on readonly + if (!readOnly) { + allow.append(", PUT, DELETE"); + } + // Trace - assume disabled unless we can prove otherwise if (req instanceof RequestFacade && ((RequestFacade) req).getAllowTrace()) { allow.append(", TRACE"); } - // Always allow options - allow.append(", OPTIONS"); - resp.setHeader("Allow", allow.toString()); + return allow.toString(); + } + + + protected void sendNotAllowed(HttpServletRequest req, HttpServletResponse resp) + throws IOException { + resp.addHeader("Allow", determineMethodsAllowed(req)); + resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED); } @@ -528,7 +562,7 @@ protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (readOnly) { - resp.sendError(HttpServletResponse.SC_FORBIDDEN); + sendNotAllowed(req, resp); return; } @@ -601,7 +635,7 @@ protected File executePartialPut(HttpServletRequest req, Range range, } try (RandomAccessFile randAccessContentFile = - new RandomAccessFile(contentFile, "rw");) { + new RandomAccessFile(contentFile, "rw")) { WebResource oldResource = resources.getResource(path); @@ -609,7 +643,7 @@ protected File executePartialPut(HttpServletRequest req, Range range, if (oldResource.isFile()) { try (BufferedInputStream bufOldRevStream = new BufferedInputStream(oldResource.getInputStream(), - BUFFER_SIZE);) { + BUFFER_SIZE)) { int numBytesRead; byte[] copyBuffer = new byte[BUFFER_SIZE]; @@ -627,7 +661,7 @@ protected File executePartialPut(HttpServletRequest req, Range range, int numBytesRead; byte[] transferBuffer = new byte[BUFFER_SIZE]; try (BufferedInputStream requestBufInStream = - new BufferedInputStream(req.getInputStream(), BUFFER_SIZE);) { + new BufferedInputStream(req.getInputStream(), BUFFER_SIZE)) { while ((numBytesRead = requestBufInStream.read(transferBuffer)) != -1) { randAccessContentFile.write(transferBuffer, 0, numBytesRead); } @@ -652,7 +686,7 @@ protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (readOnly) { - resp.sendError(HttpServletResponse.SC_FORBIDDEN); + sendNotAllowed(req, resp); return; } @@ -712,11 +746,11 @@ protected String rewriteUrl(String path) { /** * Serve the specified resource, optionally including the data content. * - * @param request The servlet request we are processing - * @param response The servlet response we are creating - * @param content Should the content be included? - * @param encoding The encoding to use if it is necessary to access the - * source as characters rather than as bytes + * @param request The servlet request we are processing + * @param response The servlet response we are creating + * @param content Should the content be included? + * @param inputEncoding The encoding to use if it is necessary to access the + * source as characters rather than as bytes * * @exception IOException if an input/output error occurs * @exception ServletException if a servlet-specified error occurs @@ -724,7 +758,7 @@ protected String rewriteUrl(String path) { protected void serveResource(HttpServletRequest request, HttpServletResponse response, boolean content, - String encoding) + String inputEncoding) throws IOException, ServletException { boolean serveContent = content; @@ -797,20 +831,6 @@ protected void serveResource(HttpServletRequest request, return; } - // If the resource is not a collection, and the resource path - // ends with "/" or "\", return NOT FOUND - if (resource.isFile() && (path.endsWith("/") || path.endsWith("\\"))) { - // Check if we're included so we can return the appropriate - // missing resource name in the error - String requestUri = (String) request.getAttribute( - RequestDispatcher.INCLUDE_REQUEST_URI); - if (requestUri == null) { - requestUri = request.getRequestURI(); - } - response.sendError(HttpServletResponse.SC_NOT_FOUND, requestUri); - return; - } - boolean included = false; // Check if the conditions specified in the optional If headers are // satisfied. @@ -923,12 +943,7 @@ protected void serveResource(HttpServletRequest request, } catch (IllegalStateException e) { // If it fails, we try to get a Writer instead if we're // trying to serve a text file - if (!usingPrecompressedVersion && - ((contentType == null) || - (contentType.startsWith("text")) || - (contentType.endsWith("xml")) || - (contentType.contains("/javascript"))) - ) { + if (!usingPrecompressedVersion && isText(contentType)) { writer = response.getWriter(); // Cannot reliably serve partial content with a Writer ranges = FULL; @@ -938,7 +953,7 @@ protected void serveResource(HttpServletRequest request, } } - // Check to see if a Filter, Valve of wrapper has written some content. + // Check to see if a Filter, Valve or wrapper has written some content. // If it has, disable range requests and setting of a content length // since neither can be done reliably. ServletResponse r = response; @@ -953,6 +968,32 @@ protected void serveResource(HttpServletRequest request, ranges = FULL; } + String outputEncoding = response.getCharacterEncoding(); + Charset charset = B2CConverter.getCharset(outputEncoding); + boolean conversionRequired; + /* + * The test below deliberately uses != to compare two Strings. This is + * because the code is looking to see if the default character encoding + * has been returned because no explicit character encoding has been + * defined. There is no clean way of doing this via the Servlet API. It + * would be possible to add a Tomcat specific API but that would require + * quite a bit of code to get to the Tomcat specific request object that + * may have been wrapped. The != test is a (slightly hacky) quick way of + * doing this. + */ + boolean outputEncodingSpecified = + outputEncoding != org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name() && + outputEncoding != resources.getContext().getResponseCharacterEncoding(); + if (!usingPrecompressedVersion && isText(contentType) && outputEncodingSpecified && + !charset.equals(fileEncodingCharset)) { + conversionRequired = true; + // Conversion often results fewer/more/different bytes. + // That does not play nicely with range requests. + ranges = FULL; + } else { + conversionRequired = false; + } + if (resource.isDirectory() || isError || ( (ranges == null || ranges.isEmpty()) @@ -972,8 +1013,8 @@ protected void serveResource(HttpServletRequest request, log("DefaultServlet.serveFile: contentLength=" + contentLength); // Don't set a content length if something else has already - // written to the response. - if (contentWritten == 0) { + // written to the response or if conversion will be taking place + if (contentWritten == 0 && !conversionRequired) { response.setContentLengthLong(contentLength); } } @@ -989,36 +1030,72 @@ protected void serveResource(HttpServletRequest request, // Output via a writer so can't use sendfile or write // content directly. if (resource.isDirectory()) { - renderResult = render(getPathPrefix(request), resource, encoding); + renderResult = render(getPathPrefix(request), resource, inputEncoding); } else { renderResult = resource.getInputStream(); + if (included) { + // Need to make sure any BOM is removed + if (!renderResult.markSupported()) { + renderResult = new BufferedInputStream(renderResult); + } + Charset bomCharset = processBom(renderResult); + if (bomCharset != null && useBomIfPresent) { + inputEncoding = bomCharset.name(); + } + } } - copy(resource, renderResult, writer, encoding); + copy(renderResult, writer, inputEncoding); } else { - // Output is via an InputStream + // Output is via an OutputStream if (resource.isDirectory()) { - renderResult = render(getPathPrefix(request), resource, encoding); + renderResult = render(getPathPrefix(request), resource, inputEncoding); } else { // Output is content of resource - if (!checkSendfile(request, response, resource, - contentLength, null)) { - // sendfile not possible so check if resource - // content is available directly - byte[] resourceBody = resource.getContent(); - if (resourceBody == null) { - // Resource content not available, use - // inputstream - renderResult = resource.getInputStream(); + // Check to see if conversion is required + if (conversionRequired || included) { + // When including a file, we need to check for a BOM + // to determine if a conversion is required, so we + // might as well always convert + InputStream source = resource.getInputStream(); + if (!source.markSupported()) { + source = new BufferedInputStream(source); + } + Charset bomCharset = processBom(source); + if (bomCharset != null && useBomIfPresent) { + inputEncoding = bomCharset.name(); + } + // Following test also ensures included resources + // are converted if an explicit output encoding was + // specified + if (outputEncodingSpecified) { + OutputStreamWriter osw = new OutputStreamWriter(ostream, charset); + PrintWriter pw = new PrintWriter(osw); + copy(source, pw, inputEncoding); + pw.flush(); } else { - // Use the resource content directly - ostream.write(resourceBody); + // Just included but no conversion + renderResult = source; + } + } else { + if (!checkSendfile(request, response, resource, contentLength, null)) { + // sendfile not possible so check if resource + // content is available directly + byte[] resourceBody = resource.getContent(); + if (resourceBody == null) { + // Resource content not available, use + // inputstream + renderResult = resource.getInputStream(); + } else { + // Use the resource content directly + ostream.write(resourceBody); + } } } } // If a stream was configured, it needs to be copied to // the output (this method closes the stream) if (renderResult != null) { - copy(resource, renderResult, ostream); + copy(renderResult, ostream); } } } @@ -1084,6 +1161,81 @@ protected void serveResource(HttpServletRequest request, } } + + /* + * Code borrowed heavily from Jasper's EncodingDetector + */ + private static Charset processBom(InputStream is) throws IOException { + // Java supported character sets do not use BOMs longer than 4 bytes + byte[] bom = new byte[4]; + is.mark(bom.length); + + int count = is.read(bom); + + // BOMs are at least 2 bytes + if (count < 2) { + skip(is, 0); + return null; + } + + // Look for two byte BOMs + int b0 = bom[0] & 0xFF; + int b1 = bom[1] & 0xFF; + if (b0 == 0xFE && b1 == 0xFF) { + skip(is, 2); + return StandardCharsets.UTF_16BE; + } + if (b0 == 0xFF && b1 == 0xFE) { + skip(is, 2); + return StandardCharsets.UTF_16LE; + } + + // Remaining BOMs are at least 3 bytes + if (count < 3) { + skip(is, 0); + return null; + } + + // UTF-8 is only 3-byte BOM + int b2 = bom[2] & 0xFF; + if (b0 == 0xEF && b1 == 0xBB && b2 == 0xBF) { + skip(is, 3); + return StandardCharsets.UTF_8; + } + + if (count < 4) { + skip(is, 0); + return null; + } + + // Look for 4-bute BOMs + int b3 = bom[3] & 0xFF; + if (b0 == 0x00 && b1 == 0x00 && b2 == 0xFE && b3 == 0xFF) { + return Charset.forName("UTF32-BE"); + } + if (b0 == 0xFF && b1 == 0xFE && b2 == 0x00 && b3 == 0x00) { + return Charset.forName("UTF32-LE"); + } + + skip(is, 0); + return null; + } + + + private static void skip(InputStream is, int skip) throws IOException { + is.reset(); + while (skip-- > 0) { + is.read(); + } + } + + + private static boolean isText(String contentType) { + return contentType == null || contentType.startsWith("text") || + contentType.endsWith("xml") || contentType.contains("/javascript"); + } + + private boolean pathEndsWithCompressedExtension(String path) { for (CompressionFormat format : compressionFormats) { if (path.endsWith(format.extension)) { @@ -1475,7 +1627,7 @@ protected InputStream renderXml(String contextPath, WebResource resource, Source .append("'"); sb.append(">"); - sb.append(RequestUtil.filter(entry)); + sb.append(Escape.htmlElementContent(entry)); if (childResource.isDirectory()) sb.append("/"); sb.append(""); @@ -1520,7 +1672,7 @@ protected InputStream renderXml(String contextPath, WebResource resource, Source StreamResult out = new StreamResult(osWriter); transformer.transform(xmlSource, out); osWriter.flush(); - return (new ByteArrayInputStream(stream.toByteArray())); + return new ByteArrayInputStream(stream.toByteArray()); } catch (TransformerException e) { throw new ServletException("XSL transformer error", e); } finally { @@ -1642,7 +1794,7 @@ protected InputStream renderHtml(String contextPath, WebResource resource, Strin if (childResource.isDirectory()) sb.append("/"); sb.append("\">"); - sb.append(RequestUtil.filter(entry)); + sb.append(Escape.htmlElementContent(entry)); if (childResource.isDirectory()) sb.append("/"); sb.append("\r\n"); @@ -1681,7 +1833,7 @@ protected InputStream renderHtml(String contextPath, WebResource resource, Strin // Return an input stream to the underlying bytes writer.write(sb.toString()); writer.flush(); - return (new ByteArrayInputStream(stream.toByteArray())); + return new ByteArrayInputStream(stream.toByteArray()); } @@ -1718,7 +1870,7 @@ protected String getReadme(WebResource directory, String encoding) { if (resource.isFile()) { StringWriter buffer = new StringWriter(); InputStreamReader reader = null; - try (InputStream is = resource.getInputStream();){ + try (InputStream is = resource.getInputStream()){ if (encoding != null) { reader = new InputStreamReader(is, encoding); } else { @@ -2091,15 +2243,12 @@ protected boolean checkIfUnmodifiedSince(HttpServletRequest request, * output stream, and ensure that both streams are closed before returning * (even in the face of an exception). * - * @param resource The source resource * @param is The input stream to read the source resource from * @param ostream The output stream to write to * * @exception IOException if an input/output error occurs */ - protected void copy(WebResource resource, InputStream is, - ServletOutputStream ostream) - throws IOException { + protected void copy(InputStream is, ServletOutputStream ostream) throws IOException { IOException exception = null; InputStream istream = new BufferedInputStream(is, input); @@ -2121,30 +2270,20 @@ protected void copy(WebResource resource, InputStream is, * output stream, and ensure that both streams are closed before returning * (even in the face of an exception). * - * @param resource The source resource * @param is The input stream to read the source resource from * @param writer The writer to write to * @param encoding The encoding to use when reading the source input stream * * @exception IOException if an input/output error occurs */ - protected void copy(WebResource resource, InputStream is, PrintWriter writer, - String encoding) throws IOException { - + protected void copy(InputStream is, PrintWriter writer, String encoding) throws IOException { IOException exception = null; - InputStream resourceInputStream = null; - if (resource.isFile()) { - resourceInputStream = resource.getInputStream(); - } else { - resourceInputStream = is; - } - Reader reader; if (encoding == null) { - reader = new InputStreamReader(resourceInputStream); + reader = new InputStreamReader(is); } else { - reader = new InputStreamReader(resourceInputStream, encoding); + reader = new InputStreamReader(is, encoding); } // Copy the input stream to the output stream @@ -2154,8 +2293,9 @@ protected void copy(WebResource resource, InputStream is, PrintWriter writer, reader.close(); // Rethrow any exception that has occurred - if (exception != null) + if (exception != null) { throw exception; + } } diff --git a/core/src/main/java/org/apache/catalina/servlets/LocalStrings.properties b/core/src/main/java/org/apache/catalina/servlets/LocalStrings.properties index f38d0b0..04e697b 100644 --- a/core/src/main/java/org/apache/catalina/servlets/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/servlets/LocalStrings.properties @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +cgiServlet.emptyEnvVarName=Empty environment variable name in initialisation parameter [environment-variable-] cgiServlet.expandCloseFail=Failed to close input stream for script at path [{0}] cgiServlet.expandCreateDirFail=Failed to create destination directory [{0}] for script expansion cgiServlet.expandDeleteFail=Failed to delete file at [{0}] after IOException during expansion diff --git a/core/src/main/java/org/apache/catalina/servlets/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/servlets/LocalStrings_es.properties index 0497b78..1a09467 100644 --- a/core/src/main/java/org/apache/catalina/servlets/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/servlets/LocalStrings_es.properties @@ -1,4 +1,3 @@ -defaultServlet.missingResource = El recurso requerido [{0}] no se encuentra disponible # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. @@ -13,6 +12,8 @@ defaultServlet.missingResource = El recurso requerido [{0}] no se encuentra disp # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +defaultServlet.missingResource = El recurso requerido [{0}] no se encuentra disponible defaultservlet.skipfail = S\u00F3lo se han saltado [{0}] cuando se requirieron [{1}] webdavservlet.jaxpfailed = Fall\u00F3 la inicializaci\u00F3n de JAXP webdavservlet.enternalEntityIgnored = El requerimiento inclu\u00EDa una referencia a una entidad externa con PublicID [{0}] y SystemID [{1}] que fue ignorada diff --git a/core/src/main/java/org/apache/catalina/servlets/WebdavServlet.java b/core/src/main/java/org/apache/catalina/servlets/WebdavServlet.java index 849c53b..a1b8ad1 100644 --- a/core/src/main/java/org/apache/catalina/servlets/WebdavServlet.java +++ b/core/src/main/java/org/apache/catalina/servlets/WebdavServlet.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.io.InputStream; +import java.io.Serializable; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; @@ -44,6 +45,7 @@ import org.apache.catalina.connector.RequestFacade; import org.apache.catalina.util.ConcurrentDateFormat; import org.apache.catalina.util.DOMWriter; +import org.apache.catalina.util.URLEncoder; import org.apache.catalina.util.XMLWriter; import org.apache.tomcat.util.buf.UDecoder; import org.apache.tomcat.util.http.FastHttpDateFormat; @@ -119,14 +121,22 @@ * * @author Remy Maucherat */ -public class WebdavServlet - extends DefaultServlet { +public class WebdavServlet extends DefaultServlet { private static final long serialVersionUID = 1L; // -------------------------------------------------------------- Constants + private static final URLEncoder URL_ENCODER_XML; + static { + URL_ENCODER_XML = (URLEncoder) URLEncoder.DEFAULT.clone(); + // Remove '&' from the safe character set since while it it permitted + // in a URI path, it is not permitted in XML and encoding it is a simple + // way to address this. + URL_ENCODER_XML.removeSafeCharacter('&'); + } + private static final String METHOD_PROPFIND = "PROPFIND"; private static final String METHOD_PROPPATCH = "PROPPATCH"; private static final String METHOD_MKCOL = "MKCOL"; @@ -379,6 +389,18 @@ protected boolean checkIfHeaders(HttpServletRequest request, } + /** + * URL rewriter. + * + * @param path Path which has to be rewritten + * @return the rewritten path + */ + @Override + protected String rewriteUrl(String path) { + return URL_ENCODER_XML.encode(path, StandardCharsets.UTF_8); + } + + /** * Override the DefaultServlet implementation and only use the PathInfo. If * the ServletPath is non-null, it will be because the WebDAV servlet has @@ -442,10 +464,7 @@ protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.addHeader("DAV", "1,2"); - - StringBuilder methodsAllowed = determineMethodsAllowed(req); - - resp.addHeader("Allow", methodsAllowed.toString()); + resp.addHeader("Allow", determineMethodsAllowed(req)); resp.addHeader("MS-Author-Via", "DAV"); } @@ -461,11 +480,7 @@ protected void doPropfind(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (!listings) { - // Get allowed methods - StringBuilder methodsAllowed = determineMethodsAllowed(req); - - resp.addHeader("Allow", methodsAllowed.toString()); - resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED); + sendNotAllowed(req, resp); return; } @@ -721,16 +736,6 @@ protected void doProppatch(HttpServletRequest req, HttpServletResponse resp) protected void doMkcol(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - if (readOnly) { - resp.sendError(WebdavStatus.SC_FORBIDDEN); - return; - } - - if (isLocked(req)) { - resp.sendError(WebdavStatus.SC_LOCKED); - return; - } - String path = getRelativePath(req); WebResource resource = resources.getResource(path); @@ -738,12 +743,17 @@ protected void doMkcol(HttpServletRequest req, HttpServletResponse resp) // Can't create a collection if a resource already exists at the given // path if (resource.exists()) { - // Get allowed methods - StringBuilder methodsAllowed = determineMethodsAllowed(req); + sendNotAllowed(req, resp); + return; + } - resp.addHeader("Allow", methodsAllowed.toString()); + if (readOnly) { + resp.sendError(WebdavStatus.SC_FORBIDDEN); + return; + } - resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED); + if (isLocked(req)) { + resp.sendError(WebdavStatus.SC_LOCKED); return; } @@ -787,7 +797,7 @@ protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (readOnly) { - resp.sendError(WebdavStatus.SC_FORBIDDEN); + sendNotAllowed(req, resp); return; } @@ -819,9 +829,14 @@ protected void doPut(HttpServletRequest req, HttpServletResponse resp) return; } - super.doPut(req, resp); - String path = getRelativePath(req); + WebResource resource = resources.getResource(path); + if (resource.isDirectory()) { + sendNotAllowed(req, resp); + return; + } + + super.doPut(req, resp); // Removing any lock-null resource which would be present lockNullResources.remove(path); @@ -895,7 +910,7 @@ protected void doLock(HttpServletRequest req, HttpServletResponse resp) return; } - LockInfo lock = new LockInfo(); + LockInfo lock = new LockInfo(maxDepth); // Parsing lock request @@ -1069,7 +1084,7 @@ protected void doLock(HttpServletRequest req, HttpServletResponse resp) break; case Node.ELEMENT_NODE: strWriter = new StringWriter(); - domWriter = new DOMWriter(strWriter, true); + domWriter = new DOMWriter(strWriter); domWriter.print(currentNode); lock.owner += strWriter.toString(); break; @@ -1287,7 +1302,7 @@ protected void doLock(HttpServletRequest req, HttpServletResponse resp) tokenList = toRenew.tokens.elements(); while (tokenList.hasMoreElements()) { String token = tokenList.nextElement(); - if (ifHeader.indexOf(token) != -1) { + if (ifHeader.contains(token)) { toRenew.expiresAt = lock.expiresAt; lock = toRenew; } @@ -1305,7 +1320,7 @@ protected void doLock(HttpServletRequest req, HttpServletResponse resp) tokenList = toRenew.tokens.elements(); while (tokenList.hasMoreElements()) { String token = tokenList.nextElement(); - if (ifHeader.indexOf(token) != -1) { + if (ifHeader.contains(token)) { toRenew.expiresAt = lock.expiresAt; lock = toRenew; } @@ -1376,7 +1391,7 @@ protected void doUnlock(HttpServletRequest req, HttpServletResponse resp) tokenList = lock.tokens.elements(); while (tokenList.hasMoreElements()) { String token = tokenList.nextElement(); - if (lockTokenHeader.indexOf(token) != -1) { + if (lockTokenHeader.contains(token)) { lock.tokens.removeElement(token); } } @@ -1399,7 +1414,7 @@ protected void doUnlock(HttpServletRequest req, HttpServletResponse resp) tokenList = lock.tokens.elements(); while (tokenList.hasMoreElements()) { String token = tokenList.nextElement(); - if (lockTokenHeader.indexOf(token) != -1) { + if (lockTokenHeader.contains(token)) { lock.tokens.removeElement(token); break; } @@ -1472,7 +1487,7 @@ private boolean isLocked(String path, String ifHeader) { boolean tokenMatch = false; while (tokenList.hasMoreElements()) { String token = tokenList.nextElement(); - if (ifHeader.indexOf(token) != -1) { + if (ifHeader.contains(token)) { tokenMatch = true; break; } @@ -1495,7 +1510,7 @@ private boolean isLocked(String path, String ifHeader) { boolean tokenMatch = false; while (tokenList.hasMoreElements()) { String token = tokenList.nextElement(); - if (ifHeader.indexOf(token) != -1) { + if (ifHeader.contains(token)) { tokenMatch = true; break; } @@ -1720,19 +1735,23 @@ private boolean copyResource(Hashtable errorList, } } } + // WebDAV Litmus test attempts to copy/move a file over a collection + // Need to remove trailing / from destination to enable test to pass + if (!destResource.exists() && dest.endsWith("/") && dest.length() > 1) { + // Convert destination name from collection (with trailing '/') + // to file (without trailing '/') + dest = dest.substring(0, dest.length() - 1); + } try (InputStream is = sourceResource.getInputStream()) { - if (!resources.write(dest, is, - false)) { - errorList.put(source, - Integer.valueOf(WebdavStatus.SC_INTERNAL_SERVER_ERROR)); + if (!resources.write(dest, is, false)) { + errorList.put(source, Integer.valueOf(WebdavStatus.SC_INTERNAL_SERVER_ERROR)); return false; } } catch (IOException e) { log(sm.getString("webdavservlet.inputstreamclosefail", source), e); } } else { - errorList.put(source, - Integer.valueOf(WebdavStatus.SC_INTERNAL_SERVER_ERROR)); + errorList.put(source, Integer.valueOf(WebdavStatus.SC_INTERNAL_SERVER_ERROR)); return false; } return true; @@ -2299,50 +2318,66 @@ private String getISOCreationDate(long creationDate) { /** * Determines the methods normally allowed for the resource. + * * @param req The Servlet request - * @return a string builder with the allowed HTTP methods + * + * @return The allowed HTTP methods */ - private StringBuilder determineMethodsAllowed(HttpServletRequest req) { + @Override + protected String determineMethodsAllowed(HttpServletRequest req) { - StringBuilder methodsAllowed = new StringBuilder(); WebResource resource = resources.getResource(getRelativePath(req)); - if (!resource.exists()) { - methodsAllowed.append("OPTIONS, MKCOL, PUT, LOCK"); - return methodsAllowed; + // These methods are always allowed. They may return a 404 (not a 405) + // if the resource does not exist. + StringBuilder methodsAllowed = new StringBuilder( + "OPTIONS, GET, POST, HEAD"); + + if (!readOnly) { + methodsAllowed.append(", DELETE"); + if (!resource.isDirectory()) { + methodsAllowed.append(", PUT"); + } } - methodsAllowed.append("OPTIONS, GET, HEAD, POST, DELETE"); // Trace - assume disabled unless we can prove otherwise if (req instanceof RequestFacade && ((RequestFacade) req).getAllowTrace()) { methodsAllowed.append(", TRACE"); } - methodsAllowed.append(", PROPPATCH, COPY, MOVE, LOCK, UNLOCK"); + + methodsAllowed.append(", LOCK, UNLOCK, PROPPATCH, COPY, MOVE"); if (listings) { methodsAllowed.append(", PROPFIND"); } - if (resource.isFile()) { - methodsAllowed.append(", PUT"); + if (!resource.exists()) { + methodsAllowed.append(", MKCOL"); } - return methodsAllowed; + return methodsAllowed.toString(); } - // -------------------------------------------------- LockInfo Inner Class + // -------------------------------------------------- LockInfo Inner Class /** * Holds a lock information. */ - private class LockInfo { + private static class LockInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + public LockInfo(int maxDepth) { + this.maxDepth = maxDepth; + } // ------------------------------------------------- Instance Variables + private final int maxDepth; String path = "/"; String type = "write"; @@ -2356,7 +2391,6 @@ private class LockInfo { // ----------------------------------------------------- Public Methods - /** * Get a String representation of this lock token. */ @@ -2445,10 +2479,7 @@ public void toXML(XMLWriter generatedXML) { generatedXML.writeElement("D", "locktoken", XMLWriter.CLOSING); generatedXML.writeElement("D", "activelock", XMLWriter.CLOSING); - } - - } diff --git a/core/src/main/java/org/apache/catalina/session/FileStore.java b/core/src/main/java/org/apache/catalina/session/FileStore.java index f3446fb..66d3af2 100644 --- a/core/src/main/java/org/apache/catalina/session/FileStore.java +++ b/core/src/main/java/org/apache/catalina/session/FileStore.java @@ -25,6 +25,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; +import java.util.List; import javax.servlet.ServletContext; @@ -128,7 +129,7 @@ public int getSize() throws IOException { // Acquire the list of files in our storage directory File file = directory(); if (file == null) { - return (0); + return 0; } String files[] = file.list(); @@ -173,18 +174,18 @@ public String[] keys() throws IOException { // Acquire the list of files in our storage directory File file = directory(); if (file == null) { - return (new String[0]); + return new String[0]; } String files[] = file.list(); // Bugzilla 32130 if((files == null) || (files.length < 1)) { - return (new String[0]); + return new String[0]; } // Build and return the list of session identifiers - ArrayList list = new ArrayList<>(); + List list = new ArrayList<>(); int n = FILE_EXT.length(); for (int i = 0; i < files.length; i++) { if (files[i].endsWith(FILE_EXT)) { @@ -263,7 +264,10 @@ public void remove(String id) throws IOException { manager.getContext().getLogger().debug(sm.getString(getStoreName() + ".removing", id, file.getAbsolutePath())); } - file.delete(); + + if (!file.delete()) { + throw new IOException(sm.getString("fileStore.deleteSessionFailed", file)); + } } diff --git a/core/src/main/java/org/apache/catalina/session/JDBCStore.java b/core/src/main/java/org/apache/catalina/session/JDBCStore.java index c7f888d..2649fc5 100644 --- a/core/src/main/java/org/apache/catalina/session/JDBCStore.java +++ b/core/src/main/java/org/apache/catalina/session/JDBCStore.java @@ -31,6 +31,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.List; import java.util.Properties; import javax.naming.Context; @@ -106,6 +107,11 @@ public class JDBCStore extends StoreBase { */ protected String dataSourceName = null; + /** + * Context local datasource. + */ + private boolean localDataSource = false; + /** * DataSource to use */ @@ -454,6 +460,23 @@ public String getDataSourceName() { return this.dataSourceName; } + /** + * @return if the datasource will be looked up in the webapp JNDI Context. + */ + public boolean getLocalDataSource() { + return localDataSource; + } + + /** + * Set to {@code true} to cause the datasource to be looked up in the webapp + * JNDI Context. + * + * @param localDataSource the new flag value + */ + public void setLocalDataSource(boolean localDataSource) { + this.localDataSource = localDataSource; + } + // --------------------------------------------------------- Public Methods @@ -502,7 +525,7 @@ private String[] keys(boolean expiredOnly) throws IOException { preparedKeysSql.setLong(2, System.currentTimeMillis()); } try (ResultSet rst = preparedKeysSql.executeQuery()) { - ArrayList tmpkeys = new ArrayList<>(); + List tmpkeys = new ArrayList<>(); if (rst != null) { while (rst.next()) { tmpkeys.add(rst.getString(1)); @@ -867,16 +890,26 @@ protected Connection open() throws SQLException { return dbConnection; if (dataSourceName != null && dataSource == null) { + org.apache.catalina.Context context = getManager().getContext(); + ClassLoader oldThreadContextCL = null; + if (localDataSource) { + oldThreadContextCL = context.bind(Globals.IS_SECURITY_ENABLED, null); + } + Context initCtx; try { initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); this.dataSource = (DataSource) envCtx.lookup(this.dataSourceName); } catch (NamingException e) { - manager.getContext().getLogger().error( + context.getLogger().error( sm.getString(getStoreName() + ".wrongDataSource", this.dataSourceName), e); - } + } finally { + if (localDataSource) { + context.unbind(Globals.IS_SECURITY_ENABLED, oldThreadContextCL); + } + } } if (dataSource != null) { @@ -887,8 +920,8 @@ protected Connection open() throws SQLException { if (driver == null) { try { Class clazz = Class.forName(driverName); - driver = (Driver) clazz.newInstance(); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { + driver = (Driver) clazz.getConstructor().newInstance(); + } catch (ReflectiveOperationException e) { manager.getContext().getLogger().error( sm.getString(getStoreName() + ".checkConnectionClassNotFoundException", e.toString())); diff --git a/core/src/main/java/org/apache/catalina/session/LocalStrings.properties b/core/src/main/java/org/apache/catalina/session/LocalStrings.properties index 222d9a8..5815915 100644 --- a/core/src/main/java/org/apache/catalina/session/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/session/LocalStrings.properties @@ -16,8 +16,9 @@ fileStore.saving=Saving Session [{0}] to file [{1}] fileStore.loading=Loading Session [{0}] from file [{1}] fileStore.removing=Removing Session [{0}] at file [{1}] -fileStore.deleteFailed=Unable to delete file [{0}] which is preventing the creation of the session storage location fileStore.createFailed=Unable to create directory [{0}] for the storage of session data +fileStore.deleteFailed=Unable to delete file [{0}] which is preventing the creation of the session storage location +fileStore.deleteSessionFailed=Unable to delete file [{0}] which is no longer required JDBCStore.close=Exception closing database connection [{0}] JDBCStore.saving=Saving Session [{0}] to database [{1}] JDBCStore.loading=Loading Session [{0}] from database [{1}] @@ -39,6 +40,7 @@ managerBase.sessionTimeout=Invalid session timeout setting [{0}] managerBase.setContextNotNew=It is illegal to call setContext() to change the Context associated with a Manager if the Manager is not in the NEW state standardManager.loading=Loading persisted sessions from [{0}] standardManager.loading.exception=Exception while loading persisted sessions +standardManager.deletePersistedFileFail=Unable to delete [{0}] after reading the persisted sessions. The continued presence of this file may cause future attempts to persist sessions to fail. standardManager.unloading=Saving persisted sessions to [{0}] standardManager.unloading.debug=Unloading persisted sessions standardManager.unloading.nosessions=No persisted sessions to unload diff --git a/core/src/main/java/org/apache/catalina/session/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/session/LocalStrings_es.properties index 52acc7b..6ab9106 100644 --- a/core/src/main/java/org/apache/catalina/session/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/session/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + fileStore.saving = Salvando Sesi\u00F3n [{0}] en archivo [{1}] fileStore.loading = Cargando Sesi\u00F3n [{0}] desde archivo [{1}] fileStore.removing = Quitando Sesi\u00F3n [{0}] en archivo [{1}] diff --git a/core/src/main/java/org/apache/catalina/session/ManagerBase.java b/core/src/main/java/org/apache/catalina/session/ManagerBase.java index 884cd52..98c4231 100644 --- a/core/src/main/java/org/apache/catalina/session/ManagerBase.java +++ b/core/src/main/java/org/apache/catalina/session/ManagerBase.java @@ -25,7 +25,6 @@ import java.util.Deque; import java.util.Enumeration; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -378,11 +377,9 @@ public SessionIdGenerator getSessionIdGenerator() { return sessionIdGenerator; } else if (sessionIdGeneratorClass != null) { try { - sessionIdGenerator = sessionIdGeneratorClass.newInstance(); + sessionIdGenerator = sessionIdGeneratorClass.getConstructor().newInstance(); return sessionIdGenerator; - } catch(IllegalAccessException ex) { - // Ignore - } catch(InstantiationException ex) { + } catch(ReflectiveOperationException ex) { // Ignore } } @@ -401,18 +398,14 @@ public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator) { * @return The descriptive short name of this Manager implementation. */ public String getName() { - - return (name); - + return name; } /** * @return The secure random number generator class name. */ public String getSecureRandomClass() { - - return (this.secureRandomClass); - + return this.secureRandomClass; } @@ -500,9 +493,7 @@ public void setProcessingTime(long processingTime) { * @return The frequency of manager checks. */ public int getProcessExpiresFrequency() { - - return (this.processExpiresFrequency); - + return this.processExpiresFrequency; } /** @@ -671,14 +662,13 @@ public Session createSession(String sessionId) { sessionCreationTiming.add(timing); sessionCreationTiming.poll(); } - return (session); - + return session; } @Override public Session createEmptySession() { - return (getNewSession()); + return getNewSession(); } @@ -786,7 +776,7 @@ public boolean willAttributeDistribute(String name, Object value) { value.getClass().getName()).matches()) { if (getWarnOnSessionAttributeFilterFailure() || log.isDebugEnabled()) { String msg = sm.getString("managerBase.sessionAttributeValueClassNameFilter", - name, value.getClass().getName(), sessionAttributeNamePattern); + name, value.getClass().getName(), sessionAttributeValueClassNamePattern); if (getWarnOnSessionAttributeFilterFailure()) { log.warn(msg); } else { @@ -922,9 +912,7 @@ public void setMaxActive(int maxActive) { * limit. */ public int getMaxActiveSessions() { - - return (this.maxActiveSessions); - + return this.maxActiveSessions; } @@ -993,11 +981,9 @@ public int getSessionAverageAliveTime() { // Init int counter = 0; int result = 0; - Iterator iter = copy.iterator(); // Calculate average - while (iter.hasNext()) { - SessionTiming timing = iter.next(); + for (SessionTiming timing : copy) { if (timing != null) { int timeAlive = timing.getDuration(); counter++; @@ -1053,11 +1039,9 @@ private static int calculateRate(List sessionTiming) { long oldest = now; int counter = 0; int result = 0; - Iterator iter = sessionTiming.iterator(); // Calculate rate - while (iter.hasNext()) { - SessionTiming timing = iter.next(); + for (SessionTiming timing : sessionTiming) { if (timing != null) { counter++; if (timing.getTimestamp() < oldest) { @@ -1084,9 +1068,8 @@ private static int calculateRate(List sessionTiming) { */ public String listSessionIds() { StringBuilder sb = new StringBuilder(); - Iterator keys = sessions.keySet().iterator(); - while (keys.hasNext()) { - sb.append(keys.next()).append(" "); + for (String s : sessions.keySet()) { + sb.append(s).append(" "); } return sb.toString(); } diff --git a/core/src/main/java/org/apache/catalina/session/StandardManager.java b/core/src/main/java/org/apache/catalina/session/StandardManager.java index 2195886..caef4f5 100644 --- a/core/src/main/java/org/apache/catalina/session/StandardManager.java +++ b/core/src/main/java/org/apache/catalina/session/StandardManager.java @@ -29,7 +29,7 @@ import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; -import java.util.Iterator; +import java.util.List; import javax.servlet.ServletContext; @@ -230,7 +230,9 @@ protected void doLoad() throws ClassNotFoundException, IOException { } finally { // Delete the persistent storage file if (file.exists()) { - file.delete(); + if (!file.delete()) { + log.warn(sm.getString("standardManager.deletePersistedFileFail", file)); + } } } } @@ -294,7 +296,7 @@ protected void doUnload() throws IOException { } // Keep a note of sessions that are expired - ArrayList list = new ArrayList<>(); + List list = new ArrayList<>(); try (FileOutputStream fos = new FileOutputStream(file.getAbsolutePath()); BufferedOutputStream bos = new BufferedOutputStream(fos); @@ -306,10 +308,8 @@ protected void doUnload() throws IOException { } // Write the number of active sessions, followed by the details oos.writeObject(Integer.valueOf(sessions.size())); - Iterator elements = sessions.values().iterator(); - while (elements.hasNext()) { - StandardSession session = - (StandardSession) elements.next(); + for (Session s : sessions.values()) { + StandardSession session = (StandardSession) s; list.add(session); session.passivate(); session.writeObjectData(oos); @@ -321,9 +321,7 @@ protected void doUnload() throws IOException { if (log.isDebugEnabled()) { log.debug("Expiring " + list.size() + " persisted sessions"); } - Iterator expires = list.iterator(); - while (expires.hasNext()) { - StandardSession session = expires.next(); + for (StandardSession session : list) { try { session.expire(false); } catch (Throwable t) { diff --git a/core/src/main/java/org/apache/catalina/session/StandardSession.java b/core/src/main/java/org/apache/catalina/session/StandardSession.java index a7ead00..30f54f7 100644 --- a/core/src/main/java/org/apache/catalina/session/StandardSession.java +++ b/core/src/main/java/org/apache/catalina/session/StandardSession.java @@ -279,9 +279,7 @@ public StandardSession(Manager manager) { */ @Override public String getAuthType() { - - return (this.authType); - + return this.authType; } @@ -293,11 +291,9 @@ public String getAuthType() { */ @Override public void setAuthType(String authType) { - String oldAuthType = this.authType; this.authType = authType; support.firePropertyChange("authType", oldAuthType, this.authType); - } @@ -322,9 +318,7 @@ public void setCreationTime(long time) { */ @Override public String getId() { - - return (this.id); - + return this.id; } @@ -333,9 +327,7 @@ public String getId() { */ @Override public String getIdInternal() { - - return (this.id); - + return this.id; } @@ -471,7 +463,7 @@ public long getThisAccessedTime() { (sm.getString("standardSession.getThisAccessedTime.ise")); } - return (this.thisAccessedTime); + return this.thisAccessedTime; } /** @@ -480,7 +472,7 @@ public long getThisAccessedTime() { */ @Override public long getThisAccessedTimeInternal() { - return (this.thisAccessedTime); + return this.thisAccessedTime; } /** @@ -498,7 +490,7 @@ public long getLastAccessedTime() { (sm.getString("standardSession.getLastAccessedTime.ise")); } - return (this.lastAccessedTime); + return this.lastAccessedTime; } /** @@ -507,7 +499,7 @@ public long getLastAccessedTime() { */ @Override public long getLastAccessedTimeInternal() { - return (this.lastAccessedTime); + return this.lastAccessedTime; } /** @@ -567,9 +559,7 @@ public void setManager(Manager manager) { */ @Override public int getMaxInactiveInterval() { - - return (this.maxInactiveInterval); - + return this.maxInactiveInterval; } @@ -593,9 +583,7 @@ public void setMaxInactiveInterval(int interval) { */ @Override public void setNew(boolean isNew) { - this.isNew = isNew; - } @@ -608,9 +596,7 @@ public void setNew(boolean isNew) { */ @Override public Principal getPrincipal() { - - return (this.principal); - + return this.principal; } @@ -952,9 +938,7 @@ public void activate() { */ @Override public Object getNote(String name) { - - return (notes.get(name)); - + return notes.get(name); } @@ -964,9 +948,7 @@ public Object getNote(String name) { */ @Override public Iterator getNoteNames() { - - return (notes.keySet().iterator()); - + return notes.keySet().iterator(); } @@ -1039,13 +1021,11 @@ public void setNote(String name, Object value) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder(); sb.append("StandardSession["); sb.append(id); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } @@ -1099,13 +1079,11 @@ public void writeObjectData(ObjectOutputStream stream) */ @Override public long getCreationTime() { - if (!isValidInternal()) throw new IllegalStateException (sm.getString("standardSession.getCreationTime.ise")); - return (this.creationTime); - + return this.creationTime; } @@ -1142,11 +1120,9 @@ public ServletContext getServletContext() { @Override @Deprecated public javax.servlet.http.HttpSessionContext getSessionContext() { - if (sessionContext == null) sessionContext = new StandardSessionContext(); - return (sessionContext); - + return sessionContext; } @@ -1164,15 +1140,13 @@ public javax.servlet.http.HttpSessionContext getSessionContext() { */ @Override public Object getAttribute(String name) { - if (!isValidInternal()) throw new IllegalStateException (sm.getString("standardSession.getAttribute.ise")); if (name == null) return null; - return (attributes.get(name)); - + return attributes.get(name); } @@ -1212,7 +1186,7 @@ public Enumeration getAttributeNames() { @Deprecated public Object getValue(String name) { - return (getAttribute(name)); + return getAttribute(name); } @@ -1230,13 +1204,11 @@ public Object getValue(String name) { @Override @Deprecated public String[] getValueNames() { - if (!isValidInternal()) throw new IllegalStateException (sm.getString("standardSession.getValueNames.ise")); - return (keys()); - + return keys(); } @@ -1271,13 +1243,11 @@ public void invalidate() { */ @Override public boolean isNew() { - if (!isValidInternal()) throw new IllegalStateException (sm.getString("standardSession.isNew.ise")); - return (this.isNew); - + return this.isNew; } @@ -1670,8 +1640,8 @@ protected void doWriteObject(ObjectOutputStream stream) throws IOException { // Accumulate the names of serializable and non-serializable attributes String keys[] = keys(); - ArrayList saveNames = new ArrayList<>(); - ArrayList saveValues = new ArrayList<>(); + List saveNames = new ArrayList<>(); + List saveValues = new ArrayList<>(); for (int i = 0; i < keys.length; i++) { Object value = attributes.get(keys[i]); if (value == null) { @@ -1910,6 +1880,6 @@ public Enumeration getIds() { @Override @Deprecated public HttpSession getSession(String id) { - return (null); + return null; } } diff --git a/core/src/main/java/org/apache/catalina/ssi/SSIMediator.java b/core/src/main/java/org/apache/catalina/ssi/SSIMediator.java index 129ccbf..7f50697 100644 --- a/core/src/main/java/org/apache/catalina/ssi/SSIMediator.java +++ b/core/src/main/java/org/apache/catalina/ssi/SSIMediator.java @@ -26,9 +26,9 @@ import java.util.Set; import java.util.TimeZone; -import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.Strftime; import org.apache.catalina.util.URLEncoder; +import org.apache.tomcat.util.security.Escape; /** * Allows the different SSICommand implementations to share data/talk to each @@ -284,7 +284,7 @@ protected String encode(String value, String encoding) { } else if (encoding.equalsIgnoreCase("none")) { retVal = value; } else if (encoding.equalsIgnoreCase("entity")) { - retVal = RequestUtil.filter(value); + retVal = Escape.htmlElementContent(value); } else { //This shouldn't be possible throw new IllegalArgumentException("Unknown encoding: " + encoding); diff --git a/core/src/main/java/org/apache/catalina/ssi/SSIPrintenv.java b/core/src/main/java/org/apache/catalina/ssi/SSIPrintenv.java index c928727..97470b2 100644 --- a/core/src/main/java/org/apache/catalina/ssi/SSIPrintenv.java +++ b/core/src/main/java/org/apache/catalina/ssi/SSIPrintenv.java @@ -19,7 +19,7 @@ import java.io.PrintWriter; import java.util.Collection; -import java.util.Iterator; + /** * Implements the Server-side #printenv command * @@ -40,9 +40,7 @@ public long process(SSIMediator ssiMediator, String commandName, writer.write(errorMessage); } else { Collection variableNames = ssiMediator.getVariableNames(); - Iterator iter = variableNames.iterator(); - while (iter.hasNext()) { - String variableName = iter.next(); + for (String variableName : variableNames) { String variableValue = ssiMediator .getVariableValue(variableName); //This shouldn't happen, since all the variable names must diff --git a/core/src/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java b/core/src/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java index 3e9d068..6f0be39 100644 --- a/core/src/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java +++ b/core/src/main/java/org/apache/catalina/ssi/SSIServletExternalResolver.java @@ -18,6 +18,7 @@ import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLConnection; import java.nio.charset.Charset; @@ -251,7 +252,11 @@ else if (nameParts[1].equals("USER")) // Get encoding settings from request / connector if // possible if (req instanceof Request) { - requestCharset = ((Request)req).getCoyoteRequest().getCharset(); + try { + requestCharset = ((Request)req).getCoyoteRequest().getCharset(); + } catch (UnsupportedEncodingException e) { + // Ignore + } Connector connector = ((Request)req).getConnector(); uriCharset = connector.getURICharset(); useBodyEncodingForURI = connector.getUseBodyEncodingForURI(); @@ -388,7 +393,7 @@ protected ServletContextAndPath getServletContextAndPathFromNonVirtualPath( throw new IOException("A non-virtual path can't be absolute: " + nonVirtualPath); } - if (nonVirtualPath.indexOf("../") >= 0) { + if (nonVirtualPath.contains("../")) { throw new IOException("A non-virtual path can't contain '../' : " + nonVirtualPath); } diff --git a/core/src/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java b/core/src/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java index 61b3594..9de34b6 100644 --- a/core/src/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java +++ b/core/src/main/java/org/apache/catalina/ssi/SSIServletRequestUtil.java @@ -41,7 +41,7 @@ public static String getRelativePath(HttpServletRequest request) { result = (String)request.getAttribute( RequestDispatcher.INCLUDE_SERVLET_PATH); if ((result == null) || (result.equals(""))) result = "/"; - return (result); + return result; } // No, extract the desired path directly from the request String result = request.getPathInfo(); diff --git a/core/src/main/java/org/apache/catalina/startup/Bootstrap.java b/core/src/main/java/org/apache/catalina/startup/Bootstrap.java index fc18b5a..53358d4 100644 --- a/core/src/main/java/org/apache/catalina/startup/Bootstrap.java +++ b/core/src/main/java/org/apache/catalina/startup/Bootstrap.java @@ -263,10 +263,8 @@ public void init() throws Exception { // Load our startup class and call its process() method if (log.isDebugEnabled()) log.debug("Loading startup class"); - Class startupClass = - catalinaLoader.loadClass - ("org.apache.catalina.startup.Catalina"); - Object startupInstance = startupClass.newInstance(); + Class startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina"); + Object startupInstance = startupClass.getConstructor().newInstance(); // Set the shared extensions class loader if (log.isDebugEnabled()) diff --git a/core/src/main/java/org/apache/catalina/startup/Catalina.java b/core/src/main/java/org/apache/catalina/startup/Catalina.java index cb83a01..3887c23 100644 --- a/core/src/main/java/org/apache/catalina/startup/Catalina.java +++ b/core/src/main/java/org/apache/catalina/startup/Catalina.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.LogManager; import org.apache.catalina.Container; @@ -162,7 +163,7 @@ public void setParentClassLoader(ClassLoader parentClassLoader) { public ClassLoader getParentClassLoader() { if (parentClassLoader != null) { - return (parentClassLoader); + return parentClassLoader; } return ClassLoader.getSystemClassLoader(); } @@ -181,7 +182,7 @@ public Server getServer() { * @return true if naming is enabled. */ public boolean isUseNaming() { - return (this.useNaming); + return this.useNaming; } @@ -257,7 +258,7 @@ protected File configFile() { if (!file.isAbsolute()) { file = new File(Bootstrap.getCatalinaBase(), configFile); } - return (file); + return file; } @@ -272,8 +273,8 @@ protected Digester createStartDigester() { Digester digester = new Digester(); digester.setValidating(false); digester.setRulesValidation(true); - HashMap, List> fakeAttributes = new HashMap<>(); - ArrayList attrs = new ArrayList<>(); + Map, List> fakeAttributes = new HashMap<>(); + List attrs = new ArrayList<>(); attrs.add("className"); fakeAttributes.put(Object.class, attrs); digester.setFakeAttributes(fakeAttributes); @@ -353,6 +354,20 @@ protected Digester createStartDigester() { "addCertificate", "org.apache.tomcat.util.net.SSLHostConfigCertificate"); + digester.addObjectCreate("Server/Service/Connector/SSLHostConfig/OpenSSLConf", + "org.apache.tomcat.util.net.openssl.OpenSSLConf"); + digester.addSetProperties("Server/Service/Connector/SSLHostConfig/OpenSSLConf"); + digester.addSetNext("Server/Service/Connector/SSLHostConfig/OpenSSLConf", + "setOpenSslConf", + "org.apache.tomcat.util.net.openssl.OpenSSLConf"); + + digester.addObjectCreate("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd", + "org.apache.tomcat.util.net.openssl.OpenSSLConfCmd"); + digester.addSetProperties("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd"); + digester.addSetNext("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd", + "addCmd", + "org.apache.tomcat.util.net.openssl.OpenSSLConfCmd"); + digester.addObjectCreate("Server/Service/Connector/Listener", null, // MUST be specified in the element "className"); @@ -386,7 +401,7 @@ protected Digester createStartDigester() { if (log.isDebugEnabled()) { log.debug("Digester for server.xml created " + ( t2-t1 )); } - return (digester); + return digester; } @@ -431,7 +446,7 @@ protected Digester createStopDigester() { "setServer", "org.apache.catalina.Server"); - return (digester); + return digester; } diff --git a/core/src/main/java/org/apache/catalina/startup/CatalinaProperties.java b/core/src/main/java/org/apache/catalina/startup/CatalinaProperties.java index 211406f..be2f940 100644 --- a/core/src/main/java/org/apache/catalina/startup/CatalinaProperties.java +++ b/core/src/main/java/org/apache/catalina/startup/CatalinaProperties.java @@ -60,10 +60,17 @@ public static String getProperty(String name) { private static void loadProperties() { InputStream is = null; + String fileName = "catalina.properties"; + try { String configUrl = System.getProperty("catalina.config"); if (configUrl != null) { - is = (new URL(configUrl)).openStream(); + if (configUrl.indexOf('/') == -1) { + // No '/'. Must be a file name rather than a URL + fileName = configUrl; + } else { + is = (new URL(configUrl)).openStream(); + } } } catch (Throwable t) { handleThrowable(t); @@ -73,7 +80,7 @@ private static void loadProperties() { try { File home = new File(Bootstrap.getCatalinaBase()); File conf = new File(home, "conf"); - File propsFile = new File(conf, "catalina.properties"); + File propsFile = new File(conf, fileName); is = new FileInputStream(propsFile); } catch (Throwable t) { handleThrowable(t); @@ -100,14 +107,14 @@ private static void loadProperties() { try { is.close(); } catch (IOException ioe) { - log.warn("Could not close catalina.properties", ioe); + log.warn("Could not close catalina properties file", ioe); } } } if ((is == null)) { // Do something - log.warn("Failed to load catalina.properties"); + log.warn("Failed to load catalina properties file"); // That's fine - we have reasonable defaults. properties = new Properties(); } diff --git a/core/src/main/java/org/apache/catalina/startup/ClassLoaderFactory.java b/core/src/main/java/org/apache/catalina/startup/ClassLoaderFactory.java index c5a245e..ab31444 100644 --- a/core/src/main/java/org/apache/catalina/startup/ClassLoaderFactory.java +++ b/core/src/main/java/org/apache/catalina/startup/ClassLoaderFactory.java @@ -298,7 +298,7 @@ private static URL buildClassLoaderUrl(File file) throws MalformedURLException { } - public static enum RepositoryType { + public enum RepositoryType { DIR, GLOB, JAR, diff --git a/core/src/main/java/org/apache/catalina/startup/Constants.java b/core/src/main/java/org/apache/catalina/startup/Constants.java index 803856f..8569516 100644 --- a/core/src/main/java/org/apache/catalina/startup/Constants.java +++ b/core/src/main/java/org/apache/catalina/startup/Constants.java @@ -27,6 +27,7 @@ public final class Constants { public static final String ApplicationContextXml = "META-INF/context.xml"; public static final String ApplicationWebXml = "/WEB-INF/web.xml"; + public static final String TomcatWebXml = "/WEB-INF/tomcat-web.xml"; public static final String DefaultContextXml = "conf/context.xml"; public static final String DefaultWebXml = "conf/web.xml"; public static final String HostContextXml = "context.xml.default"; diff --git a/core/src/main/java/org/apache/catalina/startup/ContextConfig.java b/core/src/main/java/org/apache/catalina/startup/ContextConfig.java index 8b34e49..2d455c7 100644 --- a/core/src/main/java/org/apache/catalina/startup/ContextConfig.java +++ b/core/src/main/java/org/apache/catalina/startup/ContextConfig.java @@ -399,7 +399,7 @@ protected void authenticatorConfig() { // Instantiate and install an Authenticator of the requested class try { Class authenticatorClass = Class.forName(authenticatorName); - authenticator = (Valve) authenticatorClass.newInstance(); + authenticator = (Valve) authenticatorClass.getConstructor().newInstance(); } catch (Throwable t) { ExceptionUtils.handleThrowable(t); log.error(sm.getString( @@ -433,8 +433,8 @@ protected Digester createContextDigester() { Digester digester = new Digester(); digester.setValidating(false); digester.setRulesValidation(true); - HashMap, List> fakeAttributes = new HashMap<>(); - ArrayList attrs = new ArrayList<>(); + Map, List> fakeAttributes = new HashMap<>(); + List attrs = new ArrayList<>(); attrs.add("className"); fakeAttributes.put(Object.class, attrs); digester.setFakeAttributes(fakeAttributes); @@ -1107,6 +1107,9 @@ protected void webConfig() { Set defaults = new HashSet<>(); defaults.add(getDefaultWebXmlFragment(webXmlParser)); + Set tomcatWebXml = new HashSet<>(); + tomcatWebXml.add(getTomcatWebXmlFragment(webXmlParser)); + WebXml webXml = createWebXml(); // Parse context level web.xml @@ -1175,7 +1178,11 @@ protected void webConfig() { ok = webXml.merge(orderedFragments); } - // Step 7. Apply global defaults + // Step 7a + // merge tomcat-web.xml + webXml.merge(tomcatWebXml); + + // Step 7b. Apply global defaults // Have to merge defaults before JSP conversion since defaults // provide JSP servlet definition. webXml.merge(defaults); @@ -1190,6 +1197,7 @@ protected void webConfig() { configureContext(webXml); } } else { + webXml.merge(tomcatWebXml); webXml.merge(defaults); convertJsps(webXml); configureContext(webXml); @@ -1452,6 +1460,35 @@ private void configureContext(WebXml webxml) { } + private WebXml getTomcatWebXmlFragment(WebXmlParser webXmlParser) { + + WebXml webXmlTomcatFragment = createWebXml(); + webXmlTomcatFragment.setOverridable(true); + + // Set to distributable else every app will be prevented from being + // distributable when the Tomcat fragment is merged with the main + // web.xml + webXmlTomcatFragment.setDistributable(true); + // When merging, the default welcome files are only used if the app has + // not defined any welcomes files. + webXmlTomcatFragment.setAlwaysAddWelcomeFiles(false); + + WebResource resource = context.getResources().getResource(Constants.TomcatWebXml); + if (resource.isFile()) { + try { + InputSource source = new InputSource(resource.getURL().toURI().toString()); + source.setByteStream(resource.getInputStream()); + if (!webXmlParser.parseWebXml(source, webXmlTomcatFragment, false)) { + ok = false; + } + } catch (URISyntaxException e) { + log.error(sm.getString("contextConfig.tomcatWebXmlError"), e); + } + } + return webXmlTomcatFragment; + } + + private WebXml getDefaultWebXmlFragment(WebXmlParser webXmlParser) { // Host should never be null @@ -2093,7 +2130,7 @@ protected void checkHandlesTypes(JavaClass javaClass, } if ((javaClass.getAccessFlags() & - org.apache.tomcat.util.bcel.Const.ACC_ANNOTATION) > 0) { + org.apache.tomcat.util.bcel.Const.ACC_ANNOTATION) != 0) { // Skip annotations. return; } @@ -2546,7 +2583,7 @@ protected void processAnnotationWebFilter(String className, } protected String[] processAnnotationsStringArray(ElementValue ev) { - ArrayList values = new ArrayList<>(); + List values = new ArrayList<>(); if (ev instanceof ArrayElementValue) { ElementValue[] arrayValues = ((ArrayElementValue) ev).getElementValuesArray(); diff --git a/core/src/main/java/org/apache/catalina/startup/ContextRuleSet.java b/core/src/main/java/org/apache/catalina/startup/ContextRuleSet.java index f963212..3476317 100644 --- a/core/src/main/java/org/apache/catalina/startup/ContextRuleSet.java +++ b/core/src/main/java/org/apache/catalina/startup/ContextRuleSet.java @@ -14,14 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.startup; - import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.digester.RuleSetBase; - +import org.apache.tomcat.util.digester.RuleSet; /** *

    RuleSet for processing the contents of a @@ -29,12 +25,10 @@ * * @author Craig R. McClanahan */ -public class ContextRuleSet extends RuleSetBase { - +public class ContextRuleSet implements RuleSet { // ----------------------------------------------------- Instance Variables - /** * The matching pattern prefix to use for recognizing our elements. */ @@ -49,7 +43,6 @@ public class ContextRuleSet extends RuleSetBase { // ------------------------------------------------------------ Constructor - /** * Construct an instance of this RuleSet with the default * matching pattern prefix. @@ -81,7 +74,6 @@ public ContextRuleSet(String prefix) { * created */ public ContextRuleSet(String prefix, boolean create) { - this.namespaceURI = null; this.prefix = prefix; this.create = create; } @@ -89,7 +81,6 @@ public ContextRuleSet(String prefix, boolean create) { // --------------------------------------------------------- Public Methods - /** *

    Add the set of Rule instances defined in this RuleSet to the * specified Digester instance, associating them with @@ -250,5 +241,4 @@ public void addRuleInstances(Digester digester) { "setCookieProcessor", "org.apache.tomcat.util.http.CookieProcessor"); } - } diff --git a/core/src/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java b/core/src/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java index d82ef9a..5742178 100644 --- a/core/src/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java +++ b/core/src/main/java/org/apache/catalina/startup/CredentialHandlerRuleSet.java @@ -17,7 +17,7 @@ package org.apache.catalina.startup; import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.digester.RuleSetBase; +import org.apache.tomcat.util.digester.RuleSet; /** *

    RuleSet for processing the contents of a @@ -25,7 +25,7 @@ * CredentialHandler such as the NestedCredentialHandler that used * nested CredentialHandlers.

    */ -public class CredentialHandlerRuleSet extends RuleSetBase { +public class CredentialHandlerRuleSet implements RuleSet { private static final int MAX_NESTED_LEVELS = Integer.getInteger( @@ -61,7 +61,6 @@ public CredentialHandlerRuleSet() { * trailing slash character) */ public CredentialHandlerRuleSet(String prefix) { - this.namespaceURI = null; this.prefix = prefix; } diff --git a/core/src/main/java/org/apache/catalina/startup/EngineRuleSet.java b/core/src/main/java/org/apache/catalina/startup/EngineRuleSet.java index 0fb139a..f98e285 100644 --- a/core/src/main/java/org/apache/catalina/startup/EngineRuleSet.java +++ b/core/src/main/java/org/apache/catalina/startup/EngineRuleSet.java @@ -14,14 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.startup; - import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.digester.RuleSetBase; - +import org.apache.tomcat.util.digester.RuleSet; /** *

    RuleSet for processing the contents of a @@ -31,12 +27,10 @@ * * @author Craig R. McClanahan */ -public class EngineRuleSet extends RuleSetBase { - +public class EngineRuleSet implements RuleSet { // ----------------------------------------------------- Instance Variables - /** * The matching pattern prefix to use for recognizing our elements. */ @@ -45,7 +39,6 @@ public class EngineRuleSet extends RuleSetBase { // ------------------------------------------------------------ Constructor - /** * Construct an instance of this RuleSet with the default * matching pattern prefix. @@ -63,14 +56,12 @@ public EngineRuleSet() { * trailing slash character) */ public EngineRuleSet(String prefix) { - this.namespaceURI = null; this.prefix = prefix; } // --------------------------------------------------------- Public Methods - /** *

    Add the set of Rule instances defined in this RuleSet to the * specified Digester instance, associating them with @@ -123,8 +114,5 @@ public void addRuleInstances(Digester digester) { digester.addSetNext(prefix + "Engine/Valve", "addValve", "org.apache.catalina.Valve"); - } - - } diff --git a/core/src/main/java/org/apache/catalina/startup/ExpandWar.java b/core/src/main/java/org/apache/catalina/startup/ExpandWar.java index 8b066f6..7fd7144 100644 --- a/core/src/main/java/org/apache/catalina/startup/ExpandWar.java +++ b/core/src/main/java/org/apache/catalina/startup/ExpandWar.java @@ -100,7 +100,7 @@ public static String expand(Host host, URL war, String pathname) if (!warTracker.exists() || warTracker.lastModified() == warLastModified) { // No (detectable) changes to the WAR success = true; - return (docBase.getAbsolutePath()); + return docBase.getAbsolutePath(); } // WAR must have been modified. Remove expanded directory. @@ -166,15 +166,22 @@ public static String expand(Host host, URL war, String pathname) expand(input, expandedFile); long lastModified = jarEntry.getTime(); if ((lastModified != -1) && (lastModified != 0)) { - expandedFile.setLastModified(lastModified); + if (!expandedFile.setLastModified(lastModified)) { + throw new IOException( + sm.getString("expandWar.lastModifiedFailed", expandedFile)); + } } } } // Create the warTracker file and align the last modified time // with the last modified time of the WAR - warTracker.createNewFile(); - warTracker.setLastModified(warLastModified); + if (!warTracker.createNewFile()) { + throw new IOException(sm.getString("expandWar.createFileFailed", warTracker)); + } + if (!warTracker.setLastModified(warLastModified)) { + throw new IOException(sm.getString("expandWar.lastModifiedFailed", warTracker)); + } success = true; } catch (IOException e) { diff --git a/core/src/main/java/org/apache/catalina/startup/HomesUserDatabase.java b/core/src/main/java/org/apache/catalina/startup/HomesUserDatabase.java index a301af7..35a5f9f 100644 --- a/core/src/main/java/org/apache/catalina/startup/HomesUserDatabase.java +++ b/core/src/main/java/org/apache/catalina/startup/HomesUserDatabase.java @@ -71,9 +71,7 @@ public HomesUserDatabase() { */ @Override public UserConfig getUserConfig() { - - return (this.userConfig); - + return this.userConfig; } @@ -84,10 +82,8 @@ public UserConfig getUserConfig() { */ @Override public void setUserConfig(UserConfig userConfig) { - this.userConfig = userConfig; init(); - } @@ -101,9 +97,7 @@ public void setUserConfig(UserConfig userConfig) { */ @Override public String getHome(String user) { - return homes.get(user); - } @@ -112,9 +106,7 @@ public String getHome(String user) { */ @Override public Enumeration getUsers() { - - return (homes.keys()); - + return homes.keys(); } diff --git a/core/src/main/java/org/apache/catalina/startup/HostConfig.java b/core/src/main/java/org/apache/catalina/startup/HostConfig.java index 67a0145..ab9d63c 100644 --- a/core/src/main/java/org/apache/catalina/startup/HostConfig.java +++ b/core/src/main/java/org/apache/catalina/startup/HostConfig.java @@ -22,7 +22,14 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; import java.nio.file.Files; +import java.security.CodeSource; +import java.security.Permission; +import java.security.PermissionCollection; +import java.security.Policy; +import java.security.cert.Certificate; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -47,6 +54,7 @@ import org.apache.catalina.Container; import org.apache.catalina.Context; import org.apache.catalina.DistributedManager; +import org.apache.catalina.Globals; import org.apache.catalina.Host; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleEvent; @@ -54,6 +62,7 @@ import org.apache.catalina.Manager; import org.apache.catalina.core.StandardContext; import org.apache.catalina.core.StandardHost; +import org.apache.catalina.security.DeployXmlPermission; import org.apache.catalina.util.ContextName; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -160,9 +169,7 @@ public class HostConfig implements LifecycleListener { * @return the Context implementation class name. */ public String getContextClass() { - - return (this.contextClass); - + return this.contextClass; } @@ -188,9 +195,7 @@ public void setContextClass(String contextClass) { * @return the deploy XML config file flag for this component. */ public boolean isDeployXML() { - - return (this.deployXML); - + return this.deployXML; } @@ -200,9 +205,34 @@ public boolean isDeployXML() { * @param deployXML The new deploy XML flag */ public void setDeployXML(boolean deployXML) { + this.deployXML = deployXML; + } - this.deployXML= deployXML; + private boolean isDeployThisXML(File docBase, ContextName cn) { + boolean deployThisXML = isDeployXML(); + if (Globals.IS_SECURITY_ENABLED && !deployThisXML) { + // When running under a SecurityManager, deployXML may be overridden + // on a per Context basis by the granting of a specific permission + Policy currentPolicy = Policy.getPolicy(); + if (currentPolicy != null) { + URL contextRootUrl; + try { + contextRootUrl = docBase.toURI().toURL(); + CodeSource cs = new CodeSource(contextRootUrl, (Certificate[]) null); + PermissionCollection pc = currentPolicy.getPermissions(cs); + Permission p = new DeployXmlPermission(cn.getBaseName()); + if (pc.implies(p)) { + deployThisXML = true; + } + } catch (MalformedURLException e) { + // Should never happen + log.warn("hostConfig.docBaseUrlInvalid", e); + } + } + } + + return deployThisXML; } @@ -210,9 +240,7 @@ public void setDeployXML(boolean deployXML) { * @return the copy XML config file flag for this component. */ public boolean isCopyXML() { - - return (this.copyXML); - + return this.copyXML; } @@ -232,9 +260,7 @@ public void setCopyXML(boolean copyXML) { * @return the unpack WARs flag. */ public boolean isUnpackWARs() { - - return (this.unpackWARs); - + return this.unpackWARs; } @@ -244,9 +270,7 @@ public boolean isUnpackWARs() { * @param unpackWARs The new unpack WARs flag */ public void setUnpackWARs(boolean unpackWARs) { - this.unpackWARs = unpackWARs; - } @@ -303,7 +327,7 @@ public synchronized void addServiced(String name) { * @return state of the application */ public synchronized boolean isServiced(String name) { - return (serviced.contains(name)); + return serviced.contains(name); } @@ -367,7 +391,7 @@ protected static Digester createDigester(String contextClassName) { // Set the properties on that object (it doesn't matter if extra // properties are set) digester.addSetProperties("Context"); - return (digester); + return digester; } protected File returnCanonicalPath(String path) { @@ -559,8 +583,7 @@ protected void deployDescriptor(ContextName cn, File contextXml) { } Class clazz = Class.forName(host.getConfigClass()); - LifecycleListener listener = - (LifecycleListener) clazz.newInstance(); + LifecycleListener listener = (LifecycleListener) clazz.getConstructor().newInstance(); context.addLifecycleListener(listener); context.setConfigFile(contextXml.toURI().toURL()); @@ -821,8 +844,10 @@ protected void deployWAR(ContextName cn, File war) { } Context context = null; + boolean deployThisXML = isDeployThisXML(war, cn); + try { - if (deployXML && useXml && !copyXML) { + if (deployThisXML && useXml && !copyXML) { synchronized (digesterLock) { try { context = (Context) digester.parse(xml); @@ -838,7 +863,7 @@ protected void deployWAR(ContextName cn, File war) { } } context.setConfigFile(xml.toURI().toURL()); - } else if (deployXML && xmlInWar) { + } else if (deployThisXML && xmlInWar) { synchronized (digesterLock) { try (JarFile jar = new JarFile(war)) { JarEntry entry = jar.getJarEntry(Constants.ApplicationContextXml); @@ -858,14 +883,14 @@ protected void deployWAR(ContextName cn, File war) { UriUtil.buildJarUrl(war, Constants.ApplicationContextXml)); } } - } else if (!deployXML && xmlInWar) { + } else if (!deployThisXML && xmlInWar) { // Block deployment as META-INF/context.xml may contain security // configuration necessary for a secure deployment. log.error(sm.getString("hostConfig.deployDescriptor.blocked", cn.getPath(), Constants.ApplicationContextXml, new File(host.getConfigBaseFile(), cn.getBaseName() + ".xml"))); } else { - context = (Context) Class.forName(contextClass).newInstance(); + context = (Context) Class.forName(contextClass).getConstructor().newInstance(); } } catch (Throwable t) { ExceptionUtils.handleThrowable(t); @@ -878,7 +903,7 @@ protected void deployWAR(ContextName cn, File war) { } boolean copyThisXml = false; - if (deployXML) { + if (deployThisXML) { if (host instanceof StandardHost) { copyThisXml = ((StandardHost) host).isCopyXML(); } @@ -914,7 +939,7 @@ protected void deployWAR(ContextName cn, File war) { } DeployedApplication deployedApp = new DeployedApplication(cn.getName(), - xml.exists() && deployXML && copyThisXml); + xml.exists() && deployThisXML && copyThisXml); long startTime = 0; // Deploy the application in this WAR file @@ -929,7 +954,7 @@ protected void deployWAR(ContextName cn, File war) { deployedApp.redeployResources.put (war.getAbsolutePath(), Long.valueOf(war.lastModified())); - if (deployXML && xml.exists() && copyThisXml) { + if (deployThisXML && xml.exists() && copyThisXml) { deployedApp.redeployResources.put(xml.getAbsolutePath(), Long.valueOf(xml.lastModified())); } else { @@ -941,8 +966,7 @@ protected void deployWAR(ContextName cn, File war) { } Class clazz = Class.forName(host.getConfigClass()); - LifecycleListener listener = - (LifecycleListener) clazz.newInstance(); + LifecycleListener listener = (LifecycleListener) clazz.getConstructor().newInstance(); context.addLifecycleListener(listener); context.setName(cn.getName()); @@ -967,7 +991,7 @@ protected void deployWAR(ContextName cn, File war) { Long.valueOf(docBase.lastModified())); addWatchedResources(deployedApp, docBase.getAbsolutePath(), context); - if (deployXML && !copyThisXml && (xmlInWar || xml.exists())) { + if (deployThisXML && !copyThisXml && (xmlInWar || xml.exists())) { deployedApp.redeployResources.put(xml.getAbsolutePath(), Long.valueOf(xml.lastModified())); } @@ -1054,10 +1078,11 @@ protected void deployDirectory(ContextName cn, File dir) { DeployedApplication deployedApp; - boolean copyThisXml = copyXML; + boolean copyThisXml = isCopyXML(); + boolean deployThisXML = isDeployThisXML(dir, cn); try { - if (deployXML && xml.exists()) { + if (deployThisXML && xml.exists()) { synchronized (digesterLock) { try { context = (Context) digester.parse(xml); @@ -1085,19 +1110,18 @@ protected void deployDirectory(ContextName cn, File dir) { } else { context.setConfigFile(xml.toURI().toURL()); } - } else if (!deployXML && xml.exists()) { + } else if (!deployThisXML && xml.exists()) { // Block deployment as META-INF/context.xml may contain security // configuration necessary for a secure deployment. log.error(sm.getString("hostConfig.deployDescriptor.blocked", cn.getPath(), xml, xmlCopy)); context = new FailedContext(); } else { - context = (Context) Class.forName(contextClass).newInstance(); + context = (Context) Class.forName(contextClass).getConstructor().newInstance(); } Class clazz = Class.forName(host.getConfigClass()); - LifecycleListener listener = - (LifecycleListener) clazz.newInstance(); + LifecycleListener listener = (LifecycleListener) clazz.getConstructor().newInstance(); context.addLifecycleListener(listener); context.setName(cn.getName()); @@ -1111,7 +1135,7 @@ protected void deployDirectory(ContextName cn, File dir) { dir.getAbsolutePath()), t); } finally { deployedApp = new DeployedApplication(cn.getName(), - xml.exists() && deployXML && copyThisXml); + xml.exists() && deployThisXML && copyThisXml); // Fake re-deploy resource to detect if a WAR is added at a later // point @@ -1119,7 +1143,7 @@ protected void deployDirectory(ContextName cn, File dir) { Long.valueOf(0)); deployedApp.redeployResources.put(dir.getAbsolutePath(), Long.valueOf(dir.lastModified())); - if (deployXML && xml.exists()) { + if (deployThisXML && xml.exists()) { if (copyThisXml) { deployedApp.redeployResources.put( xmlCopy.getAbsolutePath(), diff --git a/core/src/main/java/org/apache/catalina/startup/HostRuleSet.java b/core/src/main/java/org/apache/catalina/startup/HostRuleSet.java index 4afe521..3114cc1 100644 --- a/core/src/main/java/org/apache/catalina/startup/HostRuleSet.java +++ b/core/src/main/java/org/apache/catalina/startup/HostRuleSet.java @@ -14,14 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.startup; - import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.digester.RuleSetBase; - +import org.apache.tomcat.util.digester.RuleSet; /** *

    RuleSet for processing the contents of a @@ -31,12 +27,10 @@ * * @author Craig R. McClanahan */ -public class HostRuleSet extends RuleSetBase { - +public class HostRuleSet implements RuleSet { // ----------------------------------------------------- Instance Variables - /** * The matching pattern prefix to use for recognizing our elements. */ @@ -45,7 +39,6 @@ public class HostRuleSet extends RuleSetBase { // ------------------------------------------------------------ Constructor - /** * Construct an instance of this RuleSet with the default * matching pattern prefix. @@ -63,14 +56,12 @@ public HostRuleSet() { * trailing slash character) */ public HostRuleSet(String prefix) { - this.namespaceURI = null; this.prefix = prefix; } // --------------------------------------------------------- Public Methods - /** *

    Add the set of Rule instances defined in this RuleSet to the * specified Digester instance, associating them with @@ -127,8 +118,5 @@ public void addRuleInstances(Digester digester) { digester.addSetNext(prefix + "Host/Valve", "addValve", "org.apache.catalina.Valve"); - } - - } diff --git a/core/src/main/java/org/apache/catalina/startup/LifecycleListenerRule.java b/core/src/main/java/org/apache/catalina/startup/LifecycleListenerRule.java index 4cbbc89..f70a7b2 100644 --- a/core/src/main/java/org/apache/catalina/startup/LifecycleListenerRule.java +++ b/core/src/main/java/org/apache/catalina/startup/LifecycleListenerRule.java @@ -124,8 +124,7 @@ public void begin(String namespace, String name, Attributes attributes) // Instantiate a new LifecycleListener implementation object Class clazz = Class.forName(className); - LifecycleListener listener = - (LifecycleListener) clazz.newInstance(); + LifecycleListener listener = (LifecycleListener) clazz.getConstructor().newInstance(); // Add this LifecycleListener to our associated component c.addLifecycleListener(listener); diff --git a/core/src/main/java/org/apache/catalina/startup/LocalStrings.properties b/core/src/main/java/org/apache/catalina/startup/LocalStrings.properties index 2d677e3..29075c1 100644 --- a/core/src/main/java/org/apache/catalina/startup/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/startup/LocalStrings.properties @@ -67,6 +67,7 @@ contextConfig.sci.info=Unable to process ServletContainerInitializer for [{0}]. contextConfig.servletContainerInitializerFail=Failed to detect ServletContainerInitializers for context with name [{0}] contextConfig.start=ContextConfig: Processing START contextConfig.stop=ContextConfig: Processing STOP +contextConfig.tomcatWebXmlError=Error processing /WEB-INF/tomcat-web.xml contextConfig.unavailable=Marking this application unavailable due to previous error(s) contextConfig.unknownUrlProtocol=The URL protocol [{0}] was not recognised during annotation processing. URL [{1}] was ignored. contextConfig.urlPatternValue=Both the urlPatterns and value attributes were set for the [{0}] annotation on class [{1}] @@ -80,9 +81,11 @@ engineConfig.start=EngineConfig: Processing START engineConfig.stop=EngineConfig: Processing STOP expandWar.copy=Error copying [{0}] to [{1}] expandWar.createFailed=Unable to create the directory [{0}] +expandWar.createFileFailed=Unable to create the file [{0}] expandWar.deleteFailed=[{0}] could not be completely deleted. The presence of the remaining files may cause problems expandWar.deleteOld=An expanded directory [{0}] was found with a last modified time that did not match the associated WAR. It will be deleted. expandWar.illegalPath=The archive [{0}] is malformed and will be ignored: an entry contains an illegal path [{1}] which was not expanded to [{2}] since that is outside of the defined docBase [{3}] +expandWar.lastModifiedFailed=Unable to set the last modified time for [{0}] expandWar.missingJarEntry=Cannot get input stream for JarEntry [{0}] - broken WAR file? failedContext.start=Failed to process either the global, per-host or context-specific context.xml file therefore the [{0}] Context cannot be started. hostConfig.appBase=Application base [{1}] for host [{0}] does not exist or is not a directory. deployOnStartUp and autoDeploy have been set to false to prevent deployment errors. Other errors may still occur. @@ -108,6 +111,7 @@ hostConfig.deployWar.threaded.error=Error waiting for multi-thread deployment of hostConfig.deployWar.finished=Deployment of web application archive [{0}] has finished in [{1}] ms hostConfig.deploy.error=Exception while deploying web application directory [{0}] hostConfig.deploying=Deploying discovered web applications +hostConfig.docBaseUrlInvalid=The provided docBase cannot be expressed as a URL hostConfig.expand=Expanding web application archive [{0}] hostConfig.expand.error=Exception while expanding web application archive [{0}] hostConfig.expanding=Expanding discovered web application archives @@ -122,6 +126,9 @@ hostConfig.undeploy=Undeploying context [{0}] hostConfig.resourceNotAbsolute=Unable to remove resource from context [{0}] since [{1}] is not absolute hostConfig.undeployVersion=Undeploying old version of context [{0}] which has no active session passwdUserDatabase.readFail=Failed to obtain a complete set of users from /etc/passwd +tomcat.baseDirNotDir=The location [{0}] specified for the base directory is not a directory +tomcat.baseDirMakeFail=Unable to create the directory [{0}] to use as the base directory +tomcat.homeDirMakeFail=Unable to create the directory [{0}] to use as the home directory userConfig.database=Exception loading user database userConfig.deploy=Deploying web application for user [{0}] userConfig.deploying=Deploying user web applications diff --git a/core/src/main/java/org/apache/catalina/startup/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/startup/LocalStrings_es.properties index f077ea8..03bc567 100644 --- a/core/src/main/java/org/apache/catalina/startup/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/startup/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT 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.configFail = No pude cargar la configuraci\u00F3n del servidor desde [{0}] catalina.shutdownHookFail = El gancho de apagado ha experimentado un error al intentar para el servidor catalina.stopServer = No se ha configurado puerto de apagado. Apagando el servidor a trav\u00E9s de se\u00F1al de SO. Servidor no apagado. diff --git a/core/src/main/java/org/apache/catalina/startup/NamingRuleSet.java b/core/src/main/java/org/apache/catalina/startup/NamingRuleSet.java index bc31bdf..dc5fbb3 100644 --- a/core/src/main/java/org/apache/catalina/startup/NamingRuleSet.java +++ b/core/src/main/java/org/apache/catalina/startup/NamingRuleSet.java @@ -14,14 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.startup; - import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.digester.RuleSetBase; - +import org.apache.tomcat.util.digester.RuleSet; /** *

    RuleSet for processing the JNDI Enterprise Naming @@ -30,12 +26,10 @@ * @author Craig R. McClanahan * @author Remy Maucherat */ -public class NamingRuleSet extends RuleSetBase { - +public class NamingRuleSet implements RuleSet { // ----------------------------------------------------- Instance Variables - /** * The matching pattern prefix to use for recognizing our elements. */ @@ -44,7 +38,6 @@ public class NamingRuleSet extends RuleSetBase { // ------------------------------------------------------------ Constructor - /** * Construct an instance of this RuleSet with the default * matching pattern prefix. @@ -62,14 +55,12 @@ public NamingRuleSet() { * trailing slash character) */ public NamingRuleSet(String prefix) { - this.namespaceURI = null; this.prefix = prefix; } // --------------------------------------------------------- Public Methods - /** *

    Add the set of Rule instances defined in this RuleSet to the * specified Digester instance, associating them with @@ -130,8 +121,5 @@ public void addRuleInstances(Digester digester) { digester.addRule(prefix + "Transaction", new SetNextNamingRule("setTransaction", "org.apache.tomcat.util.descriptor.web.ContextTransaction")); - } - - } diff --git a/core/src/main/java/org/apache/catalina/startup/RealmRuleSet.java b/core/src/main/java/org/apache/catalina/startup/RealmRuleSet.java index 9ef26b0..eb6cfa6 100644 --- a/core/src/main/java/org/apache/catalina/startup/RealmRuleSet.java +++ b/core/src/main/java/org/apache/catalina/startup/RealmRuleSet.java @@ -14,29 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.catalina.startup; - import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.digester.RuleSetBase; - +import org.apache.tomcat.util.digester.RuleSet; /** *

    RuleSet for processing the contents of a Realm definition * element. This RuleSet supports Realms such as the * CombinedRealm that used nested Realms.

    */ -public class RealmRuleSet extends RuleSetBase { - +public class RealmRuleSet implements RuleSet { private static final int MAX_NESTED_REALM_LEVELS = Integer.getInteger( "org.apache.catalina.startup.RealmRuleSet.MAX_NESTED_REALM_LEVELS", 3).intValue(); - // ----------------------------------------------------- Instance Variables + // ----------------------------------------------------- Instance Variables /** * The matching pattern prefix to use for recognizing our elements. @@ -46,7 +41,6 @@ public class RealmRuleSet extends RuleSetBase { // ------------------------------------------------------------ Constructor - /** * Construct an instance of this RuleSet with the default * matching pattern prefix. @@ -64,14 +58,12 @@ public RealmRuleSet() { * trailing slash character) */ public RealmRuleSet(String prefix) { - this.namespaceURI = null; this.prefix = prefix; } // --------------------------------------------------------- Public Methods - /** *

    Add the set of Rule instances defined in this RuleSet to the * specified Digester instance, associating them with diff --git a/core/src/main/java/org/apache/catalina/startup/SetNextNamingRule.java b/core/src/main/java/org/apache/catalina/startup/SetNextNamingRule.java index 2cce76b..c82fe06 100644 --- a/core/src/main/java/org/apache/catalina/startup/SetNextNamingRule.java +++ b/core/src/main/java/org/apache/catalina/startup/SetNextNamingRule.java @@ -112,15 +112,13 @@ public void end(String namespace, String name) throws Exception { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("SetNextRule["); sb.append("methodName="); sb.append(methodName); sb.append(", paramType="); sb.append(paramType); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/catalina/startup/Tomcat.java b/core/src/main/java/org/apache/catalina/startup/Tomcat.java index f629ff2..0768be7 100644 --- a/core/src/main/java/org/apache/catalina/startup/Tomcat.java +++ b/core/src/main/java/org/apache/catalina/startup/Tomcat.java @@ -18,7 +18,6 @@ import java.io.File; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.security.Principal; @@ -64,6 +63,7 @@ import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.buf.UriUtil; import org.apache.tomcat.util.descriptor.web.LoginConfig; +import org.apache.tomcat.util.res.StringManager; // TODO: lazy init for the temp dir - only when a JSP is compiled or // get temp dir is called we need to create it. This will avoid the @@ -75,28 +75,35 @@ /** * Minimal tomcat starter for embedding/unit tests. * + *

    * Tomcat supports multiple styles of configuration and * startup - the most common and stable is server.xml-based, * implemented in org.apache.catalina.startup.Bootstrap. * + *

    * This class is for use in apps that embed tomcat. - * Requirements: * - * - all tomcat classes and possibly servlets are in the classpath. - * ( for example all is in one big jar, or in eclipse CP, or in any other - * combination ) + *

    + * Requirements: + *

      + *
    • all tomcat classes and possibly servlets are in the classpath. + * (for example all is in one big jar, or in eclipse CP, or in + * any other combination)
    • * - * - we need one temporary directory for work files + *
    • we need one temporary directory for work files
    • * - * - no config file is required. This class provides methods to - * use if you have a webapp with a web.xml file, but it is - * optional - you can use your own servlets. + *
    • no config file is required. This class provides methods to + * use if you have a webapp with a web.xml file, but it is + * optional - you can use your own servlets.
    • + *
    * + *

    * There are a variety of 'add' methods to configure servlets and webapps. These * methods, by default, create a simple in-memory security realm and apply it. * If you need more complex security processing, you can define a subclass of * this class. * + *

    * This class provides a set of convenience methods for configuring webapp * contexts, all overloads of the method addWebapp. These methods * create a webapp context, configure it, and then add it to a {@link Host}. @@ -104,6 +111,7 @@ * listener that adds the standard DefaultServlet, JSP processing, and welcome * files. * + *

    * In complex cases, you may prefer to use the ordinary Tomcat API to create * webapp contexts; for example, you might need to install a custom Loader * before the call to {@link Host#addChild(Container)}. To replicate the basic @@ -111,14 +119,17 @@ * methods of this class: {@link #noDefaultWebXmlPath()} and * {@link #getDefaultWebXmlListener()}. * + *

    * {@link #getDefaultWebXmlListener()} returns a {@link LifecycleListener} that * adds the standard DefaultServlet, JSP processing, and welcome files. If you * add this listener, you must prevent Tomcat from applying any standard global * web.xml with ... * + *

    * {@link #noDefaultWebXmlPath()} returns a dummy pathname to configure to * prevent {@link ContextConfig} from trying to apply a global web.xml file. * + *

    * This class provides a main() and few simple CLI arguments, * see setters for doc. It can be used for simple tests and * demo. @@ -127,6 +138,9 @@ * @author Costin Manolache */ public class Tomcat { + + private static final StringManager sm = StringManager.getManager(Tomcat.class); + // Some logging implementations use weak references for loggers so there is // the possibility that logging configuration could be lost if GC runs just // after Loggers are configured but before they are used. The purpose of @@ -149,18 +163,26 @@ public Tomcat() { } /** - * Tomcat needs a directory for temp files. This should be the - * first method called. - * - * By default, if this method is not called, we use: - * - system properties - catalina.base, catalina.home - * - $PWD/tomcat.$PORT - * (/tmp doesn't seem a good choice for security). - * + * Tomcat requires that the base directory is set because the defaults for + * a number of other locations, such as the work directory, are derived from + * the base directory. This should be the first method called. + *

    + * If this method is not called then Tomcat will attempt to use these + * locations in the following order: + *

      + *
    1. if set, the catalina.base system property
    2. + *
    3. if set, the catalina.home system property
    4. + *
    5. The user.dir system property (the directory where Java was run from) + * where a directory named tomcat.$PORT will be created. $PORT is the + * value configured via {@link #setPort(int)} which defaults to 8080 if + * not set
    6. + *
    + * The user should ensure that the file permissions for the base directory + * are appropriate. + *

    * TODO: disable work dir if not needed ( no jsp, etc ). * - * @param basedir The Tomcat base folder on which all others - * will be derived + * @param basedir The Tomcat base folder on which all others will be derived */ public void setBaseDir(String basedir) { this.basedir = basedir; @@ -214,24 +236,30 @@ public Context addWebapp(String contextPath, String docBase) throws ServletExcep * programmatically, there will still be no scanning for * {@link javax.servlet.annotation.HandlesTypes} matches. * + *

    * API calls equivalent with web.xml: * - * context-param + *

    {@code
    +     *  // context-param
          *  ctx.addParameter("name", "value");
          *
          *
    -     * error-page
    -     *    ErrorPage ep = new ErrorPage();
    -     *    ep.setErrorCode(500);
    -     *    ep.setLocation("/error.html");
    -     *    ctx.addErrorPage(ep);
    +     *  // error-page
    +     *  ErrorPage ep = new ErrorPage();
    +     *  ep.setErrorCode(500);
    +     *  ep.setLocation("/error.html");
    +     *  ctx.addErrorPage(ep);
    +     *
    +     *  ctx.addMimeMapping("ext", "type");
    +     * }
    * - * ctx.addMimeMapping("ext", "type"); * + *

    * Note: If you reload the Context, all your configuration will be lost. If * you need reload support, consider using a LifecycleListener to provide * your configuration. * + *

    * TODO: add the rest * * @param contextPath The context mapping to use, "" for root context. @@ -246,14 +274,16 @@ public Context addContext(String contextPath, String docBase) { /** * Equivalent to <servlet><servlet-name><servlet-class>. * + *

    * In general it is better/faster to use the method that takes a * Servlet as param - this one can be used if the servlet is not * commonly used, and want to avoid loading all deps. * ( for example: jsp servlet ) * * You can customize the returned servlet, ex: - * + *

          *    wrapper.addInitParameter("name", "value");
    +     *  
    * * @param contextPath Context to add Servlet to * @param servletName Servlet name (used in mappings) @@ -567,8 +597,8 @@ public Context addWebapp(Host host, String contextPath, String docBase) { LifecycleListener listener = null; try { Class clazz = Class.forName(getHost().getConfigClass()); - listener = (LifecycleListener) clazz.newInstance(); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { + listener = (LifecycleListener) clazz.getConstructor().newInstance(); + } catch (ReflectiveOperationException e) { // Wrap in IAE since we can't easily change the method signature to // to throw the specific checked exceptions throw new IllegalArgumentException(e); @@ -681,12 +711,27 @@ protected void initBaseDir() { } if (basedir == null) { // Create a temp dir. - basedir = System.getProperty("user.dir") + - "/tomcat." + port; + basedir = System.getProperty("user.dir") + "/tomcat." + port; } File baseFile = new File(basedir); - baseFile.mkdirs(); + if (baseFile.exists()) { + if (!baseFile.isDirectory()) { + throw new IllegalArgumentException(sm.getString("tomcat.baseDirNotDir", baseFile)); + } + } else { + if (!baseFile.mkdirs()) { + // Failed to create base directory + throw new IllegalStateException(sm.getString("tomcat.baseDirMakeFail", baseFile)); + } + /* + * If file permissions were going to be set on the newly created + * directory, this is the place to do it. However, even simple + * calls such as File.setReadable(boolean,boolean) behaves + * differently on different platforms. Therefore, setBaseDir + * documents that the user needs to do this. + */ + } try { baseFile = baseFile.getCanonicalFile(); } catch (IOException e) { @@ -700,7 +745,10 @@ protected void initBaseDir() { server.setCatalinaHome(baseFile); } else { File homeFile = new File(catalinaHome); - homeFile.mkdirs(); + if (!homeFile.isDirectory() && !homeFile.mkdirs()) { + // Failed to create home directory + throw new IllegalStateException(sm.getString("tomcat.homeDirMakeFail", homeFile)); + } try { homeFile = homeFile.getCanonicalFile(); } catch (IOException e) { @@ -807,10 +855,7 @@ private Context createContext(Host host, String url) { try { return (Context) Class.forName(contextClass).getConstructor() .newInstance(); - } catch (InstantiationException | IllegalAccessException - | IllegalArgumentException | InvocationTargetException - | NoSuchMethodException | SecurityException - | ClassNotFoundException e) { + } catch (ReflectiveOperationException | IllegalArgumentException | SecurityException e) { throw new IllegalArgumentException( "Can't instantiate context-class " + contextClass + " for host " + host + " and url " @@ -909,6 +954,7 @@ public static void initWebappDefaults(Context ctx) { /** * Fix startup sequence - required if you don't use web.xml. * + *

    * The start() method in context will set 'configured' to false - and * expects a listener to set it back to true. */ @@ -929,7 +975,6 @@ public void lifecycleEvent(LifecycleEvent event) { context.getPipeline().addValve(new NonLoginAuthenticator()); } } catch (ClassCastException e) { - return; } } @@ -984,10 +1029,8 @@ public synchronized Servlet loadServlet() throws ServletException { if (singleThreadModel) { Servlet instance; try { - instance = existing.getClass().newInstance(); - } catch (InstantiationException e) { - throw new ServletException(e); - } catch (IllegalAccessException e) { + instance = existing.getClass().getConstructor().newInstance(); + } catch (ReflectiveOperationException e) { throw new ServletException(e); } instance.init(facade); diff --git a/core/src/main/java/org/apache/catalina/startup/Tool.java b/core/src/main/java/org/apache/catalina/startup/Tool.java index 818dd70..07d5896 100644 --- a/core/src/main/java/org/apache/catalina/startup/Tool.java +++ b/core/src/main/java/org/apache/catalina/startup/Tool.java @@ -22,6 +22,7 @@ import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.List; import org.apache.catalina.Globals; import org.apache.juli.logging.Log; @@ -157,8 +158,8 @@ else if ("-shared".equals(args[index])) // Construct the class loader we will be using ClassLoader classLoader = null; try { - ArrayList packed = new ArrayList<>(); - ArrayList unpacked = new ArrayList<>(); + List packed = new ArrayList<>(); + List unpacked = new ArrayList<>(); unpacked.add(new File(catalinaHome, "classes")); packed.add(new File(catalinaHome, "lib")); if (common) { diff --git a/core/src/main/java/org/apache/catalina/startup/UserConfig.java b/core/src/main/java/org/apache/catalina/startup/UserConfig.java index 22baacf..8b7d32f 100644 --- a/core/src/main/java/org/apache/catalina/startup/UserConfig.java +++ b/core/src/main/java/org/apache/catalina/startup/UserConfig.java @@ -116,9 +116,7 @@ public final class UserConfig * @return the Context configuration class name. */ public String getConfigClass() { - - return (this.configClass); - + return this.configClass; } @@ -128,9 +126,7 @@ public String getConfigClass() { * @param configClass The new Context configuration class name. */ public void setConfigClass(String configClass) { - this.configClass = configClass; - } @@ -138,9 +134,7 @@ public void setConfigClass(String configClass) { * @return the Context implementation class name. */ public String getContextClass() { - - return (this.contextClass); - + return this.contextClass; } @@ -150,9 +144,7 @@ public String getContextClass() { * @param contextClass The new Context implementation class name. */ public void setContextClass(String contextClass) { - this.contextClass = contextClass; - } @@ -160,9 +152,7 @@ public void setContextClass(String contextClass) { * @return the directory name for user web applications. */ public String getDirectoryName() { - - return (this.directoryName); - + return this.directoryName; } @@ -172,9 +162,7 @@ public String getDirectoryName() { * @param directoryName The new directory name */ public void setDirectoryName(String directoryName) { - this.directoryName = directoryName; - } @@ -182,9 +170,7 @@ public void setDirectoryName(String directoryName) { * @return the base directory containing user home directories. */ public String getHomeBase() { - - return (this.homeBase); - + return this.homeBase; } @@ -194,9 +180,7 @@ public String getHomeBase() { * @param homeBase The new base directory */ public void setHomeBase(String homeBase) { - this.homeBase = homeBase; - } @@ -204,9 +188,7 @@ public void setHomeBase(String homeBase) { * @return the user database class name for this component. */ public String getUserClass() { - - return (this.userClass); - + return this.userClass; } @@ -215,9 +197,7 @@ public String getUserClass() { * @param userClass The user database class name */ public void setUserClass(String userClass) { - this.userClass = userClass; - } /** @@ -309,7 +289,7 @@ private void deploy() { UserDatabase database = null; try { Class clazz = Class.forName(userClass); - database = (UserDatabase) clazz.newInstance(); + database = (UserDatabase) clazz.getConstructor().newInstance(); database.setUserConfig(this); } catch (Exception e) { host.getLogger().error(sm.getString("userConfig.database"), e); @@ -360,13 +340,11 @@ private void deploy(String user, String home) { // Deploy the web application for this user try { Class clazz = Class.forName(contextClass); - Context context = - (Context) clazz.newInstance(); + Context context = (Context) clazz.getConstructor().newInstance(); context.setPath(contextPath); context.setDocBase(app.toString()); clazz = Class.forName(configClass); - LifecycleListener listener = - (LifecycleListener) clazz.newInstance(); + LifecycleListener listener = (LifecycleListener) clazz.getConstructor().newInstance(); context.addLifecycleListener(listener); host.addChild(context); } catch (Exception e) { diff --git a/core/src/main/java/org/apache/catalina/startup/WebAnnotationSet.java b/core/src/main/java/org/apache/catalina/startup/WebAnnotationSet.java index 19e099b..be81ad7 100644 --- a/core/src/main/java/org/apache/catalina/startup/WebAnnotationSet.java +++ b/core/src/main/java/org/apache/catalina/startup/WebAnnotationSet.java @@ -393,9 +393,12 @@ protected static void addResource(Context context, Resource annotation, context.getNamingResources().addMessageDestinationRef(resource); - } else if (type.equals("javax.resource.cci.InteractionSpec") || - type.equals("javax.transaction.UserTransaction") || - true) { + } else { + /* + * General case. Also used for: + * - javax.resource.cci.InteractionSpec + * - javax.transaction.UserTransaction + */ // resource-env-ref ContextResourceEnvRef resource = new ContextResourceEnvRef(); diff --git a/core/src/main/java/org/apache/catalina/startup/WebappServiceLoader.java b/core/src/main/java/org/apache/catalina/startup/WebappServiceLoader.java index 220baac..a47a8f9 100644 --- a/core/src/main/java/org/apache/catalina/startup/WebappServiceLoader.java +++ b/core/src/main/java/org/apache/catalina/startup/WebappServiceLoader.java @@ -163,7 +163,7 @@ void parseConfigFile(LinkedHashSet servicesFound, URL url) throws IOException { try (InputStream is = url.openStream(); InputStreamReader in = new InputStreamReader(is, StandardCharsets.UTF_8); - BufferedReader reader = new BufferedReader(in);) { + BufferedReader reader = new BufferedReader(in)) { String line; while ((line = reader.readLine()) != null) { int i = line.indexOf('#'); @@ -186,9 +186,8 @@ List loadServices(Class serviceType, LinkedHashSet servicesFound) for (String serviceClass : servicesFound) { try { Class clazz = Class.forName(serviceClass, true, loader); - services.add(serviceType.cast(clazz.newInstance())); - } catch (ClassNotFoundException | InstantiationException | - IllegalAccessException | ClassCastException e) { + services.add(serviceType.cast(clazz.getConstructor().newInstance())); + } catch (ReflectiveOperationException | ClassCastException e) { throw new IOException(e); } } diff --git a/core/src/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java b/core/src/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java index 72498dc..af0374c 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java @@ -26,7 +26,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Set; @@ -78,9 +77,7 @@ public void printAttributes(PrintWriter writer, int indent, List propertyKeys = getPropertyKeys(connector); // Create blank instance Object bean2 = new Connector(protocol);//defaultInstance(bean); - Iterator propertyIterator = propertyKeys.iterator(); - while (propertyIterator.hasNext()) { - String key = propertyIterator.next(); + for (String key : propertyKeys) { Object value = IntrospectionUtils.getProperty(bean, key); if (desc.isTransientAttribute(key)) { continue; // Skip the specified exceptions @@ -119,7 +116,7 @@ public void printAttributes(PrintWriter writer, int indent, */ protected List getPropertyKeys(Connector bean) throws IntrospectionException { - ArrayList propertyKeys = new ArrayList<>(); + List propertyKeys = new ArrayList<>(); // Acquire the list of properties for this bean ProtocolHandler protocolHandler = bean.getProtocolHandler(); // Acquire the list of properties for this bean @@ -277,7 +274,7 @@ public boolean isPrintValue(Object bean, Object bean2, String attrName, boolean isPrint = super.isPrintValue(bean, bean2, attrName, desc); if (isPrint) { if ("jkHome".equals(attrName)) { - Connector connector = ((Connector) bean); + Connector connector = (Connector) bean; File catalinaBase = getCatalinaBase(); File jkHomeBase = getJkHomeBase((String) connector .getProperty("jkHome"), catalinaBase); @@ -295,7 +292,7 @@ protected File getCatalinaBase() { file = file.getCanonicalFile(); } catch (IOException e) { } - return (file); + return file; } protected File getJkHomeBase(String jkHome, File appBase) { @@ -309,7 +306,7 @@ protected File getJkHomeBase(String jkHome, File appBase) { } catch (IOException e) { jkHomeBase = file; } - return (jkHomeBase); + return jkHomeBase; } } \ No newline at end of file diff --git a/core/src/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java b/core/src/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java index 61ead84..81c15d4 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/SSLHostConfigSF.java @@ -21,6 +21,7 @@ import org.apache.tomcat.util.net.SSLHostConfig; import org.apache.tomcat.util.net.SSLHostConfigCertificate; +import org.apache.tomcat.util.net.openssl.OpenSSLConf; /** * Store SSLHostConfig @@ -39,7 +40,10 @@ public void storeChildren(PrintWriter aWriter, int indent, Object aSSLHostConfig // Store nested elements SSLHostConfigCertificate[] hostConfigsCertificates = sslHostConfig.getCertificates().toArray(new SSLHostConfigCertificate[0]); storeElementArray(aWriter, indent, hostConfigsCertificates); + // Store nested element + OpenSSLConf openSslConf = sslHostConfig.getOpenSslConf(); + storeElement(aWriter, indent, openSslConf); } } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StandardContextSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardContextSF.java index a6c5881..fa64e6d 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StandardContextSF.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StandardContextSF.java @@ -225,7 +225,7 @@ public void storeChildren(PrintWriter aWriter, int indent, Object aContext, StandardContext context = (StandardContext) aContext; // Store nested elements LifecycleListener listeners[] = context.findLifecycleListeners(); - ArrayList listenersArray = new ArrayList<>(); + List listenersArray = new ArrayList<>(); for (LifecycleListener listener : listeners) { if (!(listener instanceof ThreadLocalLeakPreventionListener)) { listenersArray.add(listener); @@ -320,7 +320,7 @@ protected File configBase(Context context) { log.error(e); } } - return (file); + return file; } diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java index 2316ffa..290e623 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StandardEngineSF.java @@ -23,7 +23,6 @@ import org.apache.catalina.Cluster; import org.apache.catalina.Container; -import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleListener; import org.apache.catalina.Realm; import org.apache.catalina.Valve; @@ -54,8 +53,7 @@ public void storeChildren(PrintWriter aWriter, int indent, Object aEngine, if (aEngine instanceof StandardEngine) { StandardEngine engine = (StandardEngine) aEngine; // Store nested elements - LifecycleListener listeners[] = ((Lifecycle) engine) - .findLifecycleListeners(); + LifecycleListener listeners[] = engine.findLifecycleListeners(); storeElementArray(aWriter, indent, listeners); // Store nested element diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StandardHostSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardHostSF.java index 19d3e10..31368bf 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StandardHostSF.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StandardHostSF.java @@ -23,7 +23,6 @@ import org.apache.catalina.Cluster; import org.apache.catalina.Container; -import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleListener; import org.apache.catalina.Realm; import org.apache.catalina.Valve; @@ -55,8 +54,7 @@ public void storeChildren(PrintWriter aWriter, int indent, Object aHost, if (aHost instanceof StandardHost) { StandardHost host = (StandardHost) aHost; // Store nested elements - LifecycleListener listeners[] = ((Lifecycle) host) - .findLifecycleListeners(); + LifecycleListener listeners[] = host.findLifecycleListeners(); storeElementArray(aWriter, indent, listeners); // Store nested elements diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StandardServerSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardServerSF.java index 1f2665c..6902370 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StandardServerSF.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StandardServerSF.java @@ -19,7 +19,6 @@ import java.io.PrintWriter; -import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleListener; import org.apache.catalina.Service; import org.apache.catalina.core.StandardServer; @@ -68,8 +67,7 @@ public void storeChildren(PrintWriter aWriter, int indent, Object aObject, if (aObject instanceof StandardServer) { StandardServer server = (StandardServer) aObject; // Store nested elements - LifecycleListener listeners[] = ((Lifecycle) server) - .findLifecycleListeners(); + LifecycleListener listeners[] = server.findLifecycleListeners(); storeElementArray(aWriter, indent, listeners); /*LifecycleListener listener = null; for (int i = 0; listener == null && i < listeners.length; i++) diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java b/core/src/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java index 67b6e44..32e7779 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StandardServiceSF.java @@ -21,7 +21,6 @@ import org.apache.catalina.Engine; import org.apache.catalina.Executor; -import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleListener; import org.apache.catalina.connector.Connector; import org.apache.catalina.core.StandardService; @@ -46,8 +45,7 @@ public void storeChildren(PrintWriter aWriter, int indent, Object aService, if (aService instanceof StandardService) { StandardService service = (StandardService) aService; // Store nested elements - LifecycleListener listeners[] = ((Lifecycle) service) - .findLifecycleListeners(); + LifecycleListener listeners[] = service.findLifecycleListeners(); storeElementArray(aWriter, indent, listeners); // Store nested elements diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StoreAppender.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreAppender.java index 776de6f..e4fdc8b 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StoreAppender.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StoreAppender.java @@ -26,6 +26,7 @@ import org.apache.tomcat.util.IntrospectionUtils; import org.apache.tomcat.util.descriptor.web.ResourceBase; +import org.apache.tomcat.util.security.Escape; /** * StoreAppends generate really the xml tag elements @@ -106,7 +107,7 @@ public void printTagContent(PrintWriter aWriter, String tag, String content) aWriter.print("<"); aWriter.print(tag); aWriter.print(">"); - aWriter.print(convertStr(content)); + aWriter.print(Escape.xml(content)); aWriter.print(""); @@ -318,12 +319,10 @@ public boolean isPrintValue(Object bean, Object bean2, String attrName, * * @param bean The bean * @return an object from same class as bean parameter - * @throws InstantiationException Error creating a new instance - * @throws IllegalAccessException Another error occurred + * @throws ReflectiveOperationException Error creating a new instance */ - public Object defaultInstance(Object bean) throws InstantiationException, - IllegalAccessException { - return bean.getClass().newInstance(); + public Object defaultInstance(Object bean) throws ReflectiveOperationException { + return bean.getClass().getConstructor().newInstance(); } /** @@ -343,7 +342,7 @@ public void printValue(PrintWriter writer, int indent, String name, if (!(value instanceof String)) { value = value.toString(); } - String strValue = convertStr((String) value); + String strValue = Escape.xml((String) value); pos = pos + name.length() + strValue.length(); if (pos > 60) { writer.println(); @@ -357,34 +356,6 @@ public void printValue(PrintWriter writer, int indent, String name, writer.print("\""); } - /** - * Given a string, this method replaces all occurrences of '<', '>', - * '&', and '"'. - * @param input The string to escape - * @return the escaped string - */ - public String convertStr(String input) { - - StringBuffer filtered = new StringBuffer(input.length()); - char c; - for (int i = 0; i < input.length(); i++) { - c = input.charAt(i); - if (c == '<') { - filtered.append("<"); - } else if (c == '>') { - filtered.append(">"); - } else if (c == '\'') { - filtered.append("'"); - } else if (c == '"') { - filtered.append("""); - } else if (c == '&') { - filtered.append("&"); - } else { - filtered.append(c); - } - } - return (filtered.toString()); - } /** * Is the specified property type one for which we should generate a diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java index 741608c..930fc40 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StoreConfigLifecycleListener.java @@ -84,7 +84,7 @@ protected void createMBean(Server server) { try { Class clazz = Class.forName(getStoreConfigClass(), true, this .getClass().getClassLoader()); - storeConfig = (IStoreConfig) clazz.newInstance(); + storeConfig = (IStoreConfig) clazz.getConstructor().newInstance(); if (null == getStoreRegistry()) // default Loading loader.load(); diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java index b484727..b8a1b03 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StoreContextAppender.java @@ -93,12 +93,11 @@ protected File getAppBase(StandardHost host) { } catch (IOException e) { appBase = file; } - return (appBase); + return appBase; } protected File getDocBase(StandardContext context, File appBase) { - File docBase; String contextDocBase = context.getOriginalDocBase() ; if(contextDocBase == null) @@ -111,8 +110,7 @@ protected File getDocBase(StandardContext context, File appBase) { } catch (IOException e) { docBase = file; } - return (docBase); - + return docBase; } /** @@ -154,8 +152,7 @@ protected String getDefaultWorkDir(StandardContext context) { * @see org.apache.catalina.storeconfig.StoreAppender#defaultInstance(java.lang.Object) */ @Override - public Object defaultInstance(Object bean) throws InstantiationException, - IllegalAccessException { + public Object defaultInstance(Object bean) throws ReflectiveOperationException { if (bean instanceof StandardContext) { StandardContext defaultContext = new StandardContext(); /* diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java index 588ccdd..ada8528 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryBase.java @@ -52,9 +52,7 @@ public class StoreFactoryBase implements IStoreFactory { * <description>/<version>. */ public String getInfo() { - - return (info); - + return info; } /** diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java index d0016b5..69d8d4d 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StoreFactoryRule.java @@ -107,13 +107,10 @@ public void begin(String namespace, String name, Attributes attributes) * @param defaultName Default Class * @param attributes current digester attribute elements * @return new configured object instance - * @throws ClassNotFoundException Class was not found - * @throws InstantiationException Error creating an instance - * @throws IllegalAccessException Security exception + * @throws ReflectiveOperationException Error creating an instance */ protected Object newInstance(String attr, String defaultName, - Attributes attributes) throws ClassNotFoundException, - InstantiationException, IllegalAccessException { + Attributes attributes) throws ReflectiveOperationException { String className = defaultName; if (attr != null) { String value = attributes.getValue(attr); @@ -121,6 +118,6 @@ protected Object newInstance(String attr, String defaultName, className = value; } Class clazz = Class.forName(className); - return clazz.newInstance(); + return clazz.getConstructor().newInstance(); } } \ No newline at end of file diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StoreFileMover.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreFileMover.java index 99a5c24..faefca7 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StoreFileMover.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StoreFileMover.java @@ -140,7 +140,9 @@ public void init() { configNew = new File(getBasename(), configFile + ".new"); } if (!configNew.getParentFile().exists()) { - configNew.getParentFile().mkdirs(); + if (!configNew.getParentFile().mkdirs()) { + throw new IllegalStateException("Cannot create directory " + configNew); + } } String sb = getTimeTag(); configSave = new File(configFile + sb); diff --git a/core/src/main/java/org/apache/catalina/storeconfig/StoreLoader.java b/core/src/main/java/org/apache/catalina/storeconfig/StoreLoader.java index 48cd059..1bf1546 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/StoreLoader.java +++ b/core/src/main/java/org/apache/catalina/storeconfig/StoreLoader.java @@ -135,7 +135,7 @@ protected static Digester createDigester() { long t2 = System.currentTimeMillis(); if (log.isDebugEnabled()) log.debug("Digester for server-registry.xml created " + (t2 - t1)); - return (digester); + return digester; } @@ -159,7 +159,7 @@ protected File serverFile(String aFile) { } catch (IOException e) { log.error(e); } - return (file); + return file; } /** diff --git a/core/src/main/java/org/apache/catalina/storeconfig/server-registry.xml b/core/src/main/java/org/apache/catalina/storeconfig/server-registry.xml index bac0dea..8451e5c 100644 --- a/core/src/main/java/org/apache/catalina/storeconfig/server-registry.xml +++ b/core/src/main/java/org/apache/catalina/storeconfig/server-registry.xml @@ -119,6 +119,7 @@ children="true" storeFactoryClass="org.apache.catalina.storeconfig.SSLHostConfigSF"> openSslContext + openSslConfContext + + + + @@ -369,4 +373,88 @@ public interface Channel { */ public void setName(String name); + /** + * Translates the name of an option to its integer value. Valid option names are "asynchronous" (alias "async"), + * "byte_message" (alias "byte"), "multicast", "secure", "synchronized_ack" (alias "sync"), "udp", "use_ack" + * @param opt The name of the option + * @return the int value of the passed option name + */ + public static int getSendOptionValue(String opt){ + + switch (opt){ + + case "asynchronous": + case "async": + return SEND_OPTIONS_ASYNCHRONOUS; + + case "byte_message": + case "byte": + return SEND_OPTIONS_BYTE_MESSAGE; + + case "multicast": + return SEND_OPTIONS_MULTICAST; + + case "secure": + return SEND_OPTIONS_SECURE; + + case "synchronized_ack": + case "sync": + return SEND_OPTIONS_SYNCHRONIZED_ACK; + + case "udp": + return SEND_OPTIONS_UDP; + + case "use_ack": + return SEND_OPTIONS_USE_ACK; + } + + throw new IllegalArgumentException(String.format("[%s] is not a valid option", opt)); + } + + /** + * Translates a comma separated list of option names to their bitwise-ORd value + * @param input A comma separated list of options, e.g. "async, multicast" + * @return a bitwise ORd value of the passed option names + */ + public static int parseSendOptions(String input){ + + try { + return Integer.parseInt(input); + } catch (NumberFormatException nfe){ + final Log log = LogFactory.getLog(Channel.class); + log.trace(String.format("Failed to parse [%s] as integer, channelSendOptions possibly set by name(s)", input)); + } + + String[] options = input.split("\\s*,\\s*"); + + int result = 0; + for (String opt : options) { + result |= getSendOptionValue(opt); + } + + return result; + } + + /** + * Translates an integer value of SendOptions to its human-friendly comma separated value list for use in JMX and such. + * @param input the int value of SendOptions + * @return the human-friendly string representation in a reverse order (i.e. the last option will be shown first) + */ + public static String getSendOptionsAsString(int input){ + + // allOptionNames must be in order of the bits of the available options + final String[] allOptionNames = new String[]{ "byte", "use_ack", "sync", "async", "secure", "udp", "multicast" }; + + StringJoiner names = new StringJoiner(", "); + for (int bit=allOptionNames.length - 1; bit >= 0; bit--){ + + // if the bit is set then add the name to the result + if (((1 << bit) & input) > 0){ + names.add(allOptionNames[bit]); + } + } + + return names.toString(); + } + } diff --git a/core/src/main/java/org/apache/catalina/tribes/ChannelMessage.java b/core/src/main/java/org/apache/catalina/tribes/ChannelMessage.java index 8ee41b3..ab7200f 100644 --- a/core/src/main/java/org/apache/catalina/tribes/ChannelMessage.java +++ b/core/src/main/java/org/apache/catalina/tribes/ChannelMessage.java @@ -26,7 +26,7 @@ * interceptor and eventually down to the ChannelSender component * */ -public interface ChannelMessage extends Serializable { +public interface ChannelMessage extends Serializable, Cloneable { /** diff --git a/core/src/main/java/org/apache/catalina/tribes/Member.java b/core/src/main/java/org/apache/catalina/tribes/Member.java index 11484eb..638abf8 100644 --- a/core/src/main/java/org/apache/catalina/tribes/Member.java +++ b/core/src/main/java/org/apache/catalina/tribes/Member.java @@ -17,6 +17,8 @@ package org.apache.catalina.tribes; +import java.io.Serializable; + /** * The Member interface, defines a member in the group. * Each member can carry a set of properties, defined by the actual implementation.
    @@ -27,7 +29,7 @@ * since a member that has crashed and the starts up again on the same port/host is * not guaranteed to be the same member, so no state transfers will ever be confused */ -public interface Member { +public interface Member extends Serializable { /** * When a member leaves the cluster, the payload of the memberDisappeared member diff --git a/core/src/main/java/org/apache/catalina/tribes/group/GroupChannel.java b/core/src/main/java/org/apache/catalina/tribes/group/GroupChannel.java index 866c261..95164f5 100644 --- a/core/src/main/java/org/apache/catalina/tribes/group/GroupChannel.java +++ b/core/src/main/java/org/apache/catalina/tribes/group/GroupChannel.java @@ -186,17 +186,13 @@ public void addInterceptor(ChannelInterceptor interceptor) { @Override public void heartbeat() { super.heartbeat(); - Iterator membershipListenerIterator = membershipListeners.iterator(); - while ( membershipListenerIterator.hasNext() ) { - MembershipListener listener = membershipListenerIterator.next(); + for (MembershipListener listener : membershipListeners) { if ( listener instanceof Heartbeat ) ((Heartbeat)listener).heartbeat(); } - Iterator channelListenerIterator = channelListeners.iterator(); - while ( channelListenerIterator.hasNext() ) { - ChannelListener listener = channelListenerIterator.next(); + + for (ChannelListener listener : channelListeners) { if ( listener instanceof Heartbeat ) ((Heartbeat)listener).heartbeat(); } - } diff --git a/core/src/main/java/org/apache/catalina/tribes/group/RpcChannel.java b/core/src/main/java/org/apache/catalina/tribes/group/RpcChannel.java index 9798f40..79d2d5b 100644 --- a/core/src/main/java/org/apache/catalina/tribes/group/RpcChannel.java +++ b/core/src/main/java/org/apache/catalina/tribes/group/RpcChannel.java @@ -19,7 +19,8 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import org.apache.catalina.tribes.Channel; import org.apache.catalina.tribes.ChannelException; @@ -49,7 +50,7 @@ public class RpcChannel implements ChannelListener { private byte[] rpcId; private int replyMessageOptions = 0; - private final HashMap responseMap = new HashMap<>(); + private final ConcurrentMap responseMap = new ConcurrentHashMap<>(); /** * Create an RPC channel. You can have several RPC channels attached to a group diff --git a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java index 21c75e0..89dddad 100644 --- a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java +++ b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptor.java @@ -20,6 +20,8 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -36,38 +38,108 @@ /** * @version 1.0 */ -public class GzipInterceptor extends ChannelInterceptorBase { +public class GzipInterceptor extends ChannelInterceptorBase implements GzipInterceptorMBean { private static final Log log = LogFactory.getLog(GzipInterceptor.class); protected static final StringManager sm = StringManager.getManager(GzipInterceptor.class); public static final int DEFAULT_BUFFER_SIZE = 2048; + public static final int DEFAULT_OPTION_COMPRESSION_ENABLE = 0x0100; + + private int compressionMinSize = 0; + private volatile boolean statsEnabled = false; + private int interval = 0; + + // Stats + private final AtomicInteger count = new AtomicInteger(); + private final AtomicInteger countCompressedTX = new AtomicInteger(); + private final AtomicInteger countUncompressedTX = new AtomicInteger(); + private final AtomicInteger countCompressedRX = new AtomicInteger(); + private final AtomicInteger countUncompressedRX = new AtomicInteger(); + private final AtomicLong sizeTX = new AtomicLong(); + private final AtomicLong compressedSizeTX = new AtomicLong(); + private final AtomicLong uncompressedSizeTX = new AtomicLong(); + private final AtomicLong sizeRX = new AtomicLong(); + private final AtomicLong compressedSizeRX = new AtomicLong(); + private final AtomicLong uncompressedSizeRX = new AtomicLong(); + + + public GzipInterceptor() { + setOptionFlag(DEFAULT_OPTION_COMPRESSION_ENABLE); + } + @Override - public void sendMessage(Member[] destination, ChannelMessage msg, InterceptorPayload payload) throws ChannelException { + public void sendMessage(Member[] destination, ChannelMessage msg, InterceptorPayload payload) + throws ChannelException { try { - byte[] data = compress(msg.getMessage().getBytes()); + byte[] data = msg.getMessage().getBytes(); + if (statsEnabled) { + sizeTX.addAndGet(data.length); + } + + if (data.length > compressionMinSize) { + data = compress(data); + // Set the flag that indicates that the message is compressed + msg.setOptions(msg.getOptions() | getOptionFlag()); + if (statsEnabled) { + countCompressedTX.incrementAndGet(); + compressedSizeTX.addAndGet(data.length); + } + } else if (statsEnabled){ + countUncompressedTX.incrementAndGet(); + uncompressedSizeTX.addAndGet(data.length); + } + msg.getMessage().trim(msg.getMessage().getLength()); msg.getMessage().append(data,0,data.length); super.sendMessage(destination, msg, payload); + + int currentCount = count.incrementAndGet(); + if (statsEnabled && interval > 0 && currentCount % interval == 0) { + report(); + } } catch ( IOException x ) { log.error(sm.getString("gzipInterceptor.compress.failed")); throw new ChannelException(x); } } + @Override public void messageReceived(ChannelMessage msg) { try { - byte[] data = decompress(msg.getMessage().getBytes()); + byte[] data = msg.getMessage().getBytes(); + if ((msg.getOptions() & getOptionFlag()) > 0) { + if (statsEnabled) { + countCompressedRX.incrementAndGet(); + compressedSizeRX.addAndGet(data.length); + } + // Message was compressed + data = decompress(data); + } else if (statsEnabled) { + countUncompressedRX.incrementAndGet(); + uncompressedSizeRX.addAndGet(data.length); + } + + if (statsEnabled) { + sizeRX.addAndGet(data.length); + } + msg.getMessage().trim(msg.getMessage().getLength()); msg.getMessage().append(data,0,data.length); super.messageReceived(msg); + + int currentCount = count.incrementAndGet(); + if (statsEnabled && interval > 0 && currentCount % interval == 0) { + report(); + } } catch ( IOException x ) { log.error(sm.getString("gzipInterceptor.decompress.failed"),x); } } + public static byte[] compress(byte[] data) throws IOException { ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gout = new GZIPOutputStream(bout); @@ -77,6 +149,7 @@ public static byte[] compress(byte[] data) throws IOException { return bout.toByteArray(); } + /** * @param data Data to decompress * @return Decompressed data @@ -95,4 +168,134 @@ public static byte[] decompress(byte[] data) throws IOException { } return bout.toByteArray(); } + + + @Override + public void report() { + log.info(sm.getString("gzipInterceptor.report", Integer.valueOf(getCount()), + Integer.valueOf(getCountCompressedTX()), Integer.valueOf(getCountUncompressedTX()), + Integer.valueOf(getCountCompressedRX()), Integer.valueOf(getCountUncompressedRX()), + Long.valueOf(getSizeTX()), Long.valueOf(getCompressedSizeTX()), + Long.valueOf(getUncompressedSizeTX()), + Long.valueOf(getSizeRX()), Long.valueOf(getCompressedSizeRX()), + Long.valueOf(getUncompressedSizeRX()))); + } + + + @Override + public int getCompressionMinSize() { + return compressionMinSize; + } + + + @Override + public void setCompressionMinSize(int compressionMinSize) { + this.compressionMinSize = compressionMinSize; + } + + + @Override + public boolean getStatsEnabled() { + return statsEnabled; + } + + + @Override + public void setStatsEnabled(boolean statsEnabled) { + this.statsEnabled = statsEnabled; + } + + + @Override + public int getInterval() { + return interval; + } + + + @Override + public void setInterval(int interval) { + this.interval = interval; + } + + + @Override + public int getCount() { + return count.get(); + } + + + @Override + public int getCountCompressedTX() { + return countCompressedTX.get(); + } + + + @Override + public int getCountUncompressedTX() { + return countUncompressedTX.get(); + } + + + @Override + public int getCountCompressedRX() { + return countCompressedRX.get(); + } + + + @Override + public int getCountUncompressedRX() { + return countUncompressedRX.get(); + } + + + @Override + public long getSizeTX() { + return sizeTX.get(); + } + + + @Override + public long getCompressedSizeTX() { + return compressedSizeTX.get(); + } + + + @Override + public long getUncompressedSizeTX() { + return uncompressedSizeTX.get(); + } + + + @Override + public long getSizeRX() { + return sizeRX.get(); + } + + + @Override + public long getCompressedSizeRX() { + return compressedSizeRX.get(); + } + + + @Override + public long getUncompressedSizeRX() { + return uncompressedSizeRX.get(); + } + + + @Override + public void reset() { + count.set(0); + countCompressedTX.set(0); + countUncompressedTX.set(0); + countCompressedRX.set(0); + countUncompressedRX.set(0); + sizeTX.set(0); + compressedSizeTX.set(0); + uncompressedSizeTX.set(0); + sizeRX.set(0); + compressedSizeRX.set(0); + uncompressedSizeRX.set(0); + } } diff --git a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptorMBean.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptorMBean.java new file mode 100644 index 0000000..d0287ef --- /dev/null +++ b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/GzipInterceptorMBean.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 org.apache.catalina.tribes.group.interceptors; + +public interface GzipInterceptorMBean { + + // Config + public int getOptionFlag(); + public void setOptionFlag(int optionFlag); + + /** + * @return the minimum payload size for compression to be enabled. + */ + public int getCompressionMinSize(); + /** + * Set the minimum payload size for compression to be enabled. A value of + * zero or less means compression will always be used. If not explicitly + * configured, a default of zero will be used. + * + * @param compressionMinSize The new minimum payload size + */ + public void setCompressionMinSize(int compressionMinSize); + + /** + * @return {@code true} if the interceptor is configured to collect + * statistics, otherwise {@code false} + */ + public boolean getStatsEnabled(); + /** + * Configure whether the interceptor collects statistics. + * + * @param statsEnabled {@code true} to enable statistics collections, + * otherwise {@code false} + */ + public void setStatsEnabled(boolean statsEnabled); + + /** + * @return If statistics collection is enabled, the number of messages + * between statistics reports being written to the log. + */ + public int getInterval(); + /** + * If statistics collection is enabled, set the number of messages between + * statistics reports being written to the log. A value of zero or less + * means no statistics reports are written. + * + * @param interval The new interval between reports + */ + public void setInterval(int interval); + + // Stats + public int getCount(); + public int getCountCompressedTX(); + public int getCountUncompressedTX(); + public int getCountCompressedRX(); + public int getCountUncompressedRX(); + public long getSizeTX(); + public long getCompressedSizeTX(); + public long getUncompressedSizeTX(); + public long getSizeRX(); + public long getCompressedSizeRX(); + public long getUncompressedSizeRX(); + public void reset(); + public void report(); +} diff --git a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties index a0bd085..8d47233 100644 --- a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/LocalStrings.properties @@ -19,6 +19,19 @@ fragmentationInterceptor.heartbeat.failed=Unable to perform heartbeat clean up i fragmentationInterceptor.fragments.missing=Fragments are missing. gzipInterceptor.compress.failed=Unable to compress byte contents gzipInterceptor.decompress.failed=Unable to decompress byte contents +gzipInterceptor.report=GZip Interceptor Report[\ + \n\tTotal Messages: {0}\ + \n\tTx Messages Compressed: {1}\ + \n\tTx Messages Uncompressed: {2}\ + \n\tRx Messages Compressed: {3}\ + \n\tRx Messages Uncompressed: {4}\ + \n\tTotal Tx bytes: {5}\ + \n\tCompressed Tx bytes: {6}\ + \n\tUncompressed Tx bytes: {7}\ + \n\tTotal Rx bytes: {8}\ + \n\tCompressed Rx bytes: {9}\ + \n\tUncompressed Rx bytes: {10}\ + \n] messageDispatchInterceptor.queue.full=Asynchronous queue is full, reached its limit of [{0}] bytes, current:[{1}] bytes. messageDispatchInterceptor.unableAdd.queue=Unable to add the message to the async queue, queue bug? messageDispatchInterceptor.warning.optionflag=Warning, you are overriding the asynchronous option flag, this will disable the Channel.SEND_OPTIONS_ASYNCHRONOUS that other apps might use. @@ -45,7 +58,7 @@ tcpFailureDetector.heartbeat.failed=Unable to perform heartbeat on the TcpFailur tcpFailureDetector.performBasicCheck.memberAdded=Member added, even though we weren''t notified:[{0}] tcpFailureDetector.suspectMember.dead=Suspect member, confirmed dead.[{0}] tcpFailureDetector.suspectMember.alive=Suspect member, confirmed alive.[{0}] -tcpFailureDetector.failureDetection.failed=Unable to perform failure detection check, assuming member down. +tcpFailureDetector.failureDetection.failed=Unable to perform failure detection check, assuming member down.[{0}] tcpPingInterceptor.ping.failed=Unable to send TCP ping. tcpPingInterceptor.pingFailed.pingThread=Unable to send ping from TCP ping thread. throughputInterceptor.report=ThroughputInterceptor Report[\ @@ -54,7 +67,7 @@ throughputInterceptor.report=ThroughputInterceptor Report[\ \n\tSent:{2} MB (application)\ \n\tTime:{3} seconds\ \n\tTx Speed:{4} MB/sec (total)\ - \n\tTxSpeed:{5} MB/sec (application)\ + \n\tTx Speed:{5} MB/sec (application)\ \n\tError Msg:{6}\ \n\tRx Msg:{7} messages\ \n\tRx Speed:{8} MB/sec (since 1st msg)\ diff --git a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java index a91ee24..ed9dfb9 100644 --- a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java +++ b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/OrderInterceptor.java @@ -18,6 +18,7 @@ package org.apache.catalina.tribes.group.interceptors; import java.util.HashMap; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -55,9 +56,9 @@ */ public class OrderInterceptor extends ChannelInterceptorBase { protected static final StringManager sm = StringManager.getManager(OrderInterceptor.class); - private final HashMap outcounter = new HashMap<>(); - private final HashMap incounter = new HashMap<>(); - private final HashMap incoming = new HashMap<>(); + private final Map outcounter = new HashMap<>(); + private final Map incounter = new HashMap<>(); + private final Map incoming = new HashMap<>(); private long expire = 3000; private boolean forwardExpired = true; private int maxQueue = Integer.MAX_VALUE; diff --git a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java index 51b1e0d..d805fe7 100644 --- a/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java +++ b/core/src/main/java/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java @@ -356,7 +356,7 @@ protected boolean memberAlive(Member mbr, byte[] msgData, } catch (ConnectException cx) { //do nothing, we couldn't connect } catch (Exception x) { - log.error(sm.getString("tcpFailureDetector.failureDetection.failed"),x); + log.error(sm.getString("tcpFailureDetector.failureDetection.failed", mbr),x); } return false; } diff --git a/core/src/main/java/org/apache/catalina/tribes/io/ChannelData.java b/core/src/main/java/org/apache/catalina/tribes/io/ChannelData.java index 885c696..53588fe 100644 --- a/core/src/main/java/org/apache/catalina/tribes/io/ChannelData.java +++ b/core/src/main/java/org/apache/catalina/tribes/io/ChannelData.java @@ -302,15 +302,17 @@ public boolean equals(Object o) { * @return ClusterData */ @Override - public Object clone() { -// byte[] d = this.getDataPackage(); -// return ClusterData.getDataFromPackage(d); - ChannelData clone = new ChannelData(false); - clone.options = this.options; - clone.message = new XByteBuffer(this.message.getBytesDirect(),false); - clone.timestamp = this.timestamp; - clone.uniqueId = this.uniqueId; - clone.address = this.address; + public ChannelData clone() { + ChannelData clone; + try { + clone = (ChannelData) super.clone(); + } catch (CloneNotSupportedException e) { + // Cannot happen + throw new AssertionError(); + } + if (this.message != null) { + clone.message = new XByteBuffer(this.message.getBytesDirect(),false); + } return clone; } diff --git a/core/src/main/java/org/apache/catalina/tribes/io/ReplicationStream.java b/core/src/main/java/org/apache/catalina/tribes/io/ReplicationStream.java index acf80ff..dfcd08a 100644 --- a/core/src/main/java/org/apache/catalina/tribes/io/ReplicationStream.java +++ b/core/src/main/java/org/apache/catalina/tribes/io/ReplicationStream.java @@ -132,8 +132,10 @@ protected Class resolveProxyClass(String[] interfaces) classObjs[i] = cl; } try { - return Proxy.getProxyClass(hasNonPublicInterface ? nonPublicLoader + // @SuppressWarnings("deprecation") Java 9 + Class proxyClass = Proxy.getProxyClass(hasNonPublicInterface ? nonPublicLoader : latestLoader, classObjs); + return proxyClass; } catch (IllegalArgumentException e) { throw new ClassNotFoundException(null, e); } diff --git a/core/src/main/java/org/apache/catalina/tribes/io/XByteBuffer.java b/core/src/main/java/org/apache/catalina/tribes/io/XByteBuffer.java index 7f86682..08c1a21 100644 --- a/core/src/main/java/org/apache/catalina/tribes/io/XByteBuffer.java +++ b/core/src/main/java/org/apache/catalina/tribes/io/XByteBuffer.java @@ -47,7 +47,9 @@ *

  • END_DATA - 7 bytes - TLF2003
  • * */ -public class XByteBuffer { +public class XByteBuffer implements Serializable { + + private static final long serialVersionUID = 1L; private static final Log log = LogFactory.getLog(XByteBuffer.class); protected static final StringManager sm = StringManager.getManager(XByteBuffer.class); diff --git a/core/src/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java b/core/src/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java index 0233368..b4d4565 100644 --- a/core/src/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java +++ b/core/src/main/java/org/apache/catalina/tribes/jmx/JmxRegistry.java @@ -60,7 +60,10 @@ public static JmxRegistry getRegistry(Channel channel) { // create registry registry = new JmxRegistry(); registry.baseOname = baseOn; - registryCache.putIfAbsent(channel.getName(), registry); + // It doesn't matter if existing object gets over-written. This object + // holds minimal state and that state will be the same for all objects + // created for the same channel. + registryCache.put(channel.getName(), registry); return registry; } diff --git a/core/src/main/java/org/apache/catalina/tribes/membership/Membership.java b/core/src/main/java/org/apache/catalina/tribes/membership/Membership.java index c696834..00775c9 100644 --- a/core/src/main/java/org/apache/catalina/tribes/membership/Membership.java +++ b/core/src/main/java/org/apache/catalina/tribes/membership/Membership.java @@ -21,7 +21,6 @@ import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; -import java.util.Iterator; import org.apache.catalina.tribes.Member; @@ -37,7 +36,8 @@ public class Membership implements Cloneable { protected static final Member[] EMPTY_MEMBERS = new Member[0]; - private final Object membersLock = new Object(); + // Non-final to support clone() + private Object membersLock = new Object(); /** * The local member. @@ -60,13 +60,29 @@ public class Membership implements Cloneable { protected final Comparator memberComparator; @Override - public Object clone() { + public Membership clone() { synchronized (membersLock) { - Membership clone = new Membership(local, memberComparator); + Membership clone; + try { + clone = (Membership) super.clone(); + } catch (CloneNotSupportedException e) { + // Can't happen + throw new AssertionError(); + } + + // Standard clone() method will copy the map object. Replace that + // with a new map but with the same contents. @SuppressWarnings("unchecked") final HashMap tmpclone = (HashMap) map.clone(); clone.map = tmpclone; + + // Standard clone() method will copy the array obejct. Replace that + // with a new array but with the same contents. clone.members = members.clone(); + + // Standard clone() method will copy the lock object. Replace that + // with a new object. + clone.membersLock = new Object(); return clone; } } @@ -209,9 +225,7 @@ public Member[] expire(long maxtime) { } ArrayList list = null; - Iterator i = map.values().iterator(); - while (i.hasNext()) { - MbrEntry entry = i.next(); + for (MbrEntry entry : map.values()) { if (entry.hasExpired(maxtime)) { if (list == null) { // Only need a list when members are expired (smaller gc) diff --git a/core/src/main/java/org/apache/catalina/tribes/package.html b/core/src/main/java/org/apache/catalina/tribes/package.html index 8a726c4..56529ef 100644 --- a/core/src/main/java/org/apache/catalina/tribes/package.html +++ b/core/src/main/java/org/apache/catalina/tribes/package.html @@ -14,8 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. --> + +Apache Tribes - The Tomcat Cluster Communication Module + -Apache Tribes - The Tomcat Cluster Communication Module

    QuickStart

    
                 //create a channel
    diff --git a/core/src/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java b/core/src/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
    index 0529bb6..b1f9281 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
    @@ -26,6 +26,7 @@
     import java.util.HashMap;
     import java.util.Iterator;
     import java.util.LinkedHashSet;
    +import java.util.List;
     import java.util.Map;
     import java.util.Objects;
     import java.util.Set;
    @@ -279,13 +280,23 @@ protected void ping(long timeout) throws ChannelException {
                         MapMessage mapMsg = (MapMessage)resp[i].getMessage();
                         try {
                             mapMsg.deserialize(getExternalLoaders());
    +                        Member member = resp[i].getSource();
                             State state = (State) mapMsg.getValue();
                             if (state.isAvailable()) {
    -                            memberAlive(resp[i].getSource());
    +                            memberAlive(member);
    +                        } else if (state == State.STATETRANSFERRED) {
    +                            synchronized (mapMembers) {
    +                                if (log.isInfoEnabled())
    +                                    log.info(sm.getString("abstractReplicatedMap.ping.stateTransferredMember",
    +                                            member));
    +                                if (mapMembers.containsKey(member) ) {
    +                                    mapMembers.put(member, Long.valueOf(System.currentTimeMillis()));
    +                                }
    +                            }
                             } else {
                                 if (log.isInfoEnabled())
                                     log.info(sm.getString("abstractReplicatedMap.mapMember.unavailable",
    -                                        resp[i].getSource()));
    +                                        member));
                             }
                         } catch (ClassNotFoundException | IOException e) {
                             log.error(sm.getString("abstractReplicatedMap.unable.deserialize.MapMessage"), e);
    @@ -501,18 +512,15 @@ public void replicate(Object key, boolean complete) {
          * @param complete boolean
          */
         public void replicate(boolean complete) {
    -        Iterator>> i = innerMap.entrySet().iterator();
    -        while (i.hasNext()) {
    -            Map.Entry e = i.next();
    +        for (Entry> e : innerMap.entrySet()) {
                 replicate(e.getKey(), complete);
    -        } //while
    -
    +        }
         }
     
         public void transferState() {
             try {
                 Member[] members = getMapMembers();
    -            Member backup = members.length > 0 ? (Member) members[0] : null;
    +            Member backup = members.length > 0 ? members[0] : null;
                 if (backup != null) {
                     MapMessage msg = new MapMessage(mapContextName, getStateMessageType(), false,
                                                     null, null, null, null, null);
    @@ -538,6 +546,7 @@ public void transferState() {
             } catch (ClassNotFoundException x) {
                 log.error(sm.getString("abstractReplicatedMap.unable.transferState"), x);
             }
    +        this.state = State.STATETRANSFERRED;
         }
     
         /**
    @@ -574,9 +583,7 @@ public Serializable replyRequest(Serializable msg, final Member sender) {
             if (mapmsg.getMsgType() == MapMessage.MSG_STATE || mapmsg.getMsgType() == MapMessage.MSG_STATE_COPY) {
                 synchronized (stateMutex) { //make sure we dont do two things at the same time
                     ArrayList list = new ArrayList<>();
    -                Iterator>> i = innerMap.entrySet().iterator();
    -                while (i.hasNext()) {
    -                    Map.Entry e = i.next();
    +                for (Entry> e : innerMap.entrySet()) {
                         MapEntry entry = innerMap.get(e.getKey());
                         if ( entry != null && entry.isSerializable() ) {
                             boolean copy = (mapmsg.getMsgType() == MapMessage.MSG_STATE_COPY);
    @@ -760,6 +767,9 @@ public void messageReceived(Serializable msg, Member sender) {
                 if (entry != null) {
                     entry.setBackupNodes(mapmsg.getBackupNodes());
                     entry.setPrimary(mapmsg.getPrimary());
    +                if (entry.getValue() instanceof ReplicatedMapEntry) {
    +                    ((ReplicatedMapEntry) entry.getValue()).accessEntry();
    +                }
                 }
             }
         }
    @@ -794,9 +804,7 @@ public void mapMemberAdded(Member member) {
             }
             if ( memberAdded ) {
                 synchronized (stateMutex) {
    -                Iterator>> i = innerMap.entrySet().iterator();
    -                while (i.hasNext()) {
    -                    Map.Entry> e = i.next();
    +                for (Entry> e : innerMap.entrySet()) {
                         MapEntry entry = innerMap.get(e.getKey());
                         if ( entry == null ) continue;
                         if (entry.isPrimary() && (entry.getBackupNodes() == null || entry.getBackupNodes().length == 0)) {
    @@ -822,7 +830,7 @@ public boolean inSet(Member m, Member[] set) {
         }
     
         public Member[] excludeFromSet(Member[] mbrs, Member[] set) {
    -        ArrayList result = new ArrayList<>();
    +        List result = new ArrayList<>();
             for (int i=0; i= size) {
                 node = 0;
    -            currentNode = 0;
    +            currentNode = 1;
             }
             return node;
         }
    @@ -1121,9 +1129,9 @@ public void clear() {
         public void clear(boolean notify) {
             if ( notify ) {
                 //only delete active keys
    -            Iterator keys = keySet().iterator();
    -            while (keys.hasNext())
    -                remove(keys.next());
    +            for (K k : keySet()) {
    +                remove(k);
    +            }
             } else {
                 innerMap.clear();
             }
    @@ -1132,20 +1140,13 @@ public void clear(boolean notify) {
         @Override
         public boolean containsValue(Object value) {
             Objects.requireNonNull(value);
    -        Iterator>> i = innerMap.entrySet().iterator();
    -        while (i.hasNext()) {
    -            Map.Entry> e = i.next();
    +        for (Entry> e : innerMap.entrySet()) {
                 MapEntry entry = innerMap.get(e.getKey());
                 if (entry!=null && entry.isActive() && value.equals(entry.getValue())) return true;
             }
             return false;
         }
     
    -    @Override
    -    public Object clone() {
    -        throw new UnsupportedOperationException(sm.getString("abstractReplicatedMap.unsupport.operation"));
    -    }
    -
         /**
          * Returns the entire contents of the map
          * Map.Entry.getValue() will return a LazyReplicatedMap.MapEntry object containing all the information
    @@ -1167,9 +1168,7 @@ public int sizeFull() {
         @Override
         public Set> entrySet() {
             LinkedHashSet> set = new LinkedHashSet<>(innerMap.size());
    -        Iterator>> i = innerMap.entrySet().iterator();
    -        while ( i.hasNext() ) {
    -            Map.Entry e = i.next();
    +        for (Entry> e : innerMap.entrySet()) {
                 Object key = e.getKey();
                 MapEntry entry = innerMap.get(key);
                 if ( entry != null && entry.isActive() ) {
    @@ -1184,9 +1183,7 @@ public Set keySet() {
             //todo implement
             //should only return keys where this is active.
             LinkedHashSet set = new LinkedHashSet<>(innerMap.size());
    -        Iterator>> i = innerMap.entrySet().iterator();
    -        while ( i.hasNext() ) {
    -            Map.Entry> e = i.next();
    +        for (Entry> e : innerMap.entrySet()) {
                 K key = e.getKey();
                 MapEntry entry = innerMap.get(key);
                 if ( entry!=null && entry.isActive() ) set.add(key);
    @@ -1219,10 +1216,8 @@ public boolean isEmpty() {
     
         @Override
         public Collection values() {
    -        ArrayList values = new ArrayList<>();
    -        Iterator>> i = innerMap.entrySet().iterator();
    -        while ( i.hasNext() ) {
    -            Map.Entry> e = i.next();
    +        List values = new ArrayList<>();
    +        for (Entry> e : innerMap.entrySet()) {
                 MapEntry entry = innerMap.get(e.getKey());
                 if (entry!=null && entry.isActive() && entry.getValue()!=null) values.add(entry.getValue());
             }
    @@ -1390,7 +1385,7 @@ public String toString() {
     //                map message to send to and from other maps
     //------------------------------------------------------------------------------
     
    -    public static class MapMessage implements Serializable {
    +    public static class MapMessage implements Serializable, Cloneable {
             private static final long serialVersionUID = 1L;
             public static final int MSG_BACKUP = 1;
             public static final int MSG_RETRIEVE_BACKUP = 2;
    @@ -1560,11 +1555,13 @@ public void setKey(Serializable key) {
              * @return Object
              */
             @Override
    -        public Object clone() {
    -            MapMessage msg = new MapMessage(this.mapId, this.msgtype, this.diff, this.key, this.value, this.diffvalue, this.primary, this.nodes);
    -            msg.keydata = this.keydata;
    -            msg.valuedata = this.valuedata;
    -            return msg;
    +        public MapMessage clone() {
    +            try {
    +                return (MapMessage) super.clone();
    +            } catch (CloneNotSupportedException e) {
    +                // Not possible
    +                throw new AssertionError();
    +            }
             }
         } //MapMessage
     
    @@ -1625,8 +1622,9 @@ public void setAccessTimeout(long accessTimeout) {
             this.accessTimeout = accessTimeout;
         }
     
    -    private static enum State {
    +    private enum State {
             NEW(false),
    +        STATETRANSFERRED(false),
             INITIALIZED(true),
             DESTROYED(false);
     
    diff --git a/core/src/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java b/core/src/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java
    index 69bd2ef..280d49e 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java
    @@ -66,7 +66,8 @@
      */
     public class LazyReplicatedMap extends AbstractReplicatedMap {
         private static final long serialVersionUID = 1L;
    -    private final Log log = LogFactory.getLog(LazyReplicatedMap.class);
    +    // Lazy init to support serialization
    +    private transient volatile Log log;
     
     
     //------------------------------------------------------------------------------
    @@ -148,6 +149,7 @@ protected int getReplicateMessageType() {
          */
         @Override
         protected Member[] publishEntryInfo(Object key, Object value) throws ChannelException {
    +        Log log = getLog();
             if  (! (key instanceof Serializable && value instanceof Serializable)  ) return new Member[0];
             Member[] members = getMapMembers();
             int firstIdx = getNextBackupIndex();
    @@ -208,4 +210,14 @@ protected Member[] publishEntryInfo(Object key, Object value) throws ChannelExce
         }
     
     
    +    private Log getLog() {
    +        if (log == null) {
    +            synchronized (this) {
    +                if (log == null) {
    +                    log = LogFactory.getLog(LazyReplicatedMap.class);
    +                }
    +            }
    +        }
    +        return log;
    +    }
     }
    \ No newline at end of file
    diff --git a/core/src/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties b/core/src/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
    index a47c0b9..7a309f5 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
    +++ b/core/src/main/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
    @@ -33,13 +33,13 @@ abstractReplicatedMap.unable.remove=Unable to replicate out data for a AbstractR
     abstractReplicatedMap.unable.retrieve=Unable to retrieve remote object for key:[{0}]
     abstractReplicatedMap.unable.get=Unable to replicate out data for a AbstractReplicatedMap.get operation
     abstractReplicatedMap.unable.put=Unable to replicate out data for a AbstractReplicatedMap.put operation
    -abstractReplicatedMap.unsupport.operation=This operation is not valid on a replicated map
     abstractReplicatedMap.mapMemberAdded.nullMember=Notified member is not registered in the membership:[{0}].
     abstractReplicatedMap.mapMemberAdded.added=Map member added:[{0}]
     abstractReplicatedMap.leftOver.pingMsg=PING message has been received beyond the timeout period. The map member[{0}] might have been removed from the map membership.
     abstractReplicatedMap.leftOver.ignored=Message[{0}] is ignored.
     abstractReplicatedMap.mapMember.unavailable=Member[{0}] is not available yet.
     abstractReplicatedMap.ping.timeout=Member[{0}] in the Map[{1}] has timed-out in the ping processing.
    +abstractReplicatedMap.ping.stateTransferredMember=Member[{0}] is state transferred but not available yet.
     mapMessage.deserialize.error.key=Deserialization error of the MapMessage.key
     mapMessage.deserialize.error.value=Deserialization error of the MapMessage.value
     lazyReplicatedMap.unableReplicate.backup=Unable to replicate backup key:[{0}] to backup:[{1}]. Reason:[{2}]
    diff --git a/core/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java b/core/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java
    index ae9498b..616de36 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java
    @@ -19,8 +19,7 @@
     import java.io.Serializable;
     import java.util.ArrayList;
     import java.util.Arrays;
    -import java.util.Iterator;
    -import java.util.Map;
    +import java.util.List;
     
     import org.apache.catalina.tribes.Channel;
     import org.apache.catalina.tribes.ChannelException;
    @@ -58,7 +57,8 @@ public class ReplicatedMap extends AbstractReplicatedMap {
     
         private static final long serialVersionUID = 1L;
     
    -    private final Log log = LogFactory.getLog(ReplicatedMap.class);
    +    // Lazy init to support serialization
    +    private transient volatile Log log;
     
         //--------------------------------------------------------------------------
         //              CONSTRUCTORS / DESTRUCTORS
    @@ -153,7 +153,7 @@ protected Member[] publishEntryInfo(Object key, Object value) throws ChannelExce
             } catch (ChannelException e) {
                 FaultyMember[] faultyMembers = e.getFaultyMembers();
                 if (faultyMembers.length == 0) throw e;
    -            ArrayList faulty = new ArrayList<>();
    +            List faulty = new ArrayList<>();
                 for (FaultyMember faultyMember : faultyMembers) {
                     if (!(faultyMember.getCause() instanceof RemoteProcessException)) {
                         faulty.add(faultyMember.getMember());
    @@ -165,8 +165,8 @@ protected Member[] publishEntryInfo(Object key, Object value) throws ChannelExce
                     if (backup.length == 0) {
                         throw e;
                     } else {
    -                    if (log.isWarnEnabled()) {
    -                        log.warn(sm.getString("replicatedMap.unableReplicate.completely", key,
    +                    if (getLog().isWarnEnabled()) {
    +                        getLog().warn(sm.getString("replicatedMap.unableReplicate.completely", key,
                                     Arrays.toString(backup), Arrays.toString(realFaultyMembers)), e);
                         }
                     }
    @@ -178,6 +178,7 @@ protected Member[] publishEntryInfo(Object key, Object value) throws ChannelExce
         @Override
         public void memberDisappeared(Member member) {
             boolean removed = false;
    +        Log log = getLog();
             synchronized (mapMembers) {
                 removed = (mapMembers.remove(member) != null );
                 if (!removed) {
    @@ -188,9 +189,7 @@ public void memberDisappeared(Member member) {
             if (log.isInfoEnabled())
                 log.info(sm.getString("replicatedMap.member.disappeared", member));
             long start = System.currentTimeMillis();
    -        Iterator>> i = innerMap.entrySet().iterator();
    -        while (i.hasNext()) {
    -            Map.Entry> e = i.next();
    +        for (Entry> e : innerMap.entrySet()) {
                 MapEntry entry = innerMap.get(e.getKey());
                 if (entry==null) continue;
                 if (entry.isPrimary()) {
    @@ -253,9 +252,7 @@ public void mapMemberAdded(Member member) {
             if ( memberAdded ) {
                 synchronized (stateMutex) {
                     Member[] backup = getMapMembers();
    -                Iterator>> i = innerMap.entrySet().iterator();
    -                while (i.hasNext()) {
    -                    Map.Entry> e = i.next();
    +                for (Entry> e : innerMap.entrySet()) {
                         MapEntry entry = innerMap.get(e.getKey());
                         if ( entry == null ) continue;
                         if (entry.isPrimary() && !inSet(member,entry.getBackupNodes())) {
    @@ -265,4 +262,16 @@ public void mapMemberAdded(Member member) {
                 }
             }
         }
    +
    +
    +    private Log getLog() {
    +        if (log == null) {
    +            synchronized (this) {
    +                if (log == null) {
    +                    log = LogFactory.getLog(ReplicatedMap.class);
    +                }
    +            }
    +        }
    +        return log;
    +    }
     }
    \ No newline at end of file
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties
    index d326474..70b8651 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/LocalStrings_es.properties
    @@ -12,6 +12,7 @@
     # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     # See the License for the specific language governing permissions and
     # limitations under the License.
    +
     bioSender.ack.eof = EOF alcanzado en puerto local [{0}:{1,number,integer}]
     bioSender.ack.missing = No puedo leer reconocimiento desde [{0}:{1,number,integer}] en {2,number,integer} ms. Desconectando conector e intentando otra vez.
     bioSender.ack.wrong = Falta ACK correcto tras 10 bytes le\u00EDdos en puerto local [{0}:{1,number,integer}]
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java b/core/src/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java
    index 4b6b2fb..4a2c5b0 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/RxTaskPool.java
    @@ -86,7 +86,7 @@ public AbstractRxTask getRxTask()
                 }//while
                 if ( worker != null ) used.add(worker);
             }
    -        return (worker);
    +        return worker;
         }
     
         public int available() {
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java
    index 266dc3e..5109950 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/bio/BioSender.java
    @@ -173,7 +173,7 @@ protected void openSocket() throws IOException {
               SenderState.getSenderState(getDestination()).setSuspect();
               if (log.isDebugEnabled())
                   log.debug(sm.getString("bioSender.openSocket.failure",getAddress().getHostAddress(), Integer.valueOf(getPort()), Long.valueOf(0)), ex1);
    -          throw (ex1);
    +          throw ex1;
             }
     
          }
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java
    index f18b527..61c94c5 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java
    @@ -120,13 +120,21 @@ public void remove(Member member) {
     
         @Override
         public synchronized void disconnect() {
    -        try {close(); }catch (Exception x){/* Ignore */}
    +        try {
    +            close();
    +        } catch (Exception x) {
    +            // Ignore
    +        }
             setConnected(false);
         }
     
         @Override
         public void finalize() throws Throwable {
    -        try {disconnect(); }catch ( Exception e){/* Ignore */}
    +        try {
    +            disconnect();
    +        } catch (Exception e) {
    +            // Ignore
    +        }
             super.finalize();
         }
     
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
    index c1b1d4e..16b724b 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
    @@ -197,8 +197,7 @@ protected void socketTimeouts() {
             Selector tmpsel = this.selector.get();
             Set keys =  (isListening()&&tmpsel!=null)?tmpsel.keys():null;
             if ( keys == null ) return;
    -        for (Iterator iter = keys.iterator(); iter.hasNext();) {
    -            SelectionKey key = iter.next();
    +        for (SelectionKey key : keys) {
                 try {
     //                if (key.interestOps() == SelectionKey.OP_READ) {
     //                    //only timeout sockets that we are waiting for a read from
    @@ -369,10 +368,8 @@ private void closeSelector() throws IOException {
             Selector selector = this.selector.getAndSet(null);
             if (selector == null) return;
             try {
    -            Iterator it = selector.keys().iterator();
                 // look at each key in the selected set
    -            while (it.hasNext()) {
    -                SelectionKey key = it.next();
    +            for (SelectionKey key : selector.keys()) {
                     key.channel().close();
                     key.attach(null);
                     key.cancel();
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
    index a6ad6a2..83ba44a 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
    @@ -232,7 +232,6 @@ protected void drainChannel (final SelectionKey key, ObjectReader reader) throws
     
             if (count < 0) {
                 remoteEof(key);
    -            return;
             }
         }
     
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java
    index 7a766f2..6354dee 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/nio/NioSender.java
    @@ -336,7 +336,7 @@ private ByteBuffer getWriteBuffer() {
         }
     
         private ByteBuffer getBuffer(int size) {
    -        return (getDirectBuffer()?ByteBuffer.allocateDirect(size):ByteBuffer.allocate(size));
    +        return getDirectBuffer()?ByteBuffer.allocateDirect(size):ByteBuffer.allocate(size);
         }
     
         /**
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
    index e9fd891..3472a81 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
    @@ -20,8 +20,10 @@
     import java.net.UnknownHostException;
     import java.nio.channels.SelectionKey;
     import java.nio.channels.Selector;
    +import java.util.ArrayList;
     import java.util.HashMap;
     import java.util.Iterator;
    +import java.util.List;
     import java.util.Map;
     import java.util.Map.Entry;
     
    @@ -73,25 +75,26 @@ public synchronized void sendMessage(Member[] destination, ChannelMessage msg)
                         msg.getOptions()) == Channel.SEND_OPTIONS_USE_ACK;
                 while ( (remaining>0) && (delta 0 ) {
    @@ -113,20 +116,29 @@ public synchronized void sendMessage(Member[] destination, ChannelMessage msg)
                     throw cx;
                 }
             } catch (Exception x ) {
    -            try { this.disconnect(); } catch (Exception e) {/*Ignore*/}
    +            try {
    +                this.disconnect();
    +            } catch (Exception e) {
    +                // Ignore
    +            }
                 if ( x instanceof ChannelException ) throw (ChannelException)x;
                 else throw new ChannelException(x);
             }
     
         }
     
    -    private int doLoop(long selectTimeOut, int maxAttempts, boolean waitForAck, ChannelMessage msg)
    -            throws IOException, ChannelException {
    -        int completed = 0;
    -        int selectedKeys = selector.select(selectTimeOut);
    +    private SendResult doLoop(long selectTimeOut, int maxAttempts, boolean waitForAck, ChannelMessage msg)
    +            throws ChannelException {
    +        SendResult result = new SendResult();
    +        int selectedKeys;
    +        try {
    +            selectedKeys = selector.select(selectTimeOut);
    +        } catch (IOException ioe) {
    +            throw new ChannelException(sm.getString("parallelNioSender.send.failed"), ioe);
    +        }
     
             if (selectedKeys == 0) {
    -            return 0;
    +            return result;
             }
     
             Iterator it = selector.selectedKeys().iterator();
    @@ -138,8 +150,8 @@ private int doLoop(long selectTimeOut, int maxAttempts, boolean waitForAck, Chan
                 NioSender sender = (NioSender) sk.attachment();
                 try {
                     if (sender.process(sk,waitForAck)) {
    -                    completed++;
                         sender.setComplete(true);
    +                    result.complete(sender);
                         if ( Logs.MESSAGES.isTraceEnabled() ) {
                             Logs.MESSAGES.trace("ParallelNioSender - Sent msg:" +
                                     new UniqueId(msg.getUniqueId()) + " at " +
    @@ -155,7 +167,7 @@ private int doLoop(long selectTimeOut, int maxAttempts, boolean waitForAck, Chan
                     }
                     SenderState state = SenderState.getSenderState(sender.getDestination());
                     int attempt = sender.getAttempt()+1;
    -                boolean retry = (sender.getAttempt() <= maxAttempts && maxAttempts>0);
    +                boolean retry = (attempt <= maxAttempts && maxAttempts>0);
                     synchronized (state) {
     
                         //sk.cancel();
    @@ -172,17 +184,18 @@ private int doLoop(long selectTimeOut, int maxAttempts, boolean waitForAck, Chan
                         log.warn(sm.getString("parallelNioSender.sender.disconnected.notRetry", sender.getDestination().getName()));
                         ChannelException cx = new ChannelException(sm.getString("parallelNioSender.sender.disconnected.sendFailed"), x);
                         cx.addFaultyMember(sender.getDestination(),x);
    -                    throw cx;
    +                    result.failed(cx);
    +                    break;
                     }
     
                     byte[] data = sender.getMessage();
    -                if ( retry ) {
    +                if (retry) {
                         try {
                             sender.disconnect();
                             sender.connect();
                             sender.setAttempt(attempt);
                             sender.setMessage(data);
    -                    }catch ( Exception ignore){
    +                    } catch (Exception ignore){
                             state.setFailing();
                         }
                     } else {
    @@ -191,12 +204,31 @@ private int doLoop(long selectTimeOut, int maxAttempts, boolean waitForAck, Chan
                                         Integer.toString(sender.getAttempt()),
                                         Integer.toString(maxAttempts)), x);
                         cx.addFaultyMember(sender.getDestination(),x);
    -                    throw cx;
    +                    result.failed(cx);
                     }//end if
                 }
             }
    -        return completed;
    +        return result;
    +
    +    }
    +
    +    private static class SendResult {
    +        private List completeSenders = new ArrayList<>();
    +        private ChannelException exception = null;
    +        private void complete(NioSender sender) {
    +            if (!completeSenders.contains(sender)) completeSenders.add(sender);
    +        }
    +        private int getCompleted() {
    +            return completeSenders.size();
    +        }
    +        private void failed(ChannelException cx){
    +            if (exception == null) exception = cx;
    +            exception.addFaultyMember(cx.getFaultyMembers());
    +        }
     
    +        private ChannelException getFailed() {
    +            return exception;
    +        }
         }
     
         private void connect(NioSender[] senders) throws ChannelException {
    @@ -292,7 +324,11 @@ public void remove(Member member) {
         @Override
         public synchronized void disconnect() {
             setConnected(false);
    -        try {close(); }catch (Exception x){/*Ignore*/}
    +        try {
    +            close();
    +        } catch (Exception x) {
    +            // Ignore
    +        }
         }
     
         @Override
    diff --git a/core/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java b/core/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java
    index 7c8c5d0..8741504 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/transport/nio/PooledParallelSender.java
    @@ -44,6 +44,7 @@ public void sendMessage(Member[] destination, ChannelMessage message) throws Cha
                 throw cx;
             } else {
                 try {
    +                if (!sender.isConnected()) sender.connect();
                     sender.sendMessage(destination, message);
                     sender.keepalive();
                 } catch (ChannelException x) {
    diff --git a/core/src/main/java/org/apache/catalina/tribes/util/Arrays.java b/core/src/main/java/org/apache/catalina/tribes/util/Arrays.java
    index 16f12ac..8ecf061 100644
    --- a/core/src/main/java/org/apache/catalina/tribes/util/Arrays.java
    +++ b/core/src/main/java/org/apache/catalina/tribes/util/Arrays.java
    @@ -153,7 +153,7 @@ public static void fill(Membership mbrship, Member[] m) {
         }
     
         public static Member[] diff(Membership complete, Membership local, Member ignore) {
    -        ArrayList result = new ArrayList<>();
    +        List result = new ArrayList<>();
             Member[] comp = complete.getMembers();
             for ( int i=0; i {
             private static final long serialVersionUID = 1L;
     
    -        ThreadPoolExecutor parent = null;
    +        transient ThreadPoolExecutor parent = null;
     
             public TaskQueue() {
                 super();
    @@ -92,8 +92,11 @@ public void setParent(ThreadPoolExecutor tp) {
             }
     
             public boolean force(Runnable o) {
    -            if ( parent.isShutdown() ) throw new RejectedExecutionException(sm.getString("executorFactory.not.running"));
    -            return super.offer(o); //forces the item onto the queue, to be used if the task is rejected
    +            if (parent != null && parent.isShutdown()) {
    +                throw new RejectedExecutionException(sm.getString("executorFactory.not.running"));
    +            }
    +            // Forces the item onto the queue, to be used if the task is rejected
    +            return super.offer(o);
             }
     
             @Override
    diff --git a/core/src/main/java/org/apache/catalina/users/AbstractGroup.java b/core/src/main/java/org/apache/catalina/users/AbstractGroup.java
    index 521d261..17cbd6c 100644
    --- a/core/src/main/java/org/apache/catalina/users/AbstractGroup.java
    +++ b/core/src/main/java/org/apache/catalina/users/AbstractGroup.java
    @@ -59,9 +59,7 @@ public abstract class AbstractGroup implements Group {
          */
         @Override
         public String getDescription() {
    -
    -        return (this.description);
    -
    +        return this.description;
         }
     
     
    @@ -72,9 +70,7 @@ public String getDescription() {
          */
         @Override
         public void setDescription(String description) {
    -
             this.description = description;
    -
         }
     
     
    @@ -84,9 +80,7 @@ public void setDescription(String description) {
          */
         @Override
         public String getGroupname() {
    -
    -        return (this.groupname);
    -
    +        return this.groupname;
         }
     
     
    @@ -98,9 +92,7 @@ public String getGroupname() {
          */
         @Override
         public void setGroupname(String groupname) {
    -
             this.groupname = groupname;
    -
         }
     
     
    @@ -171,9 +163,7 @@ public void setGroupname(String groupname) {
          */
         @Override
         public String getName() {
    -
    -        return (getGroupname());
    -
    +        return getGroupname();
         }
     
     
    diff --git a/core/src/main/java/org/apache/catalina/users/AbstractRole.java b/core/src/main/java/org/apache/catalina/users/AbstractRole.java
    index d75b8a8..66cb207 100644
    --- a/core/src/main/java/org/apache/catalina/users/AbstractRole.java
    +++ b/core/src/main/java/org/apache/catalina/users/AbstractRole.java
    @@ -55,9 +55,7 @@ public abstract class AbstractRole implements Role {
          */
         @Override
         public String getDescription() {
    -
    -        return (this.description);
    -
    +        return this.description;
         }
     
     
    @@ -68,9 +66,7 @@ public String getDescription() {
          */
         @Override
         public void setDescription(String description) {
    -
             this.description = description;
    -
         }
     
     
    @@ -80,9 +76,7 @@ public void setDescription(String description) {
          */
         @Override
         public String getRolename() {
    -
    -        return (this.rolename);
    -
    +        return this.rolename;
         }
     
     
    @@ -94,9 +88,7 @@ public String getRolename() {
          */
         @Override
         public void setRolename(String rolename) {
    -
             this.rolename = rolename;
    -
         }
     
     
    @@ -118,9 +110,7 @@ public void setRolename(String rolename) {
          */
         @Override
         public String getName() {
    -
    -        return (getRolename());
    -
    +        return getRolename();
         }
     
     
    diff --git a/core/src/main/java/org/apache/catalina/users/AbstractUser.java b/core/src/main/java/org/apache/catalina/users/AbstractUser.java
    index 3eb6b1e..6f1f99f 100644
    --- a/core/src/main/java/org/apache/catalina/users/AbstractUser.java
    +++ b/core/src/main/java/org/apache/catalina/users/AbstractUser.java
    @@ -64,9 +64,7 @@ public abstract class AbstractUser implements User {
          */
         @Override
         public String getFullName() {
    -
    -        return (this.fullName);
    -
    +        return this.fullName;
         }
     
     
    @@ -77,9 +75,7 @@ public String getFullName() {
          */
         @Override
         public void setFullName(String fullName) {
    -
             this.fullName = fullName;
    -
         }
     
     
    @@ -97,9 +93,7 @@ public void setFullName(String fullName) {
          */
         @Override
         public String getPassword() {
    -
    -        return (this.password);
    -
    +        return this.password;
         }
     
     
    @@ -112,9 +106,7 @@ public String getPassword() {
          */
         @Override
         public void setPassword(String password) {
    -
             this.password = password;
    -
         }
     
     
    @@ -131,9 +123,7 @@ public void setPassword(String password) {
          */
         @Override
         public String getUsername() {
    -
    -        return (this.username);
    -
    +        return this.username;
         }
     
     
    @@ -145,9 +135,7 @@ public String getUsername() {
          */
         @Override
         public void setUsername(String username) {
    -
             this.username = username;
    -
         }
     
     
    @@ -232,9 +220,7 @@ public void setUsername(String username) {
          */
         @Override
         public String getName() {
    -
    -        return (getUsername());
    -
    +        return getUsername();
         }
     
     
    diff --git a/core/src/main/java/org/apache/catalina/users/LocalStrings.properties b/core/src/main/java/org/apache/catalina/users/LocalStrings.properties
    index 17ff13a..10b2894 100644
    --- a/core/src/main/java/org/apache/catalina/users/LocalStrings.properties
    +++ b/core/src/main/java/org/apache/catalina/users/LocalStrings.properties
    @@ -14,6 +14,7 @@
     # limitations under the License.
     
     memoryUserDatabase.fileNotFound=The specified user database [{0}] could not be found
    +memoryUserDatabase.fileDelete=Failed to delete [{0}]
     memoryUserDatabase.notPersistable=User database is not persistable - no write permissions on directory
     memoryUserDatabase.nullGroup=Null or zero length group name specified. The group will be ignored.
     memoryUserDatabase.nullRole=Null or zero length role name specified. The role will be ignored.
    @@ -21,5 +22,6 @@ memoryUserDatabase.nullUser=Null or zero length user name specified. The user wi
     memoryUserDatabase.readOnly=User database has been configured to be read only. Changes cannot be saved
     memoryUserDatabase.renameOld=Cannot rename original file to [{0}]
     memoryUserDatabase.renameNew=Cannot rename new file to [{0}]
    +memoryUserDatabase.restoreOrig=Cannot restore [{0} to original file
     memoryUserDatabase.writeException=IOException writing to [{0}]
     memoryUserDatabase.xmlFeatureEncoding=Exception configuring digester to permit java encoding names in XML files. Only IANA encoding names will be supported.
    diff --git a/core/src/main/java/org/apache/catalina/users/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/users/LocalStrings_es.properties
    index 659d8b6..71021b1 100644
    --- a/core/src/main/java/org/apache/catalina/users/LocalStrings_es.properties
    +++ b/core/src/main/java/org/apache/catalina/users/LocalStrings_es.properties
    @@ -12,6 +12,7 @@
     # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     # See the License for the specific language governing permissions and
     # limitations under the License.
    +
     memoryUserDatabase.notPersistable = La base de datos de usuario no es persistible - no hay permisos de grabaci\u00F3n sobre el directorio
     memoryUserDatabase.nullGroup = Se ha especificado un nombre de grupo nulo o de tama\u00F1o cero. Se ignora el grupo.
     memoryUserDatabase.nullRole = Se ha especificado un nombre rol nulo o de tama\u00F1o cero. Se ignora el rol.
    diff --git a/core/src/main/java/org/apache/catalina/users/MemoryGroup.java b/core/src/main/java/org/apache/catalina/users/MemoryGroup.java
    index b95c1d8..2d793e6 100644
    --- a/core/src/main/java/org/apache/catalina/users/MemoryGroup.java
    +++ b/core/src/main/java/org/apache/catalina/users/MemoryGroup.java
    @@ -21,6 +21,7 @@
     
     import java.util.ArrayList;
     import java.util.Iterator;
    +import java.util.List;
     
     import org.apache.catalina.Role;
     import org.apache.catalina.User;
    @@ -83,11 +84,9 @@ public class MemoryGroup extends AbstractGroup {
          */
         @Override
         public Iterator getRoles() {
    -
             synchronized (roles) {
    -            return (roles.iterator());
    +            return roles.iterator();
             }
    -
         }
     
     
    @@ -96,9 +95,7 @@ public Iterator getRoles() {
          */
         @Override
         public UserDatabase getUserDatabase() {
    -
    -        return (this.database);
    -
    +        return this.database;
         }
     
     
    @@ -107,8 +104,7 @@ public UserDatabase getUserDatabase() {
          */
         @Override
         public Iterator getUsers() {
    -
    -        ArrayList results = new ArrayList<>();
    +        List results = new ArrayList<>();
             Iterator users = database.getUsers();
             while (users.hasNext()) {
                 User user = users.next();
    @@ -116,8 +112,7 @@ public Iterator getUsers() {
                     results.add(user);
                 }
             }
    -        return (results.iterator());
    -
    +        return results.iterator();
         }
     
     
    @@ -131,13 +126,11 @@ public Iterator getUsers() {
          */
         @Override
         public void addRole(Role role) {
    -
             synchronized (roles) {
                 if (!roles.contains(role)) {
                     roles.add(role);
                 }
             }
    -
         }
     
     
    @@ -148,11 +141,9 @@ public void addRole(Role role) {
          */
         @Override
         public boolean isInRole(Role role) {
    -
             synchronized (roles) {
    -            return (roles.contains(role));
    +            return roles.contains(role);
             }
    -
         }
     
     
    @@ -163,11 +154,9 @@ public boolean isInRole(Role role) {
          */
         @Override
         public void removeRole(Role role) {
    -
             synchronized (roles) {
                 roles.remove(role);
             }
    -
         }
     
     
    @@ -176,11 +165,9 @@ public void removeRole(Role role) {
          */
         @Override
         public void removeRoles() {
    -
             synchronized (roles) {
                 roles.clear();
             }
    -
         }
     
     
    @@ -189,7 +176,6 @@ public void removeRoles() {
          */
         @Override
         public String toString() {
    -
             StringBuilder sb = new StringBuilder("");
    -        return (sb.toString());
    +        return sb.toString();
         }
     }
    diff --git a/core/src/main/java/org/apache/catalina/users/MemoryRole.java b/core/src/main/java/org/apache/catalina/users/MemoryRole.java
    index f1c64b6..e98fe32 100644
    --- a/core/src/main/java/org/apache/catalina/users/MemoryRole.java
    +++ b/core/src/main/java/org/apache/catalina/users/MemoryRole.java
    @@ -71,9 +71,7 @@ public class MemoryRole extends AbstractRole {
          */
         @Override
         public UserDatabase getUserDatabase() {
    -
    -        return (this.database);
    -
    +        return this.database;
         }
     
     
    @@ -85,7 +83,6 @@ public UserDatabase getUserDatabase() {
          */
         @Override
         public String toString() {
    -
             StringBuilder sb = new StringBuilder("");
    -        return (sb.toString());
    -
    +        return sb.toString();
         }
     
     
    diff --git a/core/src/main/java/org/apache/catalina/users/MemoryUser.java b/core/src/main/java/org/apache/catalina/users/MemoryUser.java
    index fba062b..7580e0a 100644
    --- a/core/src/main/java/org/apache/catalina/users/MemoryUser.java
    +++ b/core/src/main/java/org/apache/catalina/users/MemoryUser.java
    @@ -25,8 +25,8 @@
     import org.apache.catalina.Group;
     import org.apache.catalina.Role;
     import org.apache.catalina.UserDatabase;
    -import org.apache.catalina.util.RequestUtil;
     import org.apache.tomcat.util.buf.StringUtils;
    +import org.apache.tomcat.util.security.Escape;
     
     /**
      * 

    Concrete implementation of {@link org.apache.catalina.User} for the @@ -91,11 +91,9 @@ public class MemoryUser extends AbstractUser { */ @Override public Iterator getGroups() { - synchronized (groups) { - return (groups.iterator()); + return groups.iterator(); } - } @@ -104,11 +102,9 @@ public Iterator getGroups() { */ @Override public Iterator getRoles() { - synchronized (roles) { - return (roles.iterator()); + return roles.iterator(); } - } @@ -117,9 +113,7 @@ public Iterator getRoles() { */ @Override public UserDatabase getUserDatabase() { - - return (this.database); - + return this.database; } @@ -167,11 +161,9 @@ public void addRole(Role role) { */ @Override public boolean isInGroup(Group group) { - synchronized (groups) { - return (groups.contains(group)); + return groups.contains(group); } - } @@ -184,11 +176,9 @@ public boolean isInGroup(Group group) { */ @Override public boolean isInRole(Role role) { - synchronized (roles) { - return (roles.contains(role)); + return roles.contains(role); } - } @@ -260,26 +250,26 @@ public void removeRoles() { public String toXml() { StringBuilder sb = new StringBuilder(" 0) { sb.append(" groups=\""); - StringUtils.join(groups, ',', (x) -> RequestUtil.filter(x.getGroupname()), sb); + StringUtils.join(groups, ',', (x) -> Escape.xml(x.getGroupname()), sb); sb.append("\""); } } synchronized (roles) { if (roles.size() > 0) { sb.append(" roles=\""); - StringUtils.join(roles, ',', (x) -> RequestUtil.filter(x.getRolename()), sb); + StringUtils.join(roles, ',', (x) -> Escape.xml(x.getRolename()), sb); sb.append("\""); } } @@ -295,24 +285,24 @@ public String toXml() { public String toString() { StringBuilder sb = new StringBuilder("User username=\""); - sb.append(RequestUtil.filter(username)); + sb.append(Escape.xml(username)); sb.append("\""); if (fullName != null) { sb.append(", fullName=\""); - sb.append(RequestUtil.filter(fullName)); + sb.append(Escape.xml(fullName)); sb.append("\""); } synchronized (groups) { if (groups.size() > 0) { sb.append(", groups=\""); - StringUtils.join(groups, ',', (x) -> RequestUtil.filter(x.getGroupname()), sb); + StringUtils.join(groups, ',', (x) -> Escape.xml(x.getGroupname()), sb); sb.append("\""); } } synchronized (roles) { if (roles.size() > 0) { sb.append(", roles=\""); - StringUtils.join(roles, ',', (x) -> RequestUtil.filter(x.getRolename()), sb); + StringUtils.join(roles, ',', (x) -> Escape.xml(x.getRolename()), sb); sb.append("\""); } } diff --git a/core/src/main/java/org/apache/catalina/users/MemoryUserDatabase.java b/core/src/main/java/org/apache/catalina/users/MemoryUserDatabase.java index 10bba76..37aab04 100644 --- a/core/src/main/java/org/apache/catalina/users/MemoryUserDatabase.java +++ b/core/src/main/java/org/apache/catalina/users/MemoryUserDatabase.java @@ -143,11 +143,9 @@ public MemoryUserDatabase(String id) { */ @Override public Iterator getGroups() { - synchronized (groups) { - return (groups.values().iterator()); + return groups.values().iterator(); } - } @@ -156,9 +154,7 @@ public Iterator getGroups() { */ @Override public String getId() { - - return (this.id); - + return this.id; } @@ -166,9 +162,7 @@ public String getId() { * @return the relative or absolute pathname to the persistent storage file. */ public String getPathname() { - - return (this.pathname); - + return this.pathname; } @@ -190,9 +184,7 @@ public void setPathname(String pathname) { * @return the readonly status of the user database */ public boolean getReadonly() { - - return (this.readonly); - + return this.readonly; } @@ -213,11 +205,9 @@ public void setReadonly(boolean readonly) { */ @Override public Iterator getRoles() { - synchronized (roles) { - return (roles.values().iterator()); + return roles.values().iterator(); } - } @@ -226,11 +216,9 @@ public Iterator getRoles() { */ @Override public Iterator getUsers() { - synchronized (users) { - return (users.values().iterator()); + return users.values().iterator(); } - } @@ -266,7 +254,6 @@ public void close() throws Exception { */ @Override public Group createGroup(String groupname, String description) { - if (groupname == null || groupname.length() == 0) { String msg = sm.getString("memoryUserDatabase.nullGroup"); log.warn(msg); @@ -277,8 +264,7 @@ public Group createGroup(String groupname, String description) { synchronized (groups) { groups.put(group.getGroupname(), group); } - return (group); - + return group; } @@ -290,7 +276,6 @@ public Group createGroup(String groupname, String description) { */ @Override public Role createRole(String rolename, String description) { - if (rolename == null || rolename.length() == 0) { String msg = sm.getString("memoryUserDatabase.nullRole"); log.warn(msg); @@ -301,8 +286,7 @@ public Role createRole(String rolename, String description) { synchronized (roles) { roles.put(role.getRolename(), role); } - return (role); - + return role; } @@ -327,7 +311,7 @@ public User createUser(String username, String password, synchronized (users) { users.put(user.getUsername(), user); } - return (user); + return user; } @@ -416,7 +400,6 @@ public void open() throws Exception { digester.parse(is); } catch (IOException ioe) { log.error(sm.getString("memoryUserDatabase.fileNotFound", pathName)); - return; } } } @@ -521,16 +504,12 @@ public void save() throws Exception { // Write out contents to a temporary file File fileNew = new File(pathnameNew); if (!fileNew.isAbsolute()) { - fileNew = - new File(System.getProperty(Globals.CATALINA_BASE_PROP), pathnameNew); + fileNew = new File(System.getProperty(Globals.CATALINA_BASE_PROP), pathnameNew); } - PrintWriter writer = null; - try { - // Configure our PrintWriter - FileOutputStream fos = new FileOutputStream(fileNew); - OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF8"); - writer = new PrintWriter(osw); + try (FileOutputStream fos = new FileOutputStream(fileNew); + OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF8"); + PrintWriter writer = new PrintWriter(osw)) { // Print the file prolog writer.println(""); @@ -562,51 +541,46 @@ public void save() throws Exception { // Check for errors that occurred while printing if (writer.checkError()) { - writer.close(); - fileNew.delete(); - throw new IOException - (sm.getString("memoryUserDatabase.writeException", - fileNew.getAbsolutePath())); + throw new IOException(sm.getString("memoryUserDatabase.writeException", + fileNew.getAbsolutePath())); } - writer.close(); } catch (IOException e) { - if (writer != null) { - writer.close(); + if (fileNew.exists() && !fileNew.delete()) { + log.warn(sm.getString("memoryUserDatabase.fileDelete", fileNew)); } - fileNew.delete(); throw e; } // Perform the required renames to permanently save this file File fileOld = new File(pathnameOld); if (!fileOld.isAbsolute()) { - fileOld = - new File(System.getProperty(Globals.CATALINA_BASE_PROP), pathnameOld); + fileOld = new File(System.getProperty(Globals.CATALINA_BASE_PROP), pathnameOld); + } + if (fileOld.exists() && !fileOld.delete()) { + throw new IOException(sm.getString("memoryUserDatabase.fileDelete", fileOld)); } - fileOld.delete(); File fileOrig = new File(pathname); if (!fileOrig.isAbsolute()) { - fileOrig = - new File(System.getProperty(Globals.CATALINA_BASE_PROP), pathname); + fileOrig = new File(System.getProperty(Globals.CATALINA_BASE_PROP), pathname); } if (fileOrig.exists()) { - fileOld.delete(); if (!fileOrig.renameTo(fileOld)) { - throw new IOException - (sm.getString("memoryUserDatabase.renameOld", - fileOld.getAbsolutePath())); + throw new IOException(sm.getString("memoryUserDatabase.renameOld", + fileOld.getAbsolutePath())); } } if (!fileNew.renameTo(fileOrig)) { if (fileOld.exists()) { - fileOld.renameTo(fileOrig); + if (!fileOld.renameTo(fileOrig)) { + log.warn(sm.getString("memoryUserDatabase.restoreOrig", fileOld)); + } } - throw new IOException - (sm.getString("memoryUserDatabase.renameNew", - fileOrig.getAbsolutePath())); + throw new IOException(sm.getString("memoryUserDatabase.renameNew", + fileOrig.getAbsolutePath())); + } + if (fileOld.exists() && !fileOld.delete()) { + throw new IOException(sm.getString("memoryUserDatabase.fileDelete", fileOld)); } - fileOld.delete(); - } @@ -615,7 +589,6 @@ public void save() throws Exception { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("MemoryUserDatabase[id="); sb.append(this.id); sb.append(",pathname="); @@ -627,7 +600,7 @@ public String toString() { sb.append(",userCount="); sb.append(this.users.size()); sb.append("]"); - return (sb.toString()); + return sb.toString(); } } @@ -671,7 +644,7 @@ public Object createObject(Attributes attributes) { } } } - return (group); + return group; } private final MemoryUserDatabase database; @@ -695,7 +668,7 @@ public Object createObject(Attributes attributes) { } String description = attributes.getValue("description"); Role role = database.createRole(rolename, description); - return (role); + return role; } private final MemoryUserDatabase database; @@ -765,7 +738,7 @@ public Object createObject(Attributes attributes) { } } } - return (user); + return user; } private final MemoryUserDatabase database; diff --git a/core/src/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java b/core/src/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java index 3ad0b17..ac75a54 100644 --- a/core/src/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java +++ b/core/src/main/java/org/apache/catalina/users/MemoryUserDatabaseFactory.java @@ -76,11 +76,11 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, // We only know how to deal with javax.naming.References // that specify a class name of "org.apache.catalina.UserDatabase" if ((obj == null) || !(obj instanceof Reference)) { - return (null); + return null; } Reference ref = (Reference) obj; if (!"org.apache.catalina.UserDatabase".equals(ref.getClassName())) { - return (null); + return null; } // Create and configure a MemoryUserDatabase instance based on the @@ -103,7 +103,7 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, // Don't try something we know won't work if (!database.getReadonly()) database.save(); - return (database); + return database; } diff --git a/core/src/main/java/org/apache/catalina/util/CharsetMapper.java b/core/src/main/java/org/apache/catalina/util/CharsetMapper.java index 4436985..1d6df62 100644 --- a/core/src/main/java/org/apache/catalina/util/CharsetMapper.java +++ b/core/src/main/java/org/apache/catalina/util/CharsetMapper.java @@ -110,7 +110,7 @@ public String getCharset(Locale locale) { charset = map.getProperty(locale.getLanguage()); } } - return (charset); + return charset; } diff --git a/core/src/main/java/org/apache/catalina/util/CustomObjectInputStream.java b/core/src/main/java/org/apache/catalina/util/CustomObjectInputStream.java index 38f6e1d..539b601 100644 --- a/core/src/main/java/org/apache/catalina/util/CustomObjectInputStream.java +++ b/core/src/main/java/org/apache/catalina/util/CustomObjectInputStream.java @@ -185,7 +185,9 @@ protected Class resolveProxyClass(String[] interfaces) } try { - return Proxy.getProxyClass(classLoader, cinterfaces); + // @SuppressWarnings("deprecation") Java 9 + Class proxyClass = Proxy.getProxyClass(classLoader, cinterfaces); + return proxyClass; } catch (IllegalArgumentException e) { throw new ClassNotFoundException(null, e); } diff --git a/core/src/main/java/org/apache/catalina/util/DOMWriter.java b/core/src/main/java/org/apache/catalina/util/DOMWriter.java index 3877b41..ee99305 100644 --- a/core/src/main/java/org/apache/catalina/util/DOMWriter.java +++ b/core/src/main/java/org/apache/catalina/util/DOMWriter.java @@ -19,6 +19,7 @@ import java.io.PrintWriter; import java.io.Writer; +import org.apache.tomcat.util.security.Escape; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; @@ -26,18 +27,15 @@ import org.w3c.dom.NodeList; /** - * A sample DOM writer. This sample program illustrates how to traverse a DOM - * tree in order to print a document that is parsed. + * A DOM writer optimised for use by WebDAV. */ public class DOMWriter { private final PrintWriter out; - private final boolean canonical; - public DOMWriter(Writer writer, boolean canonical) { + public DOMWriter(Writer writer) { out = new PrintWriter(writer); - this.canonical = canonical; } @@ -56,9 +54,6 @@ public void print(Node node) { switch (type) { // print document case Node.DOCUMENT_NODE: - if (!canonical) { - out.println(""); - } print(((Document) node).getDocumentElement()); out.flush(); break; @@ -74,7 +69,7 @@ public void print(Node node) { out.print(attr.getLocalName()); out.print("=\""); - out.print(escape(attr.getNodeValue())); + out.print(Escape.xml("", true, attr.getNodeValue())); out.print('"'); } out.print('>'); @@ -83,29 +78,17 @@ public void print(Node node) { // handle entity reference nodes case Node.ENTITY_REFERENCE_NODE: - if (canonical) { - printChildren(node); - } else { - out.print('&'); - out.print(node.getLocalName()); - out.print(';'); - } + printChildren(node); break; // print cdata sections case Node.CDATA_SECTION_NODE: - if (canonical) { - out.print(escape(node.getNodeValue())); - } else { - out.print(""); - } + out.print(Escape.xml("", true, node.getNodeValue())); break; // print text case Node.TEXT_NODE: - out.print(escape(node.getNodeValue())); + out.print(Escape.xml("", true, node.getNodeValue())); break; // print processing instruction @@ -178,53 +161,6 @@ private Attr[] sortAttributes(NamedNodeMap attrs) { } } - return (array); - - } - - /** - * Normalizes the given string. - * @param s The string to escape - * @return the escaped string - */ - private String escape(String s) { - if (s == null) { - return ""; - } - - StringBuilder str = new StringBuilder(); - - int len = s.length(); - for (int i = 0; i < len; i++) { - char ch = s.charAt(i); - switch (ch) { - case '<': - str.append("<"); - break; - case '>': - str.append(">"); - break; - case '&': - str.append("&"); - break; - case '"': - str.append("""); - break; - case '\r': - case '\n': - if (canonical) { - str.append("&#"); - str.append(Integer.toString(ch)); - str.append(';'); - break; - } - // else, default append char - //$FALL-THROUGH$ - default: - str.append(ch); - } - } - - return (str.toString()); + return array; } } diff --git a/core/src/main/java/org/apache/catalina/util/Extension.java b/core/src/main/java/org/apache/catalina/util/Extension.java index 442189b..cf9489a 100644 --- a/core/src/main/java/org/apache/catalina/util/Extension.java +++ b/core/src/main/java/org/apache/catalina/util/Extension.java @@ -55,7 +55,7 @@ public final class Extension { public String getExtensionName() { - return (this.extensionName); + return this.extensionName; } public void setExtensionName(String extensionName) { @@ -69,7 +69,7 @@ public void setExtensionName(String extensionName) { private String implementationURL = null; public String getImplementationURL() { - return (this.implementationURL); + return this.implementationURL; } public void setImplementationURL(String implementationURL) { @@ -84,7 +84,7 @@ public void setImplementationURL(String implementationURL) { private String implementationVendor = null; public String getImplementationVendor() { - return (this.implementationVendor); + return this.implementationVendor; } public void setImplementationVendor(String implementationVendor) { @@ -99,7 +99,7 @@ public void setImplementationVendor(String implementationVendor) { private String implementationVendorId = null; public String getImplementationVendorId() { - return (this.implementationVendorId); + return this.implementationVendorId; } public void setImplementationVendorId(String implementationVendorId) { @@ -114,7 +114,7 @@ public void setImplementationVendorId(String implementationVendorId) { private String implementationVersion = null; public String getImplementationVersion() { - return (this.implementationVersion); + return this.implementationVersion; } public void setImplementationVersion(String implementationVersion) { @@ -129,7 +129,7 @@ public void setImplementationVersion(String implementationVersion) { private String specificationVendor = null; public String getSpecificationVendor() { - return (this.specificationVendor); + return this.specificationVendor; } public void setSpecificationVendor(String specificationVendor) { @@ -144,7 +144,7 @@ public void setSpecificationVendor(String specificationVendor) { private String specificationVersion = null; public String getSpecificationVersion() { - return (this.specificationVersion); + return this.specificationVersion; } public void setSpecificationVersion(String specificationVersion) { @@ -216,7 +216,6 @@ public boolean isCompatibleWith(Extension required) { @Override public String toString() { - StringBuilder sb = new StringBuilder("Extension["); sb.append(extensionName); if (implementationURL != null) { @@ -244,8 +243,7 @@ public String toString() { sb.append(specificationVersion); } sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/catalina/util/ExtensionValidator.java b/core/src/main/java/org/apache/catalina/util/ExtensionValidator.java index 2b35802..3ce787f 100644 --- a/core/src/main/java/org/apache/catalina/util/ExtensionValidator.java +++ b/core/src/main/java/org/apache/catalina/util/ExtensionValidator.java @@ -21,7 +21,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Iterator; +import java.util.List; import java.util.Locale; import java.util.StringTokenizer; import java.util.jar.JarInputStream; @@ -56,9 +56,8 @@ public final class ExtensionValidator { private static final StringManager sm = StringManager.getManager("org.apache.catalina.util"); - private static volatile ArrayList containerAvailableExtensions = - null; - private static final ArrayList containerManifestResources = + private static volatile List containerAvailableExtensions = null; + private static final List containerManifestResources = new ArrayList<>(); @@ -129,7 +128,7 @@ public static synchronized boolean validateApplication( throws IOException { String appName = context.getName(); - ArrayList appManifestResources = new ArrayList<>(); + List appManifestResources = new ArrayList<>(); // Web application manifest WebResource resource = resources.getResource("/META-INF/MANIFEST.MF"); @@ -205,14 +204,12 @@ public static void addSystemResource(File jarFile) throws IOException { * @return true if manifest resource file requirements are met */ private static boolean validateManifestResources(String appName, - ArrayList resources) { + List resources) { boolean passes = true; int failureCount = 0; - ArrayList availableExtensions = null; + List availableExtensions = null; - Iterator it = resources.iterator(); - while (it.hasNext()) { - ManifestResource mre = it.next(); + for (ManifestResource mre : resources) { ArrayList requiredList = mre.getRequiredExtensions(); if (requiredList == null) { continue; @@ -231,15 +228,11 @@ private static boolean validateManifestResources(String appName, } // iterate through the list of required extensions - Iterator rit = requiredList.iterator(); - while (rit.hasNext()) { + for (Extension requiredExt : requiredList) { boolean found = false; - Extension requiredExt = rit.next(); // check the application itself for the extension if (availableExtensions != null) { - Iterator ait = availableExtensions.iterator(); - while (ait.hasNext()) { - Extension targetExt = ait.next(); + for (Extension targetExt : availableExtensions) { if (targetExt.isCompatibleWith(requiredExt)) { requiredExt.setFulfilled(true); found = true; @@ -249,10 +242,7 @@ private static boolean validateManifestResources(String appName, } // check the container level list for the extension if (!found && containerAvailableExtensions != null) { - Iterator cit = - containerAvailableExtensions.iterator(); - while (cit.hasNext()) { - Extension targetExt = cit.next(); + for (Extension targetExt : containerAvailableExtensions) { if (targetExt.isCompatibleWith(requiredExt)) { requiredExt.setFulfilled(true); found = true; @@ -298,19 +288,15 @@ private static boolean validateManifestResources(String appName, * * @return HashMap Map of available extensions */ - private static ArrayList buildAvailableExtensionsList( - ArrayList resources) { + private static List buildAvailableExtensionsList( + List resources) { - ArrayList availableList = null; + List availableList = null; - Iterator it = resources.iterator(); - while (it.hasNext()) { - ManifestResource mre = it.next(); + for (ManifestResource mre : resources) { ArrayList list = mre.getAvailableExtensions(); if (list != null) { - Iterator values = list.iterator(); - while (values.hasNext()) { - Extension ext = values.next(); + for (Extension ext : list) { if (availableList == null) { availableList = new ArrayList<>(); availableList.add(ext); diff --git a/core/src/main/java/org/apache/catalina/util/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/util/LocalStrings_es.properties index a5d6b14..d6eb6f8 100644 --- a/core/src/main/java/org/apache/catalina/util/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/util/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + parameterMap.locked = No se permiten modificaciones en un ParameterMap bloqueado resourceSet.locked = No se permiten modificaciones en un ResourceSet bloqueado hexUtil.bad = D\u00EDgito hexadecimal incorrecto diff --git a/core/src/main/java/org/apache/catalina/util/ManifestResource.java b/core/src/main/java/org/apache/catalina/util/ManifestResource.java index 7ce634f..50776d2 100644 --- a/core/src/main/java/org/apache/catalina/util/ManifestResource.java +++ b/core/src/main/java/org/apache/catalina/util/ManifestResource.java @@ -17,7 +17,6 @@ package org.apache.catalina.util; import java.util.ArrayList; -import java.util.Iterator; import java.util.jar.Attributes; import java.util.jar.Manifest; @@ -107,9 +106,7 @@ public boolean isFulfilled() { if (requiredExtensions == null) { return true; } - Iterator it = requiredExtensions.iterator(); - while (it.hasNext()) { - Extension ext = it.next(); + for (Extension ext : requiredExtensions) { if (!ext.isFulfilled()) return false; } return true; @@ -117,7 +114,6 @@ public boolean isFulfilled() { @Override public String toString() { - StringBuilder sb = new StringBuilder("ManifestResource["); sb.append(resourceName); @@ -133,7 +129,7 @@ public String toString() { case APPLICATION : sb.append(", resourceType=APPLICATION"); break; } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/catalina/util/RequestUtil.java b/core/src/main/java/org/apache/catalina/util/RequestUtil.java index 14d01fc..ce6ffa7 100644 --- a/core/src/main/java/org/apache/catalina/util/RequestUtil.java +++ b/core/src/main/java/org/apache/catalina/util/RequestUtil.java @@ -26,46 +26,6 @@ */ public final class RequestUtil { - /** - * 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 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 (int i = 0; i < content.length; i++) { - switch (content[i]) { - case '<': - result.append("<"); - break; - case '>': - result.append(">"); - break; - case '&': - result.append("&"); - break; - case '"': - result.append("""); - break; - default: - result.append(content[i]); - } - } - return result.toString(); - } - - /** * Build an appropriate return value for * {@link HttpServletRequest#getRequestURL()} based on the provided diff --git a/core/src/main/java/org/apache/catalina/util/ResourceSet.java b/core/src/main/java/org/apache/catalina/util/ResourceSet.java index 40f86db..4e6dc68 100644 --- a/core/src/main/java/org/apache/catalina/util/ResourceSet.java +++ b/core/src/main/java/org/apache/catalina/util/ResourceSet.java @@ -104,9 +104,7 @@ public ResourceSet(Collection coll) { * @return the locked state of this parameter map. */ public boolean isLocked() { - - return (this.locked); - + return this.locked; } @@ -116,9 +114,7 @@ public boolean isLocked() { * @param locked The new locked state */ public void setLocked(boolean locked) { - this.locked = locked; - } @@ -142,12 +138,10 @@ public void setLocked(boolean locked) { */ @Override public boolean add(T o) { - if (locked) throw new IllegalStateException (sm.getString("resourceSet.locked")); - return (super.add(o)); - + return super.add(o); } @@ -177,12 +171,10 @@ public void clear() { */ @Override public boolean remove(Object o) { - if (locked) throw new IllegalStateException (sm.getString("resourceSet.locked")); - return (super.remove(o)); - + return super.remove(o); } diff --git a/core/src/main/java/org/apache/catalina/util/ServerInfo.java b/core/src/main/java/org/apache/catalina/util/ServerInfo.java index 44775a9..020d926 100644 --- a/core/src/main/java/org/apache/catalina/util/ServerInfo.java +++ b/core/src/main/java/org/apache/catalina/util/ServerInfo.java @@ -88,27 +88,21 @@ public class ServerInfo { * @return the server identification for this version of Tomcat. */ public static String getServerInfo() { - - return (serverInfo); - + return serverInfo; } /** * @return the server built time for this version of Tomcat. */ public static String getServerBuilt() { - - return (serverBuilt); - + return serverBuilt; } /** * @return the server's version number. */ public static String getServerNumber() { - - return (serverNumber); - + return serverNumber; } public static void main(String args[]) { diff --git a/core/src/main/java/org/apache/catalina/util/ServerInfo.properties b/core/src/main/java/org/apache/catalina/util/ServerInfo.properties index 86afffa..0f89438 100644 --- a/core/src/main/java/org/apache/catalina/util/ServerInfo.properties +++ b/core/src/main/java/org/apache/catalina/util/ServerInfo.properties @@ -13,6 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -server.info=Apache Tomcat/9.0.0.M21 -server.number=9.0.0.M21 -server.built=9.0.0.M21 \ No newline at end of file +server.info=Apache Tomcat/9.0.4 +server.number=9.0.4 +server.built=9.0.4 \ No newline at end of file diff --git a/core/src/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java b/core/src/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java index f0e1282..6ca75f8 100644 --- a/core/src/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java +++ b/core/src/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java @@ -220,13 +220,14 @@ private SecureRandom createSecureRandom() { try { // Construct and seed a new random number generator Class clazz = Class.forName(secureRandomClass); - result = (SecureRandom) clazz.newInstance(); + result = (SecureRandom) clazz.getConstructor().newInstance(); } catch (Exception e) { log.error(sm.getString("sessionIdGeneratorBase.random", secureRandomClass), e); } } + boolean error = false; if (result == null) { // No secureRandomClass or creation failed. Use SecureRandom. try { @@ -239,15 +240,17 @@ private SecureRandom createSecureRandom() { result = SecureRandom.getInstance(secureRandomAlgorithm); } } catch (NoSuchAlgorithmException e) { + error = true; log.error(sm.getString("sessionIdGeneratorBase.randomAlgorithm", secureRandomAlgorithm), e); } catch (NoSuchProviderException e) { + error = true; log.error(sm.getString("sessionIdGeneratorBase.randomProvider", secureRandomProvider), e); } } - if (result == null) { + if (result == null && error) { // Invalid provider / algorithm try { result = SecureRandom.getInstance("SHA1PRNG"); @@ -265,10 +268,11 @@ private SecureRandom createSecureRandom() { // Force seeding to take place result.nextInt(); - long t2=System.currentTimeMillis(); - if( (t2-t1) > 100 ) - log.info(sm.getString("sessionIdGeneratorBase.createRandom", - result.getAlgorithm(), Long.valueOf(t2-t1))); + long t2 = System.currentTimeMillis(); + if ((t2 - t1) > 100) { + log.warn(sm.getString("sessionIdGeneratorBase.createRandom", + result.getAlgorithm(), Long.valueOf(t2 - t1))); + } return result; } diff --git a/core/src/main/java/org/apache/catalina/util/TLSUtil.java b/core/src/main/java/org/apache/catalina/util/TLSUtil.java new file mode 100644 index 0000000..a739021 --- /dev/null +++ b/core/src/main/java/org/apache/catalina/util/TLSUtil.java @@ -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. + */ +package org.apache.catalina.util; + +import org.apache.catalina.Globals; +import org.apache.tomcat.util.net.SSLSupport; + +public class TLSUtil { + + /** + * Determines if the named request attribute is used to pass information + * about the TLS configuration of the connection to the application. Both + * the standard request attributes defined by the Servlet specification and + * Tomcat specific attributes are supported. + * + * @param name The attribute name to test + * + * @return {@code true} if the attribute is used to pass TLS configuration + * information, otherwise {@code false} + */ + public static boolean isTLSRequestAttribute(String name) { + return Globals.CERTIFICATES_ATTR.equals(name) || + Globals.CIPHER_SUITE_ATTR.equals(name) || + Globals.KEY_SIZE_ATTR.equals(name) || + Globals.SSL_SESSION_ID_ATTR.equals(name) || + Globals.SSL_SESSION_MGR_ATTR.equals(name) || + SSLSupport.PROTOCOL_VERSION_KEY.equals(name); + } +} diff --git a/core/src/main/java/org/apache/catalina/util/URLEncoder.java b/core/src/main/java/org/apache/catalina/util/URLEncoder.java index beec013..f23dc40 100644 --- a/core/src/main/java/org/apache/catalina/util/URLEncoder.java +++ b/core/src/main/java/org/apache/catalina/util/URLEncoder.java @@ -34,10 +34,10 @@ * @author Craig R. McClanahan * @author Remy Maucherat */ -public class URLEncoder { +public final class URLEncoder implements Cloneable { + private static final char[] hexadecimal = - {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F'}; + {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; public static final URLEncoder DEFAULT = new URLEncoder(); public static final URLEncoder QUERY = new URLEncoder(); @@ -99,12 +99,14 @@ public class URLEncoder { } //Array containing the safe characters set. - private final BitSet safeCharacters = new BitSet(256); + private final BitSet safeCharacters; private boolean encodeSpaceAsPlus = false; public URLEncoder() { + this(new BitSet(256)); + for (char i = 'a'; i <= 'z'; i++) { addSafeCharacter(i); } @@ -117,8 +119,18 @@ public URLEncoder() { } - public void addSafeCharacter( char c ) { - safeCharacters.set( c ); + private URLEncoder(BitSet safeCharacters) { + this.safeCharacters = safeCharacters; + } + + + public void addSafeCharacter(char c) { + safeCharacters.set(c); + } + + + public void removeSafeCharacter(char c) { + safeCharacters.clear(c); } @@ -172,4 +184,12 @@ public String encode(String path, Charset charset) { } return rewrittenPath.toString(); } + + + @Override + public Object clone() { + URLEncoder result = new URLEncoder((BitSet) safeCharacters.clone()); + result.setEncodeSpaceAsPlus(encodeSpaceAsPlus); + return result; + } } diff --git a/core/src/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java b/core/src/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java index c5b7815..3f4f87d 100644 --- a/core/src/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java +++ b/core/src/main/java/org/apache/catalina/valves/AbstractAccessLogValve.java @@ -28,8 +28,11 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.TimeZone; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpSession; @@ -39,8 +42,11 @@ import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleState; import org.apache.catalina.Session; +import org.apache.catalina.connector.ClientAbortException; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; +import org.apache.catalina.util.TLSUtil; +import org.apache.coyote.ActionCode; import org.apache.coyote.RequestInfo; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -81,7 +87,14 @@ *

  • %v - Local server name *
  • %D - Time taken to process the request, in millis *
  • %T - Time taken to process the request, in seconds + *
  • %F - Time taken to commit the response, in millis *
  • %I - current Request thread name (can compare later with stacktraces) + *
  • %X - Connection status when response is completed: + *
      + *
    • X = Connection aborted before the response completed.
    • + *
    • + = Connection may be kept alive after the response is sent.
    • + *
    • - = Connection will be closed after the response is sent.
    • + *
    * *

    In addition, the caller can specify one of the following aliases for * commonly utilized patterns:

    @@ -137,14 +150,14 @@ public abstract class AbstractAccessLogValve extends ValveBase implements Access /** * The list of our time format types. */ - private static enum FormatType { + private enum FormatType { CLF, SEC, MSEC, MSEC_FRAC, SDF } /** * The list of our port types. */ - private static enum PortType { + private enum PortType { LOCAL, REMOTE } @@ -332,7 +345,7 @@ private String getFormatInternal(long time) { private final Locale cacheDefaultLocale; private final DateFormatCache parent; protected final Cache cLFCache; - private final HashMap formatCache = new HashMap<>(); + private final Map formatCache = new HashMap<>(); protected DateFormatCache(int size, Locale loc, DateFormatCache parent) { cacheSize = size; @@ -459,6 +472,12 @@ protected Date initialValue() { */ private int maxLogMessageBufferSize = 256; + /** + * Does the configured log pattern include a known TLS attribute? + */ + private boolean tlsAttributeRequired = false; + + // ------------------------------------------------------------- Properties /** @@ -497,7 +516,7 @@ public void setEnabled(boolean enabled) { * @return the format pattern. */ public String getPattern() { - return (this.pattern); + return this.pattern; } @@ -621,6 +640,14 @@ public void setLocale(String localeName) { @Override public void invoke(Request request, Response response) throws IOException, ServletException { + if (tlsAttributeRequired) { + // The log pattern uses TLS attributes. Ensure these are populated + // before the request is processed because with NIO2 it is possible + // for the connection to be closed (and the TLS info lost) before + // the access log requests the TLS info. Requesting it now causes it + // to be cached in the request. + request.getAttribute(Globals.CERTIFICATES_ATTR); + } getNext().invoke(request, response); } @@ -701,7 +728,7 @@ protected static Locale findLocale(String name, Locale fallback) { } else { for (Locale l: Locale.getAvailableLocales()) { if (name.equals(l.toString())) { - return(l); + return l; } } } @@ -1490,6 +1517,47 @@ public void addElement(CharArrayWriter buf, Date date, Request request, } } + /** + * Write connection status when response is completed - %X + */ + protected static class ConnectionStatusElement implements AccessLogElement { + @Override + public void addElement(CharArrayWriter buf, Date date, Request request, Response response, long time) { + if (response != null && request != null) { + boolean statusFound = false; + + // Check whether connection IO is in "not allowed" state + AtomicBoolean isIoAllowed = new AtomicBoolean(false); + request.getCoyoteRequest().action(ActionCode.IS_IO_ALLOWED, isIoAllowed); + if (!isIoAllowed.get()) { + buf.append('X'); + statusFound = true; + } else { + // Check for connection aborted cond + if (response.isError()) { + Throwable ex = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION); + if (ex instanceof ClientAbortException) { + buf.append('X'); + statusFound = true; + } + } + } + + // If status is not found yet, cont to check whether connection is keep-alive or close + if (!statusFound) { + String connStatus = response.getHeader(org.apache.coyote.http11.Constants.CONNECTION); + if (org.apache.coyote.http11.Constants.CLOSE.equalsIgnoreCase(connStatus)) { + buf.append('-'); + } else { + buf.append('+'); + } + } + } else { + // Unknown connection status + buf.append('?'); + } + } + } /** * Parse pattern string and create the array of AccessLogElement. @@ -1558,6 +1626,9 @@ protected AccessLogElement createAccessLogElement(String name, char pattern) { case 'p': return new PortElement(name); case 'r': + if (TLSUtil.isTLSRequestAttribute(name)) { + tlsAttributeRequired = true; + } return new RequestAttributeElement(name); case 's': return new SessionAttributeElement(name); @@ -1617,6 +1688,8 @@ protected AccessLogElement createAccessLogElement(char pattern) { return new LocalServerNameElement(); case 'I': return new ThreadNameElement(); + case 'X': + return new ConnectionStatusElement(); default: return new StringElement("???" + pattern + "???"); } diff --git a/core/src/main/java/org/apache/catalina/valves/AccessLogValve.java b/core/src/main/java/org/apache/catalina/valves/AccessLogValve.java index 7d1c92f..35278e9 100644 --- a/core/src/main/java/org/apache/catalina/valves/AccessLogValve.java +++ b/core/src/main/java/org/apache/catalina/valves/AccessLogValve.java @@ -163,7 +163,7 @@ public AccessLogValve() { * @return the directory in which we create log files. */ public String getDirectory() { - return (directory); + return directory; } @@ -203,7 +203,7 @@ public void setCheckExists(boolean checkExists) { * @return the log file prefix. */ public String getPrefix() { - return (prefix); + return prefix; } @@ -282,7 +282,7 @@ public void setBuffered(boolean buffered) { * @return the log file suffix. */ public String getSuffix() { - return (suffix); + return suffix; } diff --git a/core/src/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java b/core/src/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java index de9663b..e3f12ff 100644 --- a/core/src/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java +++ b/core/src/main/java/org/apache/catalina/valves/CrawlerSessionManagerValve.java @@ -40,20 +40,19 @@ * users - regardless of whether or not they provide a session token with their * requests. */ -public class CrawlerSessionManagerValve extends ValveBase - implements HttpSessionBindingListener { +public class CrawlerSessionManagerValve extends ValveBase implements HttpSessionBindingListener { - private static final Log log = - LogFactory.getLog(CrawlerSessionManagerValve.class); + private static final Log log = LogFactory.getLog(CrawlerSessionManagerValve.class); - private final Map clientIpSessionId = - new ConcurrentHashMap<>(); - private final Map sessionIdClientIp = - new ConcurrentHashMap<>(); + private final Map clientIpSessionId = new ConcurrentHashMap<>(); + private final Map sessionIdClientIp = new ConcurrentHashMap<>(); - private String crawlerUserAgents = - ".*[bB]ot.*|.*Yahoo! Slurp.*|.*Feedfetcher-Google.*"; + private String crawlerUserAgents = ".*[bB]ot.*|.*Yahoo! Slurp.*|.*Feedfetcher-Google.*"; private Pattern uaPattern = null; + + private String crawlerIps = null; + private Pattern ipPattern = null; + private int sessionInactiveInterval = 60; @@ -90,6 +89,31 @@ public String getCrawlerUserAgents() { } + /** + * Specify the regular expression (using {@link Pattern}) that will be used + * to identify crawlers based on their IP address. The default is no crawler + * IPs. + * + * @param crawlerIps The regular expression using {@link Pattern} + */ + public void setCrawlerIps(String crawlerIps) { + this.crawlerIps = crawlerIps; + if (crawlerIps == null || crawlerIps.length() == 0) { + ipPattern = null; + } else { + ipPattern = Pattern.compile(crawlerIps); + } + } + + /** + * @see #setCrawlerIps(String) + * @return The current regular expression being used to match IP addresses. + */ + public String getCrawlerIps() { + return crawlerIps; + } + + /** * Specify the session timeout (in seconds) for a crawler's session. This is * typically lower than that for a user session. The default is 60 seconds. @@ -109,7 +133,7 @@ public int getSessionInactiveInterval() { } - public Map getClientIpSessionId() { + public Map getClientIpSessionId() { return clientIpSessionId; } @@ -123,17 +147,15 @@ protected void initInternal() throws LifecycleException { @Override - public void invoke(Request request, Response response) throws IOException, - ServletException { + public void invoke(Request request, Response response) throws IOException, ServletException { boolean isBot = false; String sessionId = null; - String clientIp = null; + String clientIp = request.getRemoteAddr(); if (log.isDebugEnabled()) { - log.debug(request.hashCode() + ": ClientIp=" + - request.getRemoteAddr() + ", RequestedSessionId=" + - request.getRequestedSessionId()); + log.debug(request.hashCode() + ": ClientIp=" + clientIp + ", RequestedSessionId=" + + request.getRequestedSessionId()); } // If the incoming request has a valid session ID, no action is required @@ -157,21 +179,26 @@ public void invoke(Request request, Response response) throws IOException, isBot = true; if (log.isDebugEnabled()) { - log.debug(request.hashCode() + - ": Bot found. UserAgent=" + uaHeader); + log.debug(request.hashCode() + ": Bot found. UserAgent=" + uaHeader); } } } + if (ipPattern != null && ipPattern.matcher(clientIp).matches()) { + isBot = true; + + if (log.isDebugEnabled()) { + log.debug(request.hashCode() + ": Bot found. IP=" + clientIp); + } + } + // If this is a bot, is the session ID known? if (isBot) { - clientIp = request.getRemoteAddr(); sessionId = clientIpSessionId.get(clientIp); if (sessionId != null) { request.setRequestedSessionId(sessionId); if (log.isDebugEnabled()) { - log.debug(request.hashCode() + ": SessionID=" + - sessionId); + log.debug(request.hashCode() + ": SessionID=" + sessionId); } } } @@ -191,14 +218,13 @@ public void invoke(Request request, Response response) throws IOException, s.setMaxInactiveInterval(sessionInactiveInterval); if (log.isDebugEnabled()) { - log.debug(request.hashCode() + - ": New bot session. SessionID=" + s.getId()); + log.debug(request.hashCode() + ": New bot session. SessionID=" + s.getId()); } } } else { if (log.isDebugEnabled()) { - log.debug(request.hashCode() + - ": Bot session accessed. SessionID=" + sessionId); + log.debug( + request.hashCode() + ": Bot session accessed. SessionID=" + sessionId); } } } diff --git a/core/src/main/java/org/apache/catalina/valves/ErrorReportValve.java b/core/src/main/java/org/apache/catalina/valves/ErrorReportValve.java index aa7f196..c22e529 100644 --- a/core/src/main/java/org/apache/catalina/valves/ErrorReportValve.java +++ b/core/src/main/java/org/apache/catalina/valves/ErrorReportValve.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.Writer; import java.util.Scanner; +import java.util.concurrent.atomic.AtomicBoolean; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; @@ -26,12 +27,12 @@ import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; -import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; import org.apache.catalina.util.TomcatCSS; import org.apache.coyote.ActionCode; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.res.StringManager; +import org.apache.tomcat.util.security.Escape; /** *

    Implementation of a Valve that outputs HTML error pages.

    @@ -149,12 +150,21 @@ protected void report(Request request, Response response, Throwable throwable) { if (statusCode < 400 || response.getContentWritten() > 0 || !response.setErrorReported()) { return; } - String message = RequestUtil.filter(response.getMessage()); + + // If an error has occurred that prevents further I/O, don't waste time + // producing an error report that will never be read + AtomicBoolean result = new AtomicBoolean(false); + response.getCoyoteResponse().action(ActionCode.IS_IO_ALLOWED, result); + if (!result.get()) { + return; + } + + String message = Escape.htmlElementContent(response.getMessage()); if (message == null) { if (throwable != null) { String exceptionMessage = throwable.getMessage(); if (exceptionMessage != null && exceptionMessage.length() > 0) { - message = RequestUtil.filter((new Scanner(exceptionMessage)).nextLine()); + message = Escape.htmlElementContent((new Scanner(exceptionMessage)).nextLine()); } } if (message == null) { @@ -227,7 +237,7 @@ protected void report(Request request, Response response, Throwable throwable) { sb.append("

    "); sb.append(smClient.getString("errorReportValve.exception")); sb.append("

    ");
    -                sb.append(RequestUtil.filter(stackTrace));
    +                sb.append(Escape.htmlElementContent(stackTrace));
                     sb.append("
    "); int loops = 0; @@ -237,7 +247,7 @@ protected void report(Request request, Response response, Throwable throwable) { sb.append("

    "); sb.append(smClient.getString("errorReportValve.rootCause")); sb.append("

    ");
    -                    sb.append(RequestUtil.filter(stackTrace));
    +                    sb.append(Escape.htmlElementContent(stackTrace));
                         sb.append("
    "); // In case root cause is somehow heavily nested rootCause = rootCause.getCause(); diff --git a/core/src/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java b/core/src/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java index 6656440..1fecd29 100644 --- a/core/src/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java +++ b/core/src/main/java/org/apache/catalina/valves/JDBCAccessLogValve.java @@ -568,7 +568,7 @@ protected void open() throws SQLException { if (driver == null) { try { Class clazz = Class.forName(driverName); - driver = (Driver) clazz.newInstance(); + driver = (Driver) clazz.getConstructor().newInstance(); } catch (Throwable e) { ExceptionUtils.handleThrowable(e); throw new SQLException(e.getMessage(), e); diff --git a/core/src/main/java/org/apache/catalina/valves/LoadBalancerDrainingValve.java b/core/src/main/java/org/apache/catalina/valves/LoadBalancerDrainingValve.java new file mode 100644 index 0000000..f443ae4 --- /dev/null +++ b/core/src/main/java/org/apache/catalina/valves/LoadBalancerDrainingValve.java @@ -0,0 +1,262 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.catalina.valves; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; + +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; +import org.apache.catalina.util.SessionConfig; + +/** + *

    A Valve to detect situations where a load-balanced node receiving a + * request has been deactivated by the load balancer (JK_LB_ACTIVATION=DIS) + * and the incoming request has no valid session.

    + * + *

    In these cases, the user's session cookie should be removed if it exists, + * any ";jsessionid" parameter should be removed from the request URI, + * and the client should be redirected to the same URI. This will cause the + * load-balanced to re-balance the client to another server.

    + * + *

    A request parameter is added to the redirect URI in order to avoid + * repeated redirects in the event of an error or misconfiguration.

    + * + *

    All this work is required because when the activation state of a node is + * DISABLED, the load-balancer will still send requests to the node if they + * appear to have a session on that node. Since mod_jk doesn't actually know + * whether the session id is valid, it will send the request blindly to + * the disabled node, which makes it take much longer to drain the node + * than strictly necessary.

    + * + *

    For testing purposes, a special cookie can be configured and used + * by a client to ignore the normal behavior of this Valve and allow + * a client to get a new session on a DISABLED node. See + * {@link #setIgnoreCookieName} and {@link #setIgnoreCookieValue} + * to configure those values.

    + * + *

    This Valve should be installed earlier in the Valve pipeline than any + * authentication valves, as the redirection should take place before an + * authentication valve would save a request to a protected resource.

    + * + * @see Load + * balancer documentation + */ +public class LoadBalancerDrainingValve + extends ValveBase +{ + /** + * The request attribute key where the load-balancer's activation state + * can be found. + */ + public static final String ATTRIBUTE_KEY_JK_LB_ACTIVATION = "JK_LB_ACTIVATION"; + + /** + * The HTTP response code that will be used to redirect the request + * back to the load-balancer for re-balancing. Defaults to 307 + * (TEMPORARY_REDIRECT). + * + * HTTP status code 305 (USE_PROXY) might be an option, here. too. + */ + private int _redirectStatusCode = HttpServletResponse.SC_TEMPORARY_REDIRECT; + + /** + * The name of the cookie which can be set to ignore the "draining" action + * of this Filter. This will allow a client to contact the server without + * being re-balanced to another server. The expected cookie value can be set + * in the {@link #_ignoreCookieValue}. The cookie name and value must match + * to avoid being re-balanced. + */ + private String _ignoreCookieName; + + /** + * The value of the cookie which can be set to ignore the "draining" action + * of this Filter. This will allow a client to contact the server without + * being re-balanced to another server. The expected cookie name can be set + * in the {@link #_ignoreCookieValue}. The cookie name and value must match + * to avoid being re-balanced. + */ + private String _ignoreCookieValue; + + public LoadBalancerDrainingValve() { + super(true); // Supports async + } + + // + // Configuration parameters + // + + /** + * Sets the HTTP response code that will be used to redirect the request + * back to the load-balancer for re-balancing. Defaults to 307 + * (TEMPORARY_REDIRECT). + * + * @param code The code to use for the redirect + */ + public void setRedirectStatusCode(int code) { + _redirectStatusCode = code; + } + + /** + * Gets the name of the cookie that can be used to override the + * re-balancing behavior of this Valve when the current node is + * in the DISABLED activation state. + * + * @return The cookie name used to ignore normal processing rules. + * + * @see #setIgnoreCookieValue + */ + public String getIgnoreCookieName() { + return _ignoreCookieName; + } + + /** + * Sets the name of the cookie that can be used to override the + * re-balancing behavior of this Valve when the current node is + * in the DISABLED activation state. + * + * There is no default value for this setting: the ability to override + * the re-balancing behavior of this Valve is disabled by default. + * + * @param cookieName The cookie name to use to ignore normal + * processing rules. + * + * @see #getIgnoreCookieValue + */ + public void setIgnoreCookieName(String cookieName) { + _ignoreCookieName = cookieName; + } + + /** + * Gets the expected value of the cookie that can be used to override the + * re-balancing behavior of this Valve when the current node is + * in the DISABLED activation state. + * + * @return The cookie value used to ignore normal processing rules. + * + * @see #setIgnoreCookieValue + */ + public String getIgnoreCookieValue() { + return _ignoreCookieValue; + } + + /** + * Sets the expected value of the cookie that can be used to override the + * re-balancing behavior of this Valve when the current node is + * in the DISABLED activation state. The "ignore" cookie's value + * must be exactly equal to this value in order to allow + * the client to override the re-balancing behavior. + * + * @param cookieValue The cookie value to use to ignore normal + * processing rules. + * + * @see #getIgnoreCookieValue + */ + public void setIgnoreCookieValue(String cookieValue) { + _ignoreCookieValue = cookieValue; + } + + @Override + public void invoke(Request request, Response response) throws IOException, ServletException { + if("DIS".equals(request.getAttribute(ATTRIBUTE_KEY_JK_LB_ACTIVATION)) + && !request.isRequestedSessionIdValid()) { + + if(containerLog.isDebugEnabled()) + containerLog.debug("Load-balancer is in DISABLED state; draining this node"); + + boolean ignoreRebalance = false; // Allow certain clients + Cookie sessionCookie = null; + + // Kill any session cookie present + final Cookie[] cookies = request.getCookies(); + + final String sessionCookieName = request.getServletContext().getSessionCookieConfig().getName(); + + // Kill any session cookie present + if(null != cookies) { + for(Cookie cookie : cookies) { + final String cookieName = cookie.getName(); + if(containerLog.isTraceEnabled()) + containerLog.trace("Checking cookie " + cookieName + "=" + cookie.getValue()); + + if(sessionCookieName.equals(cookieName) + && request.getRequestedSessionId().equals(cookie.getValue())) { + sessionCookie = cookie; + } else + // Is the client presenting a valid ignore-cookie value? + if(null != _ignoreCookieName + && _ignoreCookieName.equals(cookieName) + && null != _ignoreCookieValue + && _ignoreCookieValue.equals(cookie.getValue())) { + ignoreRebalance = true; + } + } + } + + if(ignoreRebalance) { + if(containerLog.isDebugEnabled()) + containerLog.debug("Client is presenting a valid " + _ignoreCookieName + + " cookie, re-balancing is being skipped"); + + getNext().invoke(request, response); + + return; + } + + // Kill any session cookie that was found + // TODO: Consider implications of SSO cookies + if(null != sessionCookie) { + String cookiePath = request.getServletContext().getSessionCookieConfig().getPath(); + + if(request.getContext().getSessionCookiePathUsesTrailingSlash()) { + // Handle special case of ROOT context where cookies require a path of + // '/' but the servlet spec uses an empty string + // Also ensure the cookies for a context with a path of /foo don't get + // sent for requests with a path of /foobar + if (!cookiePath.endsWith("/")) + cookiePath = cookiePath + "/"; + + sessionCookie.setPath(cookiePath); + sessionCookie.setMaxAge(0); // Delete + sessionCookie.setValue(""); // Purge the cookie's value + response.addCookie(sessionCookie); + } + } + + // Re-write the URI if it contains a ;jsessionid parameter + String uri = request.getRequestURI(); + String sessionURIParamName = SessionConfig.getSessionUriParamName(request.getContext()); + if(uri.contains(";" + sessionURIParamName + "=")) + uri = uri.replaceFirst(";" + sessionURIParamName + "=[^&?]*", ""); + + String queryString = request.getQueryString(); + + if(null != queryString) + uri = uri + "?" + queryString; + + // NOTE: Do not call response.encodeRedirectURL or the bad + // sessionid will be restored + response.setHeader("Location", uri); + response.setStatus(_redirectStatusCode); + } + else + getNext().invoke(request, response); + } +} diff --git a/core/src/main/java/org/apache/catalina/valves/LocalStrings.properties b/core/src/main/java/org/apache/catalina/valves/LocalStrings.properties index 1ade0f1..82a7703 100644 --- a/core/src/main/java/org/apache/catalina/valves/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/valves/LocalStrings.properties @@ -29,7 +29,9 @@ accessLogValve.invalidPortType=Invalid port type [{0}], using server (local) por accessLogValve.writeFail=Failed to write log message [{0}] # Error report valve -errorReportValve.statusHeader=HTTP Status [{0}] \u2013 [{1}] +# Default error page should not have '[' ']' symbols around substituted text fragments. +# https://bz.apache.org/bugzilla/show_bug.cgi?id=61134 +errorReportValve.statusHeader=HTTP Status {0} \u2013 {1} errorReportValve.type=Type errorReportValve.exceptionReport=Exception Report errorReportValve.statusReport=Status Report diff --git a/core/src/main/java/org/apache/catalina/valves/LocalStrings_es.properties b/core/src/main/java/org/apache/catalina/valves/LocalStrings_es.properties index 7c184fe..1fee2a1 100644 --- a/core/src/main/java/org/apache/catalina/valves/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/catalina/valves/LocalStrings_es.properties @@ -12,12 +12,15 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + jdbcAccessLogValve.exception = Excepci\u00F3n realizando entrada de acceso a inserci\u00F3n accessLogValve.closeFail = No pude cerrar fichero de historial accessLogValve.openDirFail = No pude crear directorio [{0}] para historiales de acceso accessLogValve.rotateFail = No pude rotar historial de acceso # Error report valve -errorReportValve.statusHeader = Estado HTTP [{0}] \u2013 [{1}] +# Default error page should not have '[' ']' symbols around substituted text fragments. +# https://bz.apache.org/bugzilla/show_bug.cgi?id=61134 +errorReportValve.statusHeader = Estado HTTP {0} \u2013 {1} errorReportValve.type=Tipo errorReportValve.exceptionReport = Informe de Excepci\u00F3n errorReportValve.statusReport = Informe de estado diff --git a/core/src/main/java/org/apache/catalina/valves/LocalStrings_fr.properties b/core/src/main/java/org/apache/catalina/valves/LocalStrings_fr.properties index 66b95e6..cd8a84e 100644 --- a/core/src/main/java/org/apache/catalina/valves/LocalStrings_fr.properties +++ b/core/src/main/java/org/apache/catalina/valves/LocalStrings_fr.properties @@ -14,7 +14,9 @@ # limitations under the License. # Error report valve -errorReportValve.statusHeader=\u00c9tat HTTP [{0}] \u2013 [{1}] +# Default error page should not have '[' ']' symbols around substituted text fragments. +# https://bz.apache.org/bugzilla/show_bug.cgi?id=61134 +errorReportValve.statusHeader=\u00c9tat HTTP {0} \u2013 {1} errorReportValve.type=Type errorReportValve.exceptionReport=Rapport d''exception errorReportValve.statusReport=Rapport d''\u00e9tat diff --git a/core/src/main/java/org/apache/catalina/valves/LocalStrings_ja.properties b/core/src/main/java/org/apache/catalina/valves/LocalStrings_ja.properties index 93b033e..bdd94a0 100644 --- a/core/src/main/java/org/apache/catalina/valves/LocalStrings_ja.properties +++ b/core/src/main/java/org/apache/catalina/valves/LocalStrings_ja.properties @@ -15,7 +15,9 @@ jdbcAccessLogValve.exception=\u30a2\u30af\u30bb\u30b9\u30a8\u30f3\u30c8\u30ea\u306e\u633f\u5165\u3092\u5b9f\u884c\u4e2d\u306e\u4f8b\u5916\u3067\u3059 # Error report valve -errorReportValve.statusHeader=HTTP\u30b9\u30c6\u30fc\u30bf\u30b9 [{0}] - [{1}] +# Default error page should not have '[' ']' symbols around substituted text fragments. +# https://bz.apache.org/bugzilla/show_bug.cgi?id=61134 +errorReportValve.statusHeader=HTTP\u30b9\u30c6\u30fc\u30bf\u30b9 {0} - {1} errorReportValve.statusReport=\u30b9\u30c6\u30fc\u30bf\u30b9\u30ec\u30dd\u30fc\u30c8 errorReportValve.message=\u30e1\u30c3\u30bb\u30fc\u30b8 errorReportValve.description=\u8aac\u660e diff --git a/core/src/main/java/org/apache/catalina/valves/RemoteAddrValve.java b/core/src/main/java/org/apache/catalina/valves/RemoteAddrValve.java index 69c7160..d8dc2a3 100644 --- a/core/src/main/java/org/apache/catalina/valves/RemoteAddrValve.java +++ b/core/src/main/java/org/apache/catalina/valves/RemoteAddrValve.java @@ -39,48 +39,12 @@ public final class RemoteAddrValve extends RequestFilterValve { private static final Log log = LogFactory.getLog(RemoteAddrValve.class); - // ----------------------------------------------------- Instance Variables - - /** - * Flag deciding whether we add the server connector port to the property - * compared in the filtering method. The port will be appended - * using a ";" as a separator. - */ - volatile boolean addConnectorPort = false; - - // ------------------------------------------------------------- Properties - - - /** - * Get the flag deciding whether we add the server connector port to the - * property compared in the filtering method. The port will be appended - * using a ";" as a separator. - * @return true to add the connector port, the default is - * false - */ - public boolean getAddConnectorPort() { - return addConnectorPort; - } - - - /** - * Set the flag deciding whether we add the server connector port to the - * property compared in the filtering method. The port will be appended - * using a ";" as a separator. - * - * @param addConnectorPort The new flag - */ - public void setAddConnectorPort(boolean addConnectorPort) { - this.addConnectorPort = addConnectorPort; - } - - // --------------------------------------------------------- Public Methods @Override public void invoke(Request request, Response response) throws IOException, ServletException { String property; - if (addConnectorPort) { + if (getAddConnectorPort()) { property = request.getRequest().getRemoteAddr() + ";" + request.getConnector().getPort(); } else { property = request.getRequest().getRemoteAddr(); diff --git a/core/src/main/java/org/apache/catalina/valves/RemoteHostValve.java b/core/src/main/java/org/apache/catalina/valves/RemoteHostValve.java index 90a9c71..d94389b 100644 --- a/core/src/main/java/org/apache/catalina/valves/RemoteHostValve.java +++ b/core/src/main/java/org/apache/catalina/valves/RemoteHostValve.java @@ -37,47 +37,12 @@ public final class RemoteHostValve extends RequestFilterValve { private static final Log log = LogFactory.getLog(RemoteHostValve.class); - // ----------------------------------------------------- Instance Variables - - /** - * Flag deciding whether we add the server connector port to the property - * compared in the filtering method. The port will be appended - * using a ";" as a separator. - */ - volatile boolean addConnectorPort = false; - - // ------------------------------------------------------------- Properties - - - /** - * Get the flag deciding whether we add the server connector port to the - * property compared in the filtering method. The port will be appended - * using a ";" as a separator. - * @return true to add the connector port - */ - public boolean getAddConnectorPort() { - return addConnectorPort; - } - - - /** - * Set the flag deciding whether we add the server connector port to the - * property compared in the filtering method. The port will be appended - * using a ";" as a separator. - * - * @param addConnectorPort The new flag - */ - public void setAddConnectorPort(boolean addConnectorPort) { - this.addConnectorPort = addConnectorPort; - } - - // --------------------------------------------------------- Public Methods @Override public void invoke(Request request, Response response) throws IOException, ServletException { String property; - if (addConnectorPort) { + if (getAddConnectorPort()) { property = request.getRequest().getRemoteHost() + ";" + request.getConnector().getPort(); } else { property = request.getRequest().getRemoteHost(); diff --git a/core/src/main/java/org/apache/catalina/valves/RequestFilterValve.java b/core/src/main/java/org/apache/catalina/valves/RequestFilterValve.java index ad6df92..010d1de 100644 --- a/core/src/main/java/org/apache/catalina/valves/RequestFilterValve.java +++ b/core/src/main/java/org/apache/catalina/valves/RequestFilterValve.java @@ -132,6 +132,13 @@ public RequestFilterValve() { */ private boolean invalidAuthenticationWhenDeny = false; + /** + * Flag deciding whether we add the server connector port to the property + * compared in the filtering method. The port will be appended + * using a ";" as a separator. + */ + private volatile boolean addConnectorPort = false; + // ------------------------------------------------------------- Properties @@ -259,6 +266,28 @@ public void setInvalidAuthenticationWhenDeny(boolean value) { } + /** + * Get the flag deciding whether we add the server connector port to the + * property compared in the filtering method. The port will be appended + * using a ";" as a separator. + * @return true to add the connector port + */ + public boolean getAddConnectorPort() { + return addConnectorPort; + } + + + /** + * Set the flag deciding whether we add the server connector port to the + * property compared in the filtering method. The port will be appended + * using a ";" as a separator. + * + * @param addConnectorPort The new flag + */ + public void setAddConnectorPort(boolean addConnectorPort) { + this.addConnectorPort = addConnectorPort; + } + // --------------------------------------------------------- Public Methods /** diff --git a/core/src/main/java/org/apache/catalina/valves/SSLValve.java b/core/src/main/java/org/apache/catalina/valves/SSLValve.java index 2a91f82..7c92c2e 100644 --- a/core/src/main/java/org/apache/catalina/valves/SSLValve.java +++ b/core/src/main/java/org/apache/catalina/valves/SSLValve.java @@ -119,54 +119,66 @@ public String mygetHeader(Request request, String header) { } return strcert0; } + + @Override - public void invoke(Request request, Response response) - throws IOException, ServletException { - - /* mod_header converts the '\n' into ' ' so we have to rebuild the client certificate */ - String strcert0 = mygetHeader(request, sslClientCertHeader); - if (strcert0 != null && strcert0.length()>28) { - String strcert1 = strcert0.replace(' ', '\n'); - String strcert2 = strcert1.substring(28, strcert1.length()-26); - String strcert3 = "-----BEGIN CERTIFICATE-----\n"; - String strcert4 = strcert3.concat(strcert2); - String strcerts = strcert4.concat("\n-----END CERTIFICATE-----\n"); - // ByteArrayInputStream bais = new ByteArrayInputStream(strcerts.getBytes("UTF-8")); - ByteArrayInputStream bais = new ByteArrayInputStream( - strcerts.getBytes(StandardCharsets.ISO_8859_1)); - X509Certificate jsseCerts[] = null; - String providerName = (String) request.getConnector().getProperty( - "clientCertProvider"); - try { - CertificateFactory cf; - if (providerName == null) { - cf = CertificateFactory.getInstance("X.509"); - } else { - cf = CertificateFactory.getInstance("X.509", providerName); + public void invoke(Request request, Response response) throws IOException, ServletException { + /* + * Known behaviours of reverse proxies that are handled by the + * processing below: + * - mod_header converts the '\n' into ' ' + * - nginx converts the '\n' into multiple ' ' + * + * The code assumes that the trimmed header value starts with + * '-----BEGIN CERTIFICATE-----' and ends with + * '-----END CERTIFICATE-----'. + * + * Note: As long as the BEGIN marker and the rest of the content are on + * separate lines, the CertificateFactory is tolerant of any + * additional whitespace. + */ + String headerValue = mygetHeader(request, sslClientCertHeader); + if (headerValue != null) { + headerValue = headerValue.trim(); + if (headerValue.length() > 27) { + String body = headerValue.substring(27); + String header = "-----BEGIN CERTIFICATE-----\n"; + String strcerts = header.concat(body); + ByteArrayInputStream bais = new ByteArrayInputStream( + strcerts.getBytes(StandardCharsets.ISO_8859_1)); + X509Certificate jsseCerts[] = null; + String providerName = (String) request.getConnector().getProperty( + "clientCertProvider"); + try { + CertificateFactory cf; + if (providerName == null) { + cf = CertificateFactory.getInstance("X.509"); + } else { + cf = CertificateFactory.getInstance("X.509", providerName); + } + X509Certificate cert = (X509Certificate) cf.generateCertificate(bais); + jsseCerts = new X509Certificate[1]; + jsseCerts[0] = cert; + } catch (java.security.cert.CertificateException e) { + log.warn(sm.getString("sslValve.certError", strcerts), e); + } catch (NoSuchProviderException e) { + log.error(sm.getString( + "sslValve.invalidProvider", providerName), e); } - X509Certificate cert = (X509Certificate) cf.generateCertificate(bais); - jsseCerts = new X509Certificate[1]; - jsseCerts[0] = cert; - } catch (java.security.cert.CertificateException e) { - log.warn(sm.getString("sslValve.certError", strcerts), e); - } catch (NoSuchProviderException e) { - log.error(sm.getString( - "sslValve.invalidProvider", providerName), e); + request.setAttribute(Globals.CERTIFICATES_ATTR, jsseCerts); } - request.setAttribute(Globals.CERTIFICATES_ATTR, jsseCerts); } - strcert0 = mygetHeader(request, sslCipherHeader); - if (strcert0 != null) { - request.setAttribute(Globals.CIPHER_SUITE_ATTR, strcert0); + headerValue = mygetHeader(request, sslCipherHeader); + if (headerValue != null) { + request.setAttribute(Globals.CIPHER_SUITE_ATTR, headerValue); } - strcert0 = mygetHeader(request, sslSessionIdHeader); - if (strcert0 != null) { - request.setAttribute(Globals.SSL_SESSION_ID_ATTR, strcert0); + headerValue = mygetHeader(request, sslSessionIdHeader); + if (headerValue != null) { + request.setAttribute(Globals.SSL_SESSION_ID_ATTR, headerValue); } - strcert0 = mygetHeader(request, sslCipherUserKeySizeHeader); - if (strcert0 != null) { - request.setAttribute(Globals.KEY_SIZE_ATTR, - Integer.valueOf(strcert0)); + headerValue = mygetHeader(request, sslCipherUserKeySizeHeader); + if (headerValue != null) { + request.setAttribute(Globals.KEY_SIZE_ATTR, Integer.valueOf(headerValue)); } getNext().invoke(request, response); } diff --git a/core/src/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java b/core/src/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java index 3a71f52..a4f7bd0 100644 --- a/core/src/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java +++ b/core/src/main/java/org/apache/catalina/valves/StuckThreadDetectionValve.java @@ -420,6 +420,6 @@ public long getTotalActiveTime() { } private enum MonitoredThreadState { - RUNNING, STUCK, DONE; + RUNNING, STUCK, DONE } } diff --git a/core/src/main/java/org/apache/catalina/valves/mbeans-descriptors.xml b/core/src/main/java/org/apache/catalina/valves/mbeans-descriptors.xml index c2d25a2..afacb41 100644 --- a/core/src/main/java/org/apache/catalina/valves/mbeans-descriptors.xml +++ b/core/src/main/java/org/apache/catalina/valves/mbeans-descriptors.xml @@ -336,7 +336,6 @@ 0); + return resource.isFile() && resource.getContentLength() > 0; default: return false; } diff --git a/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java b/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java index 8349f9a..bdaabe8 100644 --- a/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java +++ b/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteRule.java @@ -17,6 +17,7 @@ package org.apache.catalina.valves.rewrite; import java.util.ArrayList; +import java.util.Arrays; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -67,10 +68,7 @@ public void parse(Map maps) { } public void addCondition(RewriteCond condition) { - RewriteCond[] conditions = new RewriteCond[this.conditions.length + 1]; - for (int i = 0; i < this.conditions.length; i++) { - conditions[i] = this.conditions[i]; - } + RewriteCond[] conditions = Arrays.copyOf(this.conditions, this.conditions.length + 1); conditions[this.conditions.length] = condition; this.conditions = conditions; } @@ -268,14 +266,6 @@ public String toString() { protected boolean nosubreq = false; /** - * This flag forces the substitution part to be internally forced as a proxy - * request and immediately (i.e., rewriting rule processing stops here) put - * through the proxy module. You have to make sure that the substitution string - * is a valid URI (e.g., typically starting with http://hostname) which can be - * handled by the Apache proxy module. If not you get an error from the proxy - * module. Use this flag to achieve a more powerful implementation of the - * ProxyPass directive, to map some remote stuff into the namespace of - * the local server. * Note: No proxy */ diff --git a/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java b/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java index 5adff68..ad74bd1 100644 --- a/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java +++ b/core/src/main/java/org/apache/catalina/valves/rewrite/RewriteValve.java @@ -27,7 +27,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Hashtable; -import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.StringTokenizer; @@ -201,8 +201,8 @@ public String getConfiguration() { } protected void parse(BufferedReader reader) throws LifecycleException { - ArrayList rules = new ArrayList<>(); - ArrayList conditions = new ArrayList<>(); + List rules = new ArrayList<>(); + List conditions = new ArrayList<>(); while (true) { try { String line = reader.readLine(); @@ -259,9 +259,7 @@ protected void parse(BufferedReader reader) throws LifecycleException { @Override protected synchronized void stopInternal() throws LifecycleException { super.stopInternal(); - Iterator values = maps.values().iterator(); - while (values.hasNext()) { - RewriteMap map = values.next(); + for (RewriteMap map : maps.values()) { if (map instanceof Lifecycle) { ((Lifecycle) map).stop(); } @@ -525,18 +523,18 @@ public void invoke(Request request, Response response) } request.getMappingData().recycle(); // Reinvoke the whole request recursively + Connector connector = request.getConnector(); try { - Connector connector = request.getConnector(); if (!connector.getProtocolHandler().getAdapter().prepare( request.getCoyoteRequest(), response.getCoyoteResponse())) { return; } - Pipeline pipeline = connector.getService().getContainer().getPipeline(); - request.setAsyncSupported(pipeline.isAsyncSupported()); - pipeline.getFirst().invoke(request, response); } catch (Exception e) { // This doesn't actually happen in the Catalina adapter implementation } + Pipeline pipeline = connector.getService().getContainer().getPipeline(); + request.setAsyncSupported(pipeline.isAsyncSupported()); + pipeline.getFirst().invoke(request, response); } } else { getNext().invoke(request, response); @@ -652,7 +650,8 @@ public static Object parse(String line) { String rewriteMapClassName = tokenizer.nextToken(); RewriteMap map = null; try { - map = (RewriteMap) (Class.forName(rewriteMapClassName).newInstance()); + map = (RewriteMap) (Class.forName( + rewriteMapClassName).getConstructor().newInstance()); } catch (Exception e) { throw new IllegalArgumentException("Invalid map className: " + line); } @@ -760,9 +759,8 @@ protected static void parseRuleFlag(String line, RewriteRule rule, String flag) rule.setNoescape(true); } else if (flag.startsWith("next") || flag.startsWith("N")) { rule.setNext(true); - // FIXME: Proxy not supported, would require proxy capabilities in Tomcat - /* } else if (flag.startsWith("proxy") || flag.startsWith("P")) { - rule.setProxy(true);*/ + // Note: Proxy is not supported as Tomcat does not have proxy + // capabilities } else if (flag.startsWith("qsappend") || flag.startsWith("QSA")) { rule.setQsappend(true); } else if (flag.startsWith("redirect") || flag.startsWith("R")) { diff --git a/core/src/main/java/org/apache/catalina/valves/rewrite/Substitution.java b/core/src/main/java/org/apache/catalina/valves/rewrite/Substitution.java index d723192..441ae4b 100644 --- a/core/src/main/java/org/apache/catalina/valves/rewrite/Substitution.java +++ b/core/src/main/java/org/apache/catalina/valves/rewrite/Substitution.java @@ -17,6 +17,7 @@ package org.apache.catalina.valves.rewrite; import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -126,7 +127,7 @@ void setEscapeBackReferences(boolean escapeBackReferences) { public void parse(Map maps) { - ArrayList elements = new ArrayList<>(); + List elements = new ArrayList<>(); int pos = 0; int percentPos = 0; int dollarPos = 0; diff --git a/core/src/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java index 195b8a8..db39f47 100644 --- a/core/src/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java +++ b/core/src/main/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java @@ -21,8 +21,6 @@ import java.io.InputStream; import java.net.URL; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.jar.JarEntry; @@ -32,6 +30,7 @@ import org.apache.catalina.WebResource; import org.apache.catalina.WebResourceRoot; import org.apache.catalina.util.ResourceSet; +import org.apache.tomcat.util.compat.JreCompat; public abstract class AbstractArchiveResourceSet extends AbstractResourceSet { @@ -39,7 +38,7 @@ public abstract class AbstractArchiveResourceSet extends AbstractResourceSet { private String baseUrlString; private JarFile archive = null; - protected HashMap archiveEntries = null; + protected Map archiveEntries = null; protected final Object archiveLock = new Object(); private long archiveUseCount = 0; @@ -76,9 +75,7 @@ public final String[] list(String path) { if (pathInJar.length() > 0 && pathInJar.charAt(0) == '/') { pathInJar = pathInJar.substring(1); } - Iterator entries = getArchiveEntries(false).keySet().iterator(); - while (entries.hasNext()) { - String name = entries.next(); + for (String name : getArchiveEntries(false).keySet()) { if (name.length() > pathInJar.length() && name.startsWith(pathInJar)) { if (name.charAt(name.length() - 1) == '/') { @@ -135,9 +132,7 @@ public final Set listWebAppPaths(String path) { } } - Iterator entries = getArchiveEntries(false).keySet().iterator(); - while (entries.hasNext()) { - String name = entries.next(); + for (String name : getArchiveEntries(false).keySet()) { if (name.length() > pathInJar.length() && name.startsWith(pathInJar)) { int nextSlash = name.indexOf('/', pathInJar.length()); @@ -179,7 +174,7 @@ public final Set listWebAppPaths(String path) { * @return The archives entries mapped to their names or null if * {@link #getArchiveEntry(String)} should be used. */ - protected abstract HashMap getArchiveEntries(boolean single); + protected abstract Map getArchiveEntries(boolean single); /** @@ -253,23 +248,28 @@ public final WebResource getResource(String path) { return new JarResourceRoot(root, new File(getBase()), baseUrlString, path); } else { - Map jarEntries = getArchiveEntries(true); JarEntry jarEntry = null; - if (!(pathInJar.charAt(pathInJar.length() - 1) == '/')) { - if (jarEntries == null) { - jarEntry = getArchiveEntry(pathInJar + '/'); - } else { - jarEntry = jarEntries.get(pathInJar + '/'); - } - if (jarEntry != null) { - path = path + '/'; + if (isMultiRelease()) { + // Calls JarFile.getJarEntry() which is multi-release aware + jarEntry = getArchiveEntry(pathInJar); + } else { + Map jarEntries = getArchiveEntries(true); + if (!(pathInJar.charAt(pathInJar.length() - 1) == '/')) { + if (jarEntries == null) { + jarEntry = getArchiveEntry(pathInJar + '/'); + } else { + jarEntry = jarEntries.get(pathInJar + '/'); + } + if (jarEntry != null) { + path = path + '/'; + } } - } - if (jarEntry == null) { - if (jarEntries == null) { - jarEntry = getArchiveEntry(pathInJar); - } else { - jarEntry = jarEntries.get(pathInJar); + if (jarEntry == null) { + if (jarEntries == null) { + jarEntry = getArchiveEntry(pathInJar); + } else { + jarEntry = jarEntries.get(pathInJar); + } } } if (jarEntry == null) { @@ -283,6 +283,8 @@ public final WebResource getResource(String path) { } } + protected abstract boolean isMultiRelease(); + protected abstract WebResource createArchiveResource(JarEntry jarEntry, String webAppPath, Manifest manifest); @@ -305,7 +307,7 @@ public void setReadOnly(boolean readOnly) { protected JarFile openJarFile() throws IOException { synchronized (archiveLock) { if (archive == null) { - archive = new JarFile(getBase()); + archive = JreCompat.getInstance().jarFileNewInstance(getBase()); } archiveUseCount++; return archive; diff --git a/core/src/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java index e3e485a..b79f88b 100644 --- a/core/src/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java +++ b/core/src/main/java/org/apache/catalina/webresources/AbstractFileResourceSet.java @@ -22,6 +22,7 @@ import java.net.URL; import org.apache.catalina.LifecycleException; +import org.apache.tomcat.util.compat.JrePlatform; import org.apache.tomcat.util.http.RequestUtil; public abstract class AbstractFileResourceSet extends AbstractResourceSet { @@ -57,53 +58,113 @@ protected final File file(String name, boolean mustExist) { name = ""; } File file = new File(fileBase, name); - if (!mustExist || file.canRead()) { - if (getRoot().getAllowLinking()) { - return file; - } + // If the requested names ends in '/', the Java File API will return a + // matching file if one exists. This isn't what we want as it is not + // consistent with the Servlet spec rules for request mapping. + if (name.endsWith("/") && file.isFile()) { + return null; + } - // Check that this file is located under the WebResourceSet's base - String canPath = null; - try { - canPath = file.getCanonicalPath(); - } catch (IOException e) { - // Ignore - } - if (canPath == null) - return null; + // If the file/dir must exist but the identified file/dir can't be read + // then signal that the resource was not found + if (mustExist && !file.canRead()) { + return null; + } - if (!canPath.startsWith(canonicalBase)) { - return null; - } + // If allow linking is enabled, files are not limited to being located + // under the fileBase so all further checks are disabled. + if (getRoot().getAllowLinking()) { + return file; + } - // Case sensitivity check - // Note: We know the resource is located somewhere under base at - // point. The purpose of this code is to check in a case - // sensitive manner, the path to the resource under base - // agrees with what was requested - String fileAbsPath = file.getAbsolutePath(); - if (fileAbsPath.endsWith(".")) - fileAbsPath = fileAbsPath + '/'; - String absPath = normalize(fileAbsPath); - if ((absoluteBase.length() < absPath.length()) - && (canonicalBase.length() < canPath.length())) { - absPath = absPath.substring(absoluteBase.length() + 1); - if (absPath.equals("")) - absPath = "/"; - canPath = canPath.substring(canonicalBase.length() + 1); - if (canPath.equals("")) - canPath = "/"; - if (!canPath.equals(absPath)) - return null; - } + // Additional Windows specific checks to handle known problems with + // File.getCanonicalPath() + if (JrePlatform.IS_WINDOWS && isInvalidWindowsFilename(name)) { + return null; + } - } else { + // Check that this file is located under the WebResourceSet's base + String canPath = null; + try { + canPath = file.getCanonicalPath(); + } catch (IOException e) { + // Ignore + } + if (canPath == null || !canPath.startsWith(canonicalBase)) { return null; } + + // Ensure that the file is not outside the fileBase. This should not be + // possible for standard requests (the request is normalized early in + // the request processing) but might be possible for some access via the + // Servlet API (RequestDispatcher, HTTP/2 push etc.) therefore these + // checks are retained as an additional safety measure + // absoluteBase has been normalized so absPath needs to be normalized as + // well. + String absPath = normalize(file.getAbsolutePath()); + if (absoluteBase.length() > absPath.length()) { + return null; + } + + // Remove the fileBase location from the start of the paths since that + // was not part of the requested path and the remaining check only + // applies to the request path + absPath = absPath.substring(absoluteBase.length()); + canPath = canPath.substring(canonicalBase.length()); + + // Case sensitivity check + // The normalized requested path should be an exact match the equivalent + // canonical path. If it is not, possible reasons include: + // - case differences on case insensitive file systems + // - Windows removing a trailing ' ' or '.' from the file name + // + // In all cases, a mis-match here results in the resource not being + // found + // + // absPath is normalized so canPath needs to be normalized as well + // Can't normalize canPath earlier as canonicalBase is not normalized + if (canPath.length() > 0) { + canPath = normalize(canPath); + } + if (!canPath.equals(absPath)) { + return null; + } + return file; } + + private boolean isInvalidWindowsFilename(String name) { + final int len = name.length(); + if (len == 0) { + return false; + } + // This consistently ~10 times faster than the equivalent regular + // expression irrespective of input length. + for (int i = 0; i < len; i++) { + char c = name.charAt(i); + if (c == '\"' || c == '<' || c == '>') { + // These characters are disallowed in Windows file names and + // there are known problems for file names with these characters + // when using File#getCanonicalPath(). + // Note: There are additional characters that are disallowed in + // Windows file names but these are not known to cause + // problems when using File#getCanonicalPath(). + return true; + } + } + // Windows does not allow file names to end in ' ' unless specific low + // level APIs are used to create the files that bypass various checks. + // File names that end in ' ' are known to cause problems when using + // File#getCanonicalPath(). + if (name.charAt(len -1) == ' ') { + return true; + } + return false; + } + + /** * Return a context-relative path, beginning with a "/", that represents * the canonical version of the specified path after ".." and "." elements @@ -114,7 +175,7 @@ protected final File file(String name, boolean mustExist) { * @param path Path to be normalized */ private String normalize(String path) { - return RequestUtil.normalize(path, File.separatorChar == '/'); + return RequestUtil.normalize(path, File.separatorChar == '\\'); } @Override @@ -144,11 +205,7 @@ protected void initInternal() throws LifecycleException { fileBase = new File(getBase(), getInternalPath()); checkType(fileBase); - String absolutePath = fileBase.getAbsolutePath(); - if (absolutePath.endsWith(".")) { - absolutePath = absolutePath + '/'; - } - this.absoluteBase = normalize(absolutePath); + this.absoluteBase = normalize(fileBase.getAbsolutePath()); try { this.canonicalBase = fileBase.getCanonicalPath(); diff --git a/core/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java index 2257803..107607c 100644 --- a/core/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java +++ b/core/src/main/java/org/apache/catalina/webresources/AbstractSingleArchiveResourceSet.java @@ -21,12 +21,14 @@ import java.net.MalformedURLException; import java.util.Enumeration; import java.util.HashMap; +import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; import org.apache.catalina.LifecycleException; import org.apache.catalina.WebResourceRoot; import org.apache.tomcat.util.buf.UriUtil; +import org.apache.tomcat.util.compat.JreCompat; /** * Base class for a {@link org.apache.catalina.WebResourceSet} based on a @@ -34,6 +36,8 @@ */ public abstract class AbstractSingleArchiveResourceSet extends AbstractArchiveResourceSet { + private volatile Boolean multiRelease; + /** * A no argument constructor is required for this to work with the digester. */ @@ -59,7 +63,7 @@ public AbstractSingleArchiveResourceSet(WebResourceRoot root, String webAppMount @Override - protected HashMap getArchiveEntries(boolean single) { + protected Map getArchiveEntries(boolean single) { synchronized (archiveLock) { if (archiveEntries == null && !single) { JarFile jarFile = null; @@ -103,11 +107,37 @@ protected JarEntry getArchiveEntry(String pathInArchive) { } + @Override + protected boolean isMultiRelease() { + if (multiRelease == null) { + synchronized (archiveLock) { + if (multiRelease == null) { + JarFile jarFile = null; + try { + jarFile = openJarFile(); + multiRelease = Boolean.valueOf( + JreCompat.getInstance().jarFileIsMultiRelease(jarFile)); + } catch (IOException ioe) { + // Should never happen + throw new IllegalStateException(ioe); + } finally { + if (jarFile != null) { + closeJarFile(); + } + } + } + } + } + + return multiRelease.booleanValue(); + } + + //-------------------------------------------------------- Lifecycle methods @Override protected void initInternal() throws LifecycleException { - try (JarFile jarFile = new JarFile(getBase())) { + try (JarFile jarFile = JreCompat.getInstance().jarFileNewInstance(getBase())) { setManifest(jarFile.getManifest()); } catch (IOException ioe) { throw new IllegalArgumentException(ioe); diff --git a/core/src/main/java/org/apache/catalina/webresources/CachedResource.java b/core/src/main/java/org/apache/catalina/webresources/CachedResource.java index eab461c..aaba6f6 100644 --- a/core/src/main/java/org/apache/catalina/webresources/CachedResource.java +++ b/core/src/main/java/org/apache/catalina/webresources/CachedResource.java @@ -92,23 +92,26 @@ protected boolean validateResource(boolean useClassLoaderResources) { return true; } - WebResource webResourceInternal = root.getResourceInternal( - webAppPath, useClassLoaderResources); - if (!webResource.exists() && webResourceInternal.exists()) { - return false; - } + // Assume resources inside WARs will not change + if (!root.isPackedWarFile()) { + WebResource webResourceInternal = root.getResourceInternal( + webAppPath, useClassLoaderResources); + if (!webResource.exists() && webResourceInternal.exists()) { + return false; + } - // If modified date or length change - resource has changed / been - // removed etc. - if (webResource.getLastModified() != getLastModified() || - webResource.getContentLength() != getContentLength()) { - return false; - } + // If modified date or length change - resource has changed / been + // removed etc. + if (webResource.getLastModified() != getLastModified() || + webResource.getContentLength() != getContentLength()) { + return false; + } - // Has a resource been inserted / removed in a different resource set - if (webResource.getLastModified() != webResourceInternal.getLastModified() || - webResource.getContentLength() != webResourceInternal.getContentLength()) { - return false; + // Has a resource been inserted / removed in a different resource set + if (webResource.getLastModified() != webResourceInternal.getLastModified() || + webResource.getContentLength() != webResourceInternal.getContentLength()) { + return false; + } } nextCheck = ttl + now; @@ -133,9 +136,15 @@ protected boolean validateResources(boolean useClassLoaderResources) { return true; } - // At this point, always expire the entry as re-populating it is likely - // to be as expensive as validating it. - return false; + // Assume resources inside WARs will not change + if (root.isPackedWarFile()) { + nextCheck = ttl + now; + return true; + } else { + // At this point, always expire the entry and re-populating it is + // likely to be as expensive as validating it. + return false; + } } protected long getNextCheck() { diff --git a/core/src/main/java/org/apache/catalina/webresources/DirResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/DirResourceSet.java index e5b708d..234dc74 100644 --- a/core/src/main/java/org/apache/catalina/webresources/DirResourceSet.java +++ b/core/src/main/java/org/apache/catalina/webresources/DirResourceSet.java @@ -217,6 +217,12 @@ public boolean write(String path, InputStream is, boolean overwrite) { return false; } + // write() is meant to create a file so ensure that the path doesn't + // end in '/' + if (path.endsWith("/")) { + return false; + } + File dest = null; String webAppMount = getWebAppMount(); if (path.startsWith(webAppMount)) { diff --git a/core/src/main/java/org/apache/catalina/webresources/ExtractingRoot.java b/core/src/main/java/org/apache/catalina/webresources/ExtractingRoot.java new file mode 100644 index 0000000..32448ad --- /dev/null +++ b/core/src/main/java/org/apache/catalina/webresources/ExtractingRoot.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.catalina.webresources; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.servlet.ServletContext; + +import org.apache.catalina.LifecycleException; +import org.apache.catalina.WebResource; +import org.apache.catalina.startup.ExpandWar; +import org.apache.catalina.util.IOTools; +import org.apache.tomcat.util.res.StringManager; + +/** + * If the main resources are packaged as a WAR file then any JARs will be + * extracted to the work directory and used from there. + */ +public class ExtractingRoot extends StandardRoot { + + private static final StringManager sm = StringManager.getManager(ExtractingRoot.class); + + private static final String APPLICATION_JARS_DIR = "application-jars"; + + @Override + protected void processWebInfLib() throws LifecycleException { + + // Don't extract JAR files unless the application is deployed as a + // packed WAR file. + if (!super.isPackedWarFile()) { + super.processWebInfLib(); + return; + } + + File expansionTarget = getExpansionTarget(); + if (!expansionTarget.isDirectory()) { + if (!expansionTarget.mkdirs()) { + throw new LifecycleException( + sm.getString("extractingRoot.targetFailed", expansionTarget)); + } + } + + WebResource[] possibleJars = listResources("/WEB-INF/lib", false); + + for (WebResource possibleJar : possibleJars) { + if (possibleJar.isFile() && possibleJar.getName().endsWith(".jar")) { + try { + File dest = new File(expansionTarget, possibleJar.getName()); + dest = dest.getCanonicalFile(); + try (InputStream sourceStream = possibleJar.getInputStream(); + OutputStream destStream= new FileOutputStream(dest)) { + IOTools.flow(sourceStream, destStream); + } + + createWebResourceSet(ResourceSetType.CLASSES_JAR, + "/WEB-INF/classes", dest.toURI().toURL(), "/"); + } catch (IOException ioe) { + throw new LifecycleException( + sm.getString("extractingRoot.jarFailed", possibleJar.getName()), ioe); + } + } + } + } + + private File getExpansionTarget() { + File tmpDir = (File) getContext().getServletContext().getAttribute(ServletContext.TEMPDIR); + File expansionTarget = new File(tmpDir, APPLICATION_JARS_DIR); + return expansionTarget; + } + + + @Override + protected boolean isPackedWarFile() { + return false; + } + + + @Override + protected void stopInternal() throws LifecycleException { + super.stopInternal(); + + if (super.isPackedWarFile()) { + // Remove the extracted JARs from the work directory + File expansionTarget = getExpansionTarget(); + ExpandWar.delete(expansionTarget); + } + } +} diff --git a/core/src/main/java/org/apache/catalina/webresources/FileResource.java b/core/src/main/java/org/apache/catalina/webresources/FileResource.java index 03697d2..f3f89e0 100644 --- a/core/src/main/java/org/apache/catalina/webresources/FileResource.java +++ b/core/src/main/java/org/apache/catalina/webresources/FileResource.java @@ -47,7 +47,7 @@ public class FileResource extends AbstractResource { boolean isEBCDIC = false; try { String encoding = System.getProperty("file.encoding"); - if (encoding.indexOf("EBCDIC") != -1) { + if (encoding.contains("EBCDIC")) { isEBCDIC = true; } } catch (SecurityException e) { diff --git a/core/src/main/java/org/apache/catalina/webresources/JarWarResourceSet.java b/core/src/main/java/org/apache/catalina/webresources/JarWarResourceSet.java index 805d8dd..a0a426c 100644 --- a/core/src/main/java/org/apache/catalina/webresources/JarWarResourceSet.java +++ b/core/src/main/java/org/apache/catalina/webresources/JarWarResourceSet.java @@ -21,6 +21,9 @@ import java.io.InputStream; import java.net.MalformedURLException; import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarInputStream; @@ -30,6 +33,7 @@ import org.apache.catalina.WebResource; import org.apache.catalina.WebResourceRoot; import org.apache.tomcat.util.buf.UriUtil; +import org.apache.tomcat.util.compat.JreCompat; /** * Represents a {@link org.apache.catalina.WebResourceSet} based on a JAR file @@ -94,42 +98,50 @@ protected WebResource createArchiveResource(JarEntry jarEntry, * returned. */ @Override - protected HashMap getArchiveEntries(boolean single) { + protected Map getArchiveEntries(boolean single) { synchronized (archiveLock) { if (archiveEntries == null) { JarFile warFile = null; InputStream jarFileIs = null; archiveEntries = new HashMap<>(); + boolean multiRelease = false; try { warFile = openJarFile(); JarEntry jarFileInWar = warFile.getJarEntry(archivePath); jarFileIs = warFile.getInputStream(jarFileInWar); - try (JarInputStream jarIs = new JarInputStream(jarFileIs)) { + try (TomcatJarInputStream jarIs = new TomcatJarInputStream(jarFileIs)) { JarEntry entry = jarIs.getNextJarEntry(); - boolean hasMetaInf = false; while (entry != null) { - if (!hasMetaInf && entry.getName().startsWith("META-INF/")) { - hasMetaInf = true; - } archiveEntries.put(entry.getName(), entry); entry = jarIs.getNextJarEntry(); } - setManifest(jarIs.getManifest()); - // Hacks to work-around JarInputStream swallowing these - // entries. The attributes for these entries will be - // incomplete. Making the attributes available would - // require (re-)reading the stream as a ZipInputStream - // and creating JarEntry objects from the ZipEntries. - if (hasMetaInf) { - JarEntry metaInfDir = new JarEntry("META-INF/"); - archiveEntries.put(metaInfDir.getName(), metaInfDir); + Manifest m = jarIs.getManifest(); + setManifest(m); + if (m != null && JreCompat.isJre9Available()) { + String value = m.getMainAttributes().getValue("Multi-Release"); + if (value != null) { + multiRelease = Boolean.parseBoolean(value); + } } - if (jarIs.getManifest() != null) { - JarEntry manifest = new JarEntry("META-INF/MANIFEST.MF"); - archiveEntries.put(manifest.getName(), manifest); + // Hack to work-around JarInputStream swallowing these + // entries. TomcatJarInputStream is used above which + // extends JarInputStream and the method that creates + // the entries over-ridden so we can a) tell if the + // entries are present and b) cache them so we can + // access them here. + entry = jarIs.getMetaInfEntry(); + if (entry != null) { + archiveEntries.put(entry.getName(), entry); + } + entry = jarIs.getManifestEntry(); + if (entry != null) { + archiveEntries.put(entry.getName(), entry); } } + if (multiRelease) { + processArchivesEntriesForMultiRelease(); + } } catch (IOException ioe) { // Should never happen archiveEntries = null; @@ -152,6 +164,56 @@ protected HashMap getArchiveEntries(boolean single) { } + protected void processArchivesEntriesForMultiRelease() { + + int targetVersion = JreCompat.getInstance().jarFileRuntimeMajorVersion(); + + Map versionedEntries = new HashMap<>(); + Iterator> iter = archiveEntries.entrySet().iterator(); + while (iter.hasNext()) { + Entry entry = iter.next(); + String name = entry.getKey(); + if (name.startsWith("META-INF/versions/")) { + // Remove the multi-release version + iter.remove(); + + // Get the base name and version for this versioned entry + int i = name.indexOf('/', 18); + if (i > 0) { + String baseName = name.substring(i + 1); + int version = Integer.parseInt(name.substring(18, i)); + + // Ignore any entries targeting for a later version than + // the target for this runtime + if (version <= targetVersion) { + VersionedJarEntry versionedJarEntry = versionedEntries.get(baseName); + if (versionedJarEntry == null) { + // No versioned entry found for this name. Create + // one. + versionedEntries.put(baseName, + new VersionedJarEntry(version, entry.getValue())); + } else { + // Ignore any entry for which we have already found + // a later version + if (version > versionedJarEntry.getVersion()) { + // Replace the entry targeted at an earlier + // version + versionedEntries.put(baseName, + new VersionedJarEntry(version, entry.getValue())); + } + } + } + } + } + } + + for (Entry versionedJarEntry : versionedEntries.entrySet()) { + archiveEntries.put(versionedJarEntry.getKey(), + versionedJarEntry.getValue().getJarEntry()); + } + } + + /** * {@inheritDoc} *

    @@ -164,6 +226,14 @@ protected JarEntry getArchiveEntry(String pathInArchive) { } + @Override + protected boolean isMultiRelease() { + // This always returns false otherwise the superclass will call + // #getArchiveEntry(String) + return false; + } + + //-------------------------------------------------------- Lifecycle methods @Override protected void initInternal() throws LifecycleException { @@ -185,4 +255,25 @@ protected void initInternal() throws LifecycleException { throw new IllegalArgumentException(e); } } + + + private static final class VersionedJarEntry { + private final int version; + private final JarEntry jarEntry; + + public VersionedJarEntry(int version, JarEntry jarEntry) { + this.version = version; + this.jarEntry = jarEntry; + } + + + public int getVersion() { + return version; + } + + + public JarEntry getJarEntry() { + return jarEntry; + } + } } diff --git a/core/src/main/java/org/apache/catalina/webresources/LocalStrings.properties b/core/src/main/java/org/apache/catalina/webresources/LocalStrings.properties index 2f7921a..eea644a 100644 --- a/core/src/main/java/org/apache/catalina/webresources/LocalStrings.properties +++ b/core/src/main/java/org/apache/catalina/webresources/LocalStrings.properties @@ -32,6 +32,9 @@ dirResourceSet.notDirectory=The directory specified by base and internal path [{ dirResourceSet.writeExists=The target of the write already exists dirResourceSet.writeNpe=The input stream may not be null +extractingRoot.targetFailed=Failed to create the directory [{0}] for extracted JAR files +extractingRoot.jarFailed=Failed to extract the JAR file [{0}] + fileResource.getCanonicalPathFail=Unable to determine the canonical path for the resource [{0}] fileResource.getCreationFail=Unable to determine the creation time for the resource [{0}] fileResource.getUrlFail=Unable to determine a URL for the resource [{0}] diff --git a/core/src/main/java/org/apache/catalina/webresources/StandardRoot.java b/core/src/main/java/org/apache/catalina/webresources/StandardRoot.java index cc389d6..ba2bf39 100644 --- a/core/src/main/java/org/apache/catalina/webresources/StandardRoot.java +++ b/core/src/main/java/org/apache/catalina/webresources/StandardRoot.java @@ -142,7 +142,7 @@ public Set listWebAppPaths(String path) { path = validate(path); // Set because we don't want duplicates - HashSet result = new HashSet<>(); + Set result = new HashSet<>(); for (List list : allResources) { for (WebResourceSet webResourceSet : list) { if (!webResourceSet.getClassLoaderOnly()) { @@ -344,7 +344,7 @@ public WebResource[] listResources(String path) { return listResources(path, true); } - private WebResource[] listResources(String path, boolean validate) { + protected WebResource[] listResources(String path, boolean validate) { if (validate) { path = validate(path); } @@ -574,8 +574,11 @@ public void setContext(Context context) { * the methods that are explicitly defined to return class loader resources. * This prevents calls to getResource("/WEB-INF/classes") returning from one * or more of the JAR files. + * + * @throws LifecycleException If an error occurs that should stop the web + * application from starting */ - private void processWebInfLib() { + protected void processWebInfLib() throws LifecycleException { WebResource[] possibleJars = listResources("/WEB-INF/lib", false); for (WebResource possibleJar : possibleJars) { @@ -642,6 +645,18 @@ public List getBaseUrls() { return result; } + + + /* + * Returns true if and only if all the resources for this web application + * are provided via a packed WAR file. It is used to optimise cache + * validation in this case on the basis that the WAR file will not change. + */ + protected boolean isPackedWarFile() { + return main instanceof WarResourceSet && preResources.isEmpty() && postResources.isEmpty(); + } + + // ----------------------------------------------------------- JMX Lifecycle @Override protected String getDomainInternal() { diff --git a/core/src/main/java/org/apache/catalina/webresources/TomcatJarInputStream.java b/core/src/main/java/org/apache/catalina/webresources/TomcatJarInputStream.java new file mode 100644 index 0000000..a00dda5 --- /dev/null +++ b/core/src/main/java/org/apache/catalina/webresources/TomcatJarInputStream.java @@ -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. + */ +package org.apache.catalina.webresources; + +import java.io.IOException; +import java.io.InputStream; +import java.util.jar.JarEntry; +import java.util.jar.JarInputStream; +import java.util.zip.ZipEntry; + +/** + * The purpose of this sub-class is to obtain references to the JarEntry objects + * for META-INF/ and META-INF/MANIFEST.MF that are otherwise swallowed by the + * JarInputStream implementation. + */ +public class TomcatJarInputStream extends JarInputStream { + + private JarEntry metaInfEntry; + private JarEntry manifestEntry; + + + TomcatJarInputStream(InputStream in) throws IOException { + super(in); + } + + + @Override + protected ZipEntry createZipEntry(String name) { + ZipEntry ze = super.createZipEntry(name); + if (metaInfEntry == null && "META-INF/".equals(name)) { + metaInfEntry = (JarEntry) ze; + } else if (manifestEntry == null && "META-INF/MANIFESR.MF".equals(name)) { + manifestEntry = (JarEntry) ze; + } + return ze; + } + + + JarEntry getMetaInfEntry() { + return metaInfEntry; + } + + + JarEntry getManifestEntry() { + return manifestEntry; + } +} diff --git a/core/src/main/java/org/apache/catalina/webresources/war/WarURLConnection.java b/core/src/main/java/org/apache/catalina/webresources/war/WarURLConnection.java index 5c74a9c..371acf8 100644 --- a/core/src/main/java/org/apache/catalina/webresources/war/WarURLConnection.java +++ b/core/src/main/java/org/apache/catalina/webresources/war/WarURLConnection.java @@ -57,4 +57,10 @@ public InputStream getInputStream() throws IOException { public Permission getPermission() throws IOException { return wrappedJarUrlConnection.getPermission(); } + + + @Override + public long getLastModified() { + return wrappedJarUrlConnection.getLastModified(); + } } diff --git a/core/src/main/java/org/apache/coyote/AbstractProcessor.java b/core/src/main/java/org/apache/coyote/AbstractProcessor.java index 4f3a06f..7a4ca71 100644 --- a/core/src/main/java/org/apache/coyote/AbstractProcessor.java +++ b/core/src/main/java/org/apache/coyote/AbstractProcessor.java @@ -42,7 +42,7 @@ public abstract class AbstractProcessor extends AbstractProcessorLight implement private static final StringManager sm = StringManager.getManager(AbstractProcessor.class); - protected Adapter adapter; + protected final Adapter adapter; protected final AsyncStateMachine asyncStateMachine; private volatile long asyncTimeout = -1; protected final Request request; @@ -57,12 +57,13 @@ public abstract class AbstractProcessor extends AbstractProcessorLight implement private ErrorState errorState = ErrorState.NONE; - public AbstractProcessor() { - this(new Request(), new Response()); + public AbstractProcessor(Adapter adapter) { + this(adapter, new Request(), new Response()); } - protected AbstractProcessor(Request coyoteRequest, Response coyoteResponse) { + protected AbstractProcessor(Adapter adapter, Request coyoteRequest, Response coyoteResponse) { + this.adapter = adapter; asyncStateMachine = new AsyncStateMachine(this); request = coyoteRequest; response = coyoteResponse; @@ -80,7 +81,10 @@ protected AbstractProcessor(Request coyoteRequest, Response coyoteResponse) { protected void setErrorState(ErrorState errorState, Throwable t) { boolean blockIo = this.errorState.isIoAllowed() && !errorState.isIoAllowed(); this.errorState = this.errorState.getMostSevere(errorState); - if (response.getStatus() < 400) { + // Don't change the status code for IOException since that is almost + // certainly a client disconnect in which case it is preferable to keep + // the original status code http://markmail.org/message/4cxpwmxhtgnrwh7n + if (response.getStatus() < 400 && !(t instanceof IOException)) { response.setStatus(500); } if (t != null) { @@ -92,7 +96,10 @@ protected void setErrorState(ErrorState errorState, Throwable t) { // have been completed. Dispatch to a container thread to do the // clean-up. Need to do it this way to ensure that all the necessary // clean-up is performed. - getLog().info(sm.getString("abstractProcessor.nonContainerThreadError"), t); + asyncStateMachine.asyncMustError(); + if (getLog().isDebugEnabled()) { + getLog().debug(sm.getString("abstractProcessor.nonContainerThreadError"), t); + } processSocketEvent(SocketEvent.ERROR, true); } } @@ -109,16 +116,6 @@ public Request getRequest() { } - /** - * Set the associated adapter. - * - * @param adapter the new adapter - */ - public void setAdapter(Adapter adapter) { - this.adapter = adapter; - } - - /** * Get the associated adapter. * @@ -181,9 +178,9 @@ public SocketState asyncPostProcess() { @Override - public final SocketState dispatch(SocketEvent socketEvent) { - //更新状态机 - if (socketEvent == SocketEvent.OPEN_WRITE && response.getWriteListener() != null) { + public final SocketState dispatch(SocketEvent status) { + + if (status == SocketEvent.OPEN_WRITE && response.getWriteListener() != null) { asyncStateMachine.asyncOperation(); try { if (flushBufferedWrite()) { @@ -193,12 +190,12 @@ public final SocketState dispatch(SocketEvent socketEvent) { if (getLog().isDebugEnabled()) { getLog().debug("Unable to write async data.", ioe); } - socketEvent = SocketEvent.ERROR; + status = SocketEvent.ERROR; request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, ioe); } - } else if (socketEvent == SocketEvent.OPEN_READ && request.getReadListener() != null) { - dispatchNonBlockingRead();// asyncStateMachine.asyncOperation() - } else if (socketEvent == SocketEvent.ERROR) { + } else if (status == SocketEvent.OPEN_READ && request.getReadListener() != null) { + dispatchNonBlockingRead(); + } else if (status == SocketEvent.ERROR) { // An I/O error occurred on a non-container thread. This includes: // - read/write timeouts fired by the Poller (NIO & APR) // - completion handler failures in NIO2 @@ -222,8 +219,7 @@ public final SocketState dispatch(SocketEvent socketEvent) { RequestInfo rp = request.getRequestProcessor(); try { rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE); - //调用读写监听等逻辑 - if (!getAdapter().asyncDispatch(request, response, socketEvent)) { + if (!getAdapter().asyncDispatch(request, response, status)) { setErrorState(ErrorState.CLOSE_NOW, null); } } catch (InterruptedIOException e) { @@ -239,7 +235,7 @@ public final SocketState dispatch(SocketEvent socketEvent) { if (getErrorState().isError()) { request.updateCounters(); return SocketState.CLOSED; - } else if (isAsync()) {//AsyncState.DISPATCHED状态下isAsync为false + } else if (isAsync()) { return SocketState.LONG; } else { request.updateCounters(); @@ -303,6 +299,10 @@ public final void action(ActionCode actionCode, Object param) { ((AtomicBoolean) param).set(getErrorState().isError()); break; } + case IS_IO_ALLOWED: { + ((AtomicBoolean) param).set(getErrorState().isIoAllowed()); + break; + } case CLOSE_NOW: { // Prevent further writes to the response setSwallowResponse(); @@ -364,7 +364,11 @@ public final void action(ActionCode actionCode, Object param) { break; } case REQ_SSL_CERTIFICATE: { - sslReHandShake(); + try { + sslReHandShake(); + } catch (IOException ioe) { + setErrorState(ErrorState.CLOSE_CONNECTION_NOW, ioe); + } break; } @@ -486,6 +490,18 @@ public final void action(ActionCode actionCode, Object param) { doPush((Request) param); break; } + + // Servlet 4.0 Trailers + case IS_TRAILER_FIELDS_READY: { + AtomicBoolean result = (AtomicBoolean) param; + result.set(isTrailerFieldsReady()); + break; + } + case IS_TRAILER_FIELDS_SUPPORTED: { + AtomicBoolean result = (AtomicBoolean) param; + result.set(isTrailerFieldsSupported()); + break; + } } } @@ -626,8 +642,12 @@ protected void populateSslRequestAttributes() { /** * Processors that can perform a TLS re-handshake (e.g. HTTP/1.1) should * override this method and implement the re-handshake. + * + * @throws IOException If authentication is required then there will be I/O + * with the client and this exception will be thrown if + * that goes wrong */ - protected void sslReHandShake() { + protected void sslReHandShake() throws IOException { // NO-OP } @@ -760,6 +780,21 @@ protected void doPush(Request pushTarget) { } + protected abstract boolean isTrailerFieldsReady(); + + + /** + * Protocols that support trailer fields should override this method and + * return {@code true}. + * + * @return {@code true} if trailer fields are supported by this processor, + * otherwise {@code false}. + */ + protected boolean isTrailerFieldsSupported() { + return false; + } + + /** * Flush any pending writes. Used during non-blocking writes to flush any * remaining data from a previous incomplete write. diff --git a/core/src/main/java/org/apache/coyote/AbstractProcessorLight.java b/core/src/main/java/org/apache/coyote/AbstractProcessorLight.java index 6d0d481..a6acd1f 100644 --- a/core/src/main/java/org/apache/coyote/AbstractProcessorLight.java +++ b/core/src/main/java/org/apache/coyote/AbstractProcessorLight.java @@ -16,17 +16,17 @@ */ package org.apache.coyote; +import java.io.IOException; +import java.util.Iterator; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; + import org.apache.juli.logging.Log; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.DispatchType; import org.apache.tomcat.util.net.SocketEvent; import org.apache.tomcat.util.net.SocketWrapperBase; -import java.io.IOException; -import java.util.Iterator; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; - /** * This is a light-weight abstract processor implementation that is intended as * a basis for all Processor implementations from the light-weight upgrade @@ -38,64 +38,55 @@ public abstract class AbstractProcessorLight implements Processor { @Override - public SocketState process(SocketWrapperBase socketWrapper, SocketEvent status) throws IOException { + public SocketState process(SocketWrapperBase socketWrapper, SocketEvent status) + throws IOException { + SocketState state = SocketState.CLOSED; Iterator dispatches = null; - Integer loopCnt=0; do { - try { - if (dispatches != null) { - DispatchType nextDispatch = dispatches.next(); - state = dispatch(nextDispatch.getSocketStatus()); - } else if (status == SocketEvent.DISCONNECT) { - // Do nothing here, just wait for it to get recycled - } else if (isAsync() || isUpgrade() || state == SocketState.ASYNC_END) { - state = dispatch(status);//没有返回SocketState.ASYNC_END - if (state == SocketState.OPEN) { - // There may be pipe-lined data to read. If the data isn't - // processed now, execution will exit this loop and call - // release() which will recycle the processor (and input - // buffer) deleting any pipe-lined data. To avoid this, - // process it now. - state = service(socketWrapper);//没有返回SocketState.ASYNC_END - } - } else if (status == SocketEvent.OPEN_WRITE) { - // Extra write event likely after async, ignore - state = SocketState.LONG; - } else if (status == SocketEvent.OPEN_READ) { - state = service(socketWrapper);//没有返回SocketState.ASYNC_END - } else { - // Default to closing the socket if the SocketEvent passed in - // is not consistent with the current state of the Processor - state = SocketState.CLOSED; + if (dispatches != null) { + DispatchType nextDispatch = dispatches.next(); + state = dispatch(nextDispatch.getSocketStatus()); + } else if (status == SocketEvent.DISCONNECT) { + // Do nothing here, just wait for it to get recycled + } else if (isAsync() || isUpgrade() || state == SocketState.ASYNC_END) { + state = dispatch(status); + if (state == SocketState.OPEN) { + // There may be pipe-lined data to read. If the data isn't + // processed now, execution will exit this loop and call + // release() which will recycle the processor (and input + // buffer) deleting any pipe-lined data. To avoid this, + // process it now. + state = service(socketWrapper); } + } else if (status == SocketEvent.OPEN_WRITE) { + // Extra write event likely after async, ignore + state = SocketState.LONG; + } else if (status == SocketEvent.OPEN_READ){ + state = service(socketWrapper); + } else { + // Default to closing the socket if the SocketEvent passed in + // is not consistent with the current state of the Processor + state = SocketState.CLOSED; + } + if (state != SocketState.CLOSED && isAsync()) { + state = asyncPostProcess(); + } - //连接没有关闭,并且处于异步状态,变更下一个可能的异步状态。 - if (state != SocketState.CLOSED && isAsync()) { - state = asyncPostProcess();//有可能会返回AsyncState.DISPATCHED,isAsync()为false,但是state为ASYNC_END - } - if (getLog().isDebugEnabled()) { - getLog().debug("Socket: [" + socketWrapper + "], Status in: [" + status + "], State out: [" + state + "]"); - } - + if (getLog().isDebugEnabled()) { + getLog().debug("Socket: [" + socketWrapper + + "], Status in: [" + status + + "], State out: [" + state + "]"); + } - //获取下一轮需要处理的dispatch - if (dispatches == null || !dispatches.hasNext()) { - // Only returns non-null iterator if there are - // dispatches to process. - dispatches = getIteratorAndClearDispatches(); - } - loopCnt++; - }finally { - getLog().info(String.format("Process.Mat-->Current status:[%s],state:[%s],dispatches:[%s],loopCnt:[%s]",status,state,dispatches,loopCnt)); + if (dispatches == null || !dispatches.hasNext()) { + // Only returns non-null iterator if there are + // dispatches to process. + dispatches = getIteratorAndClearDispatches(); } - /** - * 1.state为ASYNC_END状态; - * 2.连接没有关闭,并且还有dispatches要处理 - */ - } - while (state == SocketState.ASYNC_END || dispatches != null && state != SocketState.CLOSED); + } while (state == SocketState.ASYNC_END || + dispatches != null && state != SocketState.CLOSED); return state; } @@ -143,8 +134,12 @@ protected void clearDispatches() { * calls to {@link #dispatch(SocketEvent)}. Requests may be pipe-lined. * * @param socketWrapper The connection to process - * @return The state the caller should put the socket in when this method returns - * @throws IOException If an I/O error occurs during the processing of the request + * + * @return The state the caller should put the socket in when this method + * returns + * + * @throws IOException If an I/O error occurs during the processing of the + * request */ protected abstract SocketState service(SocketWrapperBase socketWrapper) throws IOException; @@ -153,7 +148,6 @@ protected void clearDispatches() { * Uses currently include Servlet 3.0 Async and HTTP upgrade connections. * Further uses may be added in the future. These will typically start as * HTTP requests. - * * @param status The event to process * @return the socket state */ diff --git a/core/src/main/java/org/apache/coyote/AbstractProtocol.java b/core/src/main/java/org/apache/coyote/AbstractProtocol.java index ec4b9b3..16db733 100644 --- a/core/src/main/java/org/apache/coyote/AbstractProtocol.java +++ b/core/src/main/java/org/apache/coyote/AbstractProtocol.java @@ -16,23 +16,9 @@ */ package org.apache.coyote; -import org.apache.juli.logging.Log; -import org.apache.tomcat.InstanceManager; -import org.apache.tomcat.util.ExceptionUtils; -import org.apache.tomcat.util.collections.SynchronizedStack; -import org.apache.tomcat.util.modeler.Registry; -import org.apache.tomcat.util.net.AbstractEndpoint; -import org.apache.tomcat.util.net.AbstractEndpoint.Handler; -import org.apache.tomcat.util.net.SSLHostConfig; -import org.apache.tomcat.util.net.SSLHostConfigCertificate; -import org.apache.tomcat.util.net.SocketEvent; -import org.apache.tomcat.util.net.SocketWrapperBase; -import org.apache.tomcat.util.res.StringManager; - import java.net.InetAddress; import java.nio.ByteBuffer; import java.util.Collections; -import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -49,6 +35,17 @@ import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.WebConnection; +import org.apache.juli.logging.Log; +import org.apache.tomcat.InstanceManager; +import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.collections.SynchronizedStack; +import org.apache.tomcat.util.modeler.Registry; +import org.apache.tomcat.util.net.AbstractEndpoint; +import org.apache.tomcat.util.net.AbstractEndpoint.Handler; +import org.apache.tomcat.util.net.SocketEvent; +import org.apache.tomcat.util.net.SocketWrapperBase; +import org.apache.tomcat.util.res.StringManager; + public abstract class AbstractProtocol implements ProtocolHandler, MBeanRegistration { @@ -71,16 +68,6 @@ public abstract class AbstractProtocol implements ProtocolHandler, protected ObjectName rgOname = null; - /** - * Name of MBean for the ThreadPool. - */ - protected ObjectName tpOname = null; - - - private Set sslOnames = new HashSet<>(); - private Set sslCertOnames = new HashSet<>(); - - /** * Unique ID for this connector. Only used if the connector is configured * to use a random port as the port will change if stop(), start() is @@ -94,13 +81,12 @@ public abstract class AbstractProtocol implements ProtocolHandler, * ProtocolHandler implementation (ProtocolHandler using NIO, requires NIO * Endpoint etc.). */ - private final AbstractEndpoint endpoint; + private final AbstractEndpoint endpoint; private Handler handler; - //处理异步超时问题 private final Set waitingProcessors = Collections.newSetFromMap(new ConcurrentHashMap()); @@ -111,7 +97,7 @@ public abstract class AbstractProtocol implements ProtocolHandler, private AsyncTimeout asyncTimeout = null; - public AbstractProtocol(AbstractEndpoint endpoint) { + public AbstractProtocol(AbstractEndpoint endpoint) { this.endpoint = endpoint; setConnectionLinger(Constants.DEFAULT_CONNECTION_LINGER); setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY); @@ -129,7 +115,9 @@ public AbstractProtocol(AbstractEndpoint endpoint) { * * @param name The name of the property to set * @param value The value, in string form, to set for the property - * @return true if the property was set successfully, otherwise false + * + * @return true if the property was set successfully, otherwise + * false */ public boolean setProperty(String name, String value) { return endpoint.setProperty(name, value); @@ -141,6 +129,7 @@ public boolean setProperty(String name, String value) { * to use this. * * @param name The name of the property to get + * * @return The value of the property converted to a string */ public String getProperty(String name) { @@ -155,16 +144,10 @@ public String getProperty(String name) { * connector. */ protected Adapter adapter; - @Override - public void setAdapter(Adapter adapter) { - this.adapter = adapter; - } - + public void setAdapter(Adapter adapter) { this.adapter = adapter; } @Override - public Adapter getAdapter() { - return adapter; - } + public Adapter getAdapter() { return adapter; } /** @@ -175,18 +158,13 @@ public Adapter getAdapter() { * usually be closer to {@link #getMaxThreads()}. */ protected int processorCache = 200; - - public int getProcessorCache() { - return this.processorCache; - } - + public int getProcessorCache() { return this.processorCache; } public void setProcessorCache(int processorCache) { this.processorCache = processorCache; } private String clientCertProvider = null; - /** * When client certificate information is presented in a form other than * instances of {@link java.security.cert.X509Certificate} it needs to be @@ -198,12 +176,16 @@ public void setProcessorCache(int processorCache) { * * @return The name of the JSSE provider to use */ - public String getClientCertProvider() { - return clientCertProvider; - } + public String getClientCertProvider() { return clientCertProvider; } + public void setClientCertProvider(String s) { this.clientCertProvider = s; } + - public void setClientCertProvider(String s) { - this.clientCertProvider = s; + private int maxHeaderCount = 100; + public int getMaxHeaderCount() { + return maxHeaderCount; + } + public void setMaxHeaderCount(int maxHeaderCount) { + this.maxHeaderCount = maxHeaderCount; } @@ -227,72 +209,46 @@ public AsyncTimeout getAsyncTimeout() { // ---------------------- Properties that are passed through to the EndPoint @Override - public Executor getExecutor() { - return endpoint.getExecutor(); - } - + public Executor getExecutor() { return endpoint.getExecutor(); } public void setExecutor(Executor executor) { endpoint.setExecutor(executor); } - public int getMaxThreads() { - return endpoint.getMaxThreads(); - } - + public int getMaxThreads() { return endpoint.getMaxThreads(); } public void setMaxThreads(int maxThreads) { endpoint.setMaxThreads(maxThreads); } - public int getMaxConnections() { - return endpoint.getMaxConnections(); - } - + public int getMaxConnections() { return endpoint.getMaxConnections(); } public void setMaxConnections(int maxConnections) { endpoint.setMaxConnections(maxConnections); } - public int getMinSpareThreads() { - return endpoint.getMinSpareThreads(); - } - + public int getMinSpareThreads() { return endpoint.getMinSpareThreads(); } public void setMinSpareThreads(int minSpareThreads) { endpoint.setMinSpareThreads(minSpareThreads); } - public int getThreadPriority() { - return endpoint.getThreadPriority(); - } - + public int getThreadPriority() { return endpoint.getThreadPriority(); } public void setThreadPriority(int threadPriority) { endpoint.setThreadPriority(threadPriority); } - public int getAcceptCount() { - return endpoint.getAcceptCount(); - } - - public void setAcceptCount(int acceptCount) { - endpoint.setAcceptCount(acceptCount); - } + public int getAcceptCount() { return endpoint.getAcceptCount(); } + public void setAcceptCount(int acceptCount) { endpoint.setAcceptCount(acceptCount); } - public boolean getTcpNoDelay() { - return endpoint.getTcpNoDelay(); - } - + public boolean getTcpNoDelay() { return endpoint.getTcpNoDelay(); } public void setTcpNoDelay(boolean tcpNoDelay) { endpoint.setTcpNoDelay(tcpNoDelay); } - public int getConnectionLinger() { - return endpoint.getConnectionLinger(); - } - + public int getConnectionLinger() { return endpoint.getConnectionLinger(); } public void setConnectionLinger(int connectionLinger) { endpoint.setConnectionLinger(connectionLinger); } @@ -304,35 +260,24 @@ public void setConnectionLinger(int connectionLinger) { * * @return The timeout in milliseconds */ - public int getKeepAliveTimeout() { - return endpoint.getKeepAliveTimeout(); - } - + public int getKeepAliveTimeout() { return endpoint.getKeepAliveTimeout(); } public void setKeepAliveTimeout(int keepAliveTimeout) { endpoint.setKeepAliveTimeout(keepAliveTimeout); } - public InetAddress getAddress() { - return endpoint.getAddress(); - } - + public InetAddress getAddress() { return endpoint.getAddress(); } public void setAddress(InetAddress ia) { endpoint.setAddress(ia); } - public int getPort() { - return endpoint.getPort(); - } - + public int getPort() { return endpoint.getPort(); } public void setPort(int port) { endpoint.setPort(port); } - public int getLocalPort() { - return endpoint.getLocalPort(); - } + public int getLocalPort() { return endpoint.getLocalPort(); } /* * When Tomcat expects data from the client, this is the time Tomcat will @@ -341,19 +286,10 @@ public int getLocalPort() { public int getConnectionTimeout() { return endpoint.getConnectionTimeout(); } - public void setConnectionTimeout(int timeout) { endpoint.setConnectionTimeout(timeout); } - public int getMaxHeaderCount() { - return endpoint.getMaxHeaderCount(); - } - - public void setMaxHeaderCount(int maxHeaderCount) { - endpoint.setMaxHeaderCount(maxHeaderCount); - } - public long getConnectionCount() { return endpoint.getConnectionCount(); } @@ -361,17 +297,15 @@ public long getConnectionCount() { public void setAcceptorThreadCount(int threadCount) { endpoint.setAcceptorThreadCount(threadCount); } - public int getAcceptorThreadCount() { - return endpoint.getAcceptorThreadCount(); + return endpoint.getAcceptorThreadCount(); } public void setAcceptorThreadPriority(int threadPriority) { endpoint.setAcceptorThreadPriority(threadPriority); } - public int getAcceptorThreadPriority() { - return endpoint.getAcceptorThreadPriority(); + return endpoint.getAcceptorThreadPriority(); } @@ -390,8 +324,8 @@ public synchronized int getNameIndex() { * The name will be prefix-address-port if address is non-null and * prefix-port if the address is null. * - * @return A name for this protocol instance that is appropriately quoted for use in an - * ObjectName. + * @return A name for this protocol instance that is appropriately quoted + * for use in an ObjectName. */ public String getName() { return ObjectName.quote(getNameInternal()); @@ -434,7 +368,7 @@ public void removeWaitingProcessor(Processor processor) { // ----------------------------------------------- Accessors for sub-classes - protected AbstractEndpoint getEndpoint() { + protected AbstractEndpoint getEndpoint() { return endpoint; } @@ -453,7 +387,6 @@ protected void setHandler(Handler handler) { /** * Concrete implementations need to provide access to their logger to be * used by the abstract classes. - * * @return the logger */ protected abstract Log getLog(); @@ -462,7 +395,6 @@ protected void setHandler(Handler handler) { /** * Obtain the prefix to be used when construction a name for this protocol * handler. The name will be prefix-address-port. - * * @return the prefix */ protected abstract String getNamePrefix(); @@ -470,7 +402,6 @@ protected void setHandler(Handler handler) { /** * Obtain the name of the protocol, (Http, Ajp, etc.). Used with JMX. - * * @return the protocol name */ protected abstract String getProtocolName(); @@ -479,10 +410,9 @@ protected void setHandler(Handler handler) { /** * Find a suitable handler for the protocol negotiated * at the network layer. - * * @param name The name of the requested negotiated protocol. - * @return The instance where {@link UpgradeProtocol#getAlpnName()} matches the requested - * protocol + * @return The instance where {@link UpgradeProtocol#getAlpnName()} matches + * the requested protocol */ protected abstract UpgradeProtocol getNegotiatedProtocol(String name); @@ -490,10 +420,9 @@ protected void setHandler(Handler handler) { /** * Find a suitable handler for the protocol upgraded name specified. This * is used for direct connection protocol selection. - * * @param name The name of the requested negotiated protocol. - * @return The instance where {@link UpgradeProtocol#getAlpnName()} matches the requested - * protocol + * @return The instance where {@link UpgradeProtocol#getAlpnName()} matches + * the requested protocol */ protected abstract UpgradeProtocol getUpgradeProtocol(String name); @@ -599,36 +528,14 @@ public void init() throws Exception { } if (this.domain != null) { - try { - tpOname = new ObjectName(domain + ":type=ThreadPool,name=" + getName()); - Registry.getRegistry(null, null).registerComponent(endpoint, tpOname, null); - } catch (Exception e) { - getLog().error(sm.getString("abstractProtocolHandler.mbeanRegistrationFailed", - tpOname, getName()), e); - } rgOname = new ObjectName(domain + ":type=GlobalRequestProcessor,name=" + getName()); Registry.getRegistry(null, null).registerComponent( getHandler().getGlobal(), rgOname, null); - - for (SSLHostConfig sslHostConfig : getEndpoint().findSslHostConfigs()) { - ObjectName sslOname = new ObjectName(domain + ":type=SSLHostConfig,ThreadPool=" + - getName() + ",name=" + ObjectName.quote(sslHostConfig.getHostName())); - Registry.getRegistry(null, null).registerComponent(sslHostConfig, sslOname, null); - sslOnames.add(sslOname); - for (SSLHostConfigCertificate sslHostConfigCert : sslHostConfig.getCertificates()) { - ObjectName sslCertOname = new ObjectName(domain + - ":type=SSLHostConfigCertificate,ThreadPool=" + getName() + - ",Host=" + ObjectName.quote(sslHostConfig.getHostName()) + - ",name=" + sslHostConfigCert.getType()); - Registry.getRegistry(null, null).registerComponent( - sslHostConfigCert, sslCertOname, null); - sslCertOnames.add(sslCertOname); - } - } } String endpointName = getName(); - endpoint.setName(endpointName.substring(1, endpointName.length() - 1)); + endpoint.setName(endpointName.substring(1, endpointName.length()-1)); + endpoint.setDomain(domain); endpoint.init(); } @@ -672,7 +579,7 @@ public boolean isPaused() { @Override public void resume() throws Exception { - if (getLog().isInfoEnabled()) { + if(getLog().isInfoEnabled()) { getLog().info(sm.getString("abstractProtocolHandler.resume", getName())); } @@ -682,7 +589,7 @@ public void resume() throws Exception { @Override public void stop() throws Exception { - if (getLog().isInfoEnabled()) { + if(getLog().isInfoEnabled()) { getLog().info(sm.getString("abstractProtocolHandler.stop", getName())); } @@ -696,7 +603,7 @@ public void stop() throws Exception { @Override public void destroy() throws Exception { - if (getLog().isInfoEnabled()) { + if(getLog().isInfoEnabled()) { getLog().info(sm.getString("abstractProtocolHandler.destroy", getName())); } @@ -717,18 +624,9 @@ public void destroy() throws Exception { } } - if (tpOname != null) { - Registry.getRegistry(null, null).unregisterComponent(tpOname); - } if (rgOname != null) { Registry.getRegistry(null, null).unregisterComponent(rgOname); } - for (ObjectName oname : sslOnames) { - Registry.getRegistry(null, null).unregisterComponent(oname); - } - for (ObjectName oname : sslCertOnames) { - Registry.getRegistry(null, null).unregisterComponent(oname); - } } } @@ -740,7 +638,7 @@ protected static class ConnectionHandler implements AbstractEndpoint.Handler< private final AbstractProtocol proto; private final RequestGroupInfo global = new RequestGroupInfo(); private final AtomicLong registerCount = new AtomicLong(0); - private final Map connections = new ConcurrentHashMap<>(); + private final Map connections = new ConcurrentHashMap<>(); private final RecycledProcessors recycledProcessors = new RecycledProcessors(this); public ConnectionHandler(AbstractProtocol proto) { @@ -767,10 +665,10 @@ public void recycle() { @Override - public SocketState process(SocketWrapperBase wrapper, SocketEvent socketEvent) { + public SocketState process(SocketWrapperBase wrapper, SocketEvent status) { if (getLog().isDebugEnabled()) { getLog().debug(sm.getString("abstractConnectionHandler.process", - wrapper.getSocket(), socketEvent)); + wrapper.getSocket(), status)); } if (wrapper == null) { // Nothing to do. Socket has been closed. @@ -779,16 +677,16 @@ public SocketState process(SocketWrapperBase wrapper, SocketEvent socketEvent S socket = wrapper.getSocket(); - //和当前socket是否有关联的处理器 Processor processor = connections.get(socket); if (getLog().isDebugEnabled()) { - getLog().debug(sm.getString("abstractConnectionHandler.connectionsGet", processor, socket)); + getLog().debug(sm.getString("abstractConnectionHandler.connectionsGet", + processor, socket)); } if (processor != null) { // Make sure an async timeout doesn't fire getProtocol().removeWaitingProcessor(processor); - } else if (socketEvent == SocketEvent.DISCONNECT || socketEvent == SocketEvent.ERROR) { + } else if (status == SocketEvent.DISCONNECT || status == SocketEvent.ERROR) { // Nothing to do. Endpoint requested a close and there is no // longer a processor associated with this socket. return SocketState.CLOSED; @@ -818,8 +716,8 @@ public SocketState process(SocketWrapperBase wrapper, SocketEvent socketEvent // block. if (getLog().isDebugEnabled()) { getLog().debug(sm.getString( - "abstractConnectionHandler.negotiatedProcessor.fail", - negotiatedProtocol)); + "abstractConnectionHandler.negotiatedProcessor.fail", + negotiatedProtocol)); } return SocketState.CLOSED; /* @@ -833,7 +731,6 @@ public SocketState process(SocketWrapperBase wrapper, SocketEvent socketEvent } } } - //从缓存池里获取处理器 if (processor == null) { processor = recycledProcessors.pop(); if (getLog().isDebugEnabled()) { @@ -841,24 +738,22 @@ public SocketState process(SocketWrapperBase wrapper, SocketEvent socketEvent processor)); } } - //创建指定的处理器 if (processor == null) { processor = getProtocol().createProcessor(); register(processor); } + processor.setSslSupport( + wrapper.getSslSupport(getProtocol().getClientCertProvider())); - processor.setSslSupport(wrapper.getSslSupport(getProtocol().getClientCertProvider())); // Associate the processor with the connection connections.put(socket, processor); - - SocketState socketState = SocketState.CLOSED; + SocketState state = SocketState.CLOSED; do { - socketState = processor.process(wrapper, socketEvent); + state = processor.process(wrapper, status); - //处理协议升级 - if (socketState == SocketState.UPGRADING) { + if (state == SocketState.UPGRADING) { // Get the HTTP upgrade handler UpgradeToken upgradeToken = processor.getUpgradeToken(); // Retrieve leftover input @@ -875,8 +770,8 @@ public SocketState process(SocketWrapperBase wrapper, SocketEvent socketEvent } else { if (getLog().isDebugEnabled()) { getLog().debug(sm.getString( - "abstractConnectionHandler.negotiatedProcessor.fail", - "h2c")); + "abstractConnectionHandler.negotiatedProcessor.fail", + "h2c")); } return SocketState.CLOSED; } @@ -913,40 +808,37 @@ public SocketState process(SocketWrapperBase wrapper, SocketEvent socketEvent } } } - } while (socketState == SocketState.UPGRADING); - + } while ( state == SocketState.UPGRADING); - if (socketState == SocketState.LONG) { + if (state == SocketState.LONG) { // In the middle of processing a request/response. Keep the // socket associated with the processor. Exact requirements // depend on type of long poll - //1.重新注册到poller上 longPoll(wrapper, processor); if (processor.isAsync()) { - //2.通过AsyncTimeout检测连接超时 getProtocol().addWaitingProcessor(processor); } - } else if (socketState == SocketState.OPEN) { + } else if (state == SocketState.OPEN) { // In keep-alive but between requests. OK to recycle // processor. Continue to poll for the next request. connections.remove(socket); release(processor); wrapper.registerReadInterest(); - } else if (socketState == SocketState.SENDFILE) { + } else if (state == SocketState.SENDFILE) { // Sendfile in progress. If it fails, the socket will be // closed. If it works, the socket either be added to the // poller (or equivalent) to await more data or processed // if there are any pipe-lined requests remaining. - } else if (socketState == SocketState.UPGRADED) { + } else if (state == SocketState.UPGRADED) { // Don't add sockets back to the poller if this was a // non-blocking write otherwise the poller may trigger // multiple read events which may lead to thread starvation // in the connector. The write() method will add this socket // to the poller if necessary. - if (socketEvent != SocketEvent.OPEN_WRITE) { + if (status != SocketEvent.OPEN_WRITE) { longPoll(wrapper, processor); } - } else if (socketState == SocketState.SUSPENDED) { + } else if (state == SocketState.SUSPENDED) { // Don't add sockets back to the poller. // The resumeProcessing() method will add this socket // to the poller. @@ -978,8 +870,8 @@ public SocketState process(SocketWrapperBase wrapper, SocketEvent socketEvent release(processor); } } - return socketState; - } catch (java.net.SocketException e) { + return state; + } catch(java.net.SocketException e) { // SocketExceptions are normal getLog().debug(sm.getString( "abstractConnectionHandler.socketexception.debug"), e); @@ -1036,7 +928,8 @@ public Set getOpenSockets() { * Expected to be used by the handler once the processor is no longer * required. * - * @param processor Processor being released (that was associated with the socket) + * @param processor Processor being released (that was associated with + * the socket) */ private void release(Processor processor) { if (processor != null) { @@ -1072,14 +965,14 @@ protected void register(Processor processor) { try { long count = registerCount.incrementAndGet(); RequestInfo rp = - processor.getRequest().getRequestProcessor(); + processor.getRequest().getRequestProcessor(); rp.setGlobalProcessor(global); ObjectName rpName = new ObjectName( getProtocol().getDomain() + - ":type=RequestProcessor,worker=" - + getProtocol().getName() + - ",name=" + getProtocol().getProtocolName() + - "Request" + count); + ":type=RequestProcessor,worker=" + + getProtocol().getName() + + ",name=" + getProtocol().getProtocolName() + + "Request" + count); if (getLog().isDebugEnabled()) { getLog().debug("Register " + rpName); } @@ -1207,7 +1100,7 @@ public void run() { } long now = System.currentTimeMillis(); for (Processor processor : waitingProcessors) { - processor.timeoutAsync(now); + processor.timeoutAsync(now); } // Loop if endpoint is paused diff --git a/core/src/main/java/org/apache/coyote/ActionCode.java b/core/src/main/java/org/apache/coyote/ActionCode.java index 00f87c4..3ff4c21 100644 --- a/core/src/main/java/org/apache/coyote/ActionCode.java +++ b/core/src/main/java/org/apache/coyote/ActionCode.java @@ -53,6 +53,12 @@ public enum ActionCode { */ IS_ERROR, + /** + * The processor may have been placed into an error state and some error + * states do not permit any further I/O. Is I/O currently allowed? + */ + IS_IO_ALLOWED, + /** * Hook called if swallowing request input should be disabled. * Example: Cancel a large file upload. @@ -245,5 +251,19 @@ public enum ActionCode { /** * Push a request on behalf of the client of the current request. */ - PUSH_REQUEST + PUSH_REQUEST, + + /** + * Are the request trailer fields ready to be read? Note that this returns + * true if it is known that request trailer fields are not supported so an + * empty collection of trailers can then be read. + */ + IS_TRAILER_FIELDS_READY, + + /** + * Are HTTP trailer fields supported for the current response? Note that + * once an HTTP/1.1 response has been committed, it will no longer support + * trailer fields. + */ + IS_TRAILER_FIELDS_SUPPORTED } diff --git a/core/src/main/java/org/apache/coyote/AsyncStateMachine.java b/core/src/main/java/org/apache/coyote/AsyncStateMachine.java index a176d7f..6054916 100644 --- a/core/src/main/java/org/apache/coyote/AsyncStateMachine.java +++ b/core/src/main/java/org/apache/coyote/AsyncStateMachine.java @@ -16,18 +16,14 @@ */ package org.apache.coyote; -import org.apache.juli.logging.Log; -import org.apache.juli.logging.LogFactory; +import java.security.AccessController; +import java.security.PrivilegedAction; + import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.res.StringManager; import org.apache.tomcat.util.security.PrivilegedGetTccl; import org.apache.tomcat.util.security.PrivilegedSetTccl; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.security.AccessController; -import java.security.PrivilegedAction; - /** * Manages the state transitions for async requests. * @@ -70,38 +66,49 @@ * differences required to avoid race conditions during error * handling. * DISPATCHING - The dispatch is being processed. + * MUST_ERROR - ServletRequest.startAsync() has been called followed by an + * I/O error on a non-container thread. The main purpose of + * this state is to prevent additional async actions + * (complete(), dispatch() etc.) on the non-container thread. + * The container will perform the necessary error handling, + * including ensuring that the AsyncLister.onError() method + * is called. * ERROR - Something went wrong. * - * |-----------------»------| - * | \|/ /---«-------------------------------«------------------------------| - * | |----------«-----E R R O R--«-----------------------«-------------------------------| | - * | | complete() /|\/|\\ \-«--------------------------------«-------| | | - * | | | | \ | | | - * | | |-----»-------| | \-----------»----------| | | | - * | | | | |dispatch() | | | - * | | | | \|/ ^ | | - * | | | | |--|timeout() | | | | - * | | | post() | | \|/ | post() | | | - * | | | |---------- | --»DISPATCHED«---------- | --------------COMPLETING«-----| | | - * | | | | | /|\/|\ | | | /|\ /|\ | | | - * | | | | |---»- | ---| | |startAsync() | timeout()|--| | | | | - * | | ^ ^ | | | | | | | ^ | - * | | | | | |-- \ -----| | complete() | |post() | | | - * | | | | | | \ | /--»----- | ---COMPLETE_PENDING-»-| ^ | | - * | | | | | | \ | / | | | | - * | | | | | ^ \ | / | | | | - * | \|/ | | | | \ \|/ / post() | complete() | | | - * | MUST_COMPLETE-«- | - | --«----STARTING--»--------- | ------------| /---»-----| | | - * | /|\ /|\ | | complete() | \ | | / | ^ - * | | | | | | \ | post() | / error() | | - * | | | ^ | dispatch()| \ | |-----| | //------»-------| | - * | | | | | | \ | | | | // | - * | | | | | \|/ \ | | \|/\|/ // post() | + * |-----«-------------------------------«------------------------------| + * | | + * | error() | + * |-----------------»---| | |--«--------MUST_ERROR---------------«------------------------| | + * | \|/ \|/\|/ | | + * | |----------«-----E R R O R--«-----------------------«-------------------------------| | | + * | | complete() /|\/|\\ \-«--------------------------------«-------| | | | + * | | | | \ | | | | + * | | |-----»-------| | \-----------»----------| | | | | + * | | | | |dispatch() | | ^ | + * | | | | \|/ ^ | | | + * | | | | |--|timeout() | | | | | + * | | | post() | | \|/ | post() | | | | + * | | | |---------- | --»DISPATCHED«---------- | --------------COMPLETING«-----| | | | + * | | | | | /|\/|\ | | | /|\ /|\ | | | | + * | | | | |---»- | ---| | |startAsync() | timeout()|--| | | | | | + * | | ^ ^ | | | | | | | ^ | | + * | | | | | |-- \ -----| | complete() | |post() | | | | + * | | | | | | \ | /--»----- | ---COMPLETE_PENDING-»-| ^ | | | + * | | | | | | \ | / | | | | | + * | | | | | ^ \ | / | complete() | | | | + * | \|/ | | | | \ \|/ / post() | /---»-----| | ^ | + * | MUST_COMPLETE-«- | - | --«----STARTING--»--------- | ------------| / | | | + * | /|\ /|\ | | complete() | \ | | / error() | | ^ + * | | | | | | \ | | //---»----------| | | + * | | | ^ | dispatch()| \ | post() | // | | + * | | | | | | \ | |-----| | // nct-io-error | | + * | | | | | | \ | | | | ///---»---------------| | + * | | | | | \|/ \ | | \|/\| ||| | * | | | | |--«--MUST_DISPATCH-----«-----| |--«--STARTED«---------«---------| | - * | | | | dispatched() /|\ | \ / | | | | - * | | | | | | \ / | | | | - * | | | | | | \ / | | | | - * | | | | | |post() \ | | | ^ | + * | | | | dispatched() /|\ | \ / | | post() | | + * | | | | | | \ / | | | | + * | | | | | | \ / | | | | + * | | | | | |post() | | | | ^ | * ^ | ^ | | | \|/ | | |asyncOperation() | | * | | | ^ | | DISPATCH_PENDING | | | | | * | | | | | | |post() | | | | | @@ -127,26 +134,27 @@ * |----------------------------------------------------------------------------| *

  • */ -public class AsyncStateMachine { +class AsyncStateMachine { /** * The string manager for this package. */ private static final StringManager sm = StringManager.getManager(AsyncStateMachine.class); - private static enum AsyncState { - DISPATCHED(false, false, false, false), - STARTING(true, true, false, false), - STARTED(true, true, false, false), - MUST_COMPLETE(true, true, true, false), - COMPLETE_PENDING(true, true, false, false), - COMPLETING(true, false, true, false), - TIMING_OUT(true, true, false, false), - MUST_DISPATCH(true, true, false, true), - DISPATCH_PENDING(true, true, false, false), - DISPATCHING(true, false, false, true), - READ_WRITE_OP(true, true, false, false), - ERROR(true, true, false, false); + private enum AsyncState { + DISPATCHED (false, false, false, false), + STARTING (true, true, false, false), + STARTED (true, true, false, false), + MUST_COMPLETE (true, true, true, false), + COMPLETE_PENDING(true, true, false, false), + COMPLETING (true, false, true, false), + TIMING_OUT (true, true, false, false), + MUST_DISPATCH (true, true, false, true), + DISPATCH_PENDING(true, true, false, false), + DISPATCHING (true, false, false, true), + READ_WRITE_OP (true, true, false, false), + MUST_ERROR (true, true, false, false), + ERROR (true, true, false, false); private final boolean isAsync; private final boolean isStarted; @@ -154,26 +162,26 @@ private static enum AsyncState { private final boolean isDispatching; private AsyncState(boolean isAsync, boolean isStarted, boolean isCompleting, - boolean isDispatching) { + boolean isDispatching) { this.isAsync = isAsync; this.isStarted = isStarted; this.isCompleting = isCompleting; this.isDispatching = isDispatching; } - public boolean isAsync() { + boolean isAsync() { return isAsync; } - public boolean isStarted() { + boolean isStarted() { return isStarted; } - public boolean isDispatching() { + boolean isDispatching() { return isDispatching; } - public boolean isCompleting() { + boolean isCompleting() { return isCompleting; } } @@ -186,32 +194,32 @@ public boolean isCompleting() { private final AbstractProcessor processor; - public AsyncStateMachine(AbstractProcessor processor) { + AsyncStateMachine(AbstractProcessor processor) { this.processor = processor; } - public boolean isAsync() { + boolean isAsync() { return state.isAsync(); } - public boolean isAsyncDispatching() { + boolean isAsyncDispatching() { return state.isDispatching(); } - public boolean isAsyncStarted() { + boolean isAsyncStarted() { return state.isStarted(); } - public boolean isAsyncTimingOut() { + boolean isAsyncTimingOut() { return state == AsyncState.TIMING_OUT; } - public boolean isAsyncError() { + boolean isAsyncError() { return state == AsyncState.ERROR; } - public boolean isCompleting() { + boolean isCompleting() { return state.isCompleting(); } @@ -219,42 +227,32 @@ public boolean isCompleting() { * Obtain the time that this connection last transitioned to async * processing. * - * @return The time (as returned by {@link System#currentTimeMillis()}) that this connection - * last transitioned to async + * @return The time (as returned by {@link System#currentTimeMillis()}) that + * this connection last transitioned to async */ - public long getLastAsyncStart() { + long getLastAsyncStart() { return lastAsyncStart; } - public synchronized void asyncStart(AsyncContextCallback asyncCtxt) { - AsyncState before = state; - try { - if (state == AsyncState.DISPATCHED) { - state = AsyncState.STARTING; - this.asyncCtxt = asyncCtxt; - lastAsyncStart = System.currentTimeMillis(); - } else { - throw new IllegalStateException( - sm.getString("asyncStateMachine.invalidAsyncState", - "asyncStart()", state)); - } - } finally { - printStateChange(before); + synchronized void asyncStart(AsyncContextCallback asyncCtxt) { + if (state == AsyncState.DISPATCHED) { + state = AsyncState.STARTING; + this.asyncCtxt = asyncCtxt; + lastAsyncStart = System.currentTimeMillis(); + } else { + throw new IllegalStateException( + sm.getString("asyncStateMachine.invalidAsyncState", + "asyncStart()", state)); } } - public synchronized void asyncOperation() { - AsyncState before = state; - try { - if (state == AsyncState.STARTED) { - state = AsyncState.READ_WRITE_OP; - } else { - throw new IllegalStateException( - sm.getString("asyncStateMachine.invalidAsyncState", - "asyncOperation()", state)); - } - } finally { - printStateChange(before); + synchronized void asyncOperation() { + if (state==AsyncState.STARTED) { + state = AsyncState.READ_WRITE_OP; + } else { + throw new IllegalStateException( + sm.getString("asyncStateMachine.invalidAsyncState", + "asyncOperation()", state)); } } @@ -263,55 +261,44 @@ public synchronized void asyncOperation() { * current state. For example, as per SRV.2.3.3.3 can now process calls to * complete() or dispatch(). */ - public synchronized SocketState asyncPostProcess() { - AsyncState before = state; - try { - if (state == AsyncState.COMPLETE_PENDING) {//刚启动,还没走完AbstractProcessorLight.process时,业务线程调用了complete,导致COMPLETE_PENDING状态的出现。 - doComplete(); - return SocketState.ASYNC_END; - } else if (state == AsyncState.DISPATCH_PENDING) {//刚启动,还没走完AbstractProcessorLight.process时,业务线程调用了dispatch,导致DISPATCH_PENDING状态的出现。 - doDispatch(); - return SocketState.ASYNC_END; - } else if (state == AsyncState.STARTING || state == AsyncState.READ_WRITE_OP) { - state = AsyncState.STARTED; - return SocketState.LONG;//将当前AbstractProcessor继续和socket做绑定 - } else if (state == AsyncState.MUST_COMPLETE || state == AsyncState.COMPLETING) { - asyncCtxt.fireOnComplete(); - state = AsyncState.DISPATCHED; - return SocketState.ASYNC_END; - } else if (state == AsyncState.MUST_DISPATCH) { - state = AsyncState.DISPATCHING; - return SocketState.ASYNC_END; - } else if (state == AsyncState.DISPATCHING) { - state = AsyncState.DISPATCHED; - return SocketState.ASYNC_END; - } else if (state == AsyncState.STARTED) { - // This can occur if an async listener does a dispatch to an async - // servlet during onTimeout - return SocketState.LONG;//将当前AbstractProcessor继续和socket做绑定 - } else { - throw new IllegalStateException( - sm.getString("asyncStateMachine.invalidAsyncState", - "asyncPostProcess()", state)); - } - } finally { - printStateChange(before); + synchronized SocketState asyncPostProcess() { + if (state == AsyncState.COMPLETE_PENDING) { + doComplete(); + return SocketState.ASYNC_END; + } else if (state == AsyncState.DISPATCH_PENDING) { + doDispatch(); + return SocketState.ASYNC_END; + } else if (state == AsyncState.STARTING || state == AsyncState.READ_WRITE_OP) { + state = AsyncState.STARTED; + return SocketState.LONG; + } else if (state == AsyncState.MUST_COMPLETE || state == AsyncState.COMPLETING) { + asyncCtxt.fireOnComplete(); + state = AsyncState.DISPATCHED; + return SocketState.ASYNC_END; + } else if (state == AsyncState.MUST_DISPATCH) { + state = AsyncState.DISPATCHING; + return SocketState.ASYNC_END; + } else if (state == AsyncState.DISPATCHING) { + state = AsyncState.DISPATCHED; + return SocketState.ASYNC_END; + } else if (state == AsyncState.STARTED) { + // This can occur if an async listener does a dispatch to an async + // servlet during onTimeout + return SocketState.LONG; + } else { + throw new IllegalStateException( + sm.getString("asyncStateMachine.invalidAsyncState", + "asyncPostProcess()", state)); } - } - public synchronized boolean asyncComplete() { - AsyncState before = state; - try { - if (!ContainerThreadMarker.isContainerThread() && state == AsyncState.STARTING) { - state = AsyncState.COMPLETE_PENDING; - return false; - } else { - return doComplete(); - } - } finally { - printStateChange(before); + synchronized boolean asyncComplete() { + if (!ContainerThreadMarker.isContainerThread() && state == AsyncState.STARTING) { + state = AsyncState.COMPLETE_PENDING; + return false; + } else { + return doComplete(); } } @@ -334,45 +321,36 @@ private synchronized boolean doComplete() { } - public synchronized boolean asyncTimeout() { - AsyncState before = state; - try { - if (state == AsyncState.STARTED) { - state = AsyncState.TIMING_OUT; - return true; - } else if (state == AsyncState.COMPLETING || - state == AsyncState.DISPATCHING || - state == AsyncState.DISPATCHED) { - // NOOP - App called complete() or dispatch() between the the - // timeout firing and execution reaching this point - return false; - } else { - throw new IllegalStateException( - sm.getString("asyncStateMachine.invalidAsyncState", - "asyncTimeout()", state)); - } - } finally { - printStateChange(before); + synchronized boolean asyncTimeout() { + if (state == AsyncState.STARTED) { + state = AsyncState.TIMING_OUT; + return true; + } else if (state == AsyncState.COMPLETING || + state == AsyncState.DISPATCHING || + state == AsyncState.DISPATCHED) { + // NOOP - App called complete() or dispatch() between the the + // timeout firing and execution reaching this point + return false; + } else { + throw new IllegalStateException( + sm.getString("asyncStateMachine.invalidAsyncState", + "asyncTimeout()", state)); } } - public synchronized boolean asyncDispatch() { - AsyncState before = state; - try { - if (!ContainerThreadMarker.isContainerThread() && state == AsyncState.STARTING) { - state = AsyncState.DISPATCH_PENDING; - return false; - } else { - return doDispatch(); - } - } finally { - printStateChange(before); + synchronized boolean asyncDispatch() { + if (!ContainerThreadMarker.isContainerThread() && state == AsyncState.STARTING) { + state = AsyncState.DISPATCH_PENDING; + return false; + } else { + return doDispatch(); } } private synchronized boolean doDispatch() { + clearNonBlockingListeners(); boolean doDispatch = false; if (state == AsyncState.STARTING || state == AsyncState.TIMING_OUT || @@ -407,91 +385,90 @@ private synchronized boolean doDispatch() { } - public synchronized void asyncDispatched() { - AsyncState before = state; - try { - if (state == AsyncState.DISPATCHING || - state == AsyncState.MUST_DISPATCH) { - state = AsyncState.DISPATCHED; - } else { - throw new IllegalStateException( - sm.getString("asyncStateMachine.invalidAsyncState", - "asyncDispatched()", state)); - } - } finally { - printStateChange(before); + synchronized void asyncDispatched() { + if (state == AsyncState.DISPATCHING || + state == AsyncState.MUST_DISPATCH) { + state = AsyncState.DISPATCHED; + } else { + throw new IllegalStateException( + sm.getString("asyncStateMachine.invalidAsyncState", + "asyncDispatched()", state)); } } - public synchronized void asyncError() { - AsyncState before = state; - try { - if (state == AsyncState.STARTING || - state == AsyncState.STARTED || - state == AsyncState.DISPATCHED || - state == AsyncState.TIMING_OUT || - state == AsyncState.MUST_COMPLETE || - state == AsyncState.READ_WRITE_OP || - state == AsyncState.COMPLETING) { - clearNonBlockingListeners(); - state = AsyncState.ERROR; - } else { - throw new IllegalStateException( - sm.getString("asyncStateMachine.invalidAsyncState", - "asyncError()", state)); - } - } finally { - printStateChange(before); + synchronized void asyncMustError() { + if (state == AsyncState.STARTED) { + clearNonBlockingListeners(); + state = AsyncState.MUST_ERROR; + } else { + throw new IllegalStateException( + sm.getString("asyncStateMachine.invalidAsyncState", + "asyncMustError()", state)); } } - public synchronized void asyncRun(Runnable runnable) { - AsyncState before = state; - try { - if (state == AsyncState.STARTING || state == AsyncState.STARTED || - state == AsyncState.READ_WRITE_OP) { - // Execute the runnable using a container thread from the - // Connector's thread pool. Use a wrapper to prevent a memory leak - ClassLoader oldCL; + + synchronized void asyncError() { + if (state == AsyncState.STARTING || + state == AsyncState.STARTED || + state == AsyncState.DISPATCHED || + state == AsyncState.TIMING_OUT || + state == AsyncState.MUST_COMPLETE || + state == AsyncState.READ_WRITE_OP || + state == AsyncState.COMPLETING || + state == AsyncState.MUST_ERROR) { + clearNonBlockingListeners(); + state = AsyncState.ERROR; + } else { + throw new IllegalStateException( + sm.getString("asyncStateMachine.invalidAsyncState", + "asyncError()", state)); + } + } + + synchronized void asyncRun(Runnable runnable) { + if (state == AsyncState.STARTING || state == AsyncState.STARTED || + state == AsyncState.READ_WRITE_OP) { + // Execute the runnable using a container thread from the + // Connector's thread pool. Use a wrapper to prevent a memory leak + ClassLoader oldCL; + if (Constants.IS_SECURITY_ENABLED) { + PrivilegedAction pa = new PrivilegedGetTccl(); + oldCL = AccessController.doPrivileged(pa); + } else { + oldCL = Thread.currentThread().getContextClassLoader(); + } + try { if (Constants.IS_SECURITY_ENABLED) { - PrivilegedAction pa = new PrivilegedGetTccl(); - oldCL = AccessController.doPrivileged(pa); + PrivilegedAction pa = new PrivilegedSetTccl( + this.getClass().getClassLoader()); + AccessController.doPrivileged(pa); } else { - oldCL = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader( + this.getClass().getClassLoader()); } - try { - if (Constants.IS_SECURITY_ENABLED) { - PrivilegedAction pa = new PrivilegedSetTccl( - this.getClass().getClassLoader()); - AccessController.doPrivileged(pa); - } else { - Thread.currentThread().setContextClassLoader( - this.getClass().getClassLoader()); - } - - processor.execute(runnable); - } finally { - if (Constants.IS_SECURITY_ENABLED) { - PrivilegedAction pa = new PrivilegedSetTccl( - oldCL); - AccessController.doPrivileged(pa); - } else { - Thread.currentThread().setContextClassLoader(oldCL); - } + + processor.execute(runnable); + } finally { + if (Constants.IS_SECURITY_ENABLED) { + PrivilegedAction pa = new PrivilegedSetTccl( + oldCL); + AccessController.doPrivileged(pa); + } else { + Thread.currentThread().setContextClassLoader(oldCL); } - } else { - throw new IllegalStateException( - sm.getString("asyncStateMachine.invalidAsyncState", - "asyncRun()", state)); } - } finally { - printStateChange(before); + } else { + throw new IllegalStateException( + sm.getString("asyncStateMachine.invalidAsyncState", + "asyncRun()", state)); } + } - public synchronized void recycle() { + synchronized void recycle() { // Use lastAsyncStart to determine if this instance has been used since // it was last recycled. If it hasn't there is no need to recycle again // which saves the relatively expensive call to notifyAll() @@ -511,16 +488,4 @@ private void clearNonBlockingListeners() { processor.getRequest().listener = null; processor.getRequest().getResponse().listener = null; } - - private static final Log log = LogFactory.getLog(AsyncStateMachine.class); - - class AsyncStateMachineChange extends Exception { - - } - - private void printStateChange(AsyncState before) { - StringWriter sw = new StringWriter(); - new AsyncStateMachineChange().printStackTrace(new PrintWriter(sw, true)); - log.info(String.format("AsyncStateMachine.Mat-->【%s】->【%s】%n---------------Call stack:---------------%n%s", before, state, sw.toString())); - } } diff --git a/core/src/main/java/org/apache/coyote/CompressionConfig.java b/core/src/main/java/org/apache/coyote/CompressionConfig.java new file mode 100644 index 0000000..0b0b0a5 --- /dev/null +++ b/core/src/main/java/org/apache/coyote/CompressionConfig.java @@ -0,0 +1,274 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.coyote; + +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; +import java.util.regex.Pattern; + +import org.apache.tomcat.util.buf.MessageBytes; +import org.apache.tomcat.util.http.MimeHeaders; + +public class CompressionConfig { + + private int compressionLevel = 0; + private Pattern noCompressionUserAgents = null; + private String compressibleMimeType = "text/html,text/xml,text/plain,text/css," + + "text/javascript,application/javascript,application/json,application/xml"; + private String[] compressibleMimeTypes = null; + private int compressionMinSize = 2048; + + + /** + * Set compression level. + * + * @param compression One of on, force, + * off or the minimum compression size in + * bytes which implies on + */ + public void setCompression(String compression) { + if (compression.equals("on")) { + this.compressionLevel = 1; + } else if (compression.equals("force")) { + this.compressionLevel = 2; + } else if (compression.equals("off")) { + this.compressionLevel = 0; + } else { + try { + // Try to parse compression as an int, which would give the + // minimum compression size + setCompressionMinSize(Integer.parseInt(compression)); + this.compressionLevel = 1; + } catch (Exception e) { + this.compressionLevel = 0; + } + } + } + + + /** + * Return compression level. + * + * @return The current compression level in string form (off/on/force) + */ + public String getCompression() { + switch (compressionLevel) { + case 0: + return "off"; + case 1: + return "on"; + case 2: + return "force"; + } + return "off"; + } + + + public int getCompressionLevel() { + return compressionLevel; + } + + + /** + * Obtain the String form of the regular expression that defines the user + * agents to not use gzip with. + * + * @return The regular expression as a String + */ + public String getNoCompressionUserAgents() { + if (noCompressionUserAgents == null) { + return null; + } else { + return noCompressionUserAgents.toString(); + } + } + + + public Pattern getNoCompressionUserAgentsPattern() { + return noCompressionUserAgents; + } + + + /** + * Set no compression user agent pattern. Regular expression as supported + * by {@link Pattern}. e.g.: gorilla|desesplorer|tigrus. + * + * @param noCompressionUserAgents The regular expression for user agent + * strings for which compression should not + * be applied + */ + public void setNoCompressionUserAgents(String noCompressionUserAgents) { + if (noCompressionUserAgents == null || noCompressionUserAgents.length() == 0) { + this.noCompressionUserAgents = null; + } else { + this.noCompressionUserAgents = + Pattern.compile(noCompressionUserAgents); + } + } + + + public String getCompressibleMimeType() { + return compressibleMimeType; + } + + + public void setCompressibleMimeType(String valueS) { + compressibleMimeType = valueS; + compressibleMimeTypes = null; + } + + + public String[] getCompressibleMimeTypes() { + String[] result = compressibleMimeTypes; + if (result != null) { + return result; + } + List values = new ArrayList<>(); + StringTokenizer tokens = new StringTokenizer(compressibleMimeType, ","); + while (tokens.hasMoreTokens()) { + String token = tokens.nextToken().trim(); + if (token.length() > 0) { + values.add(token); + } + } + result = values.toArray(new String[values.size()]); + compressibleMimeTypes = result; + return result; + } + + + public int getCompressionMinSize() { + return compressionMinSize; + } + + + /** + * Set Minimum size to trigger compression. + * + * @param compressionMinSize The minimum content length required for + * compression in bytes + */ + public void setCompressionMinSize(int compressionMinSize) { + this.compressionMinSize = compressionMinSize; + } + + + /** + * Determines if compression should be enabled for the given response and if + * it is, sets any necessary headers to mark it as such. + * + * @param request The request that triggered the response + * @param response The response to consider compressing + * + * @return {@code true} if compression was enabled for the given response, + * otherwise {@code false} + */ + public boolean useCompression(Request request, Response response) { + // Check if compression is enabled + if (compressionLevel == 0) { + return false; + } + + MimeHeaders responseHeaders = response.getMimeHeaders(); + + // Check if content is not already gzipped + MessageBytes contentEncodingMB = responseHeaders.getValue("Content-Encoding"); + if ((contentEncodingMB != null) && (contentEncodingMB.indexOf("gzip") != -1)) { + return false; + } + + // If force mode, the length and MIME type checks are skipped + if (compressionLevel != 2) { + // Check if the response is of sufficient length to trigger the compression + long contentLength = response.getContentLengthLong(); + if (contentLength != -1 && contentLength < compressionMinSize) { + return false; + } + + // Check for compatible MIME-TYPE + String[] compressibleMimeTypes = this.compressibleMimeTypes; + if (compressibleMimeTypes != null && + !startsWithStringArray(compressibleMimeTypes, response.getContentType())) { + return false; + } + } + + // If processing reaches this far, the response might be compressed. + // Therefore, set the Vary header to keep proxies happy + MessageBytes vary = responseHeaders.getValue("Vary"); + if (vary == null) { + // Add a new Vary header + responseHeaders.setValue("Vary").setString("Accept-Encoding"); + } else if (vary.equals("*")) { + // No action required + } else { + // Merge into current header + responseHeaders.setValue("Vary").setString(vary.getString() + ",Accept-Encoding"); + } + + + // Check if browser support gzip encoding + MessageBytes acceptEncodingMB = request.getMimeHeaders().getValue("accept-encoding"); + if ((acceptEncodingMB == null) || (acceptEncodingMB.indexOf("gzip") == -1)) { + return false; + } + + // If force mode, the browser checks are skipped + if (compressionLevel != 2) { + // Check for incompatible Browser + Pattern noCompressionUserAgents = this.noCompressionUserAgents; + if (noCompressionUserAgents != null) { + MessageBytes userAgentValueMB = request.getMimeHeaders().getValue("user-agent"); + if(userAgentValueMB != null) { + String userAgentValue = userAgentValueMB.toString(); + if (noCompressionUserAgents.matcher(userAgentValue).matches()) { + return false; + } + } + } + } + + // All checks have passed. Compression is enabled. + + // Compressed content length is unknown so mark it as such. + response.setContentLength(-1); + // Configure the content encoding for compressed content + responseHeaders.setValue("Content-Encoding").setString("gzip"); + + return true; + } + + + /** + * Checks if any entry in the string array starts with the specified value + * + * @param sArray the StringArray + * @param value string + */ + private static boolean startsWithStringArray(String sArray[], String value) { + if (value == null) { + return false; + } + for (int i = 0; i < sArray.length; i++) { + if (value.startsWith(sArray[i])) { + return true; + } + } + return false; + } +} diff --git a/core/src/main/java/org/apache/coyote/LocalStrings.properties b/core/src/main/java/org/apache/coyote/LocalStrings.properties index 7883f74..9e2d61e 100644 --- a/core/src/main/java/org/apache/coyote/LocalStrings.properties +++ b/core/src/main/java/org/apache/coyote/LocalStrings.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + abstractConnectionHandler.connectionsGet=Found processor [{0}] for socket [{1}] abstractConnectionHandler.error=Error reading request, ignored abstractConnectionHandler.ioexception.debug=IOExceptions are normal, ignored @@ -33,7 +34,6 @@ abstractProtocol.mbeanDeregistrationFailed=Failed to deregister MBean named [{0} abstractProtocolHandler.getAttribute=Get attribute [{0}] with value [{1}] abstractProtocolHandler.setAttribute=Set attribute [{0}] with value [{1}] abstractProtocolHandler.init=Initializing ProtocolHandler [{0}] -abstractProtocolHandler.mbeanRegistrationFailed=Failed to register MBean [{0}] for ProtocolHandler [{1}] abstractProtocolHandler.start=Starting ProtocolHandler [{0}] abstractProtocolHandler.pause=Pausing ProtocolHandler [{0}] abstractProtocolHandler.resume=Resuming ProtocolHandler [{0}] @@ -49,5 +49,6 @@ request.readListenerSet=The non-blocking read listener has already been set response.encoding.invalid=The encoding [{0}] is not recognised by the JRE response.notAsync=It is only valid to switch to non-blocking IO within async processing or HTTP upgrade processing response.notNonBlocking=It is invalid to call isReady() when the response has not been put into non-blocking mode +response.noTrailers.notSupported=A trailer fields supplier may not be set for this response. Either the underlying protocol does not support trailer fields or the protocol requires that the supplier is set before the response is committed response.nullWriteListener=The listener passed to setWriteListener() may not be null response.writeListenerSet=The non-blocking write listener has already been set diff --git a/core/src/main/java/org/apache/coyote/Request.java b/core/src/main/java/org/apache/coyote/Request.java index c0b8d36..2752e5c 100644 --- a/core/src/main/java/org/apache/coyote/Request.java +++ b/core/src/main/java/org/apache/coyote/Request.java @@ -131,6 +131,10 @@ public Request() { private long contentLength = -1; private MessageBytes contentTypeMB = null; private Charset charset = null; + // Retain the original, user specified character encoding so it can be + // returned even if it is invalid + private String characterEncoding = null; + /** * Is there an expectation ? */ @@ -197,6 +201,13 @@ public MimeHeaders getMimeHeaders() { } + public boolean isTrailerFieldsReady() { + AtomicBoolean result = new AtomicBoolean(false); + action(ActionCode.IS_TRAILER_FIELDS_READY, result); + return result.get(); + } + + public Map getTrailerFields() { return trailerFields; } @@ -294,12 +305,32 @@ public void setLocalPort(int port){ * call has been made to that method try to obtain if from the * content type. */ - public Charset getCharset() { - if (charset != null) { - return charset; + public String getCharacterEncoding() { + if (characterEncoding == null) { + characterEncoding = getCharsetFromContentType(getContentType()); } - charset = getCharsetFromContentType(getContentType()); + return characterEncoding; + } + + + /** + * Get the character encoding used for this request. + * + * @return The value set via {@link #setCharset(Charset)} or if no + * call has been made to that method try to obtain if from the + * content type. + * + * @throws UnsupportedEncodingException If the user agent has specified an + * invalid character encoding + */ + public Charset getCharset() throws UnsupportedEncodingException { + if (charset == null) { + getCharacterEncoding(); + if (characterEncoding != null) { + charset = B2CConverter.getCharset(characterEncoding); + } + } return charset; } @@ -307,6 +338,7 @@ public Charset getCharset() { public void setCharset(Charset charset) { this.charset = charset; + this.characterEncoding = charset.name(); } @@ -579,6 +611,7 @@ public void recycle() { contentLength = -1; contentTypeMB = null; charset = null; + characterEncoding = null; expectation = false; headers.recycle(); trailerFields.clear(); @@ -640,7 +673,7 @@ public boolean isProcessing() { * * @param contentType a content type header */ - private static Charset getCharsetFromContentType(String contentType) { + private static String getCharsetFromContentType(String contentType) { if (contentType == null) { return null; @@ -660,15 +693,6 @@ private static Charset getCharsetFromContentType(String contentType) { encoding = encoding.substring(1, encoding.length() - 1); } - Charset result = null; - - try { - result = B2CConverter.getCharset(encoding.trim()); - } catch (UnsupportedEncodingException e) { - // Ignore - } - - return result; + return encoding.trim(); } - } diff --git a/core/src/main/java/org/apache/coyote/RequestGroupInfo.java b/core/src/main/java/org/apache/coyote/RequestGroupInfo.java index c5568b1..057430a 100644 --- a/core/src/main/java/org/apache/coyote/RequestGroupInfo.java +++ b/core/src/main/java/org/apache/coyote/RequestGroupInfo.java @@ -17,13 +17,16 @@ package org.apache.coyote; import java.util.ArrayList; +import java.util.List; + +import org.apache.tomcat.util.modeler.BaseModelMBean; /** This can be moved to top level ( eventually with a better name ). * It is currently used only as a JMX artifact, to aggregate the data * collected from each RequestProcessor thread. */ -public class RequestGroupInfo { - private final ArrayList processors = new ArrayList<>(); +public class RequestGroupInfo extends BaseModelMBean { + private final List processors = new ArrayList<>(); private long deadMaxTime = 0; private long deadProcessingTime = 0; private int deadRequestCount = 0; diff --git a/core/src/main/java/org/apache/coyote/Response.java b/core/src/main/java/org/apache/coyote/Response.java index 257bd3c..35127d6 100644 --- a/core/src/main/java/org/apache/coyote/Response.java +++ b/core/src/main/java/org/apache/coyote/Response.java @@ -22,7 +22,9 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Locale; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Supplier; import javax.servlet.WriteListener; @@ -78,6 +80,8 @@ public final class Response { final MimeHeaders headers = new MimeHeaders(); + private Supplier> trailerFieldsSupplier = null; + /** * Associated output buffer. */ @@ -108,6 +112,10 @@ public final class Response { String contentType = null; String contentLanguage = null; Charset charset = null; + // Retain the original name used to set the charset so exactly that name is + // used in the ContentType header. Some (arguably non-specification + // compliant) user agents are very particular + String characterEncoding = null; long contentLength = -1; private Locale locale = DEFAULT_LOCALE; @@ -120,11 +128,6 @@ public final class Response { */ Exception errorException = null; - /** - * Has the charset been explicitly set. - */ - boolean charsetSet = false; - Request req; // ------------------------------------------------------------- Properties @@ -322,6 +325,22 @@ public void addHeader(String name, String value, Charset charset) { } + public void setTrailerFields(Supplier> supplier) { + AtomicBoolean trailerFieldsSupported = new AtomicBoolean(false); + action(ActionCode.IS_TRAILER_FIELDS_SUPPORTED, trailerFieldsSupported); + if (!trailerFieldsSupported.get()) { + throw new IllegalStateException(sm.getString("response.noTrailers.notSupported")); + } + + this.trailerFieldsSupplier = supplier; + } + + + public Supplier> getTrailerFields() { + return trailerFieldsSupplier; + } + + /** * Set internal fields for special header names. * Called from set/addHeader. @@ -400,18 +419,21 @@ public String getContentLanguage() { * Overrides the character encoding used in the body of the response. This * method must be called prior to writing output using getWriter(). * - * @param charset The character encoding. + * @param characterEncoding The name of character encoding. + * + * @throws UnsupportedEncodingException If the specified name is not + * recognised */ - public void setCharset(Charset charset) { + public void setCharacterEncoding(String characterEncoding) throws UnsupportedEncodingException { if (isCommitted()) { return; } - if (charset == null) { + if (characterEncoding == null) { return; } - this.charset = charset; - charsetSet = true; + this.charset = B2CConverter.getCharset(characterEncoding); + this.characterEncoding = characterEncoding; } @@ -420,6 +442,11 @@ public Charset getCharset() { } + public String getCharacterEncoding() { + return characterEncoding; + } + + /** * Sets the content type. * @@ -458,7 +485,6 @@ public void setContentType(String type) { if (charsetValue.length() > 0) { try { charset = B2CConverter.getCharset(charsetValue); - charsetSet = true; } catch (UnsupportedEncodingException e) { log.warn(sm.getString("response.encoding.invalid", charsetValue), e); } @@ -475,9 +501,8 @@ public String getContentType() { String ret = contentType; if (ret != null - && charset != null - && charsetSet) { - ret = ret + ";charset=" + charset.name(); + && charset != null) { + ret = ret + ";charset=" + characterEncoding; } return ret; @@ -522,7 +547,7 @@ public void recycle() { contentLanguage = null; locale = DEFAULT_LOCALE; charset = null; - charsetSet = false; + characterEncoding = null; contentLength = -1; status = 200; message = null; @@ -530,6 +555,7 @@ public void recycle() { commitTime = -1; errorException = null; headers.clear(); + trailerFieldsSupplier = null; // Servlet 3.1 non-blocking write listener listener = null; fireListener = false; diff --git a/core/src/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java b/core/src/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java index b1fbc3b..2500abd 100644 --- a/core/src/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java +++ b/core/src/main/java/org/apache/coyote/ajp/AbstractAjpProtocol.java @@ -195,8 +195,7 @@ public UpgradeProtocol[] findUpgradeProtocols() { @Override protected Processor createProcessor() { - AjpProcessor processor = new AjpProcessor(this); - processor.setAdapter(getAdapter()); + AjpProcessor processor = new AjpProcessor(this, getAdapter()); return processor; } diff --git a/core/src/main/java/org/apache/coyote/ajp/AjpAprProtocol.java b/core/src/main/java/org/apache/coyote/ajp/AjpAprProtocol.java index 936810f..92ad9c0 100644 --- a/core/src/main/java/org/apache/coyote/ajp/AjpAprProtocol.java +++ b/core/src/main/java/org/apache/coyote/ajp/AjpAprProtocol.java @@ -57,6 +57,6 @@ public AjpAprProtocol() { @Override protected String getNamePrefix() { - return ("ajp-apr"); + return "ajp-apr"; } } diff --git a/core/src/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java b/core/src/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java index eee83cc..0a3e75b 100644 --- a/core/src/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java +++ b/core/src/main/java/org/apache/coyote/ajp/AjpNio2Protocol.java @@ -44,6 +44,6 @@ public AjpNio2Protocol() { @Override protected String getNamePrefix() { - return ("ajp-nio2"); + return "ajp-nio2"; } } diff --git a/core/src/main/java/org/apache/coyote/ajp/AjpNioProtocol.java b/core/src/main/java/org/apache/coyote/ajp/AjpNioProtocol.java index 6876f18..534cbc7 100644 --- a/core/src/main/java/org/apache/coyote/ajp/AjpNioProtocol.java +++ b/core/src/main/java/org/apache/coyote/ajp/AjpNioProtocol.java @@ -43,6 +43,6 @@ public AjpNioProtocol() { @Override protected String getNamePrefix() { - return ("ajp-nio"); + return "ajp-nio"; } } diff --git a/core/src/main/java/org/apache/coyote/ajp/AjpProcessor.java b/core/src/main/java/org/apache/coyote/ajp/AjpProcessor.java index 54e0816..ce134cb 100644 --- a/core/src/main/java/org/apache/coyote/ajp/AjpProcessor.java +++ b/core/src/main/java/org/apache/coyote/ajp/AjpProcessor.java @@ -30,6 +30,7 @@ import org.apache.coyote.AbstractProcessor; import org.apache.coyote.ActionCode; +import org.apache.coyote.Adapter; import org.apache.coyote.ErrorState; import org.apache.coyote.InputBuffer; import org.apache.coyote.OutputBuffer; @@ -244,8 +245,8 @@ public class AjpProcessor extends AbstractProcessor { // ------------------------------------------------------------ Constructor - public AjpProcessor(AbstractAjpProtocol protocol) { - super(); + public AjpProcessor(AbstractAjpProtocol protocol, Adapter adapter) { + super(adapter); this.protocol = protocol; int packetSize = protocol.getPacketSize(); @@ -1190,6 +1191,14 @@ protected final boolean isReady() { } + @Override + protected boolean isTrailerFieldsReady() { + // AJP does not support trailers so return true so app can request the + // trailers and find out that there are none. + return true; + } + + /** * Read at least the specified amount of bytes, and place them * in the input buffer. Note that if any data is available to read then this diff --git a/core/src/main/java/org/apache/coyote/ajp/LocalStrings.properties b/core/src/main/java/org/apache/coyote/ajp/LocalStrings.properties index a2ed44f..d3647c6 100644 --- a/core/src/main/java/org/apache/coyote/ajp/LocalStrings.properties +++ b/core/src/main/java/org/apache/coyote/ajp/LocalStrings.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + ajpprotocol.noSSL=SSL is not supported with AJP. The SSL host configuration for [{0}] was ignored ajpprotocol.noUpgrade=Upgrade is not supported with AJP. The UpgradeProtocol configuration for [{0}] was ignored ajpprotocol.noUpgradeHandler=Upgrade is not supported with AJP. The HttpUpgradeHandler [{0}] can not be processed diff --git a/core/src/main/java/org/apache/coyote/ajp/LocalStrings_es.properties b/core/src/main/java/org/apache/coyote/ajp/LocalStrings_es.properties index dac3f30..2db1895 100644 --- a/core/src/main/java/org/apache/coyote/ajp/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/coyote/ajp/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + ajpprotocol.proto.error = Error leyendo requerimiento, ignorado ajpprocessor.failedread = Fallo en lectura de Conector ajpprocessor.failedsend = No pude enviar mensaje AJP diff --git a/core/src/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java b/core/src/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java index d9c22b9..3b2d494 100644 --- a/core/src/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java +++ b/core/src/main/java/org/apache/coyote/http11/AbstractHttp11Protocol.java @@ -24,14 +24,16 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; import javax.servlet.http.HttpUpgradeHandler; import org.apache.coyote.AbstractProtocol; +import org.apache.coyote.CompressionConfig; import org.apache.coyote.Processor; +import org.apache.coyote.Request; +import org.apache.coyote.Response; import org.apache.coyote.UpgradeProtocol; import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; @@ -48,6 +50,8 @@ public abstract class AbstractHttp11Protocol extends AbstractProtocol { protected static final StringManager sm = StringManager.getManager(AbstractHttp11Protocol.class); + private final CompressionConfig compressionConfig = new CompressionConfig(); + public AbstractHttp11Protocol(AbstractEndpoint endpoint) { super(endpoint); @@ -91,6 +95,53 @@ protected AbstractEndpoint getEndpoint() { // ------------------------------------------------ HTTP specific properties // ------------------------------------------ managed in the ProtocolHandler + private boolean allowHostHeaderMismatch = false; + /** + * Will Tomcat accept an HTTP 1.1 request where the host header does not + * agree with the host specified (if any) in the request line? + * + * @return {@code true} if Tomcat will allow such requests, otherwise + * {@code false} + */ + public boolean getAllowHostHeaderMismatch() { + return allowHostHeaderMismatch; + } + /** + * Will Tomcat accept an HTTP 1.1 request where the host header does not + * agree with the host specified (if any) in the request line? + * + * @param allowHostHeaderMismatch {@code true} to allow such requests, + * {@code false} to reject them with a 400 + */ + public void setAllowHostHeaderMismatch(boolean allowHostHeaderMismatch) { + this.allowHostHeaderMismatch = allowHostHeaderMismatch; + } + + + private boolean rejectIllegalHeaderName = true; + /** + * If an HTTP request is received that contains an illegal header name (i.e. + * the header name is not a token) will the request be rejected (with a 400 + * response) or will the illegal header be ignored. + * + * @return {@code true} if the request will be rejected or {@code false} if + * the header will be ignored + */ + public boolean getRejectIllegalHeaderName() { return rejectIllegalHeaderName; } + /** + * If an HTTP request is received that contains an illegal header name (i.e. + * the header name is not a token) should the request be rejected (with a + * 400 response) or should the illegal header be ignored. + * + * @param rejectIllegalHeaderName {@code true} to reject requests with + * illegal header names, {@code false} to + * ignore the header + */ + public void setRejectIllegalHeaderName(boolean rejectIllegalHeaderName) { + this.rejectIllegalHeaderName = rejectIllegalHeaderName; + } + + private int maxSavePostSize = 4 * 1024; /** * Return the maximum size of the post which will be saved during FORM or @@ -160,127 +211,49 @@ public void setDisableUploadTimeout(boolean isDisabled) { } - private int compressionLevel = 0; - /** - * Set compression level. - * - * @param compression One of on, force, - * off or the minimum compression size in - * bytes which implies on - */ public void setCompression(String compression) { - if (compression.equals("on")) { - this.compressionLevel = 1; - } else if (compression.equals("force")) { - this.compressionLevel = 2; - } else if (compression.equals("off")) { - this.compressionLevel = 0; - } else { - try { - // Try to parse compression as an int, which would give the - // minimum compression size - setCompressionMinSize(Integer.parseInt(compression)); - this.compressionLevel = 1; - } catch (Exception e) { - this.compressionLevel = 0; - } - } + compressionConfig.setCompression(compression); } - - - /** - * Return compression level. - * - * @return The current compression level in string form (off/on/force) - */ public String getCompression() { - switch (compressionLevel) { - case 0: - return "off"; - case 1: - return "on"; - case 2: - return "force"; - } - return "off"; + return compressionConfig.getCompression(); } protected int getCompressionLevel() { - return compressionLevel; + return compressionConfig.getCompressionLevel(); } - private Pattern noCompressionUserAgents = null; - /** - * Obtain the String form of the regular expression that defines the user - * agents to not use gzip with. - * - * @return The regular expression as a String - */ public String getNoCompressionUserAgents() { - if (noCompressionUserAgents == null) { - return null; - } else { - return noCompressionUserAgents.toString(); - } + return compressionConfig.getNoCompressionUserAgents(); } protected Pattern getNoCompressionUserAgentsPattern() { - return noCompressionUserAgents; + return compressionConfig.getNoCompressionUserAgentsPattern(); } - /** - * Set no compression user agent pattern. Regular expression as supported - * by {@link Pattern}. e.g.: gorilla|desesplorer|tigrus. - * - * @param noCompressionUserAgents The regular expression for user agent - * strings for which compression should not - * be applied - */ public void setNoCompressionUserAgents(String noCompressionUserAgents) { - if (noCompressionUserAgents == null || noCompressionUserAgents.length() == 0) { - this.noCompressionUserAgents = null; - } else { - this.noCompressionUserAgents = - Pattern.compile(noCompressionUserAgents); - } + compressionConfig.setNoCompressionUserAgents(noCompressionUserAgents); } - private String compressibleMimeType = "text/html,text/xml,text/plain,text/css," + - "text/javascript,application/javascript,application/json,application/xml"; - private String[] compressibleMimeTypes = null; - public String getCompressibleMimeType() { return compressibleMimeType; } + public String getCompressibleMimeType() { + return compressionConfig.getCompressibleMimeType(); + } public void setCompressibleMimeType(String valueS) { - compressibleMimeType = valueS; - compressibleMimeTypes = null; + compressionConfig.setCompressibleMimeType(valueS); } public String[] getCompressibleMimeTypes() { - String[] result = compressibleMimeTypes; - if (result != null) { - return result; - } - List values = new ArrayList<>(); - StringTokenizer tokens = new StringTokenizer(compressibleMimeType, ","); - while (tokens.hasMoreTokens()) { - String token = tokens.nextToken().trim(); - if (token.length() > 0) { - values.add(token); - } - } - result = values.toArray(new String[values.size()]); - compressibleMimeTypes = result; - return result; + return compressionConfig.getCompressibleMimeTypes(); } - private int compressionMinSize = 2048; - public int getCompressionMinSize() { return compressionMinSize; } - /** - * Set Minimum size to trigger compression. - * - * @param compressionMinSize The minimum content length required for - * compression in bytes - */ + public int getCompressionMinSize() { + return compressionConfig.getCompressionMinSize(); + } public void setCompressionMinSize(int compressionMinSize) { - this.compressionMinSize = compressionMinSize; + compressionConfig.setCompressionMinSize(compressionMinSize); + } + + + public boolean useCompression(Request request, Response response) { + return compressionConfig.useCompression(request, response); } @@ -551,11 +524,23 @@ public void addSslHostConfig(SSLHostConfig sslHostConfig) { getEndpoint().addSslHostConfig(sslHostConfig); } + @Override public SSLHostConfig[] findSslHostConfigs() { return getEndpoint().findSslHostConfigs(); } + + public void reloadSsslHostConfigs() { + getEndpoint().reloadSslHostConfigs(); + } + + + public void reloadSsslHostConfig(String hostName) { + getEndpoint().reloadSslHostConfig(hostName); + } + + // ----------------------------------------------- HTTPS specific properties // -------------------------------------------- Handled via an SSLHostConfig @@ -934,8 +919,7 @@ public void setTrustManagerClassName(String trustManagerClassName) { @Override protected Processor createProcessor() { - Http11Processor processor = new Http11Processor(this); - processor.setAdapter(getAdapter()); + Http11Processor processor = new Http11Processor(this, adapter); return processor; } diff --git a/core/src/main/java/org/apache/coyote/http11/Http11AprProtocol.java b/core/src/main/java/org/apache/coyote/http11/Http11AprProtocol.java index fc45b17..0311fb4 100644 --- a/core/src/main/java/org/apache/coyote/http11/Http11AprProtocol.java +++ b/core/src/main/java/org/apache/coyote/http11/Http11AprProtocol.java @@ -63,9 +63,9 @@ public boolean isAprRequired() { @Override protected String getNamePrefix() { if (isSSLEnabled()) { - return ("https-openssl-apr"); + return "https-openssl-apr"; } else { - return ("http-apr"); + return "http-apr"; } } } diff --git a/core/src/main/java/org/apache/coyote/http11/Http11InputBuffer.java b/core/src/main/java/org/apache/coyote/http11/Http11InputBuffer.java index bf7ef28..b4c7cad 100644 --- a/core/src/main/java/org/apache/coyote/http11/Http11InputBuffer.java +++ b/core/src/main/java/org/apache/coyote/http11/Http11InputBuffer.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import org.apache.coyote.InputBuffer; import org.apache.coyote.Request; @@ -63,6 +64,8 @@ public class Http11InputBuffer implements InputBuffer, ApplicationBufferHandler private final MimeHeaders headers; + private final boolean rejectIllegalHeaderName; + /** * State. */ @@ -145,12 +148,14 @@ public class Http11InputBuffer implements InputBuffer, ApplicationBufferHandler // ----------------------------------------------------------- Constructors - public Http11InputBuffer(Request request, int headerBufferSize) { + public Http11InputBuffer(Request request, int headerBufferSize, + boolean rejectIllegalHeaderName) { this.request = request; headers = request.getMimeHeaders(); this.headerBufferSize = headerBufferSize; + this.rejectIllegalHeaderName = rejectIllegalHeaderName; filterLibrary = new InputFilter[0]; activeFilters = new InputFilter[0]; @@ -182,10 +187,7 @@ void addFilter(InputFilter filter) { throw new NullPointerException(sm.getString("iib.filter.npe")); } - InputFilter[] newFilterLibrary = new InputFilter[filterLibrary.length + 1]; - for (int i = 0; i < filterLibrary.length; i++) { - newFilterLibrary[i] = filterLibrary[i]; - } + InputFilter[] newFilterLibrary = Arrays.copyOf(filterLibrary, filterLibrary.length + 1); newFilterLibrary[filterLibrary.length] = filter; filterLibrary = newFilterLibrary; @@ -658,6 +660,16 @@ ByteBuffer getLeftover() { } + boolean isChunking() { + for (int i = 0; i < lastActiveFilter; i++) { + if (activeFilters[i] == filterLibrary[Constants.CHUNKED_FILTER]) { + return true; + } + } + return false; + } + + void init(SocketWrapperBase socketWrapper) { wrapper = socketWrapper; @@ -778,10 +790,11 @@ private HeaderParseStatus parseHeader() throws IOException { headerData.lastSignificantChar = pos; break; } else if (!HttpParser.isToken(chr)) { - // If a non-token header is detected, skip the line and - // ignore the header + // Non-token characters are illegal in header names + // Parsing continues so the error can be reported in context headerData.lastSignificantChar = pos; byteBuffer.position(byteBuffer.position() - 1); + // skipLine() will handle the error return skipLine(); } @@ -913,11 +926,15 @@ private HeaderParseStatus skipLine() throws IOException { headerData.lastSignificantChar = pos; } } - if (log.isDebugEnabled()) { - log.debug(sm.getString("iib.invalidheader", + if (rejectIllegalHeaderName || log.isDebugEnabled()) { + String message = sm.getString("iib.invalidheader", new String(byteBuffer.array(), headerData.start, headerData.lastSignificantChar - headerData.start + 1, - StandardCharsets.ISO_8859_1))); + StandardCharsets.ISO_8859_1)); + if (rejectIllegalHeaderName) { + throw new IllegalArgumentException(message); + } + log.debug(message); } headerParsePos = HeaderParsePosition.HEADER_START; @@ -927,12 +944,12 @@ private HeaderParseStatus skipLine() throws IOException { // ----------------------------------------------------------- Inner classes - private static enum HeaderParseStatus { + private enum HeaderParseStatus { DONE, HAVE_MORE_HEADERS, NEED_MORE_DATA } - private static enum HeaderParsePosition { + private enum HeaderParsePosition { /** * Start of a new header. A CRLF here means that there are no more * headers. Any other character starts a header name. diff --git a/core/src/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java b/core/src/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java index de520ef..e30b41a 100644 --- a/core/src/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java +++ b/core/src/main/java/org/apache/coyote/http11/Http11Nio2Protocol.java @@ -44,9 +44,9 @@ public Http11Nio2Protocol() { @Override protected String getNamePrefix() { if (isSSLEnabled()) { - return ("https-" + getSslImplementationShortName()+ "-nio2"); + return "https-" + getSslImplementationShortName()+ "-nio2"; } else { - return ("http-nio2"); + return "http-nio2"; } } } diff --git a/core/src/main/java/org/apache/coyote/http11/Http11NioProtocol.java b/core/src/main/java/org/apache/coyote/http11/Http11NioProtocol.java index f872ffe..e79390b 100644 --- a/core/src/main/java/org/apache/coyote/http11/Http11NioProtocol.java +++ b/core/src/main/java/org/apache/coyote/http11/Http11NioProtocol.java @@ -76,9 +76,9 @@ public int getPollerThreadPriority() { @Override protected String getNamePrefix() { if (isSSLEnabled()) { - return ("https-" + getSslImplementationShortName()+ "-nio"); + return "https-" + getSslImplementationShortName()+ "-nio"; } else { - return ("http-nio"); + return "http-nio"; } } } diff --git a/core/src/main/java/org/apache/coyote/http11/Http11OutputBuffer.java b/core/src/main/java/org/apache/coyote/http11/Http11OutputBuffer.java index 0639ccc..aa5ad48 100644 --- a/core/src/main/java/org/apache/coyote/http11/Http11OutputBuffer.java +++ b/core/src/main/java/org/apache/coyote/http11/Http11OutputBuffer.java @@ -18,13 +18,10 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Arrays; import org.apache.coyote.ActionCode; -import org.apache.coyote.OutputBuffer; import org.apache.coyote.Response; -import org.apache.coyote.http11.filters.GzipOutputFilter; -import org.apache.juli.logging.Log; -import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.MessageBytes; import org.apache.tomcat.util.net.SocketWrapperBase; @@ -36,7 +33,7 @@ * headers (once committed) and the response body. Note that buffering of the * response body happens at a higher level. */ -public class Http11OutputBuffer implements OutputBuffer { +public class Http11OutputBuffer implements HttpOutputBuffer { // -------------------------------------------------------------- Variables @@ -46,12 +43,6 @@ public class Http11OutputBuffer implements OutputBuffer { protected static final StringManager sm = StringManager.getManager(Http11OutputBuffer.class); - /** - * Logger. - */ - private static final Log log = LogFactory.getLog(Http11OutputBuffer.class); - - // ----------------------------------------------------- Instance Variables /** @@ -93,7 +84,7 @@ public class Http11OutputBuffer implements OutputBuffer { /** * Underlying output buffer. */ - protected OutputBuffer outputStreamOutputBuffer; + protected HttpOutputBuffer outputStreamOutputBuffer; /** @@ -134,10 +125,7 @@ protected Http11OutputBuffer(Response response, int headerBufferSize) { */ public void addFilter(OutputFilter filter) { - OutputFilter[] newFilterLibrary = new OutputFilter[filterLibrary.length + 1]; - for (int i = 0; i < filterLibrary.length; i++) { - newFilterLibrary[i] = filterLibrary[i]; - } + OutputFilter[] newFilterLibrary = Arrays.copyOf(filterLibrary, filterLibrary.length + 1); newFilterLibrary[filterLibrary.length] = filter; filterLibrary = newFilterLibrary; @@ -213,32 +201,41 @@ public long getBytesWritten() { } - // --------------------------------------------------------- Public Methods + // ----------------------------------------------- HttpOutputBuffer Methods /** * Flush the response. * * @throws IOException an underlying I/O error occurred */ + @Override public void flush() throws IOException { - // go through the filters and if there is gzip filter - // invoke it to flush - for (int i = 0; i <= lastActiveFilter; i++) { - if (activeFilters[i] instanceof GzipOutputFilter) { - if (log.isDebugEnabled()) { - log.debug("Flushing the gzip filter at position " + i + - " of the filter chain..."); - } - ((GzipOutputFilter) activeFilters[i]).flush(); - break; - } + if (lastActiveFilter == -1) { + outputStreamOutputBuffer.flush(); + } else { + activeFilters[lastActiveFilter].flush(); } + } + - // Flush the current buffer(s) - flushBuffer(isBlocking()); + @Override + public void end() throws IOException { + if (responseFinished) { + return; + } + + if (lastActiveFilter == -1) { + outputStreamOutputBuffer.end(); + } else { + activeFilters[lastActiveFilter].end(); + } + + responseFinished = true; } + // --------------------------------------------------------- Public Methods + /** * Reset the header buffer if an error occurs during the writing of the * headers so the error response can be written. @@ -279,26 +276,6 @@ public void nextRequest() { } - /** - * Finish writing the response. - * - * @throws IOException an underlying I/O error occurred - */ - public void finishResponse() throws IOException { - if (responseFinished) { - return; - } - - if (lastActiveFilter != -1) { - activeFilters[lastActiveFilter].end(); - } - - flushBuffer(true); - - responseFinished = true; - } - - public void init(SocketWrapperBase socketWrapper) { this.socketWrapper = socketWrapper; } @@ -526,12 +503,22 @@ public void registerWriteInterest() { } + boolean isChunking() { + for (int i = 0; i < lastActiveFilter; i++) { + if (activeFilters[i] == filterLibrary[Constants.CHUNKED_FILTER]) { + return true; + } + } + return false; + } + + // ------------------------------------------ SocketOutputBuffer Inner Class /** * This class is an output buffer which will write data to a socket. */ - protected class SocketOutputBuffer implements OutputBuffer { + protected class SocketOutputBuffer implements HttpOutputBuffer { /** * Write chunk. @@ -555,5 +542,15 @@ public int doWrite(ByteBuffer chunk) throws IOException { public long getBytesWritten() { return byteCount; } + + @Override + public void end() throws IOException { + socketWrapper.flush(true); + } + + @Override + public void flush() throws IOException { + socketWrapper.flush(isBlocking()); + } } } diff --git a/core/src/main/java/org/apache/coyote/http11/Http11Processor.java b/core/src/main/java/org/apache/coyote/http11/Http11Processor.java index cb868fb..bec4dc9 100644 --- a/core/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/core/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -27,6 +27,7 @@ import org.apache.coyote.AbstractProcessor; import org.apache.coyote.ActionCode; +import org.apache.coyote.Adapter; import org.apache.coyote.ErrorState; import org.apache.coyote.Request; import org.apache.coyote.RequestInfo; @@ -51,6 +52,7 @@ import org.apache.tomcat.util.buf.MessageBytes; import org.apache.tomcat.util.http.FastHttpDateFormat; import org.apache.tomcat.util.http.MimeHeaders; +import org.apache.tomcat.util.http.parser.Host; import org.apache.tomcat.util.log.UserDataHelper; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; @@ -149,13 +151,14 @@ public class Http11Processor extends AbstractProcessor { private SendfileDataBase sendfileData = null; - public Http11Processor(AbstractHttp11Protocol protocol) { - super(); + public Http11Processor(AbstractHttp11Protocol protocol, Adapter adapter) { + super(adapter); this.protocol = protocol; userDataHelper = new UserDataHelper(log); - inputBuffer = new Http11InputBuffer(request, protocol.getMaxHttpHeaderSize()); + inputBuffer = new Http11InputBuffer(request, protocol.getMaxHttpHeaderSize(), + protocol.getRejectIllegalHeaderName()); request.setInputBuffer(inputBuffer); outputBuffer = new Http11OutputBuffer(response, protocol.getMaxHttpHeaderSize()); @@ -186,90 +189,6 @@ public Http11Processor(AbstractHttp11Protocol protocol) { } - /** - * Checks if any entry in the string array starts with the specified value - * - * @param sArray the StringArray - * @param value string - */ - private static boolean startsWithStringArray(String sArray[], String value) { - if (value == null) { - return false; - } - for (int i = 0; i < sArray.length; i++) { - if (value.startsWith(sArray[i])) { - return true; - } - } - return false; - } - - - /** - * Check if the resource could be compressed, if the client supports it. - */ - private boolean isCompressible() { - - // Check if content is not already gzipped - MessageBytes contentEncodingMB = response.getMimeHeaders().getValue("Content-Encoding"); - - if ((contentEncodingMB != null) && (contentEncodingMB.indexOf("gzip") != -1)) { - return false; - } - - // If force mode, always compress (test purposes only) - if (protocol.getCompressionLevel() == 2) { - return true; - } - - // Check if sufficient length to trigger the compression - long contentLength = response.getContentLengthLong(); - if ((contentLength == -1) || (contentLength > protocol.getCompressionMinSize())) { - // Check for compatible MIME-TYPE - String[] compressibleMimeTypes = protocol.getCompressibleMimeTypes(); - if (compressibleMimeTypes != null) { - return (startsWithStringArray(compressibleMimeTypes, response.getContentType())); - } - } - - return false; - } - - - /** - * Check if compression should be used for this resource. Already checked - * that the resource could be compressed if the client supports it. - */ - private boolean useCompression() { - - // Check if browser support gzip encoding - MessageBytes acceptEncodingMB = request.getMimeHeaders().getValue("accept-encoding"); - - if ((acceptEncodingMB == null) || (acceptEncodingMB.indexOf("gzip") == -1)) { - return false; - } - - // If force mode, always compress (test purposes only) - if (protocol.getCompressionLevel() == 2) { - return true; - } - - // Check for incompatible Browser - Pattern noCompressionUserAgents = protocol.getNoCompressionUserAgentsPattern(); - if (noCompressionUserAgents != null) { - MessageBytes userAgentValueMB = request.getMimeHeaders().getValue("user-agent"); - if(userAgentValueMB != null) { - String userAgentValue = userAgentValueMB.toString(); - if (noCompressionUserAgents.matcher(userAgentValue).matches()) { - return false; - } - } - } - - return true; - } - - /** * Specialized utility method: find a sequence of lower case bytes inside * a ByteChunk. @@ -723,6 +642,30 @@ private void prepareRequest() { } } + + // Check host header + MessageBytes hostValueMB = null; + try { + hostValueMB = headers.getUniqueValue("host"); + } catch (IllegalArgumentException iae) { + // Multiple Host headers are not permitted + // 400 - Bad request + response.setStatus(400); + setErrorState(ErrorState.CLOSE_CLEAN, null); + if (log.isDebugEnabled()) { + log.debug(sm.getString("http11processor.request.multipleHosts")); + } + } + if (http11 && hostValueMB == null) { + // 400 - Bad request + response.setStatus(400); + setErrorState(ErrorState.CLOSE_CLEAN, null); + if (log.isDebugEnabled()) { + log.debug(sm.getString("http11processor.request.prepare")+ + " host header missing"); + } + } + // Check for a full URI (including protocol://host:port/) ByteChunk uriBC = request.requestURI().getByteChunk(); if (uriBC.startsWithIgnoreCase("http", 0)) { @@ -731,21 +674,56 @@ private void prepareRequest() { int uriBCStart = uriBC.getStart(); int slashPos = -1; if (pos != -1) { + pos += 3; byte[] uriB = uriBC.getBytes(); - slashPos = uriBC.indexOf('/', pos + 3); + slashPos = uriBC.indexOf('/', pos); + int atPos = uriBC.indexOf('@', pos); if (slashPos == -1) { slashPos = uriBC.getLength(); // Set URI as "/" request.requestURI().setBytes - (uriB, uriBCStart + pos + 1, 1); + (uriB, uriBCStart + pos - 2, 1); } else { request.requestURI().setBytes (uriB, uriBCStart + slashPos, uriBC.getLength() - slashPos); } - MessageBytes hostMB = headers.setValue("host"); - hostMB.setBytes(uriB, uriBCStart + pos + 3, - slashPos - pos - 3); + // Skip any user info + if (atPos != -1) { + pos = atPos + 1; + } + if (http11) { + // Missing host header is illegal but handled above + if (hostValueMB != null) { + // Any host in the request line must be consistent with + // the Host header + if (!hostValueMB.getByteChunk().equals( + uriB, uriBCStart + pos, slashPos - pos)) { + if (protocol.getAllowHostHeaderMismatch()) { + // The requirements of RFC 2616 are being + // applied. If the host header and the request + // line do not agree, the request line takes + // precedence + hostValueMB = headers.setValue("host"); + hostValueMB.setBytes(uriB, uriBCStart + pos, slashPos - pos); + } else { + // The requirements of RFC 7230 are being + // applied. If the host header and the request + // line do not agree, trigger a 400 response. + response.setStatus(400); + setErrorState(ErrorState.CLOSE_CLEAN, null); + if (log.isDebugEnabled()) { + log.debug(sm.getString("http11processor.request.inconsistentHosts")); + } + } + } + } + } else { + // Not HTTP/1.1 - no Host header so generate one since + // Tomcat internals assume it is set + hostValueMB = headers.setValue("host"); + hostValueMB.setBytes(uriB, uriBCStart + pos, slashPos - pos); + } } } @@ -790,20 +768,7 @@ private void prepareRequest() { } } - MessageBytes valueMB = headers.getValue("host"); - - // Check host header - if (http11 && (valueMB == null)) { - // 400 - Bad request - response.setStatus(400); - setErrorState(ErrorState.CLOSE_CLEAN, null); - if (log.isDebugEnabled()) { - log.debug(sm.getString("http11processor.request.prepare")+ - " host header missing"); - } - } - - parseHost(valueMB); + parseHost(hostValueMB); if (!contentDelimitation) { // If there's no content length @@ -847,6 +812,13 @@ protected final void prepareResponse() throws IOException { (outputFilters[Constants.VOID_FILTER]); entityBody = false; contentDelimitation = true; + if (statusCode == 205) { + // RFC 7231 requires the server to explicitly signal an empty + // response in this case + response.setContentLength(0); + } else { + response.setContentLength(-1); + } } MessageBytes methodMB = request.method(); @@ -863,23 +835,13 @@ protected final void prepareResponse() throws IOException { } // Check for compression - boolean isCompressible = false; + boolean useCompression = false; - if (entityBody && (protocol.getCompressionLevel() > 0) && sendfileData == null) { - isCompressible = isCompressible(); - if (isCompressible) { - useCompression = useCompression(); - } - // Change content-length to -1 to force chunking - if (useCompression) { - response.setContentLength(-1); - } + if (entityBody && sendfileData == null) { + useCompression = protocol.useCompression(request, response); } MimeHeaders headers = response.getMimeHeaders(); - if (!entityBody) { - response.setContentLength(-1); - } // A SC_NO_CONTENT response may include entity headers if (entityBody || statusCode == HttpServletResponse.SC_NO_CONTENT) { String contentType = response.getContentType(); @@ -895,44 +857,30 @@ protected final void prepareResponse() throws IOException { long contentLength = response.getContentLengthLong(); boolean connectionClosePresent = false; - if (contentLength != -1) { + if (http11 && response.getTrailerFields() != null) { + // If trailer fields are set, always use chunking + outputBuffer.addActiveFilter(outputFilters[Constants.CHUNKED_FILTER]); + contentDelimitation = true; + headers.addValue(Constants.TRANSFERENCODING).setString(Constants.CHUNKED); + } else if (contentLength != -1) { headers.setValue("Content-Length").setLong(contentLength); - outputBuffer.addActiveFilter - (outputFilters[Constants.IDENTITY_FILTER]); + outputBuffer.addActiveFilter(outputFilters[Constants.IDENTITY_FILTER]); contentDelimitation = true; } else { // If the response code supports an entity body and we're on // HTTP 1.1 then we chunk unless we have a Connection: close header connectionClosePresent = isConnectionClose(headers); - if (entityBody && http11 && !connectionClosePresent) { - outputBuffer.addActiveFilter - (outputFilters[Constants.CHUNKED_FILTER]); + if (http11 && entityBody && !connectionClosePresent) { + outputBuffer.addActiveFilter(outputFilters[Constants.CHUNKED_FILTER]); contentDelimitation = true; headers.addValue(Constants.TRANSFERENCODING).setString(Constants.CHUNKED); } else { - outputBuffer.addActiveFilter - (outputFilters[Constants.IDENTITY_FILTER]); + outputBuffer.addActiveFilter(outputFilters[Constants.IDENTITY_FILTER]); } } if (useCompression) { outputBuffer.addActiveFilter(outputFilters[Constants.GZIP_FILTER]); - headers.setValue("Content-Encoding").setString("gzip"); - } - // If it might be compressed, set the Vary header - if (isCompressible) { - // Make Proxies happy via Vary (from mod_deflate) - MessageBytes vary = headers.getValue("Vary"); - if (vary == null) { - // Add a new Vary header - headers.setValue("Vary").setString("Accept-Encoding"); - } else if (vary.equals("*")) { - // No action required - } else { - // Merge into current header - headers.setValue("Vary").setString( - vary.getString() + ",Accept-Encoding"); - } } // Add date header unless application has already set one (e.g. in a @@ -1048,6 +996,32 @@ private void parseHost(MessageBytes valueMB) { hostNameC = new char[valueL]; } + // TODO + // To minimise breakage to existing systems, just report any errors. In + // a future release this will switch to returning a 400 response. + // Depending on user feedback, the 400 response may be made optional. + try { + Host.parse(valueMB); + } catch (IOException | IllegalArgumentException e) { + // IOException should never happen + // IllegalArgumentException indicates that the host name is invalid + UserDataHelper.Mode logMode = userDataHelper.getNextMode(); + if (logMode != null) { + String message = sm.getString("http11processor.host.parse", + valueMB.toString(), e.getMessage()); + switch (logMode) { + case INFO_THEN_DEBUG: + message += sm.getString("http11processor.fallToDebug"); + //$FALL-THROUGH$ + case INFO: + log.info(message, e); + break; + case DEBUG: + log.debug(message, e); + } + } + } + boolean ipv6 = (valueB[valueS] == '['); boolean bracketClosed = false; for (int i = 0; i < valueL; i++) { @@ -1167,7 +1141,7 @@ private void endRequest() { if (getErrorState().isIoAllowed()) { try { action(ActionCode.COMMIT, null); - outputBuffer.finishResponse(); + outputBuffer.end(); } catch (IOException e) { setErrorState(ErrorState.CLOSE_CONNECTION_NOW, e); } catch (Throwable t) { @@ -1181,7 +1155,7 @@ private void endRequest() { @Override protected final void finishResponse() throws IOException { - outputBuffer.finishResponse(); + outputBuffer.end(); } @@ -1236,7 +1210,7 @@ protected final void disableSwallowRequest() { @Override - protected final void sslReHandShake() { + protected final void sslReHandShake() throws IOException { if (sslSupport != null) { // Consume and buffer the request body, so that it does not // interfere with the client's handshake messages @@ -1245,8 +1219,17 @@ protected final void sslReHandShake() { protocol.getMaxSavePostSize()); inputBuffer.addActiveFilter(inputFilters[Constants.BUFFERED_FILTER]); + /* + * Outside the try/catch because we want I/O errors during + * renegotiation to be thrown for the caller to handle since they + * will be fatal to the connection. + */ + socketWrapper.doClientAuth(sslSupport); try { - socketWrapper.doClientAuth(sslSupport); + /* + * Errors processing the cert chain do not affect the client + * connection so they can be logged and swallowed here. + */ Object sslO = sslSupport.getPeerCertificateChain(); if (sslO != null) { request.setAttribute(SSLSupport.CERTIFICATE_KEY, sslO); @@ -1302,6 +1285,34 @@ public boolean isUpgrade() { } + @Override + protected boolean isTrailerFieldsReady() { + if (inputBuffer.isChunking()) { + return inputBuffer.isFinished(); + } else { + return true; + } + } + + + @Override + protected boolean isTrailerFieldsSupported() { + // Request must be HTTP/1.1 to support trailer fields + if (!http11) { + return false; + } + + // If the response is not yet committed, chunked encoding can be used + // and the trailer fields sent + if (!response.isCommitted()) { + return true; + } + + // Response has been committed - need to see if chunked is being used + return outputBuffer.isChunking(); + } + + /** * Trigger sendfile processing if required. * @@ -1348,6 +1359,7 @@ public final void recycle() { upgradeToken = null; socketWrapper = null; sendfileData = null; + sslSupport = null; } diff --git a/core/src/main/java/org/apache/coyote/http11/HttpOutputBuffer.java b/core/src/main/java/org/apache/coyote/http11/HttpOutputBuffer.java new file mode 100644 index 0000000..ca71d47 --- /dev/null +++ b/core/src/main/java/org/apache/coyote/http11/HttpOutputBuffer.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.coyote.http11; + +import java.io.IOException; + +import org.apache.coyote.OutputBuffer; + +public interface HttpOutputBuffer extends OutputBuffer { + + /** + * Finish writing the current response. It is acceptable to write extra + * bytes using {@link #doWrite(java.nio.ByteBuffer)} during the execution of + * this method. + * + * @throws IOException If an I/O error occurs while writing to the client + */ + public void end() throws IOException; + + /** + * Flushes any unwritten data to the client. + * + * @throws IOException If an I/O error occurs while flushing + */ + public void flush() throws IOException; +} diff --git a/core/src/main/java/org/apache/coyote/http11/LocalStrings.properties b/core/src/main/java/org/apache/coyote/http11/LocalStrings.properties index f7900fa..1502596 100644 --- a/core/src/main/java/org/apache/coyote/http11/LocalStrings.properties +++ b/core/src/main/java/org/apache/coyote/http11/LocalStrings.properties @@ -17,9 +17,12 @@ abstractHttp11Protocol.alpnConfigured=The [{0}] connector has been configured to abstractHttp11Protocol.alpnWithNoAlpn=The upgrade handler [{0}] for [{1}] only supports upgrade via ALPN but has been configured for the [{2}] connector that does not support ALPN. abstractHttp11Protocol.httpUpgradeConfigured=The [{0}] connector has been configured to support HTTP upgrade to [{1}] -http11processor.fallToDebug=\n Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level. +http11processor.fallToDebug=\n Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level. http11processor.header.parse=Error parsing HTTP request header +http11processor.host.parse=The host header [{0}] failed validation with the error [{1}]. Processing of the request will continue but Tomcat will reject these requests with a 400 response in a future release. http11processor.neverused=This method should never be used +http11processor.request.inconsistentHosts=The host specified in the request line is not consistent with the host header +http11processor.request.multipleHosts=The request contained multiple host headers http11processor.request.prepare=Error preparing request http11processor.request.process=Error processing request http11processor.request.finish=Error finishing request diff --git a/core/src/main/java/org/apache/coyote/http11/LocalStrings_es.properties b/core/src/main/java/org/apache/coyote/http11/LocalStrings_es.properties index 48c0cb9..c23188d 100644 --- a/core/src/main/java/org/apache/coyote/http11/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/coyote/http11/LocalStrings_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + http11processor.header.parse = Error analizando cabecera de requerimiento HTTP http11processor.neverused = Este m\u00E9todo no deber\u00EDa de usarse nunca http11processor.request.prepare = Error preparando requerimiento diff --git a/core/src/main/java/org/apache/coyote/http11/OutputFilter.java b/core/src/main/java/org/apache/coyote/http11/OutputFilter.java index f2549e5..97cdc0a 100644 --- a/core/src/main/java/org/apache/coyote/http11/OutputFilter.java +++ b/core/src/main/java/org/apache/coyote/http11/OutputFilter.java @@ -14,12 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.coyote.http11; -import java.io.IOException; - -import org.apache.coyote.OutputBuffer; import org.apache.coyote.Response; /** @@ -27,8 +23,7 @@ * * @author Remy Maucherat */ -public interface OutputFilter extends OutputBuffer { - +public interface OutputFilter extends HttpOutputBuffer { /** * Some filters need additional parameters from the response. All the @@ -51,19 +46,5 @@ public interface OutputFilter extends OutputBuffer { * * @param buffer The next buffer instance */ - public void setBuffer(OutputBuffer buffer); - - - /** - * End the current request. It is acceptable to write extra bytes using - * buffer.doWrite during the execution of this method. - * - * @return Should return 0 unless the filter does some content length - * delimitation, in which case the number is the amount of extra bytes or - * missing bytes, which would indicate an error. - * Note: It is recommended that extra bytes be swallowed by the filter. - * - * @throws IOException If an I/O error occurs while writing to the client - */ - public long end() throws IOException; + public void setBuffer(HttpOutputBuffer buffer); } diff --git a/core/src/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java index 1285bc9..65bcf39 100644 --- a/core/src/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java +++ b/core/src/main/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java @@ -17,12 +17,20 @@ package org.apache.coyote.http11.filters; import java.io.IOException; +import java.io.OutputStreamWriter; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.HashSet; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; -import org.apache.coyote.OutputBuffer; import org.apache.coyote.Response; +import org.apache.coyote.http11.HttpOutputBuffer; import org.apache.coyote.http11.OutputFilter; import org.apache.tomcat.util.buf.HexUtils; +import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream; /** * Chunked output filter. @@ -31,14 +39,35 @@ */ public class ChunkedOutputFilter implements OutputFilter { + private static final byte[] LAST_CHUNK_BYTES = {(byte) '0', (byte) '\r', (byte) '\n'}; + private static final byte[] CRLF_BYTES = {(byte) '\r', (byte) '\n'}; private static final byte[] END_CHUNK_BYTES = {(byte) '0', (byte) '\r', (byte) '\n', (byte) '\r', (byte) '\n'}; + private static final Set disallowedTrailerFieldNames = new HashSet<>(); + + static { + // Always add these in lower case + disallowedTrailerFieldNames.add("age"); + disallowedTrailerFieldNames.add("cache-control"); + disallowedTrailerFieldNames.add("content-length"); + disallowedTrailerFieldNames.add("content-encoding"); + disallowedTrailerFieldNames.add("content-range"); + disallowedTrailerFieldNames.add("content-type"); + disallowedTrailerFieldNames.add("date"); + disallowedTrailerFieldNames.add("expires"); + disallowedTrailerFieldNames.add("location"); + disallowedTrailerFieldNames.add("retry-after"); + disallowedTrailerFieldNames.add("trailer"); + disallowedTrailerFieldNames.add("transfer-encoding"); + disallowedTrailerFieldNames.add("vary"); + disallowedTrailerFieldNames.add("warning"); + } /** * Next buffer in the pipeline. */ - protected OutputBuffer buffer; + protected HttpOutputBuffer buffer; /** @@ -47,12 +76,17 @@ public class ChunkedOutputFilter implements OutputFilter { protected final ByteBuffer chunkHeader = ByteBuffer.allocate(10); + protected final ByteBuffer lastChunk = ByteBuffer.wrap(LAST_CHUNK_BYTES); + protected final ByteBuffer crlfChunk = ByteBuffer.wrap(CRLF_BYTES); /** * End chunk. */ protected final ByteBuffer endChunk = ByteBuffer.wrap(END_CHUNK_BYTES); + private Response response; + + public ChunkedOutputFilter() { chunkHeader.put(8, (byte) '\r'); chunkHeader.put(9, (byte) '\n'); @@ -105,46 +139,69 @@ public long getBytesWritten() { // --------------------------------------------------- OutputFilter Methods - /** - * Some filters need additional parameters from the response. All the - * necessary reading can occur in that method, as this method is called - * after the response header processing is complete. - */ @Override public void setResponse(Response response) { - // NOOP: No need for parameters from response in this filter + this.response = response; } - /** - * Set the next buffer in the filter pipeline. - */ @Override - public void setBuffer(OutputBuffer buffer) { + public void setBuffer(HttpOutputBuffer buffer) { this.buffer = buffer; } - /** - * End the current request. It is acceptable to write extra bytes using - * buffer.doWrite during the execution of this method. - */ @Override - public long end() throws IOException { + public void flush() throws IOException { + // No data buffered in this filter. Flush next buffer. + buffer.flush(); + } + - // Write end chunk - buffer.doWrite(endChunk); - endChunk.position(0).limit(endChunk.capacity()); + @Override + public void end() throws IOException { - return 0; + Supplier> trailerFieldsSupplier = response.getTrailerFields(); + Map trailerFields = null; + + if (trailerFieldsSupplier != null) { + trailerFields = trailerFieldsSupplier.get(); + } + + if (trailerFields == null) { + // Write end chunk + buffer.doWrite(endChunk); + endChunk.position(0).limit(endChunk.capacity()); + } else { + buffer.doWrite(lastChunk); + lastChunk.position(0).limit(lastChunk.capacity()); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); + OutputStreamWriter osw = new OutputStreamWriter(baos, StandardCharsets.ISO_8859_1); + for (Map.Entry trailerField : trailerFields.entrySet()) { + // Ignore disallowed headers + if (disallowedTrailerFieldNames.contains( + trailerField.getKey().toLowerCase(Locale.ENGLISH))) { + continue; + } + osw.write(trailerField.getKey()); + osw.write(':'); + osw.write(' '); + osw.write(trailerField.getValue()); + osw.write("\r\n"); + } + osw.close(); + buffer.doWrite(ByteBuffer.wrap(baos.toByteArray())); + + buffer.doWrite(crlfChunk); + crlfChunk.position(0).limit(crlfChunk.capacity()); + } + buffer.end(); } - /** - * Make the filter ready to process the next request. - */ @Override public void recycle() { - // NOOP: Nothing to recycle + response = null; } } diff --git a/core/src/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java index c84f613..18d18a3 100644 --- a/core/src/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java +++ b/core/src/main/java/org/apache/coyote/http11/filters/GzipOutputFilter.java @@ -14,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.coyote.http11.filters; import java.io.IOException; @@ -22,8 +21,8 @@ import java.nio.ByteBuffer; import java.util.zip.GZIPOutputStream; -import org.apache.coyote.OutputBuffer; import org.apache.coyote.Response; +import org.apache.coyote.http11.HttpOutputBuffer; import org.apache.coyote.http11.OutputFilter; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -35,17 +34,15 @@ */ public class GzipOutputFilter implements OutputFilter { - protected static final Log log = LogFactory.getLog(GzipOutputFilter.class); // ----------------------------------------------------- Instance Variables - /** * Next buffer in the pipeline. */ - protected OutputBuffer buffer; + protected HttpOutputBuffer buffer; /** @@ -90,7 +87,8 @@ public long getBytesWritten() { /** * Added to allow flushing to happen for the gzip'ed outputstream */ - public void flush() { + @Override + public void flush() throws IOException { if (compressionStream != null) { try { if (log.isDebugEnabled()) { @@ -103,41 +101,30 @@ public void flush() { } } } + buffer.flush(); } - /** - * Some filters need additional parameters from the response. All the - * necessary reading can occur in that method, as this method is called - * after the response header processing is complete. - */ + @Override public void setResponse(Response response) { // NOOP: No need for parameters from response in this filter } - /** - * Set the next buffer in the filter pipeline. - */ @Override - public void setBuffer(OutputBuffer buffer) { + public void setBuffer(HttpOutputBuffer buffer) { this.buffer = buffer; } - /** - * End the current request. It is acceptable to write extra bytes using - * buffer.doWrite during the execution of this method. - */ @Override - public long end() - throws IOException { + public void end() throws IOException { if (compressionStream == null) { compressionStream = new GZIPOutputStream(fakeOutputStream, true); } compressionStream.finish(); compressionStream.close(); - return ((OutputFilter) buffer).end(); + buffer.end(); } diff --git a/core/src/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java index 148641b..8c44d85 100644 --- a/core/src/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java +++ b/core/src/main/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java @@ -14,14 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.coyote.http11.filters; import java.io.IOException; import java.nio.ByteBuffer; -import org.apache.coyote.OutputBuffer; import org.apache.coyote.Response; +import org.apache.coyote.http11.HttpOutputBuffer; import org.apache.coyote.http11.OutputFilter; /** @@ -31,10 +30,8 @@ */ public class IdentityOutputFilter implements OutputFilter { - // ----------------------------------------------------- Instance Variables - /** * Content length. */ @@ -50,7 +47,7 @@ public class IdentityOutputFilter implements OutputFilter { /** * Next buffer in the pipeline. */ - protected OutputBuffer buffer; + protected HttpOutputBuffer buffer; // --------------------------------------------------- OutputBuffer Methods @@ -101,12 +98,6 @@ public long getBytesWritten() { // --------------------------------------------------- OutputFilter Methods - - /** - * Some filters need additional parameters from the response. All the - * necessary reading can occur in that method, as this method is called - * after the response header processing is complete. - */ @Override public void setResponse(Response response) { contentLength = response.getContentLengthLong(); @@ -114,33 +105,25 @@ public void setResponse(Response response) { } - /** - * Set the next buffer in the filter pipeline. - */ @Override - public void setBuffer(OutputBuffer buffer) { + public void setBuffer(HttpOutputBuffer buffer) { this.buffer = buffer; } - /** - * End the current request. It is acceptable to write extra bytes using - * buffer.doWrite during the execution of this method. - */ @Override - public long end() - throws IOException { + public void flush() throws IOException { + // No data buffered in this filter. Flush next buffer. + buffer.flush(); + } - if (remaining > 0) - return remaining; - return 0; + @Override + public void end() throws IOException { + buffer.end(); } - /** - * Make the filter ready to process the next request. - */ @Override public void recycle() { contentLength = -1; diff --git a/core/src/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java b/core/src/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java index e6c9a21..edf38f9 100644 --- a/core/src/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java +++ b/core/src/main/java/org/apache/coyote/http11/filters/VoidOutputFilter.java @@ -14,14 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.coyote.http11.filters; import java.io.IOException; import java.nio.ByteBuffer; -import org.apache.coyote.OutputBuffer; import org.apache.coyote.Response; +import org.apache.coyote.http11.HttpOutputBuffer; import org.apache.coyote.http11.OutputFilter; /** @@ -32,6 +31,8 @@ */ public class VoidOutputFilter implements OutputFilter { + private HttpOutputBuffer buffer = null; + // --------------------------------------------------- OutputBuffer Methods @@ -49,50 +50,32 @@ public long getBytesWritten() { // --------------------------------------------------- OutputFilter Methods - - /** - * Some filters need additional parameters from the response. All the - * necessary reading can occur in that method, as this method is called - * after the response header processing is complete. - */ @Override public void setResponse(Response response) { // NOOP: No need for parameters from response in this filter } - /** - * Set the next buffer in the filter pipeline. - */ @Override - public void setBuffer(OutputBuffer buffer) { - // NO-OP + public void setBuffer(HttpOutputBuffer buffer) { + this.buffer = buffer; } - /** - * Make the filter ready to process the next request. - */ @Override - public void recycle() { - // NOOP: Nothing to recycle + public void flush() throws IOException { + this.buffer.flush(); } - /** - * End the current request. It is acceptable to write extra bytes using - * buffer.doWrite during the execution of this method. - * - * @return Should return 0 unless the filter does some content length - * delimitation, in which case the number is the amount of extra bytes or - * missing bytes, which would indicate an error. - * Note: It is recommended that extra bytes be swallowed by the filter. - */ @Override - public long end() - throws IOException { - return 0; + public void recycle() { + buffer = null; } + @Override + public void end() throws IOException { + buffer.end(); + } } diff --git a/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java index 25b808e..1c1ddb6 100644 --- a/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java +++ b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java @@ -101,6 +101,8 @@ public final void setReadListener(ReadListener listener) { throw new IllegalStateException(sm.getString("upgrade.sis.read.closed")); } + this.listener = listener; + // Container is responsible for first call to onDataAvailable(). if (ContainerThreadMarker.isContainerThread()) { processor.addDispatch(DispatchType.NON_BLOCKING_READ); @@ -108,7 +110,6 @@ public final void setReadListener(ReadListener listener) { socketWrapper.registerReadInterest(); } - this.listener = listener; // Switching to non-blocking. Don't know if data is available. ready = null; } @@ -202,8 +203,12 @@ private int readInternal() throws IOException { final void onDataAvailable() { - if (listener == null) { - return; + try { + if (listener == null || !socketWrapper.isReadyForRead()) { + return; + } + } catch (IOException e) { + onError(e); } ready = Boolean.TRUE; ClassLoader oldCL = processor.getUpgradeToken().getContextBind().bind(false, null); diff --git a/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java index 81f0f78..3de8096 100644 --- a/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java +++ b/core/src/main/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java @@ -112,6 +112,7 @@ public final void setWriteListener(WriteListener listener) { if (closed) { throw new IllegalStateException(sm.getString("upgrade.sos.write.closed")); } + this.listener = listener; // Container is responsible for first call to onWritePossible(). synchronized (registeredLock) { registered = true; @@ -123,7 +124,6 @@ public final void setWriteListener(WriteListener listener) { } } - this.listener = listener; } diff --git a/core/src/main/java/org/apache/coyote/http2/ByteUtil.java b/core/src/main/java/org/apache/coyote/http2/ByteUtil.java index c940ce2..d1e3060 100644 --- a/core/src/main/java/org/apache/coyote/http2/ByteUtil.java +++ b/core/src/main/java/org/apache/coyote/http2/ByteUtil.java @@ -27,7 +27,7 @@ private ByteUtil() { static boolean isBit7Set(byte input) { - return (input & 0x80) > 0; + return (input & 0x80) != 0; } diff --git a/core/src/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java b/core/src/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java index 7f7970d..a4e6570 100644 --- a/core/src/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java +++ b/core/src/main/java/org/apache/coyote/http2/ConnectionSettingsBase.java @@ -16,7 +16,7 @@ */ package org.apache.coyote.http2; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import org.apache.juli.logging.Log; @@ -45,8 +45,8 @@ abstract class ConnectionSettingsBase { static final int DEFAULT_MAX_FRAME_SIZE = MIN_MAX_FRAME_SIZE; static final long DEFAULT_MAX_HEADER_LIST_SIZE = UNLIMITED; - Map current = new HashMap<>(); - Map pending = new HashMap<>(); + Map current = new EnumMap<>(Setting.class); + Map pending = new EnumMap<>(Setting.class); ConnectionSettingsBase(String connectionId) { diff --git a/core/src/main/java/org/apache/coyote/http2/Flags.java b/core/src/main/java/org/apache/coyote/http2/Flags.java index 6c63f93..d7ff181 100644 --- a/core/src/main/java/org/apache/coyote/http2/Flags.java +++ b/core/src/main/java/org/apache/coyote/http2/Flags.java @@ -24,26 +24,26 @@ private Flags() { static boolean isEndOfStream(int flags) { - return (flags & 0x01) > 0; + return (flags & 0x01) != 0; } static boolean isAck(int flags) { - return (flags & 0x01) > 0; + return (flags & 0x01) != 0; } static boolean isEndOfHeaders(int flags) { - return (flags & 0x04) > 0; + return (flags & 0x04) != 0; } static boolean hasPadding(int flags) { - return (flags & 0x08) > 0; + return (flags & 0x08) != 0; } static boolean hasPriority(int flags) { - return (flags & 0x20) > 0; + return (flags & 0x20) != 0; } } diff --git a/core/src/main/java/org/apache/coyote/http2/HeaderSink.java b/core/src/main/java/org/apache/coyote/http2/HeaderSink.java index e639c7d..d9fe699 100644 --- a/core/src/main/java/org/apache/coyote/http2/HeaderSink.java +++ b/core/src/main/java/org/apache/coyote/http2/HeaderSink.java @@ -34,4 +34,11 @@ public void emitHeader(String name, String value) { public void validateHeaders() throws StreamException { // NO-OP } + + @Override + public void setHeaderException(StreamException streamException) { + // NO-OP + // The connection is already closing so no need to process additional + // errors + } } diff --git a/core/src/main/java/org/apache/coyote/http2/HpackDecoder.java b/core/src/main/java/org/apache/coyote/http2/HpackDecoder.java index db44e73..ee16555 100644 --- a/core/src/main/java/org/apache/coyote/http2/HpackDecoder.java +++ b/core/src/main/java/org/apache/coyote/http2/HpackDecoder.java @@ -240,8 +240,11 @@ private String handleIndexedHeaderName(int index) throws HpackException { if (index <= Hpack.STATIC_TABLE_LENGTH) { return Hpack.STATIC_TABLE[index].name; } else { - if (index >= Hpack.STATIC_TABLE_LENGTH + filledTableSlots) { - throw new HpackException(); + // index is 1 based + if (index > Hpack.STATIC_TABLE_LENGTH + filledTableSlots) { + throw new HpackException(sm.getString("hpackdecoder.headerTableIndexInvalid", + Integer.valueOf(index), Integer.valueOf(Hpack.STATIC_TABLE_LENGTH), + Integer.valueOf(filledTableSlots))); } int adjustedIndex = getRealIndex(index - Hpack.STATIC_TABLE_LENGTH); Hpack.HeaderField res = headerTable[adjustedIndex]; @@ -355,6 +358,16 @@ interface HeaderEmitter { */ void emitHeader(String name, String value) throws HpackException; + /** + * Inform the recipient of the headers that a stream error needs to be + * triggered using the given message when {@link #validateHeaders()} is + * called. This is used when the Parser becomes aware of an error that + * is not visible to the recipient. + * + * @param streamException The exception to use when resetting the stream + */ + void setHeaderException(StreamException streamException); + /** * Are the headers pass to the recipient so far valid? The decoder needs * to process all the headers to maintain state even if there is a diff --git a/core/src/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java b/core/src/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java index 5aca12e..9b26f8b 100644 --- a/core/src/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java +++ b/core/src/main/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java @@ -19,15 +19,23 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; +import java.nio.channels.FileChannel; +import java.nio.channels.FileChannel.MapMode; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import org.apache.coyote.Adapter; import org.apache.coyote.ProtocolException; import org.apache.coyote.Request; import org.apache.tomcat.util.http.MimeHeaders; +import org.apache.tomcat.util.net.SendfileState; import org.apache.tomcat.util.net.SocketWrapperBase; import org.apache.tomcat.util.net.SocketWrapperBase.BlockingMode; +import org.apache.tomcat.util.net.SocketWrapperBase.CompletionCheck; +import org.apache.tomcat.util.net.SocketWrapperBase.CompletionHandlerCall; +import org.apache.tomcat.util.net.SocketWrapperBase.CompletionState; public class Http2AsyncUpgradeHandler extends Http2UpgradeHandler { @@ -35,8 +43,9 @@ public class Http2AsyncUpgradeHandler extends Http2UpgradeHandler { private Throwable error = null; private IOException applicationIOE = null; - public Http2AsyncUpgradeHandler(Adapter adapter, Request coyoteRequest) { - super (adapter, coyoteRequest); + public Http2AsyncUpgradeHandler(Http2Protocol protocol, Adapter adapter, + Request coyoteRequest) { + super (protocol, adapter, coyoteRequest); } private CompletionHandler errorCompletion = new CompletionHandler() { @@ -66,11 +75,16 @@ protected PingManager getPingManager() { return new AsyncPingManager(); } + @Override + boolean hasAsyncIO() { + return true; + } + @Override protected void writeSettings() { // Send the initial settings frame - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, ByteBuffer.wrap(localSettings.getSettingsFrameForPending())); if (error != null) { String msg = sm.getString("upgradeHandler.sendPrefaceFail", connectionId); @@ -99,8 +113,8 @@ void sendStreamReset(StreamException se) throws IOException { ByteUtil.set31Bits(rstFrame, 5, se.getStreamId()); // Payload ByteUtil.setFourBytes(rstFrame, 9, se.getError().getCode()); - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, ByteBuffer.wrap(rstFrame)); handleAsyncException(); } @@ -119,13 +133,15 @@ protected void writeGoAwayFrame(int maxStreamId, long errorCode, byte[] debugMsg byte[] payloadLength = new byte[3]; ByteUtil.setThreeBytes(payloadLength, 0, len); if (debugMsg != null) { - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, - ByteBuffer.wrap(payloadLength), ByteBuffer.wrap(GOAWAY), ByteBuffer.wrap(fixedPayload), ByteBuffer.wrap(debugMsg)); + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, + ByteBuffer.wrap(payloadLength), ByteBuffer.wrap(GOAWAY), + ByteBuffer.wrap(fixedPayload), ByteBuffer.wrap(debugMsg)); } else { - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, - ByteBuffer.wrap(payloadLength), ByteBuffer.wrap(GOAWAY), ByteBuffer.wrap(fixedPayload)); + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, + ByteBuffer.wrap(payloadLength), ByteBuffer.wrap(GOAWAY), + ByteBuffer.wrap(fixedPayload)); } handleAsyncException(); } @@ -134,7 +150,22 @@ protected void writeGoAwayFrame(int maxStreamId, long errorCode, byte[] debugMsg @Override void writeHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize) throws IOException { - doWriteHeaders(stream, pushedStreamId, mimeHeaders, endOfStream, payloadSize); + // This ensures the Stream processing thread has control of the socket. + ByteBuffer[] bufs = null; + synchronized (socketWrapper) { + AsyncHeaderFrameBuffers headerFrameBuffers = (AsyncHeaderFrameBuffers) + doWriteHeaders(stream, pushedStreamId, mimeHeaders, endOfStream, payloadSize); + bufs = headerFrameBuffers.bufs.toArray(BYTEBUFFER_ARRAY); + } + if (bufs != null) { + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, + applicationErrorCompletion, bufs); + handleAsyncException(); + } + if (endOfStream) { + stream.sentEndOfStream(); + } } @@ -166,9 +197,9 @@ void writeBody(Stream stream, ByteBuffer data, int len, boolean finished) throws ByteUtil.set31Bits(header, 5, stream.getIdentifier().intValue()); int orgLimit = data.limit(); data.limit(data.position() + len); - socketWrapper.write(BlockingMode.BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, applicationErrorCompletion, - ByteBuffer.wrap(header), data); + socketWrapper.write(BlockingMode.BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, + applicationErrorCompletion, ByteBuffer.wrap(header), data); data.limit(orgLimit); handleAsyncException(); } @@ -192,8 +223,8 @@ void writeWindowUpdate(Stream stream, int increment, boolean applicationInitiate frame2[3] = FrameType.WINDOW_UPDATE.getIdByte(); ByteUtil.set31Bits(frame2, 9, increment); ByteUtil.set31Bits(frame2, 5, stream.getIdentifier().intValue()); - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, ByteBuffer.wrap(frame), ByteBuffer.wrap(frame2)); handleAsyncException(); } @@ -207,8 +238,8 @@ public void settingsEnd(boolean ack) throws IOException { log.warn(sm.getString("upgradeHandler.unexpectedAck", connectionId, getIdentifier())); } } else { - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, ByteBuffer.wrap(SETTINGS_ACK)); } handleAsyncException(); @@ -223,6 +254,136 @@ protected void handleAsyncException() throws IOException { } } + @Override + protected void processWrites() throws IOException { + if (socketWrapper.isWritePending()) { + socketWrapper.registerWriteInterest(); + } + } + + @Override + protected SendfileState processSendfile(SendfileData sendfile) { + if (sendfile != null) { + try { + try (FileChannel channel = FileChannel.open(sendfile.path, StandardOpenOption.READ)) { + sendfile.mappedBuffer = channel.map(MapMode.READ_ONLY, sendfile.pos, sendfile.end - sendfile.pos); + } + // Reserve as much as possible right away + int reservation = (sendfile.end - sendfile.pos > Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int) (sendfile.end - sendfile.pos); + sendfile.streamReservation = sendfile.stream.reserveWindowSize(reservation, true); + sendfile.connectionReservation = reserveWindowSize(sendfile.stream, sendfile.streamReservation); + } catch (IOException e) { + return SendfileState.ERROR; + } + // Actually perform the write + int frameSize = Integer.min(getMaxFrameSize(), sendfile.connectionReservation); + boolean finished = (frameSize == sendfile.left) && sendfile.stream.getCoyoteResponse().getTrailerFields() == null; + + // Need to check this now since sending end of stream will change this. + boolean writeable = sendfile.stream.canWrite(); + byte[] header = new byte[9]; + ByteUtil.setThreeBytes(header, 0, frameSize); + header[3] = FrameType.DATA.getIdByte(); + if (finished) { + header[4] = FLAG_END_OF_STREAM; + sendfile.stream.sentEndOfStream(); + if (!sendfile.stream.isActive()) { + activeRemoteStreamCount.decrementAndGet(); + } + } + if (writeable) { + ByteUtil.set31Bits(header, 5, sendfile.stream.getIdentifier().intValue()); + sendfile.mappedBuffer.limit(sendfile.mappedBuffer.position() + frameSize); + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, sendfile, COMPLETE_WRITE_WITH_COMPLETION, + new SendfileCompletionHandler(), ByteBuffer.wrap(header), sendfile.mappedBuffer); + try { + handleAsyncException(); + } catch (IOException e) { + return SendfileState.ERROR; + } + } + return SendfileState.PENDING; + } else { + return SendfileState.DONE; + } + } + + private static final CompletionCheck COMPLETE_WRITE_WITH_COMPLETION = new CompletionCheck() { + @Override + public CompletionHandlerCall callHandler(CompletionState state, ByteBuffer[] buffers, + int offset, int length) { + for (int i = 0; i < length; i++) { + if (buffers[offset + i].remaining() > 0) { + return CompletionHandlerCall.CONTINUE; + } + } + return CompletionHandlerCall.DONE; + } + }; + + protected class SendfileCompletionHandler implements CompletionHandler { + @Override + public void completed(Long nBytes, SendfileData sendfile) { + long bytesWritten = nBytes.longValue() - 9; + sendfile.left -= bytesWritten; + if (sendfile.left == 0) { + try { + sendfile.stream.getOutputBuffer().end(); + } catch (IOException e) { + failed(e, sendfile); + } + return; + } + sendfile.streamReservation -= bytesWritten; + sendfile.connectionReservation -= bytesWritten; + sendfile.pos += bytesWritten; + try { + if (sendfile.connectionReservation == 0) { + if (sendfile.streamReservation == 0) { + int reservation = (sendfile.end - sendfile.pos > Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int) (sendfile.end - sendfile.pos); + sendfile.streamReservation = sendfile.stream.reserveWindowSize(reservation, true); + } + sendfile.connectionReservation = reserveWindowSize(sendfile.stream, sendfile.streamReservation); + } + } catch (IOException e) { + failed (e, sendfile); + return; + } + int frameSize = Integer.min(getMaxFrameSize(), sendfile.streamReservation); + boolean finished = (frameSize == sendfile.left) && sendfile.stream.getCoyoteResponse().getTrailerFields() == null; + + // Need to check this now since sending end of stream will change this. + boolean writeable = sendfile.stream.canWrite(); + byte[] header = new byte[9]; + ByteUtil.setThreeBytes(header, 0, frameSize); + header[3] = FrameType.DATA.getIdByte(); + if (finished) { + header[4] = FLAG_END_OF_STREAM; + sendfile.stream.sentEndOfStream(); + if (!sendfile.stream.isActive()) { + activeRemoteStreamCount.decrementAndGet(); + } + } + if (writeable) { + ByteUtil.set31Bits(header, 5, sendfile.stream.getIdentifier().intValue()); + sendfile.mappedBuffer.limit(sendfile.mappedBuffer.position() + frameSize); + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, sendfile, COMPLETE_WRITE_WITH_COMPLETION, + this, ByteBuffer.wrap(header), sendfile.mappedBuffer); + try { + handleAsyncException(); + } catch (IOException e) { + failed(e, sendfile); + } + } + } + + @Override + public void failed(Throwable t, SendfileData sendfile) { + applicationErrorCompletion.failed(t, null); + } + } protected class AsyncPingManager extends PingManager { @Override @@ -238,9 +399,9 @@ public void sendPing(boolean force) throws IOException { PingRecord pingRecord = new PingRecord(sentSequence, now); inflightPings.add(pingRecord); ByteUtil.set31Bits(payload, 4, sentSequence); - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, - ByteBuffer.wrap(PING), ByteBuffer.wrap(payload)); + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, + errorCompletion, ByteBuffer.wrap(PING), ByteBuffer.wrap(payload)); handleAsyncException(); } } @@ -251,9 +412,9 @@ public void receivePing(byte[] payload, boolean ack) throws IOException { super.receivePing(payload, ack); } else { // Client originated ping. Echo it back. - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, errorCompletion, - ByteBuffer.wrap(PING_ACK), ByteBuffer.wrap(payload)); + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, + errorCompletion, ByteBuffer.wrap(PING_ACK), ByteBuffer.wrap(payload)); handleAsyncException(); } } @@ -268,7 +429,7 @@ private class AsyncHeaderFrameBuffers implements HeaderFrameBuffers { private byte[] header; private ByteBuffer payload; - private final ArrayList bufs = new ArrayList<>(); + private final List bufs = new ArrayList<>(); public AsyncHeaderFrameBuffers(int initialPayloadSize) { this.payloadSize = initialPayloadSize; @@ -288,10 +449,6 @@ public void endFrame() throws IOException { @Override public void endHeaders() throws IOException { - socketWrapper.write(BlockingMode.SEMI_BLOCK, getWriteTimeout(), TimeUnit.MILLISECONDS, - null, SocketWrapperBase.COMPLETE_WRITE, applicationErrorCompletion, - bufs.toArray(BYTEBUFFER_ARRAY)); - handleAsyncException(); } @Override @@ -307,6 +464,7 @@ public ByteBuffer getPayload() { @Override public void expandPayload() { payloadSize = payloadSize * 2; + payload = ByteBuffer.allocate(payloadSize); } } } diff --git a/core/src/main/java/org/apache/coyote/http2/Http2OutputBuffer.java b/core/src/main/java/org/apache/coyote/http2/Http2OutputBuffer.java new file mode 100644 index 0000000..c11596f --- /dev/null +++ b/core/src/main/java/org/apache/coyote/http2/Http2OutputBuffer.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 org.apache.coyote.http2; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import org.apache.coyote.Response; +import org.apache.coyote.http11.HttpOutputBuffer; +import org.apache.coyote.http11.OutputFilter; +import org.apache.coyote.http2.Stream.StreamOutputBuffer; + +public class Http2OutputBuffer implements HttpOutputBuffer { + + private final Response coyoteResponse; + private HttpOutputBuffer next; + + + /** + * Add a filter at the start of the existing processing chain. Subsequent + * calls to the {@link HttpOutputBuffer} methods of this object will be + * passed to the filter. If appropriate, the filter will then call the same + * method on the next HttpOutputBuffer in the chain until the call reaches + * the StreamOutputBuffer. + * + * @param filter The filter to add to the start of the processing chain + */ + public void addFilter(OutputFilter filter) { + filter.setBuffer(next); + next = filter; + } + + + public Http2OutputBuffer(Response coyoteResponse, StreamOutputBuffer streamOutputBuffer) { + this.coyoteResponse = coyoteResponse; + this.next = streamOutputBuffer; + } + + + @Override + public int doWrite(ByteBuffer chunk) throws IOException { + if (!coyoteResponse.isCommitted()) { + coyoteResponse.sendHeaders(); + } + return next.doWrite(chunk); + } + + + @Override + public long getBytesWritten() { + return next.getBytesWritten(); + } + + + @Override + public void end() throws IOException { + next.end(); + } + + + @Override + public void flush() throws IOException { + next.flush(); + } +} diff --git a/core/src/main/java/org/apache/coyote/http2/Http2Parser.java b/core/src/main/java/org/apache/coyote/http2/Http2Parser.java index e8ea253..9bcacab 100644 --- a/core/src/main/java/org/apache/coyote/http2/Http2Parser.java +++ b/core/src/main/java/org/apache/coyote/http2/Http2Parser.java @@ -45,7 +45,6 @@ class Http2Parser { ByteBuffer.allocate(Constants.DEFAULT_HEADER_READ_BUFFER_SIZE); private volatile int headersCurrentStream = -1; private volatile boolean headersEndStream = false; - private volatile boolean streamReset = false; Http2Parser(String connectionId, Input input, Output output) { this.connectionId = connectionId; @@ -379,8 +378,8 @@ private void readContinuationFrame(int streamId, int flags, int payloadSize) readHeaderPayload(streamId, payloadSize); if (Flags.isEndOfHeaders(flags)) { - onHeadersComplete(streamId); headersCurrentStream = -1; + onHeadersComplete(streamId); } } @@ -427,16 +426,18 @@ private void readHeaderPayload(int streamId, int payloadSize) headerReadBuffer.compact(); remaining -= toRead; - if (hpackDecoder.isHeaderCountExceeded() && !streamReset) { - streamReset = true; - throw new StreamException(sm.getString("http2Parser.headerLimitCount", connectionId, - Integer.valueOf(streamId)), Http2Error.ENHANCE_YOUR_CALM, streamId); + if (hpackDecoder.isHeaderCountExceeded()) { + StreamException headerException = new StreamException(sm.getString( + "http2Parser.headerLimitCount", connectionId, Integer.valueOf(streamId)), + Http2Error.ENHANCE_YOUR_CALM, streamId); + hpackDecoder.getHeaderEmitter().setHeaderException(headerException); } - if (hpackDecoder.isHeaderSizeExceeded(headerReadBuffer.position()) && !streamReset) { - streamReset = true; - throw new StreamException(sm.getString("http2Parser.headerLimitSize", connectionId, - Integer.valueOf(streamId)), Http2Error.ENHANCE_YOUR_CALM, streamId); + if (hpackDecoder.isHeaderSizeExceeded(headerReadBuffer.position())) { + StreamException headerException = new StreamException(sm.getString( + "http2Parser.headerLimitSize", connectionId, Integer.valueOf(streamId)), + Http2Error.ENHANCE_YOUR_CALM, streamId); + hpackDecoder.getHeaderEmitter().setHeaderException(headerException); } if (hpackDecoder.isHeaderSwallowSizeExceeded(headerReadBuffer.position())) { @@ -444,8 +445,6 @@ private void readHeaderPayload(int streamId, int payloadSize) connectionId, Integer.valueOf(streamId)), Http2Error.ENHANCE_YOUR_CALM); } } - - hpackDecoder.getHeaderEmitter().validateHeaders(); } @@ -457,6 +456,11 @@ private void onHeadersComplete(int streamId) throws Http2Exception { Http2Error.COMPRESSION_ERROR); } + // Delay validation (and triggering any exception) until this point + // since all the headers still have to be read if a StreamException is + // going to be thrown. + hpackDecoder.getHeaderEmitter().validateHeaders(); + output.headersEnd(streamId); if (headersEndStream) { @@ -468,11 +472,6 @@ private void onHeadersComplete(int streamId) throws Http2Exception { if (headerReadBuffer.capacity() > Constants.DEFAULT_HEADER_READ_BUFFER_SIZE) { headerReadBuffer = ByteBuffer.allocate(Constants.DEFAULT_HEADER_READ_BUFFER_SIZE); } - - // Clear the 'stream has been reset' flag, if set - if (streamReset) { - streamReset = false; - } } diff --git a/core/src/main/java/org/apache/coyote/http2/Http2Protocol.java b/core/src/main/java/org/apache/coyote/http2/Http2Protocol.java index c9a9cbd..b1ce8e4 100644 --- a/core/src/main/java/org/apache/coyote/http2/Http2Protocol.java +++ b/core/src/main/java/org/apache/coyote/http2/Http2Protocol.java @@ -25,10 +25,13 @@ import java.util.Locale; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Pattern; import org.apache.coyote.Adapter; +import org.apache.coyote.CompressionConfig; import org.apache.coyote.Processor; import org.apache.coyote.Request; +import org.apache.coyote.Response; import org.apache.coyote.UpgradeProtocol; import org.apache.coyote.UpgradeToken; import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; @@ -45,7 +48,7 @@ public class Http2Protocol implements UpgradeProtocol { static final long DEFAULT_MAX_CONCURRENT_STREAMS = 200; // Maximum amount of streams which can be concurrently executed over // a single connection - static final int DEFAULT_MAX_CONCURRENT_STREAM_EXECUTION = 200; + static final int DEFAULT_MAX_CONCURRENT_STREAM_EXECUTION = 20; // This default is defined by the HTTP/2 specification static final int DEFAULT_INITIAL_WINDOW_SIZE = (1 << 16) - 1; @@ -70,6 +73,9 @@ public class Http2Protocol implements UpgradeProtocol { private int maxTrailerCount = Constants.DEFAULT_MAX_TRAILER_COUNT; private int maxTrailerSize = Constants.DEFAULT_MAX_TRAILER_SIZE; private boolean initiatePingDisabled = false; + private boolean useSendfile = true; + // Compression + private final CompressionConfig compressionConfig = new CompressionConfig(); @Override public String getHttpUpgradeName(boolean isSSLEnabled) { @@ -101,23 +107,9 @@ public Processor getProcessor(SocketWrapperBase socketWrapper, Adapter adapte @Override public InternalHttpUpgradeHandler getInternalUpgradeHandler(SocketWrapperBase socketWrapper, Adapter adapter, Request coyoteRequest) { - Http2UpgradeHandler result = (socketWrapper.hasAsyncIO()) - ? new Http2AsyncUpgradeHandler(adapter, coyoteRequest) - : new Http2UpgradeHandler(adapter, coyoteRequest); - - result.setReadTimeout(getReadTimeout()); - result.setKeepAliveTimeout(getKeepAliveTimeout()); - result.setWriteTimeout(getWriteTimeout()); - result.setMaxConcurrentStreams(getMaxConcurrentStreams()); - result.setMaxConcurrentStreamExecution(getMaxConcurrentStreamExecution()); - result.setInitialWindowSize(getInitialWindowSize()); - result.setAllowedTrailerHeaders(allowedTrailerHeaders); - result.setMaxHeaderCount(getMaxHeaderCount()); - result.setMaxHeaderSize(getMaxHeaderSize()); - result.setMaxTrailerCount(getMaxTrailerCount()); - result.setMaxTrailerSize(getMaxTrailerSize()); - result.setInitiatePingDisabled(initiatePingDisabled); - return result; + return socketWrapper.hasAsyncIO() + ? new Http2AsyncUpgradeHandler(this, adapter, coyoteRequest) + : new Http2UpgradeHandler(this, adapter, coyoteRequest); } @@ -203,6 +195,16 @@ public void setInitialWindowSize(int initialWindowSize) { } + public boolean getUseSendfile() { + return useSendfile; + } + + + public void setUseSendfile(boolean useSendfile) { + this.useSendfile = useSendfile; + } + + public void setAllowedTrailerHeaders(String commaSeparatedHeaders) { // Jump through some hoops so we don't end up with an empty set while // doing updates. @@ -232,6 +234,11 @@ public String getAllowedTrailerHeaders() { } + boolean isTrailerHeaderAllowed(String headerName) { + return allowedTrailerHeaders.contains(headerName); + } + + public void setMaxHeaderCount(int maxHeaderCount) { this.maxHeaderCount = maxHeaderCount; } @@ -275,4 +282,55 @@ public int getMaxTrailerSize() { public void setInitiatePingDisabled(boolean initiatePingDisabled) { this.initiatePingDisabled = initiatePingDisabled; } + + + public boolean getInitiatePingDisabled() { + return initiatePingDisabled; + } + + + public void setCompression(String compression) { + compressionConfig.setCompression(compression); + } + public String getCompression() { + return compressionConfig.getCompression(); + } + protected int getCompressionLevel() { + return compressionConfig.getCompressionLevel(); + } + + + public String getNoCompressionUserAgents() { + return compressionConfig.getNoCompressionUserAgents(); + } + protected Pattern getNoCompressionUserAgentsPattern() { + return compressionConfig.getNoCompressionUserAgentsPattern(); + } + public void setNoCompressionUserAgents(String noCompressionUserAgents) { + compressionConfig.setNoCompressionUserAgents(noCompressionUserAgents); + } + + + public String getCompressibleMimeType() { + return compressionConfig.getCompressibleMimeType(); + } + public void setCompressibleMimeType(String valueS) { + compressionConfig.setCompressibleMimeType(valueS); + } + public String[] getCompressibleMimeTypes() { + return compressionConfig.getCompressibleMimeTypes(); + } + + + public int getCompressionMinSize() { + return compressionConfig.getCompressionMinSize(); + } + public void setCompressionMinSize(int compressionMinSize) { + compressionConfig.setCompressionMinSize(compressionMinSize); + } + + + public boolean useCompression(Request request, Response response) { + return compressionConfig.useCompression(request, response); + } } diff --git a/core/src/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/core/src/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java index 3c5ff44..db98da4 100644 --- a/core/src/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java +++ b/core/src/main/java/org/apache/coyote/http2/Http2UpgradeHandler.java @@ -20,8 +20,6 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; @@ -51,6 +49,7 @@ import org.apache.tomcat.util.http.MimeHeaders; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; +import org.apache.tomcat.util.net.SendfileState; import org.apache.tomcat.util.net.SocketEvent; import org.apache.tomcat.util.net.SocketWrapperBase; import org.apache.tomcat.util.res.StringManager; @@ -96,6 +95,7 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH protected final String connectionId; + protected final Http2Protocol protocol; private final Adapter adapter; protected volatile SocketWrapperBase socketWrapper; private volatile SSLSupport sslSupport; @@ -121,12 +121,7 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH private HpackDecoder hpackDecoder; private HpackEncoder hpackEncoder; - // All timeouts in milliseconds - private long readTimeout = Http2Protocol.DEFAULT_READ_TIMEOUT; - private long keepAliveTimeout = Http2Protocol.DEFAULT_KEEP_ALIVE_TIMEOUT; - private long writeTimeout = Http2Protocol.DEFAULT_WRITE_TIMEOUT; - - private final Map streams = new HashMap<>(); + private final Map streams = new ConcurrentHashMap<>(); protected final AtomicInteger activeRemoteStreamCount = new AtomicInteger(0); // Start at -1 so the 'add 2' logic in closeIdleStreams() works private volatile int maxActiveRemoteStreamId = -1; @@ -139,26 +134,24 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH private long backLogSize = 0; // Stream concurrency control - private int maxConcurrentStreamExecution = Http2Protocol.DEFAULT_MAX_CONCURRENT_STREAM_EXECUTION; private AtomicInteger streamConcurrency = null; private Queue queuedRunnable = null; - // Limits - private Set allowedTrailerHeaders = Collections.emptySet(); - private int maxHeaderCount = Constants.DEFAULT_MAX_HEADER_COUNT; - private int maxHeaderSize = Constants.DEFAULT_MAX_HEADER_SIZE; - private int maxTrailerCount = Constants.DEFAULT_MAX_TRAILER_COUNT; - private int maxTrailerSize = Constants.DEFAULT_MAX_TRAILER_SIZE; - - Http2UpgradeHandler(Adapter adapter, Request coyoteRequest) { + Http2UpgradeHandler(Http2Protocol protocol, Adapter adapter, Request coyoteRequest) { super (STREAM_ID_ZERO); + this.protocol = protocol; this.adapter = adapter; this.connectionId = Integer.toString(connectionIdGenerator.getAndIncrement()); remoteSettings = new ConnectionSettingsRemote(connectionId); localSettings = new ConnectionSettingsLocal(connectionId); + localSettings.set(Setting.MAX_CONCURRENT_STREAMS, protocol.getMaxConcurrentStreams()); + localSettings.set(Setting.INITIAL_WINDOW_SIZE, protocol.getInitialWindowSize()); + + pingManager.initiateDisabled = protocol.getInitiatePingDisabled(); + // Initial HTTP request becomes stream 1. if (coyoteRequest != null) { if (log.isDebugEnabled()) { @@ -190,7 +183,7 @@ public void init(WebConnection webConnection) { } // Init concurrency control if needed - if (maxConcurrentStreamExecution < localSettings.getMaxConcurrentStreams()) { + if (protocol.getMaxConcurrentStreamExecution() < localSettings.getMaxConcurrentStreams()) { streamConcurrency = new AtomicInteger(0); queuedRunnable = new ConcurrentLinkedQueue<>(); } @@ -199,8 +192,8 @@ public void init(WebConnection webConnection) { Stream stream = null; - socketWrapper.setReadTimeout(getReadTimeout()); - socketWrapper.setWriteTimeout(getWriteTimeout()); + socketWrapper.setReadTimeout(protocol.getReadTimeout()); + socketWrapper.setWriteTimeout(protocol.getWriteTimeout()); if (webConnection != null) { // HTTP/2 started via HTTP upgrade. @@ -269,7 +262,7 @@ void processStreamOnContainerThread(StreamProcessor streamProcessor, SocketEvent if (streamConcurrency == null) { socketWrapper.execute(streamRunnable); } else { - if (getStreamConcurrency() < maxConcurrentStreamExecution) { + if (getStreamConcurrency() < protocol.getMaxConcurrentStreamExecution()) { increaseStreamConcurrency(); socketWrapper.execute(streamRunnable); } else { @@ -314,7 +307,7 @@ public SocketState upgradeDispatch(SocketEvent status) { try { // There is data to read so use the read timeout while // reading frames. - socketWrapper.setReadTimeout(getReadTimeout()); + socketWrapper.setReadTimeout(protocol.getReadTimeout()); while (true) { try { if (!parser.readFrame(false)) { @@ -333,7 +326,7 @@ public SocketState upgradeDispatch(SocketEvent status) { } // No more frames to read so switch to the keep-alive // timeout. - socketWrapper.setReadTimeout(getKeepAliveTimeout()); + socketWrapper.setReadTimeout(protocol.getKeepAliveTimeout()); } catch (Http2Exception ce) { // Really ConnectionException if (log.isDebugEnabled()) { @@ -385,6 +378,11 @@ ConnectionSettingsLocal getLocalSettings() { } + Http2Protocol getProtocol() { + return protocol; + } + + @Override public void pause() { if (log.isDebugEnabled()) { @@ -438,7 +436,7 @@ void executeQueuedStream() { return; } decreaseStreamConcurrency(); - if (getStreamConcurrency() < maxConcurrentStreamExecution) { + if (getStreamConcurrency() < protocol.getMaxConcurrentStreamExecution()) { StreamRunnable streamRunnable = queuedRunnable.poll(); if (streamRunnable != null) { increaseStreamConcurrency(); @@ -531,6 +529,9 @@ void writeHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, synchronized (socketWrapper) { doWriteHeaders(stream, pushedStreamId, mimeHeaders, endOfStream, payloadSize); } + if (endOfStream) { + stream.sentEndOfStream(); + } } @@ -538,7 +539,7 @@ void writeHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, * Separate method to allow Http2AsyncUpgradeHandler to call this code * without synchronizing on socketWrapper since it doesn't need to. */ - void doWriteHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, + protected HeaderFrameBuffers doWriteHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize) throws IOException { if (log.isDebugEnabled()) { @@ -548,7 +549,7 @@ void doWriteHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, } if (!stream.canWrite()) { - return; + return null; } HeaderFrameBuffers headerFrameBuffers = getHeaderFrameBuffers(payloadSize); @@ -597,9 +598,9 @@ void doWriteHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, } } headerFrameBuffers.endHeaders(); + return headerFrameBuffers; } - protected HeaderFrameBuffers getHeaderFrameBuffers(int initialPayloadSize) { return new DefaultHeaderFrameBuffers(initialPayloadSize); } @@ -698,11 +699,15 @@ void writeWindowUpdate(Stream stream, int increment, boolean applicationInitiate } - private void processWrites() throws IOException { + boolean hasAsyncIO() { + return false; + } + + + protected void processWrites() throws IOException { synchronized (socketWrapper) { if (socketWrapper.flush(false)) { socketWrapper.registerWriteInterest(); - return; } } } @@ -799,6 +804,19 @@ protected void incrementWindowSize(int increment) throws Http2Exception { } + /** + * Process send file (if supported) for the given stream. The appropriate + * request attributes should be set before calling this method. + * + * @param sendfileData The stream and associated data to process + * + * @return The result of the send file processing + */ + protected SendfileState processSendfile(SendfileData sendfileData) { + return SendfileState.DONE; + } + + private synchronized Set releaseBackLog(int increment) { Set result = new HashSet<>(); if (backLogSize < increment) { @@ -999,9 +1017,7 @@ private void pruneClosedStreams() { TreeSet candidatesStepTwo = new TreeSet<>(); TreeSet candidatesStepThree = new TreeSet<>(); - Iterator> entryIter = streams.entrySet().iterator(); - while (entryIter.hasNext()) { - Entry entry = entryIter.next(); + for (Entry entry : streams.entrySet()) { Stream stream = entry.getValue(); // Never remove active streams if (stream.isActive()) { @@ -1022,9 +1038,7 @@ private void pruneClosedStreams() { } // Process the step one list - Iterator stepOneIter = candidatesStepOne.iterator(); - while (stepOneIter.hasNext()) { - Integer streamIdToRemove = stepOneIter.next(); + for (Integer streamIdToRemove : candidatesStepOne) { // Remove this childless stream Stream removedStream = streams.remove(streamIdToRemove); removedStream.detachFromParent(); @@ -1050,9 +1064,7 @@ private void pruneClosedStreams() { } // Process the P2 list - Iterator stepTwoIter = candidatesStepTwo.iterator(); - while (stepTwoIter.hasNext()) { - Integer streamIdToRemove = stepTwoIter.next(); + for (Integer streamIdToRemove : candidatesStepTwo) { removeStreamFromPriorityTree(streamIdToRemove); toClose--; if (log.isDebugEnabled()) { @@ -1097,6 +1109,7 @@ private void removeStreamFromPriorityTree(Integer streamIdToRemove) { } } streamToRemove.detachFromParent(); + streamToRemove.getChildStreams().clear(); } @@ -1125,108 +1138,6 @@ protected final int getWeight() { } - boolean isTrailerHeaderAllowed(String headerName) { - return allowedTrailerHeaders.contains(headerName); - } - - - // ------------------------------------------- Configuration getters/setters - - public long getReadTimeout() { - return readTimeout; - } - - - public void setReadTimeout(long readTimeout) { - this.readTimeout = readTimeout; - } - - - public long getKeepAliveTimeout() { - return keepAliveTimeout; - } - - - public void setKeepAliveTimeout(long keepAliveTimeout) { - this.keepAliveTimeout = keepAliveTimeout; - } - - - public long getWriteTimeout() { - return writeTimeout; - } - - - public void setWriteTimeout(long writeTimeout) { - this.writeTimeout = writeTimeout; - } - - - public void setMaxConcurrentStreams(long maxConcurrentStreams) { - localSettings.set(Setting.MAX_CONCURRENT_STREAMS, maxConcurrentStreams); - } - - - public void setMaxConcurrentStreamExecution(int maxConcurrentStreamExecution) { - this.maxConcurrentStreamExecution = maxConcurrentStreamExecution; - } - - - public void setInitialWindowSize(int initialWindowSize) { - localSettings.set(Setting.INITIAL_WINDOW_SIZE, initialWindowSize); - } - - - public void setAllowedTrailerHeaders(Set allowedTrailerHeaders) { - this.allowedTrailerHeaders = allowedTrailerHeaders; - } - - - public void setMaxHeaderCount(int maxHeaderCount) { - this.maxHeaderCount = maxHeaderCount; - } - - - public int getMaxHeaderCount() { - return maxHeaderCount; - } - - - public void setMaxHeaderSize(int maxHeaderSize) { - this.maxHeaderSize = maxHeaderSize; - } - - - public int getMaxHeaderSize() { - return maxHeaderSize; - } - - - public void setMaxTrailerCount(int maxTrailerCount) { - this.maxTrailerCount = maxTrailerCount; - } - - - public int getMaxTrailerCount() { - return maxTrailerCount; - } - - - public void setMaxTrailerSize(int maxTrailerSize) { - this.maxTrailerSize = maxTrailerSize; - } - - - public int getMaxTrailerSize() { - return maxTrailerSize; - } - - - public void setInitiatePingDisabled(boolean initiatePingDisabled) { - pingManager.initiateDisabled = initiatePingDisabled; - } - - // ----------------------------------------------- Http2Parser.Input methods @Override @@ -1538,6 +1449,8 @@ public void receivePing(byte[] payload, boolean ack) throws IOException { long roundTripTime = System.nanoTime() - pingRecord.getSentNanoTime(); roundTripTimes.add(Long.valueOf(roundTripTime)); while (roundTripTimes.size() > 3) { + // Ignore the returned value as we just want to reduce + // the queue to 3 entries to use for the rolling average. roundTripTimes.poll(); } if (log.isDebugEnabled()) { @@ -1582,7 +1495,7 @@ public long getSentNanoTime() { } - private static enum ConnectionState { + private enum ConnectionState { NEW(true), CONNECTED(true), diff --git a/core/src/main/java/org/apache/coyote/http2/LocalStrings.properties b/core/src/main/java/org/apache/coyote/http2/LocalStrings.properties index afa882a..e7b8bc0 100644 --- a/core/src/main/java/org/apache/coyote/http2/LocalStrings.properties +++ b/core/src/main/java/org/apache/coyote/http2/LocalStrings.properties @@ -34,8 +34,9 @@ frameType.checkStream=Invalid frame type [{0}] hpack.integerEncodedOverTooManyOctets=HPACK variable length integer encoded over too many octets, max is [{0}] hpack.invalidCharacter=The Unicode character [{0}] at code point [{1}] cannot be encoded as it is outside the permitted range of 0 to 255. -hpackdecoder.zeroNotValidHeaderTableIndex=Zero is not a valid header table index +hpackdecoder.headerTableIndexInvalid=The header table index [{0}] is not valid as there are [{1}] static entries and [{2}] dynamic entries hpackdecoder.tableSizeUpdateNotAtStart=Any table size update must be sent at the start of a header block +hpackdecoder.zeroNotValidHeaderTableIndex=Zero is not a valid header table index hpackEncoder.encodeHeader=Encoding header [{0}] with value [{1}] @@ -89,7 +90,6 @@ stream.reset.fail=Connection [{0}], Stream [{1}], Failed to reset stream stream.reset.receive=Connection [{0}], Stream [{1}], Reset received due to [{2}] stream.reset.send=Connection [{0}], Stream [{1}], Reset sent due to [{2}] stream.trailerHeader.noEndOfStream=Connection [{0}], Stream [{1}], The trailer headers did not include the end of stream flag -stream.write=Connection [{0}], Stream [{1}] stream.inputBuffer.copy=Copying [{0}] bytes from inBuffer to outBuffer stream.inputBuffer.dispatch=Data added to inBuffer when read interest is registered. Triggering a read dispatch @@ -143,7 +143,7 @@ upgradeHandler.windowSizeTooBig=Connection [{0}], Stream [{1}], Window size too upgradeHandler.windowSizeReservationInterrupted=Connection [{0}], Stream [{1}], reservation for [{2}] bytes upgradeHandler.writeBody=Connection [{0}], Stream [{1}], Data length [{2}] upgradeHandler.writeHeaders=Connection [{0}], Stream [{1}] -upgradeHandler.writePushHeaders=Connection [{0}], Stream [{1}], Pushed stream [{2}] +upgradeHandler.writePushHeaders=Connection [{0}], Stream [{1}], Pushed stream [{2}], EndOfStream [{3}] writeStateMachine.endWrite.ise=It is illegal to specify [{0}] for the new state once a write has completed writeStateMachine.ise=It is illegal to call [{0}()] in state [{1}] \ No newline at end of file diff --git a/core/src/main/java/org/apache/coyote/http2/SendfileData.java b/core/src/main/java/org/apache/coyote/http2/SendfileData.java new file mode 100644 index 0000000..25a9f68 --- /dev/null +++ b/core/src/main/java/org/apache/coyote/http2/SendfileData.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 org.apache.coyote.http2; + +import java.nio.MappedByteBuffer; +import java.nio.file.Path; + +class SendfileData { + Path path; + Stream stream; + // Note: a mapped buffer is a special construct with an underlying file + // that doesn't need to be closed + MappedByteBuffer mappedBuffer; + int frameSize; + long left; + int streamReservation; + int connectionReservation; + long pos; + long end; +} \ No newline at end of file diff --git a/core/src/main/java/org/apache/coyote/http2/Stream.java b/core/src/main/java/org/apache/coyote/http2/Stream.java index 8956f67..678f4bf 100644 --- a/core/src/main/java/org/apache/coyote/http2/Stream.java +++ b/core/src/main/java/org/apache/coyote/http2/Stream.java @@ -18,23 +18,28 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import java.util.Collections; import java.util.Iterator; import java.util.Locale; +import java.util.Map; +import java.util.function.Supplier; import org.apache.coyote.ActionCode; import org.apache.coyote.CloseNowException; import org.apache.coyote.InputBuffer; -import org.apache.coyote.OutputBuffer; import org.apache.coyote.Request; import org.apache.coyote.Response; +import org.apache.coyote.http11.HttpOutputBuffer; +import org.apache.coyote.http11.OutputFilter; import org.apache.coyote.http2.HpackDecoder.HeaderEmitter; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.buf.ByteChunk; -import org.apache.tomcat.util.http.FastHttpDateFormat; +import org.apache.tomcat.util.buf.MessageBytes; import org.apache.tomcat.util.http.MimeHeaders; import org.apache.tomcat.util.net.ApplicationBufferHandler; import org.apache.tomcat.util.res.StringManager; @@ -54,7 +59,7 @@ class Stream extends AbstractStream implements HeaderEmitter { static { Response response = new Response(); response.setStatus(100); - prepareHeaders(response); + StreamProcessor.prepareHeaders(null, response, true, null, null); ACK_HEADERS = response.getMimeHeaders(); } @@ -65,13 +70,15 @@ class Stream extends AbstractStream implements HeaderEmitter { private final StreamStateMachine state; // State machine would be too much overhead private int headerState = HEADER_STATE_START; - private String headerStateErrorMsg = null; + private StreamException headerException = null; // TODO: null these when finished to reduce memory used by closed stream private final Request coyoteRequest; private StringBuilder cookieHeader = null; private final Response coyoteResponse = new Response(); private final StreamInputBuffer inputBuffer; - private final StreamOutputBuffer outputBuffer = new StreamOutputBuffer(); + private final StreamOutputBuffer streamOutputBuffer = new StreamOutputBuffer(); + private final Http2OutputBuffer http2OutputBuffer = + new Http2OutputBuffer(coyoteResponse, streamOutputBuffer); Stream(Integer identifier, Http2UpgradeHandler handler) { @@ -82,7 +89,7 @@ class Stream extends AbstractStream implements HeaderEmitter { Stream(Integer identifier, Http2UpgradeHandler handler, Request coyoteRequest) { super(identifier); this.handler = handler; - setParentStream(handler); + handler.addChild(this); setWindowSize(handler.getRemoteSettings().getInitialWindowSize()); state = new StreamStateMachine(this); if (coyoteRequest == null) { @@ -99,9 +106,8 @@ class Stream extends AbstractStream implements HeaderEmitter { // TODO Assuming the body has been read at this point is not valid state.receivedEndOfStream(); } - // No sendfile for HTTP/2 (it is enabled by default in the request) - this.coyoteRequest.setSendfile(false); - this.coyoteResponse.setOutputBuffer(outputBuffer); + this.coyoteRequest.setSendfile(handler.hasAsyncIO() && handler.getProtocol().getUseSendfile()); + this.coyoteResponse.setOutputBuffer(http2OutputBuffer); this.coyoteRequest.setResponse(coyoteResponse); this.coyoteRequest.protocol().setString("HTTP/2.0"); if (this.coyoteRequest.getStartTime() < 0) { @@ -135,6 +141,7 @@ final void rePrioritise(AbstractStream parent, boolean exclusive, int weight) { this.addChild(parentsChild); } } + detachFromParent(); parent.addChild(this); this.weight = weight; } @@ -193,7 +200,7 @@ final synchronized void incrementWindowSize(int windowSizeIncrement) throws Http } - private final synchronized int reserveWindowSize(int reservation, boolean block) + final synchronized int reserveWindowSize(int reservation, boolean block) throws IOException { long windowSize = getWindowSize(); while (windowSize < 1) { @@ -251,7 +258,7 @@ public final void emitHeader(String name, String value) throws HpackException { } } - if (headerStateErrorMsg != null) { + if (headerException != null) { // Don't bother processing the header since the stream is going to // be reset anyway return; @@ -260,8 +267,9 @@ public final void emitHeader(String name, String value) throws HpackException { boolean pseudoHeader = name.charAt(0) == ':'; if (pseudoHeader && headerState != HEADER_STATE_PSEUDO) { - headerStateErrorMsg = sm.getString("stream.header.unexpectedPseudoHeader", - getConnectionId(), getIdentifier(), name); + headerException = new StreamException(sm.getString( + "stream.header.unexpectedPseudoHeader", getConnectionId(), getIdentifier(), + name), Http2Error.PROTOCOL_ERROR, getIdentifier().intValue()); // No need for further processing. The stream will be reset. return; } @@ -299,18 +307,20 @@ public final void emitHeader(String name, String value) throws HpackException { getConnectionId(), getIdentifier())); } int queryStart = value.indexOf('?'); + String uri; if (queryStart == -1) { - coyoteRequest.requestURI().setString(value); - coyoteRequest.decodedURI().setString( - coyoteRequest.getURLDecoder().convert(value, false)); + uri = value; } else { - String uri = value.substring(0, queryStart); + uri = value.substring(0, queryStart); String query = value.substring(queryStart + 1); - coyoteRequest.requestURI().setString(uri); - coyoteRequest.decodedURI().setString( - coyoteRequest.getURLDecoder().convert(uri, false)); coyoteRequest.queryString().setString(query); } + // Bug 61120. Set the URI as bytes rather than String so: + // - any path parameters are correctly processed + // - the normalization security checks are performed that prevent + // directory traversal attacks + byte[] uriBytes = uri.getBytes(StandardCharsets.ISO_8859_1); + coyoteRequest.requestURI().setBytes(uriBytes, 0, uriBytes.length); break; } case ":authority": { @@ -340,15 +350,17 @@ public final void emitHeader(String name, String value) throws HpackException { break; } default: { - if (headerState == HEADER_STATE_TRAILER && !handler.isTrailerHeaderAllowed(name)) { + if (headerState == HEADER_STATE_TRAILER && + !handler.getProtocol().isTrailerHeaderAllowed(name)) { break; } if ("expect".equals(name) && "100-continue".equals(value)) { coyoteRequest.setExpectation(true); } if (pseudoHeader) { - headerStateErrorMsg = sm.getString("stream.header.unknownPseudoHeader", - getConnectionId(), getIdentifier(), name); + headerException = new StreamException(sm.getString( + "stream.header.unknownPseudoHeader", getConnectionId(), getIdentifier(), + name), Http2Error.PROTOCOL_ERROR, getIdentifier().intValue()); } if (headerState == HEADER_STATE_TRAILER) { @@ -362,14 +374,21 @@ public final void emitHeader(String name, String value) throws HpackException { } + @Override + public void setHeaderException(StreamException streamException) { + if (headerException == null) { + headerException = streamException; + } + } + + @Override public void validateHeaders() throws StreamException { - if (headerStateErrorMsg == null) { + if (headerException == null) { return; } - throw new StreamException(headerStateErrorMsg, Http2Error.PROTOCOL_ERROR, - getIdentifier().intValue()); + throw headerException; } @@ -390,23 +409,50 @@ final boolean receivedEndOfHeaders() throws ConnectionException { final void writeHeaders() throws IOException { - prepareHeaders(coyoteResponse); - boolean endOfStream = getOutputBuffer().hasNoBody(); + boolean endOfStream = streamOutputBuffer.hasNoBody() && + coyoteResponse.getTrailerFields() == null; // TODO: Is 1k the optimal value? handler.writeHeaders(this, 0, coyoteResponse.getMimeHeaders(), endOfStream, 1024); } - final void writeAck() throws IOException { - // TODO: Is 64 too big? Just the status header with compression - handler.writeHeaders(this, 0, ACK_HEADERS, false, 64); + + final void addOutputFilter(OutputFilter filter) { + http2OutputBuffer.addFilter(filter); } - final void flushData() throws IOException { - if (log.isDebugEnabled()) { - log.debug(sm.getString("stream.write", getConnectionId(), getIdentifier())); + final void writeTrailers() throws IOException { + Supplier> supplier = coyoteResponse.getTrailerFields(); + if (supplier == null) { + // No supplier was set, end of stream will already have been sent + return; + } + + // We can re-use the MimeHeaders from the response since they have + // already been processed by the encoder at this point + MimeHeaders mimeHeaders = coyoteResponse.getMimeHeaders(); + mimeHeaders.recycle(); + + Map headerMap = supplier.get(); + if (headerMap == null) { + headerMap = Collections.emptyMap(); } - outputBuffer.flush(true); + + // Copy the contents of the Map to the MimeHeaders + // TODO: Is there benefit in refactoring this? Is MimeHeaders too + // heavyweight? Can we reduce the copy/conversions? + for (Map.Entry headerEntry : headerMap.entrySet()) { + MessageBytes mb = mimeHeaders.addValue(headerEntry.getKey()); + mb.setString(headerEntry.getValue()); + } + + handler.writeHeaders(this, 0, mimeHeaders, true, 1024); + } + + + final void writeAck() throws IOException { + // TODO: Is 64 too big? Just the status header with compression + handler.writeHeaders(this, 0, ACK_HEADERS, false, 64); } @@ -440,14 +486,16 @@ final ByteBuffer getInputByteBuffer() { final void receivedStartOfHeaders(boolean headersEndStream) throws Http2Exception { if (headerState == HEADER_STATE_START) { headerState = HEADER_STATE_PSEUDO; - handler.getHpackDecoder().setMaxHeaderCount(handler.getMaxHeaderCount()); - handler.getHpackDecoder().setMaxHeaderSize(handler.getMaxHeaderSize()); + handler.getHpackDecoder().setMaxHeaderCount(handler.getProtocol().getMaxHeaderCount()); + handler.getHpackDecoder().setMaxHeaderSize(handler.getProtocol().getMaxHeaderSize()); } else if (headerState == HEADER_STATE_PSEUDO || headerState == HEADER_STATE_REGULAR) { // Trailer headers MUST include the end of stream flag if (headersEndStream) { headerState = HEADER_STATE_TRAILER; - handler.getHpackDecoder().setMaxHeaderCount(handler.getMaxTrailerCount()); - handler.getHpackDecoder().setMaxHeaderSize(handler.getMaxTrailerSize()); + handler.getHpackDecoder().setMaxHeaderCount( + handler.getProtocol().getMaxTrailerCount()); + handler.getHpackDecoder().setMaxHeaderSize( + handler.getProtocol().getMaxTrailerSize()); } else { throw new ConnectionException(sm.getString("stream.trailerHeader.noEndOfStream", getConnectionId(), getIdentifier()), Http2Error.PROTOCOL_ERROR); @@ -485,18 +533,28 @@ final void receivedEndOfStream() throws ConnectionException { final void sentEndOfStream() { - outputBuffer.endOfStreamSent = true; + streamOutputBuffer.endOfStreamSent = true; state.sentEndOfStream(); } + final boolean isReady() { + return streamOutputBuffer.isReady(); + } + + + final boolean flush(boolean block) throws IOException { + return streamOutputBuffer.flush(block); + } + + final StreamInputBuffer getInputBuffer() { return inputBuffer; } - final StreamOutputBuffer getOutputBuffer() { - return outputBuffer; + final HttpOutputBuffer getOutputBuffer() { + return http2OutputBuffer; } @@ -585,6 +643,17 @@ final void push(Request request) throws IOException { } + boolean isTrailerFieldsReady() { + // Once EndOfStream has been received, canRead will be false + return !state.canRead(); + } + + + boolean isTrailerFieldsSupported() { + return !streamOutputBuffer.endOfStreamSent; + } + + private static void push(final Http2UpgradeHandler handler, final Request request, final Stream stream) throws IOException { if (org.apache.coyote.Constants.IS_SECURITY_ENABLED) { @@ -605,33 +674,6 @@ private static void push(final Http2UpgradeHandler handler, final Request reques } - private static void prepareHeaders(Response coyoteResponse) { - MimeHeaders headers = coyoteResponse.getMimeHeaders(); - int statusCode = coyoteResponse.getStatus(); - - // Add the pseudo header for status - headers.addValue(":status").setString(Integer.toString(statusCode)); - - // Check to see if a response body is present - if (!(statusCode < 200 || statusCode == 205 || statusCode == 304)) { - String contentType = coyoteResponse.getContentType(); - if (contentType != null) { - headers.setValue("content-type").setString(contentType); - } - String contentLanguage = coyoteResponse.getContentLanguage(); - if (contentLanguage != null) { - headers.setValue("content-language").setString(contentLanguage); - } - } - - // Add date header unless it is an informational response or the - // application has already set one - if (statusCode >= 200 && headers.getValue("date") == null) { - headers.addValue("date").setString(FastHttpDateFormat.getCurrentDate()); - } - } - - private static class PrivilegedPush implements PrivilegedExceptionAction { private final Http2UpgradeHandler handler; @@ -653,7 +695,7 @@ public Void run() throws IOException { } - class StreamOutputBuffer implements OutputBuffer { + class StreamOutputBuffer implements HttpOutputBuffer { private final ByteBuffer buffer = ByteBuffer.allocate(8 * 1024); private volatile long written = 0; @@ -671,9 +713,6 @@ public final synchronized int doWrite(ByteBuffer chunk) throws IOException { throw new IllegalStateException( sm.getString("stream.closed", getConnectionId(), getIdentifier())); } - if (!coyoteResponse.isCommitted()) { - coyoteResponse.sendHeaders(); - } int chunkLimit = chunk.limit(); int offset = 0; while (chunk.remaining() > 0) { @@ -709,7 +748,8 @@ private final synchronized boolean flush(boolean writeInProgress, boolean block) if (closed && !endOfStreamSent) { // Handling this special case here is simpler than trying // to modify the following code to handle it. - handler.writeBody(Stream.this, buffer, 0, true); + handler.writeBody(Stream.this, buffer, 0, + coyoteResponse.getTrailerFields() == null); } // Buffer is empty. Nothing to do. return false; @@ -728,7 +768,8 @@ private final synchronized boolean flush(boolean writeInProgress, boolean block) handler.reserveWindowSize(Stream.this, streamReservation); // Do the write handler.writeBody(Stream.this, buffer, connectionReservation, - !writeInProgress && closed && left == connectionReservation); + !writeInProgress && closed && left == connectionReservation && + coyoteResponse.getTrailerFields() == null); streamReservation -= connectionReservation; left -= connectionReservation; } @@ -750,9 +791,11 @@ public final long getBytesWritten() { return written; } - final void close() throws IOException { + @Override + public final void end() throws IOException { closed = true; - flushData(); + flush(true); + writeTrailers(); } /** @@ -762,6 +805,11 @@ final void close() throws IOException { final boolean hasNoBody() { return ((written == 0) && closed); } + + @Override + public void flush() throws IOException { + flush(true); + } } @@ -853,8 +901,10 @@ public final int doRead(ApplicationBufferHandler applicationBufferHandler) final void registerReadInterest() { - synchronized (inBuffer) { - readInterest = true; + if (inBuffer != null) { + synchronized (inBuffer) { + readInterest = true; + } } } diff --git a/core/src/main/java/org/apache/coyote/http2/StreamProcessor.java b/core/src/main/java/org/apache/coyote/http2/StreamProcessor.java index 218d830..ba1b7af 100644 --- a/core/src/main/java/org/apache/coyote/http2/StreamProcessor.java +++ b/core/src/main/java/org/apache/coyote/http2/StreamProcessor.java @@ -16,6 +16,7 @@ */ package org.apache.coyote.http2; +import java.io.File; import java.io.IOException; import java.util.Iterator; @@ -25,11 +26,16 @@ import org.apache.coyote.ContainerThreadMarker; import org.apache.coyote.ErrorState; import org.apache.coyote.Request; +import org.apache.coyote.Response; +import org.apache.coyote.http11.filters.GzipOutputFilter; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.buf.ByteChunk; +import org.apache.tomcat.util.http.FastHttpDateFormat; +import org.apache.tomcat.util.http.MimeHeaders; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.DispatchType; +import org.apache.tomcat.util.net.SendfileState; import org.apache.tomcat.util.net.SocketEvent; import org.apache.tomcat.util.net.SocketWrapperBase; import org.apache.tomcat.util.res.StringManager; @@ -41,14 +47,15 @@ class StreamProcessor extends AbstractProcessor { private final Http2UpgradeHandler handler; private final Stream stream; + private SendfileData sendfileData = null; + private SendfileState sendfileState = null; StreamProcessor(Http2UpgradeHandler handler, Stream stream, Adapter adapter, SocketWrapperBase socketWrapper) { - super(stream.getCoyoteRequest(), stream.getCoyoteResponse()); + super(adapter, stream.getCoyoteRequest(), stream.getCoyoteResponse()); this.handler = handler; this.stream = stream; - setAdapter(adapter); setSocketWrapper(socketWrapper); } @@ -97,13 +104,74 @@ final void process(SocketEvent event) { @Override protected final void prepareResponse() throws IOException { response.setCommitted(true); + if (handler.hasAsyncIO() && handler.getProtocol().getUseSendfile()) { + prepareSendfile(); + } + prepareHeaders(request, response, sendfileData == null, handler.getProtocol(), stream); stream.writeHeaders(); } + private void prepareSendfile() { + String fileName = (String) stream.getCoyoteRequest().getAttribute( + org.apache.coyote.Constants.SENDFILE_FILENAME_ATTR); + if (fileName != null) { + sendfileData = new SendfileData(); + sendfileData.path = new File(fileName).toPath(); + sendfileData.pos = ((Long) stream.getCoyoteRequest().getAttribute( + org.apache.coyote.Constants.SENDFILE_FILE_START_ATTR)).longValue(); + sendfileData.end = ((Long) stream.getCoyoteRequest().getAttribute( + org.apache.coyote.Constants.SENDFILE_FILE_END_ATTR)).longValue(); + sendfileData.left = sendfileData.end - sendfileData.pos; + sendfileData.stream = stream; + } + } + + + // Static so it can be used by Stream to build the MimeHeaders required for + // an ACK. For that use case coyoteRequest, protocol and stream will be null. + static void prepareHeaders(Request coyoteRequest, Response coyoteResponse, boolean noSendfile, + Http2Protocol protocol, Stream stream) { + MimeHeaders headers = coyoteResponse.getMimeHeaders(); + int statusCode = coyoteResponse.getStatus(); + + // Add the pseudo header for status + headers.addValue(":status").setString(Integer.toString(statusCode)); + + // Check to see if a response body is present + if (!(statusCode < 200 || statusCode == 205 || statusCode == 304)) { + String contentType = coyoteResponse.getContentType(); + if (contentType != null) { + headers.setValue("content-type").setString(contentType); + } + String contentLanguage = coyoteResponse.getContentLanguage(); + if (contentLanguage != null) { + headers.setValue("content-language").setString(contentLanguage); + } + } + + // Add date header unless it is an informational response or the + // application has already set one + if (statusCode >= 200 && headers.getValue("date") == null) { + headers.addValue("date").setString(FastHttpDateFormat.getCurrentDate()); + } + + // Compression can't be used with sendfile + if (noSendfile && protocol != null && + protocol.useCompression(coyoteRequest, coyoteResponse)) { + // Enable compression. Headers will have been set. Need to configure + // output filter at this point. + stream.addOutputFilter(new GzipOutputFilter()); + } + } + + @Override protected final void finishResponse() throws IOException { - stream.getOutputBuffer().close(); + sendfileState = handler.processSendfile(sendfileData); + if (!(sendfileState == SendfileState.PENDING)) { + stream.getOutputBuffer().end(); + } } @@ -121,7 +189,7 @@ protected final void ack() { @Override protected final void flush() throws IOException { - stream.flushData(); + stream.getOutputBuffer().flush(); } @@ -180,7 +248,7 @@ protected final void registerReadInterest() { @Override protected final boolean isReady() { - return stream.getOutputBuffer().isReady(); + return stream.isReady(); } @@ -190,7 +258,7 @@ protected final void executeDispatches() { synchronized (this) { /* * TODO Check if this sync is necessary. - * Compare with superrclass that uses SocketWrapper + * Compare with superclass that uses SocketWrapper */ while (dispatches != null && dispatches.hasNext()) { DispatchType dispatchType = dispatches.next(); @@ -217,13 +285,24 @@ protected final void doPush(Request pushTarget) { } + @Override + protected boolean isTrailerFieldsReady() { + return stream.isTrailerFieldsReady(); + } + + + @Override + protected boolean isTrailerFieldsSupported() { + return stream.isTrailerFieldsSupported(); + } + + @Override public final void recycle() { // StreamProcessor instances are not re-used. // Clear fields that can be cleared to aid GC and trigger NPEs if this // is reused setSocketWrapper(null); - setAdapter(null); } @@ -251,7 +330,9 @@ public final SocketState service(SocketWrapperBase socket) throws IOException setErrorState(ErrorState.CLOSE_NOW, e); } - if (getErrorState().isError()) { + if (sendfileState == SendfileState.PENDING) { + return SocketState.SENDFILE; + } else if (getErrorState().isError()) { action(ActionCode.CLOSE, null); request.updateCounters(); return SocketState.CLOSED; @@ -267,7 +348,7 @@ public final SocketState service(SocketWrapperBase socket) throws IOException @Override protected final boolean flushBufferedWrite() throws IOException { - if (stream.getOutputBuffer().flush(false)) { + if (stream.flush(false)) { // The buffer wasn't fully flushed so re-register the // stream for write. Note this does not go via the // Response since the write registration state at @@ -275,7 +356,7 @@ protected final boolean flushBufferedWrite() throws IOException { // has been emptied then the code below will call // dispatch() which will enable the // Response to respond to this event. - if (stream.getOutputBuffer().isReady()) { + if (stream.isReady()) { // Unexpected throw new IllegalStateException(); } diff --git a/core/src/main/java/org/apache/coyote/http2/StreamStateMachine.java b/core/src/main/java/org/apache/coyote/http2/StreamStateMachine.java index 313ad2c..3b67f86 100644 --- a/core/src/main/java/org/apache/coyote/http2/StreamStateMachine.java +++ b/core/src/main/java/org/apache/coyote/http2/StreamStateMachine.java @@ -136,6 +136,11 @@ final synchronized boolean isActive() { } + final synchronized boolean canRead() { + return state.canRead(); + } + + final synchronized boolean canWrite() { return state.canWrite(); } @@ -222,6 +227,10 @@ public boolean isActive() { return canWrite || canRead; } + public boolean canRead() { + return canRead; + } + public boolean canWrite() { return canWrite; } diff --git a/core/src/main/java/org/apache/coyote/mbeans-descriptors.xml b/core/src/main/java/org/apache/coyote/mbeans-descriptors.xml new file mode 100644 index 0000000..a17a59b --- /dev/null +++ b/core/src/main/java/org/apache/coyote/mbeans-descriptors.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/java/org/apache/el/Messages_es.properties b/core/src/main/java/org/apache/el/Messages_es.properties index fa0ee0b..09d0372 100644 --- a/core/src/main/java/org/apache/el/Messages_es.properties +++ b/core/src/main/java/org/apache/el/Messages_es.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + error.convert = No puedo convertir [{0}] desde tipo [{1}] a [{2}] error.compare = No puedo comparar [{0}] con [{1}] error.function = Problemas llamando a funci\u00F3n [{0}] diff --git a/core/src/main/java/org/apache/el/lang/ExpressionBuilder.java b/core/src/main/java/org/apache/el/lang/ExpressionBuilder.java index cde34a6..f784d8e 100644 --- a/core/src/main/java/org/apache/el/lang/ExpressionBuilder.java +++ b/core/src/main/java/org/apache/el/lang/ExpressionBuilder.java @@ -230,7 +230,7 @@ public void visit(Node node) throws ELException { "" + methodParameterCount, "" + node.jjtGetChild(0).jjtGetNumChildren())); } } else if (node instanceof AstIdentifier && this.varMapper != null) { - String variable = ((AstIdentifier) node).getImage(); + String variable = node.getImage(); // simply capture it this.varMapper.resolveVariable(variable); diff --git a/core/src/main/java/org/apache/el/parser/AstMethodParameters.java b/core/src/main/java/org/apache/el/parser/AstMethodParameters.java index 29fe15e..bc33b4c 100644 --- a/core/src/main/java/org/apache/el/parser/AstMethodParameters.java +++ b/core/src/main/java/org/apache/el/parser/AstMethodParameters.java @@ -19,6 +19,7 @@ package org.apache.el.parser; import java.util.ArrayList; +import java.util.List; import org.apache.el.lang.EvaluationContext; @@ -28,7 +29,7 @@ public AstMethodParameters(int id) { } public Object[] getParameters(EvaluationContext ctx) { - ArrayList params = new ArrayList<>(); + List params = new ArrayList<>(); for (int i = 0; i < this.jjtGetNumChildren(); i++) { params.add(this.jjtGetChild(i).getValue(ctx)); } diff --git a/core/src/main/java/org/apache/el/parser/AstValue.java b/core/src/main/java/org/apache/el/parser/AstValue.java index 06e10c3..caa264a 100644 --- a/core/src/main/java/org/apache/el/parser/AstValue.java +++ b/core/src/main/java/org/apache/el/parser/AstValue.java @@ -303,12 +303,11 @@ private Object[] convertArgs(EvaluationContext ctx, Object[] src, Method m) { } if (m.isVarArgs()) { - Object[] varArgs = (Object[]) Array.newInstance( - m.getParameterTypes()[paramCount - 1].getComponentType(), - src.length - (paramCount - 1)); + Class varArgType = m.getParameterTypes()[paramCount - 1].getComponentType(); + Object[] varArgs = + (Object[]) Array.newInstance(varArgType, src.length - (paramCount - 1)); for (int i = 0; i < src.length - (paramCount - 1); i ++) { - varArgs[i] = ELSupport.coerceToType(ctx, src[paramCount - 1 + i], - types[paramCount - 1].getComponentType()); + varArgs[i] = ELSupport.coerceToType(ctx, src[paramCount - 1 + i], varArgType); } dest[paramCount - 1] = varArgs; } else { diff --git a/core/src/main/java/org/apache/el/parser/ELParser.java b/core/src/main/java/org/apache/el/parser/ELParser.java index 4d073b0..f412e48 100644 --- a/core/src/main/java/org/apache/el/parser/ELParser.java +++ b/core/src/main/java/org/apache/el/parser/ELParser.java @@ -7,7 +7,7 @@ public class ELParser/*@bgen(jjtree)*/implements ELParserTreeConstants, ELParser protected JJTELParserState jjtree = new JJTELParserState(); public static Node parse(String ref) throws ELException { try { - return (new ELParser(new StringReader(ref))).CompositeExpression(); + return new ELParser(new StringReader(ref)).CompositeExpression(); } catch (ParseException pe) { throw new ELException(pe.getMessage()); } diff --git a/core/src/main/java/org/apache/el/parser/ELParser.jjt b/core/src/main/java/org/apache/el/parser/ELParser.jjt index 480c8dd..5bca021 100644 --- a/core/src/main/java/org/apache/el/parser/ELParser.jjt +++ b/core/src/main/java/org/apache/el/parser/ELParser.jjt @@ -43,7 +43,7 @@ public class ELParser { public static Node parse(String ref) throws ELException { try { - return (new ELParser(new StringReader(ref))).CompositeExpression(); + return new ELParser(new StringReader(ref)).CompositeExpression(); } catch (ParseException pe) { throw new ELException(pe.getMessage()); } diff --git a/core/src/main/java/org/apache/el/parser/TokenMgrError.java b/core/src/main/java/org/apache/el/parser/TokenMgrError.java index 7fee656..cf37fb9 100644 --- a/core/src/main/java/org/apache/el/parser/TokenMgrError.java +++ b/core/src/main/java/org/apache/el/parser/TokenMgrError.java @@ -106,11 +106,11 @@ protected static final String addEscapes(String str) { * Note: You can customize the lexical error message by modifying this method. */ protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { - return("Lexical error at line " + + return "Lexical error at line " + errorLine + ", column " + errorColumn + ". Encountered: " + (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + - "after : \"" + addEscapes(errorAfter) + "\""); + "after : \"" + addEscapes(errorAfter) + "\""; } /** diff --git a/core/src/main/java/org/apache/el/stream/StreamELResolverImpl.java b/core/src/main/java/org/apache/el/stream/StreamELResolverImpl.java index d76dd7e..f5f6bcf 100644 --- a/core/src/main/java/org/apache/el/stream/StreamELResolverImpl.java +++ b/core/src/main/java/org/apache/el/stream/StreamELResolverImpl.java @@ -20,6 +20,7 @@ import java.lang.reflect.Array; import java.util.Collection; import java.util.Iterator; +import java.util.NoSuchElementException; import javax.el.ELContext; import javax.el.ELResolver; @@ -97,7 +98,11 @@ public boolean hasNext() { @Override public Object next() { - return Array.get(base, index++); + try { + return Array.get(base, index++); + } catch (ArrayIndexOutOfBoundsException e) { + throw new NoSuchElementException(); + } } @Override diff --git a/core/src/main/java/org/apache/el/util/ReflectionUtil.java b/core/src/main/java/org/apache/el/util/ReflectionUtil.java index 904aa8b..f759305 100644 --- a/core/src/main/java/org/apache/el/util/ReflectionUtil.java +++ b/core/src/main/java/org/apache/el/util/ReflectionUtil.java @@ -129,6 +129,7 @@ public static String[] toTypeNameArray(Class[] c) { public static Method getMethod(EvaluationContext ctx, Object base, Object property, Class[] paramTypes, Object[] paramValues) throws MethodNotFoundException { + if (base == null || property == null) { throw new MethodNotFoundException(MessageFactory.get( "error.method.notfound", base, property, @@ -163,11 +164,29 @@ public static Method getMethod(EvaluationContext ctx, Object base, Object proper } // Check the number of parameters - if (!(paramCount == mParamCount || - (m.isVarArgs() && paramCount >= mParamCount))) { + // Multiple tests to improve readability + if (!m.isVarArgs() && paramCount != mParamCount) { + // Method has wrong number of parameters + continue; + } + if (m.isVarArgs() && paramCount < mParamCount -1) { // Method has wrong number of parameters continue; } + if (m.isVarArgs() && paramCount == mParamCount && paramValues != null && + paramValues.length > paramCount && !paramTypes[mParamCount -1].isArray()) { + // Method arguments don't match + continue; + } + if (m.isVarArgs() && paramCount > mParamCount && paramValues != null && + paramValues.length != paramCount) { + // Might match a different varargs method + continue; + } + if (!m.isVarArgs() && paramValues != null && paramCount != paramValues.length) { + // Might match a different varargs method + continue; + } // Check the parameters match int exactMatch = 0; @@ -176,15 +195,18 @@ public static Method getMethod(EvaluationContext ctx, Object base, Object proper boolean noMatch = false; for (int i = 0; i < mParamCount; i++) { // Can't be null - if (mParamTypes[i].equals(paramTypes[i])) { - exactMatch++; - } else if (i == (mParamCount - 1) && m.isVarArgs()) { + if (m.isVarArgs() && i == (mParamCount - 1)) { + if (i == paramCount || (paramValues != null && paramValues.length == i)) { + // Nothing is passed as varargs + assignableMatch++; + break; + } Class varType = mParamTypes[i].getComponentType(); for (int j = i; j < paramCount; j++) { if (isAssignableFrom(paramTypes[j], varType)) { assignableMatch++; } else { - if (paramValues == null || j >= paramValues.length) { + if (paramValues == null) { noMatch = true; break; } else { @@ -200,18 +222,22 @@ public static Method getMethod(EvaluationContext ctx, Object base, Object proper // lead to a varArgs method matching when the result // should be ambiguous } - } else if (isAssignableFrom(paramTypes[i], mParamTypes[i])) { - assignableMatch++; } else { - if (paramValues == null || i >= paramValues.length) { - noMatch = true; - break; + if (mParamTypes[i].equals(paramTypes[i])) { + exactMatch++; + } else if (paramTypes[i] != null && isAssignableFrom(paramTypes[i], mParamTypes[i])) { + assignableMatch++; } else { - if (isCoercibleFrom(ctx, paramValues[i], mParamTypes[i])) { - coercibleMatch++; - } else { + if (paramValues == null) { noMatch = true; break; + } else { + if (isCoercibleFrom(ctx, paramValues[i], mParamTypes[i])) { + coercibleMatch++; + } else { + noMatch = true; + break; + } } } } @@ -502,6 +528,29 @@ public int compareTo(MatchResult o) { } return cmp; } - } + @Override + public boolean equals(Object o) + { + return o == this + || (null != o + && this.getClass().equals(o.getClass()) + && ((MatchResult)o).getExact() == this.getExact() + && ((MatchResult)o).getAssignable() == this.getAssignable() + && ((MatchResult)o).getCoercible() == this.getCoercible() + && ((MatchResult)o).isBridge() == this.isBridge() + ) + ; + } + + @Override + public int hashCode() + { + return (this.isBridge() ? 1 << 24 : 0) + ^ this.getExact() << 16 + ^ this.getAssignable() << 8 + ^ this.getCoercible() + ; + } + } } diff --git a/core/src/main/java/org/apache/jasper/EmbeddedServletOptions.java b/core/src/main/java/org/apache/jasper/EmbeddedServletOptions.java index e5729dd..56f19c4 100644 --- a/core/src/main/java/org/apache/jasper/EmbeddedServletOptions.java +++ b/core/src/main/java/org/apache/jasper/EmbeddedServletOptions.java @@ -63,9 +63,9 @@ public final class EmbeddedServletOptions implements Options { private boolean keepGenerated = true; /** - * Should white spaces between directives or actions be trimmed? + * How should template text that consists entirely of whitespace be handled? */ - private boolean trimSpaces = false; + private TrimSpacesOption trimSpaces = TrimSpacesOption.FALSE; /** * Determines whether tag handler pooling is enabled. @@ -238,11 +238,8 @@ public boolean getKeepGenerated() { return keepGenerated; } - /** - * Should white spaces between directives or actions be trimmed? - */ @Override - public boolean getTrimSpaces() { + public TrimSpacesOption getTrimSpaces() { return trimSpaces; } @@ -499,13 +496,11 @@ public EmbeddedServletOptions(ServletConfig config, ServletContext context) { String trimsp = config.getInitParameter("trimSpaces"); if (trimsp != null) { - if (trimsp.equalsIgnoreCase("true")) { - trimSpaces = true; - } else if (trimsp.equalsIgnoreCase("false")) { - trimSpaces = false; - } else { + try { + trimSpaces = TrimSpacesOption.valueOf(trimsp.toUpperCase()); + } catch (IllegalArgumentException iae) { if (log.isWarnEnabled()) { - log.warn(Localizer.getMessage("jsp.warning.trimspaces")); + log.warn(Localizer.getMessage("jsp.warning.trimspaces"), iae); } } } diff --git a/core/src/main/java/org/apache/jasper/JspC.java b/core/src/main/java/org/apache/jasper/JspC.java index 34ce120..5e3bc93 100644 --- a/core/src/main/java/org/apache/jasper/JspC.java +++ b/core/src/main/java/org/apache/jasper/JspC.java @@ -34,7 +34,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -115,6 +114,7 @@ public class JspC extends Task implements Options { protected static final String SWITCH_CLASS_NAME = "-c"; protected static final String SWITCH_FULL_STOP = "--"; protected static final String SWITCH_COMPILE = "-compile"; + protected static final String SWITCH_FAIL_FAST = "-failFast"; protected static final String SWITCH_SOURCE = "-source"; protected static final String SWITCH_TARGET = "-target"; protected static final String SWITCH_URI_BASE = "-uribase"; @@ -167,7 +167,7 @@ public class JspC extends Task implements Options { protected String classPath = null; protected ClassLoader loader = null; - protected boolean trimSpaces = false; + protected TrimSpacesOption trimSpaces = TrimSpacesOption.FALSE; protected boolean genStringAsCharArray = false; protected boolean validateTld; protected boolean validateXml; @@ -186,6 +186,7 @@ public class JspC extends Task implements Options { protected int dieLevel; protected boolean helpNeeded = false; protected boolean compile = false; + protected boolean failFast = false; protected boolean smapSuppressed = true; protected boolean smapDumped = false; protected boolean caching = true; @@ -204,6 +205,11 @@ public class JspC extends Task implements Options { */ protected boolean failOnError = true; + /** + * Should a separate process be forked to perform the compilation? + */ + private boolean fork = false; + /** * The file extensions to be handled as JSP files. * Default list is .jsp and .jspx. @@ -314,6 +320,8 @@ public void setArgs(String[] arg) throws JasperException { targetPackage = nextArg(); } else if (tok.equals(SWITCH_COMPILE)) { compile=true; + } else if (tok.equals(SWITCH_FAIL_FAST)) { + failFast = true; } else if (tok.equals(SWITCH_CLASS_NAME)) { targetClassName = nextArg(); } else if (tok.equals(SWITCH_URI_BASE)) { @@ -345,7 +353,13 @@ public void setArgs(String[] arg) throws JasperException { } else if (tok.equals(SWITCH_XPOWERED_BY)) { xpoweredBy = true; } else if (tok.equals(SWITCH_TRIM_SPACES)) { - setTrimSpaces(true); + tok = nextArg(); + if (TrimSpacesOption.SINGLE.toString().equalsIgnoreCase(tok)) { + setTrimSpaces(TrimSpacesOption.SINGLE); + } else { + setTrimSpaces(TrimSpacesOption.TRUE); + argPos--; + } } else if (tok.equals(SWITCH_CACHE)) { tok = nextArg(); if ("false".equals(tok)) { @@ -426,20 +440,23 @@ public boolean getKeepGenerated() { return true; } - /** - * {@inheritDoc} - */ @Override - public boolean getTrimSpaces() { + public TrimSpacesOption getTrimSpaces() { return trimSpaces; } + public void setTrimSpaces(TrimSpacesOption trimSpaces) { + this.trimSpaces = trimSpaces; + } + /** - * Sets the option to trim white spaces between directives or actions. + * Sets the option to control handling of template text that consists + * entirely of whitespace. + * * @param ts New value */ - public void setTrimSpaces(boolean ts) { - this.trimSpaces = ts; + public void setTrimSpaces(String ts) { + this.trimSpaces = TrimSpacesOption.valueOf(ts); } /** @@ -780,7 +797,11 @@ public void setJavaEncoding(String encodingName) { */ @Override public boolean getFork() { - return false; + return fork; + } + + public void setFork(boolean fork) { + this.fork = fork; } /** @@ -1240,7 +1261,7 @@ protected void processFile(String file) targetClassName = null; } if (targetPackage != null) { - clctxt.setServletPackageName(targetPackage); + clctxt.setBasePackageName(targetPackage); } originalClassLoader = Thread.currentThread().getContextClassLoader(); @@ -1280,14 +1301,7 @@ protected void processFile(String file) file), rootCause); } - - // Bugzilla 35114. - if(getFailOnError()) { - throw je; - } else { - log.error(je.getMessage()); - } - + throw je; } catch (Exception e) { if ((e instanceof FileNotFoundException) && log.isWarnEnabled()) { log.warn(Localizer.getMessage("jspc.error.fileDoesNotExist", @@ -1390,9 +1404,10 @@ public void execute() { initWebXml(); - Iterator iter = pages.iterator(); - while (iter.hasNext()) { - String nextjsp = iter.next(); + int errorCount = 0; + long start = System.currentTimeMillis(); + + for (String nextjsp : pages) { File fjsp = new File(nextjsp); if (!fjsp.isAbsolute()) { fjsp = new File(uriRootF, nextjsp); @@ -1412,7 +1427,25 @@ public void execute() { if (nextjsp.startsWith("." + File.separatorChar)) { nextjsp = nextjsp.substring(2); } - processFile(nextjsp); + try { + processFile(nextjsp); + } catch (JasperException e) { + if (failFast) { + throw e; + } + errorCount++; + log.error(nextjsp + ":" + e.getMessage()); + } + } + + long time = System.currentTimeMillis() - start; + String msg = Localizer.getMessage("jspc.compilation.result", + Integer.toString(errorCount), Long.toString(time)); + if (failOnError && errorCount > 0) { + System.out.println("Error Count: " + errorCount); + throw new BuildException(msg); + } else { + log.info(msg); } completeWebXml(); @@ -1425,15 +1458,9 @@ public void execute() { throw new BuildException(ioe); } catch (JasperException je) { - Throwable rootCause = je; - while (rootCause instanceof JasperException - && ((JasperException) rootCause).getRootCause() != null) { - rootCause = ((JasperException) rootCause).getRootCause(); - } - if (rootCause != je) { - rootCause.printStackTrace(); + if (failOnError) { + throw new BuildException(je); } - throw new BuildException(je); } finally { if (loader != null) { LogFactory.release(loader); @@ -1566,7 +1593,7 @@ protected ClassLoader initClassLoader() throws IOException { } // Turn the classPath into URLs - ArrayList urls = new ArrayList<>(); + List urls = new ArrayList<>(); StringTokenizer tokenizer = new StringTokenizer(classPath, File.pathSeparator); while (tokenizer.hasMoreTokens()) { diff --git a/core/src/main/java/org/apache/jasper/JspCompilationContext.java b/core/src/main/java/org/apache/jasper/JspCompilationContext.java index be253b8..9f602be 100644 --- a/core/src/main/java/org/apache/jasper/JspCompilationContext.java +++ b/core/src/main/java/org/apache/jasper/JspCompilationContext.java @@ -232,7 +232,8 @@ public Compiler createCompiler() { } } if (jspCompiler == null) { - throw new IllegalStateException(Localizer.getMessage("jsp.error.compiler")); + throw new IllegalStateException(Localizer.getMessage("jsp.error.compiler.config", + options.getCompilerClassName(), options.getCompiler())); } jspCompiler.init(this, jsw); return jspCompiler; @@ -241,19 +242,13 @@ public Compiler createCompiler() { protected Compiler createCompiler(String className) { Compiler compiler = null; try { - compiler = (Compiler) Class.forName(className).newInstance(); - } catch (InstantiationException e) { - log.warn(Localizer.getMessage("jsp.error.compiler"), e); - } catch (IllegalAccessException e) { - log.warn(Localizer.getMessage("jsp.error.compiler"), e); - } catch (NoClassDefFoundError e) { - if (log.isDebugEnabled()) { - log.debug(Localizer.getMessage("jsp.error.compiler"), e); - } - } catch (ClassNotFoundException e) { + compiler = (Compiler) Class.forName(className).getConstructor().newInstance(); + } catch (NoClassDefFoundError | ClassNotFoundException e) { if (log.isDebugEnabled()) { log.debug(Localizer.getMessage("jsp.error.compiler"), e); } + } catch (ReflectiveOperationException e) { + log.warn(Localizer.getMessage("jsp.error.compiler"), e); } return compiler; } @@ -450,7 +445,7 @@ public void setPrototypeMode(boolean pm) { } /** - * Package name for the generated class is make up of the base package + * Package name for the generated class is made up of the base package * name, which is user settable, and the derived package name. The * derived package name directly mirrors the file hierarchy of the JSP page. * @return the package name @@ -482,12 +477,20 @@ protected String getDerivedPackageName() { return derivedPackageName; } + /** + * @return The base package name into which all servlet and associated code + * is generated + */ + public String getBasePackageName() { + return basePackageName; + } + /** * The package name into which the servlet class is generated. - * @param servletPackageName The package name to use + * @param basePackageName The package name to use */ - public void setServletPackageName(String servletPackageName) { - this.basePackageName = servletPackageName; + public void setBasePackageName(String basePackageName) { + this.basePackageName = basePackageName; } /** diff --git a/core/src/main/java/org/apache/jasper/Options.java b/core/src/main/java/org/apache/jasper/Options.java index f31c907..9d0fbf9 100644 --- a/core/src/main/java/org/apache/jasper/Options.java +++ b/core/src/main/java/org/apache/jasper/Options.java @@ -98,10 +98,13 @@ public interface Options { public boolean isSmapDumped(); /** - * @return true to trim white spaces between - * directives or actions. + * @return {@link TrimSpacesOption#TRUE} to remove template text that + * consists only of whitespace from the output completely, + * {@link TrimSpacesOption#SINGLE} to replace such template text + * with a single space or {@link TrimSpacesOption#FALSE} to leave + * such template text unchanged */ - public boolean getTrimSpaces(); + public TrimSpacesOption getTrimSpaces(); /** * Gets the class-id value that is sent to Internet Explorer when using diff --git a/core/src/main/java/org/apache/jasper/TrimSpacesOption.java b/core/src/main/java/org/apache/jasper/TrimSpacesOption.java new file mode 100644 index 0000000..faf7476 --- /dev/null +++ b/core/src/main/java/org/apache/jasper/TrimSpacesOption.java @@ -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. + */ +package org.apache.jasper; + +public enum TrimSpacesOption { + FALSE, + TRUE, + SINGLE +} diff --git a/core/src/main/java/org/apache/jasper/compiler/AntCompiler.java b/core/src/main/java/org/apache/jasper/compiler/AntCompiler.java index b9c7ad4..12a0bb8 100644 --- a/core/src/main/java/org/apache/jasper/compiler/AntCompiler.java +++ b/core/src/main/java/org/apache/jasper/compiler/AntCompiler.java @@ -14,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.jasper.compiler; import java.io.ByteArrayOutputStream; @@ -22,6 +21,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; +import java.util.Map; import java.util.StringTokenizer; import org.apache.jasper.Constants; @@ -118,7 +118,7 @@ protected String getReport() { * Compile the servlet from .java file to .class file */ @Override - protected void generateClass(String[] smap) + protected void generateClass(Map smaps) throws FileNotFoundException, JasperException, Exception { long t1 = 0; @@ -250,7 +250,10 @@ protected void generateClass(String[] smap) if (!ctxt.keepGenerated()) { File javaFile = new File(javaFileName); - javaFile.delete(); + if (!javaFile.delete()) { + throw new JasperException(Localizer.getMessage( + "jsp.warning.compiler.javafile.delete.fail", javaFile)); + } } if (be != null) { @@ -279,8 +282,8 @@ protected void generateClass(String[] smap) } // JSR45 Support - if (! options.isSmapSuppressed()) { - SmapUtil.installSmap(smap); + if (!options.isSmapSuppressed()) { + SmapUtil.installSmap(smaps); } } diff --git a/core/src/main/java/org/apache/jasper/compiler/AttributeParser.java b/core/src/main/java/org/apache/jasper/compiler/AttributeParser.java index 69332f2..2ce4862 100644 --- a/core/src/main/java/org/apache/jasper/compiler/AttributeParser.java +++ b/core/src/main/java/org/apache/jasper/compiler/AttributeParser.java @@ -50,8 +50,8 @@ public class AttributeParser { public static String getUnquoted(String input, char quote, boolean isELIgnored, boolean isDeferredSyntaxAllowedAsLiteral, boolean strict, boolean quoteAttributeEL) { - return (new AttributeParser(input, quote, isELIgnored, - isDeferredSyntaxAllowedAsLiteral, strict, quoteAttributeEL)).getUnquoted(); + return new AttributeParser(input, quote, isELIgnored, + isDeferredSyntaxAllowedAsLiteral, strict, quoteAttributeEL).getUnquoted(); } /* The quoted input string. */ diff --git a/core/src/main/java/org/apache/jasper/compiler/Compiler.java b/core/src/main/java/org/apache/jasper/compiler/Compiler.java index 2da20fb..27fcb44 100644 --- a/core/src/main/java/org/apache/jasper/compiler/Compiler.java +++ b/core/src/main/java/org/apache/jasper/compiler/Compiler.java @@ -26,7 +26,6 @@ import java.net.JarURLConnection; import java.net.URL; import java.net.URLConnection; -import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -69,6 +68,7 @@ public abstract class Compiler { protected Node.Nodes pageNodes; + // ------------------------------------------------------------ Constructor public void init(JspCompilationContext ctxt, JspServletWrapper jsw) { @@ -77,30 +77,35 @@ public void init(JspCompilationContext ctxt, JspServletWrapper jsw) { this.options = ctxt.getOptions(); } + // --------------------------------------------------------- Public Methods - /** - *

    - * Retrieves the parsed nodes of the JSP page, if they are available. May - * return null. Used in development mode for generating detailed error - * messages. http://bz.apache.org/bugzilla/show_bug.cgi?id=37062. - *

    - * @return the page nodes - */ - public Node.Nodes getPageNodes() { - return this.pageNodes; + public SmapStratum getSmap(String className) { + + Map smaps = ctxt.getRuntimeContext().getSmaps(); + SmapStratum smap = smaps.get(className); + + if (smap == null && !options.isSmapSuppressed()) { + // Tomcat was restarted so cached SMAP has been lost. However, it + // was written to the class file so it can be recovered. + smap = SmapUtil.loadSmap(className, ctxt.getJspLoader()); + if (smap != null) { + smaps.put(className, smap); + } + } + + return smap; } + /** * Compile the jsp file into equivalent servlet in .java file * - * @return a smap for the current JSP page, if one is generated, null - * otherwise * @throws Exception Error generating Java source + * + * @return A map of class names to JSR 045 source maps */ - protected String[] generateJava() throws Exception { - - String[] smapStr = null; + protected Map generateJava() throws Exception { long t1, t2, t3, t4; @@ -276,9 +281,14 @@ protected String[] generateJava() throws Exception { throw e; } + Map smaps = null; + // JSR45 Support if (!options.isSmapSuppressed()) { - smapStr = SmapUtil.generateSmap(ctxt, pageNodes); + smaps = SmapUtil.generateSmap(ctxt, pageNodes); + // Add them to the web application wide cache for future lookup in + // error handling etc. + ctxt.getRuntimeContext().getSmaps().putAll(smaps); } // If any proto type .java and .class files was generated, @@ -288,7 +298,7 @@ protected String[] generateJava() throws Exception { // generate .class again from the new .java file just generated. tfp.removeProtoTypeFiles(ctxt.getClassFileName()); - return smapStr; + return smaps; } private ServletWriter setupContextWriter(String javaFileName) @@ -314,12 +324,15 @@ private ServletWriter setupContextWriter(String javaFileName) /** * Servlet compilation. This compiles the generated sources into * Servlets. - * @param smap The SMAP files for source debugging + * + * @param smaps The source maps for the class(es) generated from the source + * file + * * @throws FileNotFoundException Source files not found * @throws JasperException Compilation error * @throws Exception Some other error */ - protected abstract void generateClass(String[] smap) + protected abstract void generateClass(Map smaps) throws FileNotFoundException, JasperException, Exception; /** @@ -369,17 +382,22 @@ public void compile(boolean compileClass, boolean jspcMode) } try { - String[] smap = generateJava(); + Map smaps = generateJava(); File javaFile = new File(ctxt.getServletJavaFileName()); Long jspLastModified = ctxt.getLastModified(ctxt.getJspFile()); - javaFile.setLastModified(jspLastModified.longValue()); + if (!javaFile.setLastModified(jspLastModified.longValue())) { + throw new JasperException(Localizer.getMessage("jsp.error.setLastModified", javaFile)); + } if (compileClass) { - generateClass(smap); + generateClass(smaps); // Fix for bugzilla 41606 // Set JspServletWrapper.servletClassLastModifiedTime after successful compile File targetFile = new File(ctxt.getClassFileName()); if (targetFile.exists()) { - targetFile.setLastModified(jspLastModified.longValue()); + if (!targetFile.setLastModified(jspLastModified.longValue())) { + throw new JasperException( + Localizer.getMessage("jsp.error.setLastModified", targetFile)); + } if (jsw != null) { jsw.setServletClassLastModifiedTime( jspLastModified.longValue()); @@ -397,14 +415,7 @@ public void compile(boolean compileClass, boolean jspcMode) tfp = null; errDispatcher = null; pageInfo = null; - - // Only get rid of the pageNodes if in production. - // In development mode, they are used for detailed - // error messages. - // http://bz.apache.org/bugzilla/show_bug.cgi?id=37062 - if (!this.options.getDevelopment()) { - pageNodes = null; - } + pageNodes = null; if (ctxt.getWriter() != null) { ctxt.getWriter().close(); @@ -491,9 +502,7 @@ public boolean isOutDated(boolean checkClass) { return false; } - Iterator> it = depends.entrySet().iterator(); - while (it.hasNext()) { - Entry include = it.next(); + for (Entry include : depends.entrySet()) { try { String key = include.getKey(); URL includeUrl; diff --git a/core/src/main/java/org/apache/jasper/compiler/ELFunctionMapper.java b/core/src/main/java/org/apache/jasper/compiler/ELFunctionMapper.java index 8271783..2cb9e8a 100644 --- a/core/src/main/java/org/apache/jasper/compiler/ELFunctionMapper.java +++ b/core/src/main/java/org/apache/jasper/compiler/ELFunctionMapper.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import javax.servlet.jsp.tagext.FunctionInfo; @@ -81,7 +82,7 @@ private class ELFunctionVisitor extends Node.Visitor { * Use a global name map to facilitate reuse of function maps. * The key used is prefix:function:uri. */ - private final HashMap gMap = new HashMap<>(); + private final Map gMap = new HashMap<>(); @Override public void visit(Node.ParamAction n) throws JasperException { diff --git a/core/src/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java b/core/src/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java index 367566b..fa598a4 100644 --- a/core/src/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java +++ b/core/src/main/java/org/apache/jasper/compiler/ELInterpreterFactory.java @@ -85,7 +85,7 @@ public static ELInterpreter getELInterpreter(ServletContext context) private static ELInterpreter createInstance(ServletContext context, String className) throws Exception { return (ELInterpreter) context.getClassLoader().loadClass( - className).newInstance(); + className).getConstructor().newInstance(); } diff --git a/core/src/main/java/org/apache/jasper/compiler/ELNode.java b/core/src/main/java/org/apache/jasper/compiler/ELNode.java index baad450..6051456 100644 --- a/core/src/main/java/org/apache/jasper/compiler/ELNode.java +++ b/core/src/main/java/org/apache/jasper/compiler/ELNode.java @@ -207,9 +207,7 @@ public void add(ELNode en) { * @throws JasperException if an error occurs while visiting a node */ public void visit(Visitor v) throws JasperException { - Iterator iter = list.iterator(); - while (iter.hasNext()) { - ELNode n = iter.next(); + for (ELNode n : list) { n.accept(v); } } @@ -226,9 +224,7 @@ public boolean isEmpty() { * @return true if the expression contains a ${...} */ public boolean containsEL() { - Iterator iter = list.iterator(); - while (iter.hasNext()) { - ELNode n = iter.next(); + for (ELNode n : list) { if (n instanceof Root) { return true; } diff --git a/core/src/main/java/org/apache/jasper/compiler/ELParser.java b/core/src/main/java/org/apache/jasper/compiler/ELParser.java index ced5dc2..9f2dd2c 100644 --- a/core/src/main/java/org/apache/jasper/compiler/ELParser.java +++ b/core/src/main/java/org/apache/jasper/compiler/ELParser.java @@ -106,11 +106,17 @@ private ELNode.Nodes parseEL() { ELexpr = new ELNode.Nodes(); curToken = null; prevToken = null; + int openBraces = 0; while (hasNext()) { curToken = nextToken(); if (curToken instanceof Char) { if (curToken.toChar() == '}') { - break; + openBraces--; + if (openBraces < 0) { + break; + } + } else if (curToken.toChar() == '{') { + openBraces++; } buf.append(curToken.toString()); } else { @@ -180,7 +186,7 @@ private boolean isELReserved(String id) { int i = 0; int j = reservedWords.length; while (i < j) { - int k = (i + j) / 2; + int k = (i + j) >>> 1; int result = reservedWords[k].compareTo(id); if (result == 0) { return true; diff --git a/core/src/main/java/org/apache/jasper/compiler/EncodingDetector.java b/core/src/main/java/org/apache/jasper/compiler/EncodingDetector.java index f6b6e29..84290ac 100644 --- a/core/src/main/java/org/apache/jasper/compiler/EncodingDetector.java +++ b/core/src/main/java/org/apache/jasper/compiler/EncodingDetector.java @@ -43,15 +43,8 @@ class EncodingDetector { private final boolean encodingSpecifiedInProlog; - /* - * TODO: Refactor Jasper InputStream creation and handling so the - * InputStream passed to this method is buffered and therefore saves - * on multiple opening and re-opening of the same file. - */ - EncodingDetector(InputStream is) throws IOException { - // Keep buffer size to a minimum here. BoM will be no more than 4 bytes - // so that is the maximum we need to buffer - BufferedInputStream bis = new BufferedInputStream(is, 4); + EncodingDetector(BufferedInputStream bis) throws IOException { + // Buffer is 1k. BOM is only 4 bytes. bis.mark(4); BomResult bomResult = processBom(bis); @@ -178,7 +171,7 @@ private BomResult parseBom(byte[] b4, int count) { return new BomResult("ISO-10646-UCS-4", 0); } if (b0 == 0x00 && b1 == 0x3C && b2 == 0x00 && b3 == 0x00) { - // UCS-4, unusual octect order (3412) + // UCS-4, unusual octet order (3412) // REVISIT: What should this be? return new BomResult("ISO-10646-UCS-4", 0); } diff --git a/core/src/main/java/org/apache/jasper/compiler/ErrorDispatcher.java b/core/src/main/java/org/apache/jasper/compiler/ErrorDispatcher.java index f9bf3b3..2ecc675 100644 --- a/core/src/main/java/org/apache/jasper/compiler/ErrorDispatcher.java +++ b/core/src/main/java/org/apache/jasper/compiler/ErrorDispatcher.java @@ -21,6 +21,7 @@ import java.io.StringReader; import java.net.MalformedURLException; import java.util.ArrayList; +import java.util.List; import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; @@ -316,7 +317,7 @@ private static JavacErrorDetail[] parseJavacMessage( String errMsg, String fname, Node.Nodes page) throws IOException, JasperException { - ArrayList errors = new ArrayList<>(); + List errors = new ArrayList<>(); StringBuilder errMsgBuf = null; int lineNum = -1; JavacErrorDetail javacError = null; diff --git a/core/src/main/java/org/apache/jasper/compiler/Generator.java b/core/src/main/java/org/apache/jasper/compiler/Generator.java index 8e767bf..b4a369e 100644 --- a/core/src/main/java/org/apache/jasper/compiler/Generator.java +++ b/core/src/main/java/org/apache/jasper/compiler/Generator.java @@ -33,7 +33,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -331,7 +330,7 @@ private String createTagHandlerPoolName(String prefix, } for (int i = 0; i < namedAttrs.size(); i++) { attrNames[attrs.getLength() + i] = - ((NamedAttribute) namedAttrs.getNode(i)).getQName(); + namedAttrs.getNode(i).getQName(); } Arrays.sort(attrNames, Collections.reverseOrder()); if (attrNames.length > 0) { @@ -571,10 +570,9 @@ private void genPreamblePackage(String packageName) { * generation) */ private void genPreambleImports() { - Iterator iter = pageInfo.getImports().iterator(); - while (iter.hasNext()) { + for (String i : pageInfo.getImports()) { out.printin("import "); - out.print(iter.next()); + out.print(i); out.println(";"); } @@ -601,9 +599,7 @@ private void genPreambleStaticInitializers() { out.printin("_jspx_dependants = new java.util.HashMap("); out.print("" + dependants.size()); out.println(");"); - Iterator> iter = dependants.entrySet().iterator(); - while (iter.hasNext()) { - Entry entry = iter.next(); + for (Entry entry : dependants.entrySet()) { out.printin("_jspx_dependants.put(\""); out.print(entry.getKey()); out.print("\", Long.valueOf("); @@ -3419,8 +3415,7 @@ public String generateNamedAttributeValue(Node.NamedAttribute n) out.printil("java.lang.String " + varName + " = " - + quote(((Node.TemplateText) bodyElement) - .getText()) + ";"); + + quote(bodyElement.getText()) + ";"); } } @@ -4266,7 +4261,7 @@ public int getId() { // True if the helper class should be generated. private boolean used = false; - private ArrayList fragments = new ArrayList<>(); + private List fragments = new ArrayList<>(); private String className; diff --git a/core/src/main/java/org/apache/jasper/compiler/JDTCompiler.java b/core/src/main/java/org/apache/jasper/compiler/JDTCompiler.java index 75cb5aa..877d6f3 100644 --- a/core/src/main/java/org/apache/jasper/compiler/JDTCompiler.java +++ b/core/src/main/java/org/apache/jasper/compiler/JDTCompiler.java @@ -29,6 +29,7 @@ import java.io.Reader; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.StringTokenizer; @@ -68,7 +69,7 @@ public class JDTCompiler extends org.apache.jasper.compiler.Compiler { * Compile the servlet from .java file to .class file */ @Override - protected void generateClass(String[] smap) + protected void generateClass(Map smaps) throws FileNotFoundException, JasperException, Exception { long t1 = 0; @@ -85,7 +86,7 @@ protected void generateClass(String[] smap) final ClassLoader classLoader = ctxt.getJspLoader(); String[] fileNames = new String[] {sourceFile}; String[] classNames = new String[] {targetClassName}; - final ArrayList problemList = new ArrayList<>(); + final List problemList = new ArrayList<>(); class CompilationUnit implements ICompilationUnit { @@ -420,7 +421,7 @@ public void acceptResult(CompilationResult result) { classFileName.append(".class"); try (FileOutputStream fout = new FileOutputStream( classFileName.toString()); - BufferedOutputStream bos = new BufferedOutputStream(fout);) { + BufferedOutputStream bos = new BufferedOutputStream(fout)) { bos.write(bytes); } } @@ -448,7 +449,10 @@ public void acceptResult(CompilationResult result) { if (!ctxt.keepGenerated()) { File javaFile = new File(ctxt.getServletJavaFileName()); - javaFile.delete(); + if (!javaFile.delete()) { + throw new JasperException(Localizer.getMessage( + "jsp.warning.compiler.javafile.delete.fail", javaFile)); + } } if (!problemList.isEmpty()) { @@ -469,7 +473,7 @@ public void acceptResult(CompilationResult result) { // JSR45 Support if (! options.isSmapSuppressed()) { - SmapUtil.installSmap(smap); + SmapUtil.installSmap(smaps); } } } diff --git a/core/src/main/java/org/apache/jasper/compiler/JavacErrorDetail.java b/core/src/main/java/org/apache/jasper/compiler/JavacErrorDetail.java index 4386fcc..3200d24 100644 --- a/core/src/main/java/org/apache/jasper/compiler/JavacErrorDetail.java +++ b/core/src/main/java/org/apache/jasper/compiler/JavacErrorDetail.java @@ -118,7 +118,7 @@ public JavacErrorDetail(String javaFileName, String javaLine = javaLines[javaLineNum-1].trim(); for (int i=jspBeginLineNum-1; i iter = jspProperties.iterator(); - while (iter.hasNext()) { - - JspPropertyGroup jpg = iter.next(); + for (JspPropertyGroup jpg : jspProperties) { JspProperty jp = jpg.getJspProperty(); // (arrays will be the same length) @@ -404,10 +400,7 @@ public boolean isJspPage(String uri) { uriExtension = uri.substring(index+1); } - Iterator iter = jspProperties.iterator(); - while (iter.hasNext()) { - - JspPropertyGroup jpg = iter.next(); + for (JspPropertyGroup jpg : jspProperties) { String extension = jpg.getExtension(); String path = jpg.getPath(); diff --git a/core/src/main/java/org/apache/jasper/compiler/JspDocumentParser.java b/core/src/main/java/org/apache/jasper/compiler/JspDocumentParser.java index add6535..ac42fde 100644 --- a/core/src/main/java/org/apache/jasper/compiler/JspDocumentParser.java +++ b/core/src/main/java/org/apache/jasper/compiler/JspDocumentParser.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.security.AccessController; import java.util.Collection; -import java.util.Iterator; import javax.servlet.jsp.tagext.TagFileInfo; import javax.servlet.jsp.tagext.TagInfo; @@ -239,14 +238,12 @@ public static Node.Nodes parse( */ private void addInclude(Node parent, Collection files) throws SAXException { if (files != null) { - Iterator iter = files.iterator(); - while (iter.hasNext()) { - String file = iter.next(); + for (String file : files) { AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute("", "file", "file", "CDATA", file); // Create a dummy Include directive node - Node includeDir = + Node includeDir = new Node.IncludeDirective(attrs, null, // XXX parent); processIncludeDirective(file, includeDir); @@ -651,7 +648,7 @@ public void endElement(String uri, String localName, String qName) if (current instanceof Node.NamedAttribute) { boolean isTrim = ((Node.NamedAttribute)current).isTrim(); - Node.Nodes subElems = ((Node.NamedAttribute)current).getBody(); + Node.Nodes subElems = current.getBody(); for (int i = 0; subElems != null && i < subElems.size(); i++) { Node subElem = subElems.getNode(i); if (!(subElem instanceof Node.TemplateText)) { diff --git a/core/src/main/java/org/apache/jasper/compiler/JspRuntimeContext.java b/core/src/main/java/org/apache/jasper/compiler/JspRuntimeContext.java index 1b6e32e..9bce564 100644 --- a/core/src/main/java/org/apache/jasper/compiler/JspRuntimeContext.java +++ b/core/src/main/java/org/apache/jasper/compiler/JspRuntimeContext.java @@ -28,7 +28,6 @@ import java.security.PermissionCollection; import java.security.Policy; import java.security.cert.Certificate; -import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -170,6 +169,14 @@ public JspRuntimeContext(ServletContext context, Options options) { */ private FastRemovalDequeue jspQueue = null; + /** + * Map of class name to associated source map. This is maintained here as + * multiple JSPs can depend on the same file (included JSP, tag file, etc.) + * so a web application scoped Map is required. + */ + private final Map smaps = new ConcurrentHashMap<>(); + + // ------------------------------------------------------ Public Methods /** @@ -283,9 +290,8 @@ public PermissionCollection getPermissionCollection() { * Process a "destroy" event for this web application context. */ public void destroy() { - Iterator servlets = jsps.values().iterator(); - while (servlets.hasNext()) { - servlets.next().destroy(); + for (JspServletWrapper jspServletWrapper : jsps.values()) { + jspServletWrapper.destroy(); } } @@ -391,9 +397,13 @@ public long getLastJspQueueUpdate() { } - // -------------------------------------------------------- Private Methods + public Map getSmaps() { + return smaps; + } + // -------------------------------------------------------- Private Methods + /** * Method used to initialize classpath for compiles. * @return the compilation classpath diff --git a/core/src/main/java/org/apache/jasper/compiler/JspUtil.java b/core/src/main/java/org/apache/jasper/compiler/JspUtil.java index 2d8bfe3..01f4b11 100644 --- a/core/src/main/java/org/apache/jasper/compiler/JspUtil.java +++ b/core/src/main/java/org/apache/jasper/compiler/JspUtil.java @@ -28,6 +28,7 @@ import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; import org.apache.tomcat.Jar; +import org.apache.tomcat.util.security.Escape; import org.xml.sax.Attributes; import org.xml.sax.InputSource; @@ -81,7 +82,7 @@ public static String getExprInXml(String expression) { returnString = expression; } - return escapeXml(returnString); + return Escape.xml(returnString); } /** @@ -214,35 +215,6 @@ public static void checkAttributes(String typeOfTag, Node n, // XXX *could* move EL-syntax validation here... (sb) } - /** - * Escape the 5 entities defined by XML. - * @param s String to escape - * @return XML escaped string - */ - public static String escapeXml(String s) { - if (s == null) { - return null; - } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c == '<') { - sb.append("<"); - } else if (c == '>') { - sb.append(">"); - } else if (c == '\'') { - sb.append("'"); - } else if (c == '&') { - sb.append("&"); - } else if (c == '"') { - sb.append("""); - } else { - sb.append(c); - } - } - return sb.toString(); - } - public static class ValidAttribute { private final String name; @@ -892,7 +864,7 @@ public static boolean isJavaKeyword(String key) { int i = 0; int j = javaKeywords.length; while (i < j) { - int k = (i + j) / 2; + int k = (i + j) >>> 1; int result = javaKeywords[k].compareTo(key); if (result == 0) { return true; diff --git a/core/src/main/java/org/apache/jasper/compiler/Localizer.java b/core/src/main/java/org/apache/jasper/compiler/Localizer.java index 8fed5f2..24a6de2 100644 --- a/core/src/main/java/org/apache/jasper/compiler/Localizer.java +++ b/core/src/main/java/org/apache/jasper/compiler/Localizer.java @@ -14,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.jasper.compiler; import java.text.MessageFormat; @@ -35,8 +34,7 @@ public class Localizer { static { try { - bundle = ResourceBundle.getBundle( - "org.apache.jasper.resources.LocalStrings"); + bundle = ResourceBundle.getBundle("org.apache.jasper.resources.LocalStrings"); } catch (Throwable t) { ExceptionUtils.handleThrowable(t); t.printStackTrace(); @@ -63,78 +61,6 @@ public static String getMessage(String errCode) { return errMsg; } - /* - * Returns the localized error message corresponding to the given error - * code. - * - * If the given error code is not defined in the resource bundle for - * localized error messages, it is used as the error message. - * - * @param errCode Error code to localize - * @param arg Argument for parametric replacement - * - * @return Localized error message - */ - public static String getMessage(String errCode, String arg) { - return getMessage(errCode, new Object[] {arg}); - } - - /* - * Returns the localized error message corresponding to the given error - * code. - * - * If the given error code is not defined in the resource bundle for - * localized error messages, it is used as the error message. - * - * @param errCode Error code to localize - * @param arg1 First argument for parametric replacement - * @param arg2 Second argument for parametric replacement - * - * @return Localized error message - */ - public static String getMessage(String errCode, String arg1, String arg2) { - return getMessage(errCode, new Object[] {arg1, arg2}); - } - - /* - * Returns the localized error message corresponding to the given error - * code. - * - * If the given error code is not defined in the resource bundle for - * localized error messages, it is used as the error message. - * - * @param errCode Error code to localize - * @param arg1 First argument for parametric replacement - * @param arg2 Second argument for parametric replacement - * @param arg3 Third argument for parametric replacement - * - * @return Localized error message - */ - public static String getMessage(String errCode, String arg1, String arg2, - String arg3) { - return getMessage(errCode, new Object[] {arg1, arg2, arg3}); - } - - /* - * Returns the localized error message corresponding to the given error - * code. - * - * If the given error code is not defined in the resource bundle for - * localized error messages, it is used as the error message. - * - * @param errCode Error code to localize - * @param arg1 First argument for parametric replacement - * @param arg2 Second argument for parametric replacement - * @param arg3 Third argument for parametric replacement - * @param arg4 Fourth argument for parametric replacement - * - * @return Localized error message - */ - public static String getMessage(String errCode, String arg1, String arg2, - String arg3, String arg4) { - return getMessage(errCode, new Object[] {arg1, arg2, arg3, arg4}); - } - /* * Returns the localized error message corresponding to the given error * code. @@ -147,15 +73,12 @@ public static String getMessage(String errCode, String arg1, String arg2, * * @return Localized error message */ - public static String getMessage(String errCode, Object[] args) { - String errMsg = errCode; - try { - errMsg = bundle.getString(errCode); - if (args != null && args.length > 0) { - MessageFormat formatter = new MessageFormat(errMsg); - errMsg = formatter.format(args); - } - } catch (MissingResourceException e) { + public static String getMessage(String errCode, Object... args) { + String errMsg = getMessage(errCode); + + if (args != null && args.length > 0) { + MessageFormat formatter = new MessageFormat(errMsg); + errMsg = formatter.format(args); } return errMsg; diff --git a/core/src/main/java/org/apache/jasper/compiler/Node.java b/core/src/main/java/org/apache/jasper/compiler/Node.java index 01b6f50..687b19c 100644 --- a/core/src/main/java/org/apache/jasper/compiler/Node.java +++ b/core/src/main/java/org/apache/jasper/compiler/Node.java @@ -17,7 +17,6 @@ package org.apache.jasper.compiler; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Vector; @@ -2386,9 +2385,7 @@ public void remove(Node n) { * @throws JasperException if an error occurs while visiting a node */ public void visit(Visitor v) throws JasperException { - Iterator iter = list.iterator(); - while (iter.hasNext()) { - Node n = iter.next(); + for (Node n : list) { n.accept(v); } } diff --git a/core/src/main/java/org/apache/jasper/compiler/PageDataImpl.java b/core/src/main/java/org/apache/jasper/compiler/PageDataImpl.java index 1240622..50b5dd7 100644 --- a/core/src/main/java/org/apache/jasper/compiler/PageDataImpl.java +++ b/core/src/main/java/org/apache/jasper/compiler/PageDataImpl.java @@ -20,11 +20,11 @@ import java.io.CharArrayWriter; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.ListIterator; import javax.servlet.jsp.tagext.PageData; import org.apache.jasper.JasperException; +import org.apache.tomcat.util.security.Escape; import org.xml.sax.Attributes; import org.xml.sax.helpers.AttributesImpl; @@ -331,7 +331,7 @@ public void visit(Node.ELExpression n) throws JasperException { buf.append(jspId++).append("\">"); } buf.append("${"); - buf.append(JspUtil.escapeXml(n.getText())); + buf.append(Escape.xml(n.getText())); buf.append("}"); if (!n.getRoot().isXmlSyntax()) { buf.append(JSP_TEXT_ACTION_END); @@ -552,15 +552,14 @@ private void appendPageDirective(Node.PageDirective n) { if (n.getImports().size() > 0) { // Concatenate names of imported classes/packages boolean first = true; - ListIterator iter = n.getImports().listIterator(); - while (iter.hasNext()) { + for (String i : n.getImports()) { if (first) { first = false; buf.append(" import=\""); } else { buf.append(","); } - buf.append(JspUtil.getExprInXml(iter.next())); + buf.append(JspUtil.getExprInXml(i)); } buf.append("\"\n"); } diff --git a/core/src/main/java/org/apache/jasper/compiler/Parser.java b/core/src/main/java/org/apache/jasper/compiler/Parser.java index ec7cc41..9de1f1e 100644 --- a/core/src/main/java/org/apache/jasper/compiler/Parser.java +++ b/core/src/main/java/org/apache/jasper/compiler/Parser.java @@ -19,7 +19,6 @@ import java.io.CharArrayWriter; import java.io.FileNotFoundException; import java.util.Collection; -import java.util.Iterator; import javax.servlet.jsp.tagext.TagAttributeInfo; import javax.servlet.jsp.tagext.TagFileInfo; @@ -387,9 +386,7 @@ private void parseIncludeDirective(Node parent) throws JasperException { */ private void addInclude(Node parent, Collection files) throws JasperException { if (files != null) { - Iterator iter = files.iterator(); - while (iter.hasNext()) { - String file = iter.next(); + for (String file : files) { AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute("", "file", "file", "CDATA", file); diff --git a/core/src/main/java/org/apache/jasper/compiler/ParserController.java b/core/src/main/java/org/apache/jasper/compiler/ParserController.java index c721d46..3e690aa 100644 --- a/core/src/main/java/org/apache/jasper/compiler/ParserController.java +++ b/core/src/main/java/org/apache/jasper/compiler/ParserController.java @@ -16,9 +16,9 @@ */ package org.apache.jasper.compiler; +import java.io.BufferedInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.util.Stack; @@ -238,7 +238,7 @@ private Node.Nodes doParse(String inFileName, Node parent, Jar jar) } else { // Standard syntax try (InputStreamReader inStreamReader = JspUtil.getReader( - absFileName, sourceEnc, jar, ctxt, err, skip);) { + absFileName, sourceEnc, jar, ctxt, err, skip)) { JspReader jspReader = new JspReader(ctxt, absFileName, inStreamReader, err); parsedPage = Parser.parse(this, jspReader, parent, isTagFile, @@ -318,8 +318,10 @@ private void determineSyntaxAndEncoding(String absFileName, Jar jar, sourceEnc = "ISO-8859-1"; } else { // XML syntax or unknown, (auto)detect encoding ... - InputStream inStream = JspUtil.getInputStream(absFileName, jar, ctxt); - EncodingDetector encodingDetector = new EncodingDetector(inStream); + EncodingDetector encodingDetector; + try (BufferedInputStream bis = JspUtil.getInputStream(absFileName, jar, ctxt)) { + encodingDetector = new EncodingDetector(bis); + } sourceEnc = encodingDetector.getEncoding(); isEncodingSpecifiedInProlog = encodingDetector.isEncodingSpecifiedInProlog(); diff --git a/core/src/main/java/org/apache/jasper/compiler/SmapGenerator.java b/core/src/main/java/org/apache/jasper/compiler/SmapGenerator.java deleted file mode 100644 index efe09ee..0000000 --- a/core/src/main/java/org/apache/jasper/compiler/SmapGenerator.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT 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 org.apache.jasper.compiler; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents a source map (SMAP), which serves to associate lines - * of the input JSP file(s) to lines in the generated servlet in the - * final .class file, according to the JSR-045 spec. - * - * @author Shawn Bayern - */ -public class SmapGenerator { - - //********************************************************************* - // Overview - - /* - * The SMAP syntax is reasonably straightforward. The purpose of this - * class is currently twofold: - * - to provide a simple but low-level Java interface to build - * a logical SMAP - * - to serialize this logical SMAP for eventual inclusion directly - * into a .class file. - */ - - - //********************************************************************* - // Private state - - private String outputFileName; - private String defaultStratum = "Java"; - private final List strata = new ArrayList<>(); - private final List embedded = new ArrayList<>(); - private boolean doEmbedded = true; - - //********************************************************************* - // Methods for adding mapping data - - /** - * Sets the filename (without path information) for the generated - * source file. E.g., "foo$jsp.java". - * @param x The file name - */ - public synchronized void setOutputFileName(String x) { - outputFileName = x; - } - - /** - * Adds the given SmapStratum object, representing a Stratum with - * logically associated FileSection and LineSection blocks, to - * the current SmapGenerator. If default is true, this - * stratum is made the default stratum, overriding any previously - * set default. - * - * @param stratum the SmapStratum object to add - * @param defaultStratum if true, this SmapStratum is considered - * to represent the default SMAP stratum unless - * overwritten - */ - public synchronized void addStratum(SmapStratum stratum, - boolean defaultStratum) { - strata.add(stratum); - if (defaultStratum) - this.defaultStratum = stratum.getStratumName(); - } - - /** - * Adds the given string as an embedded SMAP with the given stratum name. - * - * @param smap the SMAP to embed - * @param stratumName the name of the stratum output by the compilation - * that produced the smap to be embedded - */ - public synchronized void addSmap(String smap, String stratumName) { - embedded.add("*O " + stratumName + "\n" - + smap - + "*C " + stratumName + "\n"); - } - - /** - * Instructs the SmapGenerator whether to actually print any embedded - * SMAPs or not. Intended for situations without an SMAP resolver. - * - * @param status If false, ignore any embedded SMAPs. - */ - public void setDoEmbedded(boolean status) { - doEmbedded = status; - } - - //********************************************************************* - // Methods for serializing the logical SMAP - - public synchronized String getString() { - // check state and initialize buffer - if (outputFileName == null) - throw new IllegalStateException(); - StringBuilder out = new StringBuilder(); - - // start the SMAP - out.append("SMAP\n"); - out.append(outputFileName + '\n'); - out.append(defaultStratum + '\n'); - - // include embedded SMAPs - if (doEmbedded) { - int nEmbedded = embedded.size(); - for (int i = 0; i < nEmbedded; i++) { - out.append(embedded.get(i)); - } - } - - // print our StratumSections, FileSections, and LineSections - int nStrata = strata.size(); - for (int i = 0; i < nStrata; i++) { - SmapStratum s = strata.get(i); - out.append(s.getString()); - } - - // end the SMAP - out.append("*E\n"); - - return out.toString(); - } - - @Override - public String toString() { return getString(); } - - //********************************************************************* - // For testing (and as an example of use)... - - public static void main(String args[]) { - SmapGenerator g = new SmapGenerator(); - g.setOutputFileName("foo.java"); - SmapStratum s = new SmapStratum("JSP"); - s.addFile("foo.jsp"); - s.addFile("bar.jsp", "/foo/foo/bar.jsp"); - s.addLineData(1, "foo.jsp", 1, 1, 1); - s.addLineData(2, "foo.jsp", 1, 6, 1); - s.addLineData(3, "foo.jsp", 2, 10, 5); - s.addLineData(20, "bar.jsp", 1, 30, 1); - g.addStratum(s, true); - System.out.print(g); - - System.out.println("---"); - - SmapGenerator embedded = new SmapGenerator(); - embedded.setOutputFileName("blargh.tier2"); - s = new SmapStratum("Tier2"); - s.addFile("1.tier2"); - s.addLineData(1, "1.tier2", 1, 1, 1); - embedded.addStratum(s, true); - g.addSmap(embedded.toString(), "JSP"); - System.out.println(g); - } -} diff --git a/core/src/main/java/org/apache/jasper/compiler/SmapInput.java b/core/src/main/java/org/apache/jasper/compiler/SmapInput.java new file mode 100644 index 0000000..858c052 --- /dev/null +++ b/core/src/main/java/org/apache/jasper/compiler/SmapInput.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 org.apache.jasper.compiler; + +public class SmapInput { + + private final String fileName; + private final int lineNumber; + + + public SmapInput(String fileName, int lineNumber) { + this.fileName = fileName; + this.lineNumber = lineNumber; + } + + + public String getFileName() { + return fileName; + } + + + public int getLineNumber() { + return lineNumber; + } +} diff --git a/core/src/main/java/org/apache/jasper/compiler/SmapStratum.java b/core/src/main/java/org/apache/jasper/compiler/SmapStratum.java index ff241b4..0e3b98e 100644 --- a/core/src/main/java/org/apache/jasper/compiler/SmapStratum.java +++ b/core/src/main/java/org/apache/jasper/compiler/SmapStratum.java @@ -36,7 +36,7 @@ public class SmapStratum { * Represents a single LineSection in an SMAP, associated with * a particular stratum. */ - private static class LineInfo { + static class LineInfo { private int inputStartLine = -1; private int outputStartLine = -1; private int lineFileID = 0; @@ -83,6 +83,10 @@ public void setOutputLineIncrement(int outputLineIncrement) { this.outputLineIncrement = outputLineIncrement; } + public int getMaxOutputLineNumber() { + return outputStartLine + inputLineCount * outputLineIncrement; + } + /** * @return the current LineInfo as a String, print all values only when * appropriate (but LineInfoID if and only if it's been @@ -113,28 +117,14 @@ public String toString() { //********************************************************************* // Private state - private final String stratumName; - private final List fileNameList; - private final List filePathList; - private final List lineData; + private final List fileNameList = new ArrayList<>(); + private final List filePathList = new ArrayList<>(); + private final List lineData = new ArrayList<>(); private int lastFileID; - - //********************************************************************* - // Constructor - - /** - * Constructs a new SmapStratum object for the given stratum name - * (e.g., JSP). - * - * @param stratumName the name of the stratum (e.g., JSP) - */ - public SmapStratum(String stratumName) { - this.stratumName = stratumName; - fileNameList = new ArrayList<>(); - filePathList = new ArrayList<>(); - lineData = new ArrayList<>(); - lastFileID = 0; - } + // .java file + private String outputFileName; + // .class file + private String classFileName; //********************************************************************* // Methods to add mapping information @@ -275,29 +265,56 @@ public void addLineData( lineData.add(li); } + + public void addLineInfo(LineInfo li) { + lineData.add(li); + } + + + public void setOutputFileName(String outputFileName) { + this.outputFileName = outputFileName; + } + + + public void setClassFileName(String classFileName) { + this.classFileName = classFileName; + } + + + public String getClassFileName() { + return classFileName; + } + + //********************************************************************* // Methods to retrieve information - /** - * @return the name of the stratum. - */ - public String getStratumName() { - return stratumName; + @Override + public String toString() { + return getSmapStringInternal(); } - /** - * @return the given stratum as a String: a StratumSection, - * followed by at least one FileSection and at least one LineSection. - */ - public String getString() { - // check state and initialize buffer - if (fileNameList.size() == 0 || lineData.size() == 0) - return null; + public String getSmapString() { + + if (outputFileName == null) { + throw new IllegalStateException(); + } + + return getSmapStringInternal(); + } + + + private String getSmapStringInternal() { StringBuilder out = new StringBuilder(); + // start the SMAP + out.append("SMAP\n"); + out.append(outputFileName + '\n'); + out.append("JSP\n"); + // print StratumSection - out.append("*S " + stratumName + "\n"); + out.append("*S JSP\n"); // print FileSection out.append("*F\n"); @@ -325,12 +342,40 @@ public String getString() { out.append(li.getString()); } + // end the SMAP + out.append("*E\n"); + return out.toString(); } - @Override - public String toString() { - return getString(); - } + public SmapInput getInputLineNumber(int outputLineNumber) { + // For a given Java line number, provide the associated line number + // in the JSP/tag source + int inputLineNumber = -1; + int fileId = 0; + + for (LineInfo lineInfo : lineData) { + if (lineInfo.lineFileIDSet) { + fileId = lineInfo.lineFileID; + } + if (lineInfo.outputStartLine > outputLineNumber) { + // Didn't find match + break; + } + + if (lineInfo.getMaxOutputLineNumber() < outputLineNumber) { + // Too early + continue; + } + + // This is the match + int inputOffset = + (outputLineNumber - lineInfo.outputStartLine) / lineInfo.outputLineIncrement; + + inputLineNumber = lineInfo.inputStartLine + inputOffset; + } + + return new SmapInput(filePathList.get(fileId), inputLineNumber); + } } diff --git a/core/src/main/java/org/apache/jasper/compiler/SmapUtil.java b/core/src/main/java/org/apache/jasper/compiler/SmapUtil.java index d4f11da..e32087f 100644 --- a/core/src/main/java/org/apache/jasper/compiler/SmapUtil.java +++ b/core/src/main/java/org/apache/jasper/compiler/SmapUtil.java @@ -17,21 +17,24 @@ package org.apache.jasper.compiler; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; +import org.apache.jasper.compiler.SmapStratum.LineInfo; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -50,7 +53,9 @@ public class SmapUtil { //********************************************************************* // Constants - private static final String SMAP_ENCODING = "UTF-8"; + private static final Charset SMAP_ENCODING = StandardCharsets.UTF_8; + + private static final Log log = LogFactory.getLog(SmapUtil.class); //********************************************************************* // Public entry points @@ -64,10 +69,10 @@ public class SmapUtil { * @return a SMAP for the page * @throws IOException Error writing SMAP */ - public static String[] generateSmap( - JspCompilationContext ctxt, - Node.Nodes pageNodes) - throws IOException { + public static Map generateSmap(JspCompilationContext ctxt, + Node.Nodes pageNodes) throws IOException { + + Map smapInfo = new HashMap<>(); // Scan the nodes for presence of Jasper generated inner classes PreScanVisitor psVisitor = new PreScanVisitor(); @@ -77,66 +82,42 @@ public static String[] generateSmap( } HashMap map = psVisitor.getMap(); - // set up our SMAP generator - SmapGenerator g = new SmapGenerator(); - - /** Disable reading of input SMAP because: - 1. There is a bug here: getRealPath() is null if .jsp is in a jar - Bugzilla 14660. - 2. Mappings from other sources into .jsp files are not supported. - TODO: fix 1. if 2. is not true. - // determine if we have an input SMAP - String smapPath = inputSmapPath(ctxt.getRealPath(ctxt.getJspFile())); - File inputSmap = new File(smapPath); - if (inputSmap.exists()) { - byte[] embeddedSmap = null; - byte[] subSmap = SDEInstaller.readWhole(inputSmap); - String subSmapString = new String(subSmap, SMAP_ENCODING); - g.addSmap(subSmapString, "JSP"); - } - **/ - - // now, assemble info about our own stratum (JSP) using JspLineMap - SmapStratum s = new SmapStratum("JSP"); - - g.setOutputFileName(unqualify(ctxt.getServletJavaFileName())); + // Assemble info about our own stratum (JSP) using JspLineMap + SmapStratum s = new SmapStratum(); // Map out Node.Nodes evaluateNodes(pageNodes, s, map, ctxt.getOptions().getMappedFile()); s.optimizeLineSection(); - g.addStratum(s, true); + s.setOutputFileName(unqualify(ctxt.getServletJavaFileName())); + + String classFileName = ctxt.getClassFileName(); + s.setClassFileName(classFileName); + + smapInfo.put(ctxt.getFQCN(), s); if (ctxt.getOptions().isSmapDumped()) { - File outSmap = new File(ctxt.getClassFileName() + ".smap"); + File outSmap = new File(classFileName + ".smap"); PrintWriter so = new PrintWriter( new OutputStreamWriter( new FileOutputStream(outSmap), SMAP_ENCODING)); - so.print(g.getString()); + so.print(s.getSmapString()); so.close(); } - String classFileName = ctxt.getClassFileName(); - int innerClassCount = map.size(); - String [] smapInfo = new String[2 + innerClassCount*2]; - smapInfo[0] = classFileName; - smapInfo[1] = g.getString(); - - int count = 2; - Iterator> iter = map.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); + for (Map.Entry entry : map.entrySet()) { String innerClass = entry.getKey(); s = entry.getValue(); s.optimizeLineSection(); - g = new SmapGenerator(); - g.setOutputFileName(unqualify(ctxt.getServletJavaFileName())); - g.addStratum(s, true); - + s.setOutputFileName(unqualify(ctxt.getServletJavaFileName())); String innerClassFileName = classFileName.substring(0, classFileName.indexOf(".class")) + '$' + innerClass + ".class"; + s.setClassFileName(innerClassFileName); + + smapInfo.put(ctxt.getFQCN() + "." + innerClass, s); + if (ctxt.getOptions().isSmapDumped()) { File outSmap = new File(innerClassFileName + ".smap"); PrintWriter so = @@ -144,27 +125,24 @@ public static String[] generateSmap( new OutputStreamWriter( new FileOutputStream(outSmap), SMAP_ENCODING)); - so.print(g.getString()); + so.print(s.getSmapString()); so.close(); } - smapInfo[count] = innerClassFileName; - smapInfo[count+1] = g.getString(); - count += 2; } return smapInfo; } - public static void installSmap(String[] smap) + public static void installSmap(Map smapInfo) throws IOException { - if (smap == null) { + if (smapInfo == null) { return; } - for (int i = 0; i < smap.length; i += 2) { - File outServlet = new File(smap[i]); + for (Map.Entry entry : smapInfo.entrySet()) { + File outServlet = new File(entry.getValue().getClassFileName()); SDEInstaller.install(outServlet, - smap[i+1].getBytes(StandardCharsets.ISO_8859_1)); + entry.getValue().getSmapString().getBytes(StandardCharsets.ISO_8859_1)); } } @@ -225,7 +203,7 @@ void install(File outClassFile) throws IOException { addSDE(); // write result - try (FileOutputStream outStream = new FileOutputStream(outClassFile);) { + try (FileOutputStream outStream = new FileOutputStream(outClassFile)) { outStream.write(gen, 0, genPos); } } @@ -702,7 +680,7 @@ private static class PreScanVisitor extends Node.Visitor { public void doVisit(Node n) { String inner = n.getInnerClassName(); if (inner != null && !map.containsKey(inner)) { - map.put(inner, new SmapStratum("JSP")); + map.put(inner, new SmapStratum()); } } @@ -711,4 +689,128 @@ HashMap getMap() { } } + public static SmapStratum loadSmap(String className, ClassLoader cl) { + // Extract SMAP from class file. First line "SMAP" is not included + String smap = getSmap(className, cl); + + if (smap == null) { + return null; + } + + SmapStratum smapStratum = new SmapStratum(); + + String[] lines = smap.split("\n"); + int lineIndex = 0; + + // First line is output file name + smapStratum.setOutputFileName(lines[lineIndex]); + + // There is only one stratum (JSP) so skip to the start of the file + // section + lineIndex = 4; + + while (!lines[lineIndex].equals("*L")) { + int i = lines[lineIndex].lastIndexOf(' '); + String fileName = lines[lineIndex].substring(i + 1); + smapStratum.addFile(fileName, lines[++lineIndex]); + lineIndex++; + } + + // Skip *L + lineIndex++; + + while (!lines[lineIndex].equals("*E")) { + LineInfo li = new LineInfo(); + // Split into in and out + String[] inOut = lines[lineIndex].split(":"); + // Split in on comma (might not be one) + String[] in = inOut[0].split(","); + if (in.length == 2) { + // There is a count + li.setInputLineCount(Integer.parseInt(in[1])); + } + // Check for fileID + String[] start = in[0].split("#"); + if (start.length == 2) { + // There is a file ID + li.setLineFileID(Integer.parseInt(start[1])); + } + li.setInputStartLine(Integer.parseInt(start[0])); + // Split out + String[] out = inOut[1].split(","); + if (out.length == 2) { + // There is an increment + li.setOutputLineIncrement(Integer.parseInt(out[1])); + } + li.setOutputStartLine(Integer.parseInt(out[0])); + + smapStratum.addLineInfo(li); + + lineIndex++; + } + + return smapStratum; + } + + + private static String getSmap(String className, ClassLoader cl) { + Charset encoding = StandardCharsets.ISO_8859_1; + boolean found = false; + String smap = null; + + InputStream is = null; + try { + is = cl.getResourceAsStream(className.replaceAll("\\.","/") + ".smap"); + if (is != null) { + encoding = SMAP_ENCODING; + found = true; + } else { + is = cl.getResourceAsStream(className.replaceAll("\\.","/") + ".class"); + // Alternative approach would be to read the class file as per the + // JLS. That would require duplicating a lot of BCEL functionality. + int b = is.read(); + while (b != -1) { + if (b == 'S') { + if ((b = is.read()) != 'M') { + continue; + } + if ((b = is.read()) != 'A') { + continue; + } + if ((b = is.read()) != 'P') { + continue; + } + if ((b = is.read()) != '\n') { + continue; + } + found = true; + break; + } + b = is.read(); + } + } + + if (found) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); + byte[] buf = new byte[1024]; + int numRead; + while ( (numRead = is.read(buf) ) >= 0) { + baos.write(buf, 0, numRead); + } + + smap = new String(baos.toByteArray(), encoding); + } + } catch (IOException ioe) { + log.warn(Localizer.getMessage("jsp.warning.loadSmap", className), ioe); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException ioe) { + log.warn(Localizer.getMessage("jsp.warning.loadSmap", className), ioe); + } + } + } + return smap; + } } diff --git a/core/src/main/java/org/apache/jasper/compiler/TagFileProcessor.java b/core/src/main/java/org/apache/jasper/compiler/TagFileProcessor.java index d8c2812..b47e0db 100644 --- a/core/src/main/java/org/apache/jasper/compiler/TagFileProcessor.java +++ b/core/src/main/java/org/apache/jasper/compiler/TagFileProcessor.java @@ -19,7 +19,7 @@ import java.io.IOException; import java.util.HashMap; -import java.util.Iterator; +import java.util.Map; import java.util.Map.Entry; import java.util.Vector; @@ -127,9 +127,9 @@ private static class TagFileDirectiveVisitor extends Node.Visitor { private static final String TAG_DYNAMIC = "the dynamic-attributes attribute of the tag directive"; - private HashMap nameTable = new HashMap<>(); + private Map nameTable = new HashMap<>(); - private HashMap nameFromTable = new HashMap<>(); + private Map nameFromTable = new HashMap<>(); public TagFileDirectiveVisitor(Compiler compiler, TagLibraryInfo tagLibInfo, String name, String path) { @@ -422,7 +422,7 @@ private void checkUniqueName(String name, String type, Node n) private void checkUniqueName(String name, String type, Node n, TagAttributeInfo attr) throws JasperException { - HashMap table = (VAR_NAME_FROM.equals(type)) ? nameFromTable : nameTable; + Map table = (VAR_NAME_FROM.equals(type)) ? nameFromTable : nameTable; NameEntry nameEntry = table.get(name); if (nameEntry != null) { if (!TAG_DYNAMIC.equals(type) || @@ -593,12 +593,10 @@ private Class loadTagFile(Compiler compiler, String tagFilePath, // Dependent list. The only reliable dependency information // can only be obtained from the tag instance. try { - Object tagIns = tagClazz.newInstance(); + Object tagIns = tagClazz.getConstructor().newInstance(); if (tagIns instanceof JspSourceDependent) { - Iterator> iter = ((JspSourceDependent) - tagIns).getDependants().entrySet().iterator(); - while (iter.hasNext()) { - Entry entry = iter.next(); + for (Entry entry : ((JspSourceDependent) + tagIns).getDependants().entrySet()) { parentPageInfo.addDependant(entry.getKey(), entry.getValue()); } @@ -702,9 +700,7 @@ public void loadTagFiles(Compiler compiler, Node.Nodes page) * If non-null, remove only the class file with with this name. */ public void removeProtoTypeFiles(String classFileName) { - Iterator iter = tempVector.iterator(); - while (iter.hasNext()) { - Compiler c = iter.next(); + for (Compiler c : tempVector) { if (classFileName == null) { c.removeGeneratedClassFiles(); } else if (classFileName.equals(c.getCompilationContext() diff --git a/core/src/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java b/core/src/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java index 0ebe577..d5f35bd 100644 --- a/core/src/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java +++ b/core/src/main/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java @@ -290,7 +290,7 @@ private TagInfo createTagInfo(TagXml tagXml) throws JasperException { if (teiClassName != null && !teiClassName.isEmpty()) { try { Class teiClass = ctxt.getClassLoader().loadClass(teiClassName); - tei = (TagExtraInfo) teiClass.newInstance(); + tei = (TagExtraInfo) teiClass.getConstructor().newInstance(); } catch (Exception e) { err.jspError(e, "jsp.error.teiclass.instantiation", teiClassName); } @@ -346,7 +346,7 @@ private TagLibraryValidator createValidator(ValidatorXml validatorXml) throws Ja try { Class tlvClass = ctxt.getClassLoader().loadClass(validatorClass); - TagLibraryValidator tlv = (TagLibraryValidator) tlvClass.newInstance(); + TagLibraryValidator tlv = (TagLibraryValidator) tlvClass.getConstructor().newInstance(); tlv.setInitParameters(initParams); return tlv; } catch (Exception e) { diff --git a/core/src/main/java/org/apache/jasper/compiler/TagPluginManager.java b/core/src/main/java/org/apache/jasper/compiler/TagPluginManager.java index 018ed77..b1ae5dc 100644 --- a/core/src/main/java/org/apache/jasper/compiler/TagPluginManager.java +++ b/core/src/main/java/org/apache/jasper/compiler/TagPluginManager.java @@ -123,7 +123,7 @@ private void init(ErrorDispatcher err) throws JasperException { String tagClass = entry.getKey(); String pluginName = entry.getValue(); Class pluginClass = ctxt.getClassLoader().loadClass(pluginName); - TagPlugin plugin = (TagPlugin) pluginClass.newInstance(); + TagPlugin plugin = (TagPlugin) pluginClass.getConstructor().newInstance(); tagPlugins.put(tagClass, plugin); } catch (Exception e) { err.jspError(e); diff --git a/core/src/main/java/org/apache/jasper/compiler/TextOptimizer.java b/core/src/main/java/org/apache/jasper/compiler/TextOptimizer.java index 9f00b57..98c0e41 100644 --- a/core/src/main/java/org/apache/jasper/compiler/TextOptimizer.java +++ b/core/src/main/java/org/apache/jasper/compiler/TextOptimizer.java @@ -18,6 +18,7 @@ import org.apache.jasper.JasperException; import org.apache.jasper.Options; +import org.apache.jasper.TrimSpacesOption; /** */ @@ -29,6 +30,7 @@ public class TextOptimizer { private static class TextCatVisitor extends Node.Visitor { private static final String EMPTY_TEXT = ""; + private static final String SINGLE_SPACE = " "; private final Options options; private final PageInfo pageInfo; @@ -81,10 +83,15 @@ public void visitBody(Node n) throws JasperException { @Override public void visit(Node.TemplateText n) throws JasperException { - if ((options.getTrimSpaces() || pageInfo.isTrimDirectiveWhitespaces()) - && n.isAllSpace()) { - n.setText(EMPTY_TEXT); - return; + if (n.isAllSpace()) { + if ((options.getTrimSpaces() == TrimSpacesOption.TRUE || + pageInfo.isTrimDirectiveWhitespaces())) { + n.setText(EMPTY_TEXT); + return; + } else if (options.getTrimSpaces() == TrimSpacesOption.SINGLE) { + n.setText(SINGLE_SPACE); + return; + } } if (textNodeCount++ == 0) { diff --git a/core/src/main/java/org/apache/jasper/compiler/Validator.java b/core/src/main/java/org/apache/jasper/compiler/Validator.java index f0d80d1..0600fd1 100644 --- a/core/src/main/java/org/apache/jasper/compiler/Validator.java +++ b/core/src/main/java/org/apache/jasper/compiler/Validator.java @@ -22,7 +22,9 @@ import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; +import java.util.List; import java.util.Locale; +import java.util.Map; import javax.el.ELException; import javax.el.ExpressionFactory; @@ -40,6 +42,7 @@ import org.apache.jasper.JasperException; import org.apache.jasper.compiler.ELNode.Text; import org.apache.jasper.el.ELContextImpl; +import org.apache.tomcat.util.security.Escape; import org.xml.sax.Attributes; /** @@ -1403,7 +1406,7 @@ private Node.JspAttribute getJspAttribute(TagAttributeInfo tai, el.visit(v); value = v.getText(); } else { - value = xmlEscape(value); + value = Escape.xml(value); } } @@ -1452,7 +1455,7 @@ protected XmlEscapeNonELVisitor( @Override public void visit(Text n) throws JasperException { output.append(ELParser.escapeLiteralExpression( - xmlEscape(n.getText()), + Escape.xml(n.getText()), isDeferredSyntaxAllowedAsLiteral)); } } @@ -1620,7 +1623,7 @@ private void prepareExpression(ELNode.Nodes el, Node n, String expr) try { ef.createValueExpression(ctx, expr, Object.class); } catch (ELException e) { - + throw new JasperException(e); } } @@ -1660,7 +1663,7 @@ private String[] getParameters(ELNode.Function func) throws JasperException { FunctionInfo funcInfo = func.getFunctionInfo(); String signature = funcInfo.getFunctionSignature(); - ArrayList params = new ArrayList<>(); + List params = new ArrayList<>(); // Signature is of the form // S ( ',' )* )? ')' @@ -1693,7 +1696,7 @@ private FunctionMapper getFunctionMapper(ELNode.Nodes el) class ValidateFunctionMapper extends FunctionMapper { - private HashMap fnmap = new HashMap<>(); + private Map fnmap = new HashMap<>(); @Override public void mapFunction(String prefix, String localName, @@ -1819,7 +1822,7 @@ public static void validateExDirectives(Compiler compiler, Node.Nodes page) PageInfo pageInfo = compiler.getPageInfo(); String contentType = pageInfo.getContentType(); - if (contentType == null || contentType.indexOf("charset=") < 0) { + if (contentType == null || !contentType.contains("charset=")) { boolean isXml = page.getRoot().isXmlSyntax(); String defaultType; if (contentType == null) { @@ -1913,67 +1916,4 @@ private static void validateXmlView(PageData xmlView, Compiler compiler) errDisp.jspError(errMsg.toString()); } } - - protected static String xmlEscape(String s) { - if (s == null) { - return null; - } - int len = s.length(); - - /* - * Look for any "bad" characters, Escape "bad" character was found - */ - // ASCII " 34 & 38 ' 39 < 60 > 62 - for (int i = 0; i < len; i++) { - char c = s.charAt(i); - if (c >= '\"' && c <= '>' && - (c == '<' || c == '>' || c == '\'' || c == '&' || c == '"')) { - // need to escape them and then quote the whole string - StringBuilder sb = new StringBuilder((int) (len * 1.2)); - sb.append(s, 0, i); - int pos = i + 1; - for (int j = i; j < len; j++) { - c = s.charAt(j); - if (c >= '\"' && c <= '>') { - if (c == '<') { - if (j > pos) { - sb.append(s, pos, j); - } - sb.append("<"); - pos = j + 1; - } else if (c == '>') { - if (j > pos) { - sb.append(s, pos, j); - } - sb.append(">"); - pos = j + 1; - } else if (c == '\'') { - if (j > pos) { - sb.append(s, pos, j); - } - sb.append("'"); // ' - pos = j + 1; - } else if (c == '&') { - if (j > pos) { - sb.append(s, pos, j); - } - sb.append("&"); - pos = j + 1; - } else if (c == '"') { - if (j > pos) { - sb.append(s, pos, j); - } - sb.append("""); // " - pos = j + 1; - } - } - } - if (pos < len) { - sb.append(s, pos, len); - } - return sb.toString(); - } - } - return s; - } } diff --git a/core/src/main/java/org/apache/jasper/resources/LocalStrings.properties b/core/src/main/java/org/apache/jasper/resources/LocalStrings.properties index a893d94..b4cbc16 100644 --- a/core/src/main/java/org/apache/jasper/resources/LocalStrings.properties +++ b/core/src/main/java/org/apache/jasper/resources/LocalStrings.properties @@ -17,6 +17,7 @@ # Localized this the Default Locale as is en_US jsp.error.compiler=No Java compiler available +jsp.error.compiler.config=No Java compiler available for configuration options compilerClassName: [{0}] and compiler: [{1}] jsp.error.no.scratch.dir=The JSP engine is not configured with a scratch dir.\ \n Please add "jsp.initparams=scratchdir=" \ \n in the servlets.properties file for this context. @@ -118,6 +119,7 @@ jsp.warning.recompileOnFail=Warning: Invalid value for the initParam recompileOn jsp.warning.development=Warning: Invalid value for the initParam development. Will use the default value of "true" jsp.warning.fork=Warning: Invalid value for the initParam fork. Will use the default value of "true" jsp.warning.dumpSmap=Warning: Invalid value for the initParam dumpSmap. Will use the default value of "false" +jsp.warning.loadSmap=Unable to load SMAP data for class [{0}] jsp.warning.genchararray=Warning: Invalid value for the initParam genStringAsCharArray. Will use the default value of "false" jsp.warning.suppressSmap=Warning: Invalid value for the initParam suppressSmap. Will use the default value of "false" jsp.warning.displaySourceFragment=Warning: Invalid value for the initParam displaySourceFragment. Will use the default value of "true" @@ -152,40 +154,43 @@ jsp.warning.compiler.javafile.delete.fail=Failed to delete generated Java file [ jsp.error.jspc.uriroot_not_dir=The -uriroot option must specify a pre-existing directory jsp.error.jspc.missingTarget=Missing target: Must specify -webapp or -uriroot, or one or more JSP pages jsp.error.jspc.no_uriroot=The uriroot is not specified and cannot be located with the specified JSP file(s) +jspc.compilation.result=Compilation completed with [{0}] errors in [{1}] milliseconds jspc.implicit.uriRoot=uriRoot implicitly set to [{0}] jspc.usage=Usage: jspc [--] \n\ where jsp files is\n\ -\ -webapp A directory containing a web-app, whose JSP pages\n\ -\ will be processed recursively\n\ +\ -webapp A directory containing a web-app, whose JSP pages\n\ +\ will be processed recursively\n\ or any number of\n\ -\ A file to be parsed as a JSP page\n\ +\ A file to be parsed as a JSP page\n\ where options include:\n\ -\ -help Print this help message\n\ -\ -v Verbose mode\n\ -\ -d Output Directory (default -Djava.io.tmpdir)\n\ -\ -l Outputs the name of the JSP page upon failure\n\ -\ -s Outputs the name of the JSP page upon success\n\ -\ -p Name of target package (default org.apache.jsp)\n\ -\ -c Name of target class name (only applies to first JSP page)\n\ -\ -mapped Generates separate write() calls for each HTML line in the JSP\n\ -\ -die[#] Generates an error return code (#) on fatal errors (default 1)\n\ -\ -uribase The uri directory compilations should be relative to\n\ -\ (default "/")\n\ -\ -uriroot Same as -webapp\n\ -\ -compile Compiles generated servlets\n\ -\ -webinc Creates a partial servlet mappings in the file\n\ -\ -webxml Creates a complete web.xml in the file\n\ +\ -help Print this help message\n\ +\ -v Verbose mode\n\ +\ -d Output Directory (default -Djava.io.tmpdir)\n\ +\ -l Outputs the name of the JSP page upon failure\n\ +\ -s Outputs the name of the JSP page upon success\n\ +\ -p Name of target package (default org.apache.jsp)\n\ +\ -c Name of target class name (only applies to first JSP page)\n\ +\ -mapped Generates separate write() calls for each HTML line in the JSP\n\ +\ -die[#] Generates an error return code (#) on fatal errors (default 1)\n\ +\ -uribase The uri directory compilations should be relative to\n\ +\ (default "/")\n\ +\ -uriroot Same as -webapp\n\ +\ -compile Compiles generated servlets\n\ +\ -failFast Stop on first compile error\n\ +\ -webinc Creates a partial servlet mappings in the file\n\ +\ -webxml Creates a complete web.xml in the file\n\ \ -webxmlencoding Set the encoding charset used to read and write the web.xml\n\ -\ file (default is UTF-8)\n\ -\ -addwebxmlmappings Merge generated web.xml fragment into the web.xml file of the\n\ -\ web-app, whose JSP pages we are processing\n\ -\ -ieplugin Java Plugin classid for Internet Explorer\n\ -\ -classpath Overrides java.class.path system property\n\ -\ -xpoweredBy Add X-Powered-By response header\n\ -\ -trimSpaces Trim spaces in template text between actions, directives\n\ -\ -javaEncoding Set the encoding charset for Java classes (default UTF-8)\n\ -\ -source Set the -source argument to the compiler (default 1.8)\n\ -\ -target Set the -target argument to the compiler (default 1.8)\n\ +\ file (default is UTF-8)\n\ +\ -addwebxmlmappings Merge generated web.xml fragment into the web.xml file of the\n\ +\ web-app, whose JSP pages we are processing\n\ +\ -ieplugin Java Plugin classid for Internet Explorer\n\ +\ -classpath Overrides java.class.path system property\n\ +\ -xpoweredBy Add X-Powered-By response header\n\ +\ -trimSpaces [single] Remove template text that consists entirely of whitespace\n\ +\ (if "single", replace such template text with a single space)\n +\ -javaEncoding Set the encoding charset for Java classes (default UTF-8)\n\ +\ -source Set the -source argument to the compiler (default 1.8)\n\ +\ -target Set the -target argument to the compiler (default 1.8)\n\ jspc.webxml.header=\n\ \n\ @@ -355,9 +360,10 @@ jsp.error.unbalanced.endtag=The end tag "</{0}" is unbalanced jsp.error.invalid.bean=The value for the useBean class attribute [{0}] is invalid. jsp.error.prefix.use_before_dcl=The prefix [{0}] specified in this tag directive has been previously used by an action in file [{1}] line [{2}]. jsp.error.lastModified=Unable to determine last modified date for file [{0}] +jsp.error.setLastModified=Unable to set last modified date for file [{0}] jsp.info.ignoreSetting=Ignored setting for [{0}] of [{1}] because a SecurityManager was enabled -jsp.exception=An exception occurred processing JSP page [{0}] at line [{1}] +jsp.exception=An exception occurred processing [{0}] at line [{1}] # JSP 2.1 jsp.error.el.template.deferred=#{...} is not allowed in template text diff --git a/core/src/main/java/org/apache/jasper/resources/LocalStrings_es.properties b/core/src/main/java/org/apache/jasper/resources/LocalStrings_es.properties index bbcc0b4..29d5a64 100644 --- a/core/src/main/java/org/apache/jasper/resources/LocalStrings_es.properties +++ b/core/src/main/java/org/apache/jasper/resources/LocalStrings_es.properties @@ -148,38 +148,45 @@ jsp.error.jspc.missingTarget = Falta target: Debe de especificar -webapp o -urir jsp.error.jspc.no_uriroot = No se ha especificado uriroot y no puede ser localizado en los archivos JSP especificados jspc.implicit.uriRoot = uriRoot implicitamente puesto a [{0}] jspc.usage = Uso: jspc [--] \n\ - donde son:\n\ - \ -webapp Un directorio conteniendo una web-app. Todas las\n\ - \ p\u00E1ginas jsp ser\u00E1n compiladas recursivamente\n\ - o cualquier n\u00FAmero de\n\ - \ Un Archivo para ser interpretado como una p\u00E1gina jsp\n\ - y donde incluyen:\n\ - \ -help Muestra este mensaje de ayuda\n\ - \ -v Modo detallado\n\ - \ -d Directorio de salida\n\ - \ -l Muestra el nombre de la p\u00E1gina JSP al ocurrir un fallo\n\ - \ -s Muestra el nombre de la p\u00E1gina JSP al tener \u00E9xito\n\ - \ -p Nombre del package objetivo\n\ - \ (por defecto org.apache.jsp)\n\ - \ -c Nombre de la clase objetivo\n\ - \ (s\u00F3lo se aplica a la primera p\u00E1gina JSP)\n\ - \ -mapped Genera llamadas separadas a write() para cada l\u00EDnea de\n\ - \ HTML en el JSP\n\ - \ -die[#] Genera un c\u00F3digo de retorno de error (#) en errores\n\ - \ fatales. (por defecto 1).\n\ - \ -uribase El directorio uri de donde deben de partir las\n\ - \ compilaciones. (por defecto "/")\n\ - \ -uriroot Igual que -webapp\n\ - \ -compile Compila los servlets generados\n\ - \ -webinc Crea unos mapeos parciales de servlet en el archivo\n\ - \ -webxml Crea un web.xml completo en el archivo.\n\ - \ -ieplugin Java Plugin classid para Internet Explorer\n\ - \ -classpath Pasa por alto la propiedad de sistema java.class.path\n\ - \ -xpoweredBy A\u00F1ade cabecera de respuesta X-Powered-By\n\ - \ -trimSpaces Trim spaces in template text between actions, directives\n\ - \ -javaEncoding Set the encoding charset for Java classes (default UTF-8)\n\ - \ -source Set the -source argument to the compiler (default 1.8)\n\ - \ -target Set the -target argument to the compiler (default 1.8)\n +donde son:\n\ +\ -webapp Un directorio conteniendo una web-app. Todas las\n\ +\ p\u00E1ginas jsp ser\u00E1n compiladas recursivamente\n\ +o cualquier n\u00FAmero de\n\ +\ Un Archivo para ser interpretado como una p\u00E1gina jsp\n\ +y donde incluyen:\n\ +\ -help Muestra este mensaje de ayuda\n\ +\ -v Modo detallado\n\ +\ -d Directorio de salida\n\ +\ -l Muestra el nombre de la p\u00E1gina JSP al ocurrir un fallo\n\ +\ -s Muestra el nombre de la p\u00E1gina JSP al tener \u00E9xito\n\ +\ -p Nombre del package objetivo\n\ +\ (por defecto org.apache.jsp)\n\ +\ -c Nombre de la clase objetivo\n\ +\ (s\u00F3lo se aplica a la primera p\u00E1gina JSP)\n\ +\ -mapped Genera llamadas separadas a write() para cada l\u00EDnea de\n\ +\ HTML en el JSP\n\ +\ -die[#] Genera un c\u00F3digo de retorno de error (#) en errores\n\ +\ fatales. (por defecto 1).\n\ +\ -uribase El directorio uri de donde deben de partir las\n\ +\ compilaciones. (por defecto "/")\n\ +\ -uriroot Igual que -webapp\n\ +\ -compile Compila los servlets generados\n\ +\ -failFast Stop on first compile error\n\ +\ -webinc Crea unos mapeos parciales de servlet en el archivo\n\ +\ -webxml Crea un web.xml completo en el archivo.\n\ +\ -webxmlencoding Set the encoding charset used to read and write the web.xml\n\ +\ file (default is UTF-8)\n\ +\ -addwebxmlmappings Merge generated web.xml fragment into the web.xml file of the\n\ +\ web-app, whose JSP pages we are processing\n\ +\ -ieplugin Java Plugin classid para Internet Explorer\n\ +\ -classpath Pasa por alto la propiedad de sistema java.class.path\n\ +\ -xpoweredBy A\u00F1ade cabecera de respuesta X-Powered-By\n\ +\ -trimSpaces [single] Remove template text that consists entirely of whitespace\n\ +\ (if "single", replace such template text with a single space)\n +\ -javaEncoding Set the encoding charset for Java classes (default UTF-8)\n\ +\ -source Set the -source argument to the compiler (default 1.8)\n\ +\ -target Set the -target argument to the compiler (default 1.8)\n\ + jspc.webxml.header = \n\ \n\ [--] \n\ o\u00f9 les fichiers jsp sont n''importe quel nombre de:\n\ -\ Un fichier \u00e0 \u00e9valuer (parser) comme page jsp\n\ -\ -webapp Un r\u00e9pertoire contenant une application web, toutes les pages jsp\n\ -\ seront r\u00e9cursivement \u00e9valu\u00e9es\n\ +\ Un fichier \u00e0 \u00e9valuer (parser) comme page jsp\n\ +\ -webapp Un r\u00e9pertoire contenant une application web, toutes les pages jsp\n\ +\ seront r\u00e9cursivement \u00e9valu\u00e9es\n\ o\u00f9 les options comprennet:\n\ -\ -q Mode silencieux (identique \u00e0 -v0)\n\ -\ -v[#] Mode bavard (Le nombre optionnel indique le niveau, 2 par d\u00e9faut)\n\ -\ -d Dossier de sortie\n\ -\ -dd Dossier de sortie literal. (Les dossiers de paquets ne seront pas construits)\n\ -\ -l Sortie du nom la page JSP en cas d''\u00e9chec\n\ -\ -s Sortie du nom la page JSP en cas de succ\u00e8s\n\ -\ -p Nom du paquet cible\n\ -\ -c Nom d'un nom de classe cible\n\ -\ (s''applique seulement \u00e0 la premi\u00e8re page JSP)\n\ -\ -mapped G\u00e9n\u00e8re des appels \u00e0 write() s\u00e9par\u00e9s pour chaque ligne HTML dans la JSP\n\ -\ -die[#] G\u00e9n\u00e8re un code d''erreur de retour (#) en cas d''erreurs fatales.\n\ -\ Si le nombre est absent ou non num\u00e9rique, le d\u00e9faut est 1.\n\ -\ -uribase Le r\u00e9pertoire uri de compilations relatif\n\ -\ (Par d\u00e9faut "/")\n\ -\ -uriroot The r\u00e9pertoire racine contre lequel les fichiers seront r\u00e9solus\n\ -\ , (Par d\u00e9faut le r\u00e9pertoire depuis lequel jspc est appel\u00e9)\n\ -\ -webinc Cr\u00e9ation d''association partielle de servlet pour l''option -webapp.\n\ -\ -webxml Cr\u00e9ation d''un fichier web.xml complet pour l''option -webapp.\n\ -\ -ieplugin Le classid du Plugin Java Plugin pour Internet Explorer\n\ -\ -sax2 Le nom de classe du Driver SAX 2.0 \u00e0 utiliser\n\ -\ -trimSpaces Trim spaces in template text between actions, directives\n\ -\ -javaEncoding Set the encoding charset for Java classes (default UTF-8)\n\ -\ -source Set the -source argument to the compiler (default 1.8)\n\ -\ -target Set the -target argument to the compiler (default 1.8)\n\ +\ -help Print this help message\n\ +\ -v Mode bavard\n\ +\ -d Dossier de sortie\n\ +\ -l Sortie du nom la page JSP en cas d''\u00e9chec\n\ +\ -s Sortie du nom la page JSP en cas de succ\u00e8s\n\ +\ -p Nom du paquet cible\n\ +\ -c Nom d''un nom de classe cible\n\ +\ (s''applique seulement \u00e0 la premi\u00e8re page JSP)\n\ +\ -mapped G\u00e9n\u00e8re des appels \u00e0 write() s\u00e9par\u00e9s pour chaque ligne HTML dans la JSP\n\ +\ -die[#] G\u00e9n\u00e8re un code d''erreur de retour (#) en cas d''erreurs fatales.\n\ +\ Si le nombre est absent ou non num\u00e9rique, le d\u00e9faut est 1.\n\ +\ -uribase Le r\u00e9pertoire uri de compilations relatif\n\ +\ (Par d\u00e9faut "/")\n\ +\ -uriroot The r\u00e9pertoire racine contre lequel les fichiers seront r\u00e9solus\n\ +\ , (Par d\u00e9faut le r\u00e9pertoire depuis lequel jspc est appel\u00e9)\n\ +\ -compile Compiles generated servlets\n\ +\ -failFast Stop on first compile error\n\ +\ -webinc Cr\u00e9ation d''association partielle de servlet pour l''option -webapp.\n\ +\ -webxml Cr\u00e9ation d''un fichier web.xml complet pour l''option -webapp.\n\ +\ -webxmlencoding Set the encoding charset used to read and write the web.xml\n\ +\ file (default is UTF-8)\n\ +\ -addwebxmlmappings Merge generated web.xml fragment into the web.xml file of the\n\ +\ web-app, whose JSP pages we are processing\n\ +\ -ieplugin Le classid du Plugin Java Plugin pour Internet Explorer\n\ +\ -classpath Overrides java.class.path system property\n\ +\ -xpoweredBy Add X-Powered-By response header\n\ +\ -trimSpaces [single] Remove template text that consists entirely of whitespace\n\ +\ (if "single", replace such template text with a single space)\n +\ -javaEncoding Set the encoding charset for Java classes (default UTF-8)\n\ +\ -source Set the -source argument to the compiler (default 1.8)\n\ +\ -target Set the -target argument to the compiler (default 1.8)\n\ jspc.webxml.header=\n\ \n\ diff --git a/core/src/main/java/org/apache/jasper/resources/LocalStrings_ja.properties b/core/src/main/java/org/apache/jasper/resources/LocalStrings_ja.properties index 7c988bf..f6a39a9 100644 --- a/core/src/main/java/org/apache/jasper/resources/LocalStrings_ja.properties +++ b/core/src/main/java/org/apache/jasper/resources/LocalStrings_ja.properties @@ -129,34 +129,39 @@ jsp.error.jspc.no_uriroot=uriroot\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306 jspc.implicit.uriRoot=uriRoot\u306f\u30c7\u30d5\u30a9\u30eb\u30c8[{0}]\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3059 jspc.usage=\u4f7f\u7528\u6cd5: jspc [--] \n\ JSP\u30d5\u30a1\u30a4\u30eb\u306e\u5834\u6240\u306f\u6b21\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u6307\u5b9a\u3059\u308b\u304b\u3001\n\ -\ -webapp web-app\u3092\u542b\u3080\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3002\u3059\u3079\u3066\u306eJSP\u30d5\u30a1\u30a4\u30eb\u306f\n\ -\ \u518d\u5e30\u7684\u306b\u89e3\u6790\u3055\u308c\u308b\n\ +\ -webapp web-app\u3092\u542b\u3080\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3002\u3059\u3079\u3066\u306eJSP\u30d5\u30a1\u30a4\u30eb\u306f\n\ +\ \u518d\u5e30\u7684\u306b\u89e3\u6790\u3055\u308c\u308b\n\ \u53c8\u306f\u6b21\u306e\u4efb\u610f\u306e\u6570\u306e\u30d5\u30a1\u30a4\u30eb\u3067\u6307\u5b9a\u3057\u307e\u3059\u3002\n\ -\ JSP\u3068\u3057\u3066\u89e3\u6790\u3055\u308c\u308b\u30d5\u30a1\u30a4\u30eb\n\ +\ JSP\u3068\u3057\u3066\u89e3\u6790\u3055\u308c\u308b\u30d5\u30a1\u30a4\u30eb\n\ \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\n\ -\ -help \u3053\u306e\u30d8\u30eb\u30d7\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8868\u793a\n\ -\ -v Verbose\u30e2\u30fc\u30c9\n\ -\ -d \u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\n\ -\ -l \u5931\u6557\u3057\u305fJSP\u30da\u30fc\u30b8\u306e\u540d\u524d\u306e\u51fa\u529b\n\ -\ -s \u6210\u529f\u3057\u305fJSP\u30da\u30fc\u30b8\u306e\u540d\u524d\u306e\u51fa\u529b\n\ -\ -p \u30bf\u30fc\u30b2\u30c3\u30c8\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u540d\u524d (\u30c7\u30d5\u30a9\u30eb\u30c8\u306forg.apache.jsp)\n\ -\ -c \u30bf\u30fc\u30b2\u30c3\u30c8\u30af\u30e9\u30b9\u306e\u540d\u524d (\u6700\u521d\u306eJSP\u30da\u30fc\u30b8\u3060\u3051\u306b\u9069\u7528\u3055\u308c\u308b)\n\ -\ -mapped JSP\u306e\u5404HTML\u884c\u3054\u3068\u306bwrite()\u30b3\u30fc\u30eb\u3092\u751f\u6210\n\ -\ -die[#] \u81f4\u547d\u7684\u30a8\u30e9\u30fc\u306b\u30a8\u30e9\u30fc\u30ea\u30bf\u30fc\u30f3\u30b3\u30fc\u30c9(#)\u3092\u751f\u6210 (\u30c7\u30d5\u30a9\u30eb\u30c8\u306f1)\n\ -\ -uribase \u30b3\u30f3\u30d1\u30a4\u30eb\u304c\u76f8\u5bfe\u7684\u306b\u304a\u3053\u306a\u308f\u308c\u308buri\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\n\ -\ (\u30c7\u30d5\u30a9\u30eb\u30c8\u306f"/")\n\ -\ -uriroot -webapp\u3068\u540c\u3058\n\ -\ -compile \u751f\u6210\u3057\u305f\u30b5\u30fc\u30d6\u30ec\u30c3\u30c8\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\n\ -\ -webinc \u30d5\u30a1\u30a4\u30eb\u306b\u90e8\u5206\u7684\u306a\u30b5\u30fc\u30d6\u30ec\u30c3\u30c8\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u4f5c\u6210\n\ -\ -webxml \u30d5\u30a1\u30a4\u30eb\u306b\u5b8c\u5168\u306aweb.xml\u3092\u4f5c\u6210\n\ -\ -ieplugin Internet Explorer\u306eJava Plugin\u306eclassid\n\ -\ -classpath java.class.path\u30b7\u30b9\u30c6\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u4e0a\u66f8\u304d\n\ -\ -xpoweredBy X-Powered-By\u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u306e\u8ffd\u52a0\n\ -\ -trimSpaces \u30a2\u30af\u30b7\u30e7\u30f3\u3084\u6307\u793a\u5b50\u306e\u9593\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30c6\u30ad\u30b9\u30c8\u4e2d\u306e\u30b9\u30da\u30fc\u30b9\u3092\u524a\u9664\n\ -\ -trimSpaces Trim spaces in template text between actions, directives\n\ -\ -javaEncoding Set the encoding charset for Java classes (default UTF-8)\n\ -\ -source Set the -source argument to the compiler (default 1.8)\n\ -\ -target Set the -target argument to the compiler (default 1.8)\n\ +\ -help \u3053\u306e\u30d8\u30eb\u30d7\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8868\u793a\n\ +\ -v Verbose\u30e2\u30fc\u30c9\n\ +\ -d \u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\n\ +\ -l \u5931\u6557\u3057\u305fJSP\u30da\u30fc\u30b8\u306e\u540d\u524d\u306e\u51fa\u529b\n\ +\ -s \u6210\u529f\u3057\u305fJSP\u30da\u30fc\u30b8\u306e\u540d\u524d\u306e\u51fa\u529b\n\ +\ -p \u30bf\u30fc\u30b2\u30c3\u30c8\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u540d\u524d (\u30c7\u30d5\u30a9\u30eb\u30c8\u306forg.apache.jsp)\n\ +\ -c \u30bf\u30fc\u30b2\u30c3\u30c8\u30af\u30e9\u30b9\u306e\u540d\u524d (\u6700\u521d\u306eJSP\u30da\u30fc\u30b8\u3060\u3051\u306b\u9069\u7528\u3055\u308c\u308b)\n\ +\ -mapped JSP\u306e\u5404HTML\u884c\u3054\u3068\u306bwrite()\u30b3\u30fc\u30eb\u3092\u751f\u6210\n\ +\ -die[#] \u81f4\u547d\u7684\u30a8\u30e9\u30fc\u306b\u30a8\u30e9\u30fc\u30ea\u30bf\u30fc\u30f3\u30b3\u30fc\u30c9(#)\u3092\u751f\u6210 (\u30c7\u30d5\u30a9\u30eb\u30c8\u306f1)\n\ +\ -uribase \u30b3\u30f3\u30d1\u30a4\u30eb\u304c\u76f8\u5bfe\u7684\u306b\u304a\u3053\u306a\u308f\u308c\u308buri\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\n\ +\ (\u30c7\u30d5\u30a9\u30eb\u30c8\u306f"/")\n\ +\ -uriroot -webapp\u3068\u540c\u3058\n\ +\ -compile \u751f\u6210\u3057\u305f\u30b5\u30fc\u30d6\u30ec\u30c3\u30c8\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\n\ +\ -failFast Stop on first compile error\n\ +\ -webinc \u30d5\u30a1\u30a4\u30eb\u306b\u90e8\u5206\u7684\u306a\u30b5\u30fc\u30d6\u30ec\u30c3\u30c8\u30de\u30c3\u30d4\u30f3\u30b0\u3092\u4f5c\u6210\n\ +\ -webxml \u30d5\u30a1\u30a4\u30eb\u306b\u5b8c\u5168\u306aweb.xml\u3092\u4f5c\u6210\n\ +\ -webxmlencoding Set the encoding charset used to read and write the web.xml\n\ +\ file (default is UTF-8)\n\ +\ -addwebxmlmappings Merge generated web.xml fragment into the web.xml file of the\n\ +\ web-app, whose JSP pages we are processing\n\ +\ -ieplugin Internet Explorer\u306eJava Plugin\u306eclassid\n\ +\ -classpath java.class.path\u30b7\u30b9\u30c6\u30e0\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u4e0a\u66f8\u304d\n\ +\ -xpoweredBy X-Powered-By\u30ec\u30b9\u30dd\u30f3\u30b9\u30d8\u30c3\u30c0\u306e\u8ffd\u52a0\n\ +\ -trimSpaces [single] Remove template text that consists entirely of whitespace\n\ +\ (if "single", replace such template text with a single space)\n +\ -javaEncoding Set the encoding charset for Java classes (default UTF-8)\n\ +\ -source Set the -source argument to the compiler (default 1.8)\n\ +\ -target Set the -target argument to the compiler (default 1.8)\n\ jspc.webxml.header=\n\ \n\ diff --git a/core/src/main/java/org/apache/jasper/runtime/BodyContentImpl.java b/core/src/main/java/org/apache/jasper/runtime/BodyContentImpl.java index c063b00..9a891d6 100644 --- a/core/src/main/java/org/apache/jasper/runtime/BodyContentImpl.java +++ b/core/src/main/java/org/apache/jasper/runtime/BodyContentImpl.java @@ -40,7 +40,12 @@ public class BodyContentImpl extends BodyContent { private static final boolean LIMIT_BUFFER = - Boolean.parseBoolean(System.getProperty("org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "false")); + Boolean.parseBoolean(System.getProperty( + "org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "false")); + + private static final int TAG_BUFFER_SIZE = + Integer.getInteger("org.apache.jasper.runtime.BodyContentImpl.BUFFER_SIZE", + Constants.DEFAULT_TAG_BUFFER_SIZE).intValue(); private char[] cb; private int nextChar; @@ -57,7 +62,7 @@ public class BodyContentImpl extends BodyContent { */ public BodyContentImpl(JspWriter enclosingWriter) { super(enclosingWriter); - cb = new char[Constants.DEFAULT_TAG_BUFFER_SIZE]; + cb = new char[TAG_BUFFER_SIZE]; bufferSize = cb.length; nextChar = 0; closed = false; @@ -512,8 +517,8 @@ public void clear() throws IOException { throw new IOException(); } else { nextChar = 0; - if (LIMIT_BUFFER && (cb.length > Constants.DEFAULT_TAG_BUFFER_SIZE)) { - cb = new char[Constants.DEFAULT_TAG_BUFFER_SIZE]; + if (LIMIT_BUFFER && (cb.length > TAG_BUFFER_SIZE)) { + cb = new char[TAG_BUFFER_SIZE]; bufferSize = cb.length; } } diff --git a/core/src/main/java/org/apache/jasper/runtime/JspContextWrapper.java b/core/src/main/java/org/apache/jasper/runtime/JspContextWrapper.java index 5197ea0..765edf3 100644 --- a/core/src/main/java/org/apache/jasper/runtime/JspContextWrapper.java +++ b/core/src/main/java/org/apache/jasper/runtime/JspContextWrapper.java @@ -454,9 +454,7 @@ private void copyTagToPageScope(int scope) { */ private void saveNestedVariables() { if (nestedVars != null) { - Iterator iter = nestedVars.iterator(); - while (iter.hasNext()) { - String varName = iter.next(); + for (String varName : nestedVars) { varName = findAlias(varName); Object obj = invokingJspCtxt.getAttribute(varName); if (obj != null) { @@ -471,9 +469,7 @@ private void saveNestedVariables() { */ private void restoreNestedVariables() { if (nestedVars != null) { - Iterator iter = nestedVars.iterator(); - while (iter.hasNext()) { - String varName = iter.next(); + for (String varName : nestedVars) { varName = findAlias(varName); Object obj = originalNestedVars.get(varName); if (obj != null) { diff --git a/core/src/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java b/core/src/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java index b51ddf6..4365433 100644 --- a/core/src/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java +++ b/core/src/main/java/org/apache/jasper/runtime/JspRuntimeLibrary.java @@ -783,8 +783,7 @@ public static Object getValueFromBeanInfoPropertyEditor( throws JasperException { try { - PropertyEditor pe = - (PropertyEditor)propertyEditorClass.newInstance(); + PropertyEditor pe = (PropertyEditor)propertyEditorClass.getConstructor().newInstance(); pe.setAsText(attrValue); return pe.getValue(); } catch (Exception ex) { @@ -835,9 +834,9 @@ public static String getContextRelativePath(ServletRequest request, String relativePath) { if (relativePath.startsWith("/")) - return (relativePath); + return relativePath; if (!(request instanceof HttpServletRequest)) - return (relativePath); + return relativePath; HttpServletRequest hrequest = (HttpServletRequest) request; String uri = (String) request.getAttribute( RequestDispatcher.INCLUDE_SERVLET_PATH); diff --git a/core/src/main/java/org/apache/jasper/runtime/PageContextImpl.java b/core/src/main/java/org/apache/jasper/runtime/PageContextImpl.java index 13f31f7..0fda1a5 100644 --- a/core/src/main/java/org/apache/jasper/runtime/PageContextImpl.java +++ b/core/src/main/java/org/apache/jasper/runtime/PageContextImpl.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.Writer; +import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; @@ -544,10 +545,7 @@ public BodyContent pushBody() { public JspWriter pushBody(Writer writer) { depth++; if (depth >= outs.length) { - BodyContentImpl[] newOuts = new BodyContentImpl[depth + 1]; - for (int i = 0; i < outs.length; i++) { - newOuts[i] = outs[i]; - } + BodyContentImpl[] newOuts = Arrays.copyOf(outs, depth + 1); newOuts[depth] = new BodyContentImpl(out); outs = newOuts; } diff --git a/core/src/main/java/org/apache/jasper/runtime/TagHandlerPool.java b/core/src/main/java/org/apache/jasper/runtime/TagHandlerPool.java index 00af003..6a753cc 100644 --- a/core/src/main/java/org/apache/jasper/runtime/TagHandlerPool.java +++ b/core/src/main/java/org/apache/jasper/runtime/TagHandlerPool.java @@ -47,7 +47,7 @@ public static TagHandlerPool getTagHandlerPool(ServletConfig config) { if (tpClassName != null) { try { Class c = Class.forName(tpClassName); - result = (TagHandlerPool) c.newInstance(); + result = (TagHandlerPool) c.getConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); result = null; @@ -112,7 +112,7 @@ public Tag get(Class handlerClass) throws JspException { return (Tag) instanceManager.newInstance( handlerClass.getName(), handlerClass.getClassLoader()); } else { - Tag instance = handlerClass.newInstance(); + Tag instance = handlerClass.getConstructor().newInstance(); instanceManager.newInstance(instance); return instance; } diff --git a/core/src/main/java/org/apache/jasper/security/SecurityUtil.java b/core/src/main/java/org/apache/jasper/security/SecurityUtil.java index 5ca7210..5b6f69d 100644 --- a/core/src/main/java/org/apache/jasper/security/SecurityUtil.java +++ b/core/src/main/java/org/apache/jasper/security/SecurityUtil.java @@ -38,44 +38,4 @@ public static boolean isPackageProtectionEnabled(){ } return false; } - - - /** - * 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 HTML filtered 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 (int i = 0; i < content.length; i++) { - switch (content[i]) { - case '<': - result.append("<"); - break; - case '>': - result.append(">"); - break; - case '&': - result.append("&"); - break; - case '"': - result.append("""); - break; - default: - result.append(content[i]); - } - } - return (result.toString()); - - } - } diff --git a/core/src/main/java/org/apache/jasper/servlet/JasperLoader.java b/core/src/main/java/org/apache/jasper/servlet/JasperLoader.java index bca4170..4f37939 100644 --- a/core/src/main/java/org/apache/jasper/servlet/JasperLoader.java +++ b/core/src/main/java/org/apache/jasper/servlet/JasperLoader.java @@ -56,8 +56,7 @@ public JasperLoader(URL[] urls, ClassLoader parent, */ @Override public Class loadClass(String name) throws ClassNotFoundException { - - return (loadClass(name, false)); + return loadClass(name, false); } /** @@ -96,7 +95,7 @@ public synchronized Class loadClass(final String name, boolean resolve) if (clazz != null) { if (resolve) resolveClass(clazz); - return (clazz); + return clazz; } // (.5) Permission to access this class when using a SecurityManager diff --git a/core/src/main/java/org/apache/jasper/servlet/JspCServletContext.java b/core/src/main/java/org/apache/jasper/servlet/JspCServletContext.java index 04f99f3..cc8e683 100644 --- a/core/src/main/java/org/apache/jasper/servlet/JspCServletContext.java +++ b/core/src/main/java/org/apache/jasper/servlet/JspCServletContext.java @@ -358,14 +358,12 @@ public URL getResource(String path) throws MalformedURLException { */ @Override public InputStream getResourceAsStream(String path) { - try { - return (getResource(path).openStream()); + return getResource(path).openStream(); } catch (Throwable t) { ExceptionUtils.handleThrowable(t); - return (null); + return null; } - } @@ -383,10 +381,10 @@ public Set getResourcePaths(String path) { path += "/"; String basePath = getRealPath(path); if (basePath == null) - return (thePaths); + return thePaths; File theBaseDir = new File(basePath); if (!theBaseDir.exists() || !theBaseDir.isDirectory()) - return (thePaths); + return thePaths; String theFiles[] = theBaseDir.list(); if (theFiles == null) { return thePaths; @@ -398,7 +396,7 @@ public Set getResourcePaths(String path) { else if (testFile.isDirectory()) thePaths.add(path + theFiles[i] + "/"); } - return (thePaths); + return thePaths; } @@ -408,7 +406,7 @@ else if (testFile.isDirectory()) */ @Override public String getServerInfo() { - return ("JspC/ApacheTomcat8"); + return "JspC/ApacheTomcat8"; } @@ -431,7 +429,7 @@ public Servlet getServlet(String name) throws ServletException { */ @Override public String getServletContextName() { - return (getServerInfo()); + return getServerInfo(); } @@ -443,7 +441,7 @@ public String getServletContextName() { @Override @Deprecated public Enumeration getServletNames() { - return (new Vector().elements()); + return new Vector().elements(); } @@ -455,7 +453,7 @@ public Enumeration getServletNames() { @Override @Deprecated public Enumeration getServlets() { - return (new Vector().elements()); + return new Vector().elements(); } diff --git a/core/src/main/java/org/apache/jasper/servlet/JspServlet.java b/core/src/main/java/org/apache/jasper/servlet/JspServlet.java index 92c05d7..a37dbac 100644 --- a/core/src/main/java/org/apache/jasper/servlet/JspServlet.java +++ b/core/src/main/java/org/apache/jasper/servlet/JspServlet.java @@ -43,6 +43,7 @@ import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.PeriodicEventListener; +import org.apache.tomcat.util.security.Escape; /** * The JSP engine (a.k.a Jasper). @@ -404,7 +405,7 @@ private void handleMissingResource(HttpServletRequest request, Localizer.getMessage("jsp.error.file.not.found",jspUri); // Strictly, filtering this is an application // responsibility but just in case... - throw new ServletException(SecurityUtil.filter(msg)); + throw new ServletException(Escape.htmlElementContent(msg)); } else { try { response.sendError(HttpServletResponse.SC_NOT_FOUND, @@ -414,7 +415,6 @@ private void handleMissingResource(HttpServletRequest request, jspUri)); } } - return; } diff --git a/core/src/main/java/org/apache/jasper/servlet/JspServletWrapper.java b/core/src/main/java/org/apache/jasper/servlet/JspServletWrapper.java index 7c6c6b1..d158507 100644 --- a/core/src/main/java/org/apache/jasper/servlet/JspServletWrapper.java +++ b/core/src/main/java/org/apache/jasper/servlet/JspServletWrapper.java @@ -36,10 +36,11 @@ import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; import org.apache.jasper.Options; -import org.apache.jasper.compiler.ErrorDispatcher; import org.apache.jasper.compiler.JavacErrorDetail; import org.apache.jasper.compiler.JspRuntimeContext; import org.apache.jasper.compiler.Localizer; +import org.apache.jasper.compiler.SmapInput; +import org.apache.jasper.compiler.SmapStratum; import org.apache.jasper.runtime.ExceptionUtils; import org.apache.jasper.runtime.InstanceManagerFactory; import org.apache.jasper.runtime.JspSourceDependent; @@ -545,45 +546,49 @@ protected JasperException handleJspException(Exception ex) { realException = ((ServletException) ex).getRootCause(); } - // First identify the stack frame in the trace that represents the JSP + // Find the first stack frame that represents code generated by + // Jasper StackTraceElement[] frames = realException.getStackTrace(); StackTraceElement jspFrame = null; - for (int i=0; iSystem.err. */ public class ClassLoaderLogManager extends LogManager { + + private static final boolean isJava9; + public static final String DEBUG_PROPERTY = ClassLoaderLogManager.class.getName() + ".debug"; + static { + Class c = null; + try { + c = Class.forName("java.lang.Runtime$Version"); + } catch (ClassNotFoundException e) { + // Must be Java 8 + } + isJava9 = c != null; + } + private final class Cleaner extends Thread { @Override @@ -426,7 +439,11 @@ protected synchronized void readConfiguration(ClassLoader classLoader) // Special case for URL classloaders which are used in containers: // only look in the local repositories to avoid redefining loggers 20 times try { - if (classLoader instanceof URLClassLoader) { + if (classLoader instanceof WebappProperties) { + if (((WebappProperties) classLoader).hasLoggingConfig()) { + is = classLoader.getResourceAsStream("logging.properties"); + } + } else if (classLoader instanceof URLClassLoader) { URL logConfig = ((URLClassLoader)classLoader).findResource("logging.properties"); if(null != logConfig) { @@ -474,7 +491,8 @@ protected synchronized void readConfiguration(ClassLoader classLoader) } // Try the default JVM configuration if (is == null) { - File defaultFile = new File(new File(System.getProperty("java.home"), "lib"), + File defaultFile = new File(new File(System.getProperty("java.home"), + isJava9 ? "conf" : "lib"), "logging.properties"); try { is = new FileInputStream(defaultFile); @@ -560,8 +578,8 @@ protected synchronized void readConfiguration(InputStream is, ClassLoader classL } try { this.prefix.set(prefix); - Handler handler = - (Handler) classLoader.loadClass(handlerClassName).newInstance(); + Handler handler = (Handler) classLoader.loadClass( + handlerClassName).getConstructor().newInstance(); // The specification strongly implies all configuration should be done // during the creation of the handler object. // This includes setting level, filter, formatter and encoding. diff --git a/core/src/main/java/org/apache/juli/FileHandler.java b/core/src/main/java/org/apache/juli/FileHandler.java index ff5016a..9108735 100644 --- a/core/src/main/java/org/apache/juli/FileHandler.java +++ b/core/src/main/java/org/apache/juli/FileHandler.java @@ -26,7 +26,20 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.sql.Timestamp; +import java.time.DateTimeException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.ErrorManager; @@ -36,6 +49,7 @@ import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.LogRecord; +import java.util.regex.Pattern; /** * Implementation of Handler that appends log messages to a file @@ -74,26 +88,85 @@ *
  • formatter - The java.util.logging.Formatter * implementation class name for this Handler. Default value: * java.util.logging.SimpleFormatter
  • + *
  • maxDays - The maximum number of days to keep the log + * files. If the specified value is <=0 then the log files + * will be kept on the file system forever, otherwise they will be kept the + * specified maximum days. Default value: -1.
  • * */ -public class FileHandler - extends Handler { +public class FileHandler extends Handler { + public static final int DEFAULT_MAX_DAYS = -1; + + private static final ExecutorService DELETE_FILES_SERVICE = + Executors.newSingleThreadExecutor(new ThreadFactory() { + private final boolean isSecurityEnabled; + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix = "FileHandlerLogFilesCleaner-"; + + { + SecurityManager s = System.getSecurityManager(); + if (s == null) { + this.isSecurityEnabled = false; + this.group = Thread.currentThread().getThreadGroup(); + } else { + this.isSecurityEnabled = true; + this.group = s.getThreadGroup(); + } + } + @Override + public Thread newThread(Runnable r) { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + try { + // Threads should not be created by the webapp classloader + if (isSecurityEnabled) { + AccessController.doPrivileged((PrivilegedAction) () -> { + Thread.currentThread() + .setContextClassLoader(getClass().getClassLoader()); + return null; + }); + } else { + Thread.currentThread() + .setContextClassLoader(getClass().getClassLoader()); + } + Thread t = new Thread(group, r, + namePrefix + threadNumber.getAndIncrement()); + t.setDaemon(true); + return t; + } finally { + if (isSecurityEnabled) { + AccessController.doPrivileged((PrivilegedAction) () -> { + Thread.currentThread().setContextClassLoader(loader); + return null; + }); + } else { + Thread.currentThread().setContextClassLoader(loader); + } + } + } + }); // ------------------------------------------------------------ Constructor public FileHandler() { - this(null, null, null); + this(null, null, null, DEFAULT_MAX_DAYS); } public FileHandler(String directory, String prefix, String suffix) { + this(directory, prefix, suffix, DEFAULT_MAX_DAYS); + } + + public FileHandler(String directory, String prefix, String suffix, int maxDays) { this.directory = directory; this.prefix = prefix; this.suffix = suffix; + this.maxDays = maxDays; configure(); openWriter(); + clean(); } @@ -126,11 +199,17 @@ public FileHandler(String directory, String prefix, String suffix) { /** - * Determines whether the logfile is rotatable + * Determines whether the log file is rotatable */ private boolean rotatable = true; + /** + * Maximum number of days to keep the log files + */ + private int maxDays = DEFAULT_MAX_DAYS; + + /** * The PrintWriter to which we are currently logging, if any. */ @@ -149,6 +228,13 @@ public FileHandler(String directory, String prefix, String suffix) { private int bufferSize = -1; + /** + * Represents a file name pattern of type {prefix}{date}{suffix}. + * The date is YYYY-MM-DD + */ + private Pattern pattern; + + // --------------------------------------------------------- Public Methods @@ -181,6 +267,7 @@ public void publish(LogRecord record) { closeWriter(); date = tsDate; openWriter(); + clean(); } } finally { // Downgrade to read-lock. This ensures the writer remains valid @@ -199,17 +286,17 @@ public void publish(LogRecord record) { } try { - if (writer!=null) { + if (writer != null) { writer.write(result); if (bufferSize < 0) { writer.flush(); } } else { - reportError("FileHandler is closed or not yet initialized, unable to log ["+result+"]", null, ErrorManager.WRITE_FAILURE); + reportError("FileHandler is closed or not yet initialized, unable to log [" + + result + "]", null, ErrorManager.WRITE_FAILURE); } } catch (Exception e) { reportError(null, e, ErrorManager.WRITE_FAILURE); - return; } } finally { writerLock.readLock().unlock(); @@ -232,8 +319,9 @@ protected void closeWriter() { writerLock.writeLock().lock(); try { - if (writer == null) + if (writer == null) { return; + } writer.write(getFormatter().getTail(this)); writer.flush(); writer.close(); @@ -255,8 +343,9 @@ public void flush() { writerLock.readLock().lock(); try { - if (writer == null) + if (writer == null) { return; + } writer.flush(); } catch (Exception e) { reportError(null, e, ErrorManager.FLUSH_FAILURE); @@ -282,12 +371,36 @@ private void configure() { // Retrieve configuration of logging file name rotatable = Boolean.parseBoolean(getProperty(className + ".rotatable", "true")); - if (directory == null) + if (directory == null) { directory = getProperty(className + ".directory", "logs"); - if (prefix == null) + } + if (prefix == null) { prefix = getProperty(className + ".prefix", "juli."); - if (suffix == null) + } + if (suffix == null) { suffix = getProperty(className + ".suffix", ".log"); + } + + // https://bz.apache.org/bugzilla/show_bug.cgi?id=61232 + boolean shouldCheckForRedundantSeparator = !rotatable && !prefix.isEmpty() + && !suffix.isEmpty(); + // assuming separator is just one char, if there are use cases with + // more, the notion of separator might be introduced + if (shouldCheckForRedundantSeparator + && (prefix.charAt(prefix.length() - 1) == suffix.charAt(0))) { + suffix = suffix.substring(1); + } + + pattern = Pattern.compile("^(" + Pattern.quote(prefix) + ")\\d{4}-\\d{1,2}-\\d{1,2}(" + + Pattern.quote(suffix) + ")$"); + String sMaxDays = getProperty(className + ".maxDays", String.valueOf(DEFAULT_MAX_DAYS)); + if (maxDays <= 0) { + try { + maxDays = Integer.parseInt(sMaxDays); + } catch (NumberFormatException ignore) { + // no-op + } + } String sBufferSize = getProperty(className + ".bufferSize", String.valueOf(bufferSize)); try { bufferSize = Integer.parseInt(sBufferSize); @@ -311,7 +424,7 @@ private void configure() { String filterName = getProperty(className + ".filter", null); if (filterName != null) { try { - setFilter((Filter) cl.loadClass(filterName).newInstance()); + setFilter((Filter) cl.loadClass(filterName).getConstructor().newInstance()); } catch (Exception e) { // Ignore } @@ -321,7 +434,8 @@ private void configure() { String formatterName = getProperty(className + ".formatter", null); if (formatterName != null) { try { - setFormatter((Formatter) cl.loadClass(formatterName).newInstance()); + setFormatter((Formatter) cl.loadClass( + formatterName).getConstructor().newInstance()); } catch (Exception e) { // Ignore and fallback to defaults setFormatter(new OneLineFormatter()); @@ -359,8 +473,7 @@ protected void openWriter() { // Create the directory if necessary File dir = new File(directory); if (!dir.mkdirs() && !dir.isDirectory()) { - reportError("Unable to create [" + dir + "]", null, - ErrorManager.OPEN_FAILURE); + reportError("Unable to create [" + dir + "]", null, ErrorManager.OPEN_FAILURE); writer = null; return; } @@ -374,14 +487,13 @@ protected void openWriter() { + (rotatable ? date : "") + suffix); File parent = pathname.getParentFile(); if (!parent.mkdirs() && !parent.isDirectory()) { - reportError("Unable to create [" + parent + "]", null, - ErrorManager.OPEN_FAILURE); + reportError("Unable to create [" + parent + "]", null, ErrorManager.OPEN_FAILURE); writer = null; return; } String encoding = getEncoding(); fos = new FileOutputStream(pathname, true); - os = bufferSize>0?new BufferedOutputStream(fos,bufferSize):fos; + os = bufferSize > 0 ? new BufferedOutputStream(fos, bufferSize) : fos; writer = new PrintWriter( (encoding != null) ? new OutputStreamWriter(os, encoding) : new OutputStreamWriter(os), false); @@ -407,4 +519,51 @@ protected void openWriter() { writerLock.writeLock().unlock(); } } + + private void clean() { + if (maxDays <= 0) { + return; + } + DELETE_FILES_SERVICE.submit(() -> { + try (DirectoryStream files = streamFilesForDelete()) { + for (Path file : files) { + Files.delete(file); + } + } catch (IOException e) { + reportError("Unable to delete log files older than [" + maxDays + "] days", null, + ErrorManager.GENERIC_FAILURE); + } + }); + } + + private DirectoryStream streamFilesForDelete() throws IOException { + LocalDate maxDaysOffset = LocalDate.now().minus(maxDays, ChronoUnit.DAYS); + return Files.newDirectoryStream(new File(directory).toPath(), path -> { + boolean result = false; + String date = obtainDateFromPath(path); + if (date != null) { + try { + LocalDate dateFromFile = LocalDate.from(DateTimeFormatter.ISO_LOCAL_DATE.parse(date)); + result = dateFromFile.isBefore(maxDaysOffset); + } catch (DateTimeException e) { + // no-op + } + } + return result; + }); + } + + private String obtainDateFromPath(Path path) { + Path fileName = path.getFileName(); + if (fileName == null) { + return null; + } + String date = fileName.toString(); + if (pattern.matcher(date).matches()) { + date = date.substring(prefix.length()); + return date.substring(0, date.length() - suffix.length()); + } else { + return null; + } + } } diff --git a/core/src/main/java/org/apache/juli/OneLineFormatter.java b/core/src/main/java/org/apache/juli/OneLineFormatter.java index f598495..f5de6dc 100644 --- a/core/src/main/java/org/apache/juli/OneLineFormatter.java +++ b/core/src/main/java/org/apache/juli/OneLineFormatter.java @@ -43,21 +43,10 @@ public class OneLineFormatter extends Formatter { private static final Object threadMxBeanLock = new Object(); private static volatile ThreadMXBean threadMxBean = null; private static final int THREAD_NAME_CACHE_SIZE = 10000; - private static ThreadLocal> threadNameCache = - new ThreadLocal>() { - + private static ThreadLocal threadNameCache = new ThreadLocal() { @Override - protected LinkedHashMap initialValue() { - return new LinkedHashMap() { - - private static final long serialVersionUID = 1L; - - @Override - protected boolean removeEldestEntry( - Entry eldest) { - return (size() > THREAD_NAME_CACHE_SIZE); - } - }; + protected ThreadNameCache initialValue() { + return new ThreadNameCache(THREAD_NAME_CACHE_SIZE); } }; @@ -226,4 +215,21 @@ private static String getThreadName(int logRecordThreadId) { return result; } + + + private static class ThreadNameCache extends LinkedHashMap { + + private static final long serialVersionUID = 1L; + + private final int cacheSize; + + public ThreadNameCache(int cacheSize) { + this.cacheSize = cacheSize; + } + + @Override + protected boolean removeEldestEntry(Entry eldest) { + return (size() > cacheSize); + } + } } diff --git a/core/src/main/java/org/apache/juli/WebappProperties.java b/core/src/main/java/org/apache/juli/WebappProperties.java index ae6fc61..b524c5a 100644 --- a/core/src/main/java/org/apache/juli/WebappProperties.java +++ b/core/src/main/java/org/apache/juli/WebappProperties.java @@ -51,4 +51,15 @@ public interface WebappProperties { * null if none is available. */ String getServiceName(); + + /** + * Enables JULI to determine if the web application includes a local + * configuration without JULI having to look for the file which it may not + * have permission to do when running under a SecurityManager. + * + * @return {@code true} if the web application includes a logging + * configuration at the standard location of + * /WEB-INF/classes/logging.properties. + */ + boolean hasLoggingConfig(); } diff --git a/core/src/main/java/org/apache/juli/logging/DirectJDKLog.java b/core/src/main/java/org/apache/juli/logging/DirectJDKLog.java index b5c565a..2e38563 100644 --- a/core/src/main/java/org/apache/juli/logging/DirectJDKLog.java +++ b/core/src/main/java/org/apache/juli/logging/DirectJDKLog.java @@ -42,11 +42,12 @@ class DirectJDKLog implements Log { // default configuration - it sucks. Let's override at least the // formatter for the console try { - Class.forName(SIMPLE_CFG).newInstance(); + Class.forName(SIMPLE_CFG).getConstructor().newInstance(); } catch( Throwable t ) { } try { - Formatter fmt=(Formatter)Class.forName(System.getProperty(FORMATTER, SIMPLE_FMT)).newInstance(); + Formatter fmt= (Formatter) Class.forName(System.getProperty( + FORMATTER, SIMPLE_FMT)).getConstructor().newInstance(); // it is also possible that the user modified jre/lib/logging.properties - // but that's really stupid in most cases Logger root=Logger.getLogger(""); diff --git a/core/src/main/java/org/apache/juli/logging/LogFactory.java b/core/src/main/java/org/apache/juli/logging/LogFactory.java index 6717610..3be213f 100644 --- a/core/src/main/java/org/apache/juli/logging/LogFactory.java +++ b/core/src/main/java/org/apache/juli/logging/LogFactory.java @@ -17,7 +17,6 @@ package org.apache.juli.logging; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.ServiceLoader; import java.util.logging.LogManager; @@ -119,8 +118,7 @@ public Log getInstance(String name) throws LogConfigurationException { try { return discoveredLogConstructor.newInstance(name); - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | - InvocationTargetException e) { + } catch (ReflectiveOperationException | IllegalArgumentException e) { throw new LogConfigurationException(e); } } @@ -193,8 +191,7 @@ public static LogFactory getFactory() throws LogConfigurationException { */ public static Log getLog(Class clazz) throws LogConfigurationException { - return (getFactory().getInstance(clazz)); - + return getFactory().getInstance(clazz); } @@ -213,8 +210,7 @@ public static Log getLog(Class clazz) */ public static Log getLog(String name) throws LogConfigurationException { - return (getFactory().getInstance(name)); - + return getFactory().getInstance(name); } diff --git a/core/src/main/java/org/apache/juli/logging/package.html b/core/src/main/java/org/apache/juli/logging/package.html index e768de7..f92156b 100644 --- a/core/src/main/java/org/apache/juli/logging/package.html +++ b/core/src/main/java/org/apache/juli/logging/package.html @@ -32,6 +32,6 @@

    Overview

    This package generates commons-logging-jdk14.jar - i.e. the java.util implementation -of commons-logging api.

    +of commons-logging api.

    diff --git a/core/src/main/java/org/apache/naming/ContextBindings.java b/core/src/main/java/org/apache/naming/ContextBindings.java index 0f2f282..ae509b2 100644 --- a/core/src/main/java/org/apache/naming/ContextBindings.java +++ b/core/src/main/java/org/apache/naming/ContextBindings.java @@ -200,7 +200,7 @@ static String getThreadName() throws NamingException { * context, otherwise false */ public static boolean isThreadBound() { - return (threadBindings.containsKey(Thread.currentThread())); + return threadBindings.containsKey(Thread.currentThread()); } diff --git a/core/src/main/java/org/apache/naming/NamingContext.java b/core/src/main/java/org/apache/naming/NamingContext.java index 53df219..c0888a3 100644 --- a/core/src/main/java/org/apache/naming/NamingContext.java +++ b/core/src/main/java/org/apache/naming/NamingContext.java @@ -832,7 +832,7 @@ protected Object lookup(Name name, boolean resolveLinks) // Link relative to this context return lookup(link.substring(1)); } else { - return (new InitialContext(env)).lookup(link); + return new InitialContext(env).lookup(link); } } else if (entry.type == NamingEntry.REFERENCE) { try { diff --git a/core/src/main/java/org/apache/naming/SelectorContext.java b/core/src/main/java/org/apache/naming/SelectorContext.java index e957945..0e263e3 100644 --- a/core/src/main/java/org/apache/naming/SelectorContext.java +++ b/core/src/main/java/org/apache/naming/SelectorContext.java @@ -751,10 +751,10 @@ protected String parseName(String name) throws NamingException { if ((!initialContext) && (name.startsWith(prefix))) { - return (name.substring(prefixLength)); + return name.substring(prefixLength); } else { if (initialContext) { - return (name); + return name; } else { throw new NamingException (sm.getString("selectorContext.noJavaUrl")); diff --git a/core/src/main/java/org/apache/naming/factory/BeanFactory.java b/core/src/main/java/org/apache/naming/factory/BeanFactory.java index a342f51..193d579 100644 --- a/core/src/main/java/org/apache/naming/factory/BeanFactory.java +++ b/core/src/main/java/org/apache/naming/factory/BeanFactory.java @@ -145,7 +145,7 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, BeanInfo bi = Introspector.getBeanInfo(beanClass); PropertyDescriptor[] pda = bi.getPropertyDescriptors(); - Object bean = beanClass.newInstance(); + Object bean = beanClass.getConstructor().newInstance(); /* Look for properties with explicitly configured setter */ RefAddr ra = ref.get("forceString"); @@ -288,24 +288,16 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, NamingException ne = new NamingException(ie.getMessage()); ne.setRootCause(ie); throw ne; - } catch (java.lang.IllegalAccessException iae) { - NamingException ne = new NamingException(iae.getMessage()); - ne.setRootCause(iae); - throw ne; - } catch (java.lang.InstantiationException ie2) { - NamingException ne = new NamingException(ie2.getMessage()); - ne.setRootCause(ie2); - throw ne; - } catch (java.lang.reflect.InvocationTargetException ite) { - Throwable cause = ite.getCause(); + } catch (java.lang.ReflectiveOperationException e) { + Throwable cause = e.getCause(); if (cause instanceof ThreadDeath) { throw (ThreadDeath) cause; } if (cause instanceof VirtualMachineError) { throw (VirtualMachineError) cause; } - NamingException ne = new NamingException(ite.getMessage()); - ne.setRootCause(ite); + NamingException ne = new NamingException(e.getMessage()); + ne.setRootCause(e); throw ne; } diff --git a/core/src/main/java/org/apache/naming/factory/DataSourceLinkFactory.java b/core/src/main/java/org/apache/naming/factory/DataSourceLinkFactory.java index 09a83ef..37b551d 100644 --- a/core/src/main/java/org/apache/naming/factory/DataSourceLinkFactory.java +++ b/core/src/main/java/org/apache/naming/factory/DataSourceLinkFactory.java @@ -18,7 +18,6 @@ package org.apache.naming.factory; -import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -70,10 +69,10 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtabl protected Object wrapDataSource(Object datasource, String username, String password) throws NamingException { try { - Class proxyClass = Proxy.getProxyClass(datasource.getClass().getClassLoader(), datasource.getClass().getInterfaces()); - Constructor proxyConstructor = proxyClass.getConstructor(new Class[] { InvocationHandler.class }); - DataSourceHandler handler = new DataSourceHandler((DataSource)datasource, username, password); - return proxyConstructor.newInstance(handler); + DataSourceHandler handler = + new DataSourceHandler((DataSource)datasource, username, password); + return Proxy.newProxyInstance(datasource.getClass().getClassLoader(), + datasource.getClass().getInterfaces(), handler); }catch (Exception x) { if (x instanceof InvocationTargetException) { Throwable cause = x.getCause(); diff --git a/core/src/main/java/org/apache/naming/factory/EjbFactory.java b/core/src/main/java/org/apache/naming/factory/EjbFactory.java index 53d972b..4f593a5 100644 --- a/core/src/main/java/org/apache/naming/factory/EjbFactory.java +++ b/core/src/main/java/org/apache/naming/factory/EjbFactory.java @@ -44,7 +44,7 @@ protected ObjectFactory getDefaultFactory(Reference ref) throws NamingException "javax.ejb.Factory", Constants.OPENEJB_EJB_FACTORY); try { factory = (ObjectFactory) - Class.forName(javaxEjbFactoryClassName).newInstance(); + Class.forName(javaxEjbFactoryClassName).getConstructor().newInstance(); } catch(Throwable t) { if (t instanceof NamingException) { throw (NamingException) t; diff --git a/core/src/main/java/org/apache/naming/factory/FactoryBase.java b/core/src/main/java/org/apache/naming/factory/FactoryBase.java index bd16b3d..ee5510e 100644 --- a/core/src/main/java/org/apache/naming/factory/FactoryBase.java +++ b/core/src/main/java/org/apache/naming/factory/FactoryBase.java @@ -69,7 +69,7 @@ public final Object getObjectInstance(Object obj, Name name, Context nameCtx, throw ex; } try { - factory = (ObjectFactory) factoryClass.newInstance(); + factory = (ObjectFactory) factoryClass.getConstructor().newInstance(); } catch(Throwable t) { if (t instanceof NamingException) { throw (NamingException) t; diff --git a/core/src/main/java/org/apache/naming/factory/MailSessionFactory.java b/core/src/main/java/org/apache/naming/factory/MailSessionFactory.java index ab32cca..fc87930 100644 --- a/core/src/main/java/org/apache/naming/factory/MailSessionFactory.java +++ b/core/src/main/java/org/apache/naming/factory/MailSessionFactory.java @@ -94,7 +94,7 @@ public Object getObjectInstance(Object refObj, Name name, Context context, // Return null if we cannot create an object of the requested type final Reference ref = (Reference) refObj; if (!ref.getClassName().equals(factoryType)) - return (null); + return null; // Create a new Session inside a doPrivileged block, so that JavaMail // can read its default properties without throwing Security @@ -147,7 +147,7 @@ protected PasswordAuthentication getPasswordAuthentication() { // Create and return the new Session object Session session = Session.getInstance(props, auth); - return (session); + return session; } } ); diff --git a/core/src/main/java/org/apache/naming/factory/ResourceFactory.java b/core/src/main/java/org/apache/naming/factory/ResourceFactory.java index 034cf5b..5bb85f9 100644 --- a/core/src/main/java/org/apache/naming/factory/ResourceFactory.java +++ b/core/src/main/java/org/apache/naming/factory/ResourceFactory.java @@ -45,7 +45,7 @@ protected ObjectFactory getDefaultFactory(Reference ref) throws NamingException Constants.DBCP_DATASOURCE_FACTORY); try { factory = (ObjectFactory) Class.forName( - javaxSqlDataSourceFactoryClassName).newInstance(); + javaxSqlDataSourceFactoryClassName).getConstructor().newInstance(); } catch (Exception e) { NamingException ex = new NamingException( "Could not create resource factory instance"); @@ -57,8 +57,8 @@ protected ObjectFactory getDefaultFactory(Reference ref) throws NamingException System.getProperty("javax.mail.Session.Factory", "org.apache.naming.factory.MailSessionFactory"); try { - factory = (ObjectFactory) - Class.forName(javaxMailSessionFactoryClassName).newInstance(); + factory = (ObjectFactory) Class.forName( + javaxMailSessionFactoryClassName).getConstructor().newInstance(); } catch(Throwable t) { if (t instanceof NamingException) { throw (NamingException) t; diff --git a/core/src/main/java/org/apache/naming/factory/package.html b/core/src/main/java/org/apache/naming/factory/package.html index 5f65a4f..769d5e6 100644 --- a/core/src/main/java/org/apache/naming/factory/package.html +++ b/core/src/main/java/org/apache/naming/factory/package.html @@ -18,6 +18,4 @@

    This package contains object factories used by the naming service.

    -

    - diff --git a/core/src/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java b/core/src/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java index e400229..b47c4ff 100644 --- a/core/src/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java +++ b/core/src/main/java/org/apache/naming/factory/webservices/ServiceRefFactory.java @@ -21,6 +21,7 @@ import java.lang.reflect.Proxy; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; @@ -32,7 +33,6 @@ import javax.naming.Name; import javax.naming.NamingException; import javax.naming.RefAddr; -import javax.naming.Reference; import javax.naming.spi.ObjectFactory; import javax.wsdl.Definition; import javax.wsdl.Port; @@ -69,7 +69,7 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, throws Exception { if (obj instanceof ServiceRef) { - Reference ref = (Reference) obj; + ServiceRef ref = (ServiceRef) obj; // ClassLoader ClassLoader tcl = @@ -181,11 +181,10 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, Method m = serviceInterfaceClass.getMethod("setEndpointAddress", new Class[] { java.lang.String.class, java.lang.String.class }); - for (Iterator i = ports.keySet().iterator(); i.hasNext();) { - String portName = i.next(); + for (String portName : ports.keySet()) { Port port = wsdlservice.getPort(portName); String endpoint = getSOAPLocation(port); - m.invoke(service, new Object[] {port.getName(), endpoint }); + m.invoke(service, new Object[]{port.getName(), endpoint}); portComponentRef.put(endpoint, new QName(port.getName())); } } catch (Exception e) { @@ -223,15 +222,11 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, proxy.setPortComponentRef(portComponentRef); // Instantiate service with proxy class - Class[] interfaces = null; Class[] serviceInterfaces = serviceInterfaceClass.getInterfaces(); - interfaces = new Class[serviceInterfaces.length + 1]; - for (int i = 0; i < serviceInterfaces.length; i++) { - interfaces[i] = serviceInterfaces[i]; - } - + Class[] interfaces = Arrays.copyOf(serviceInterfaces, serviceInterfaces.length + 1); interfaces[interfaces.length - 1] = javax.xml.rpc.Service.class; + Object proxyInstance = null; try { proxyInstance = Proxy.newProxyInstance(tcl, interfaces, proxy); @@ -240,13 +235,13 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, } // Use handler - if (((ServiceRef) ref).getHandlersSize() > 0) { + if (ref.getHandlersSize() > 0) { HandlerRegistry handlerRegistry = service.getHandlerRegistry(); - ArrayList soaproles = new ArrayList<>(); + List soaproles = new ArrayList<>(); - while (((ServiceRef) ref).getHandlersSize() > 0) { - HandlerRef handlerRef = ((ServiceRef) ref).getHandler(); + while (ref.getHandlersSize() > 0) { + HandlerRef handlerRef = ref.getHandler(); HandlerInfo handlerInfo = new HandlerInfo(); // Loading handler Class @@ -262,9 +257,9 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, // Load all datas relative to the handler : SOAPHeaders, config init element, // portNames to be set on - ArrayList headers = new ArrayList<>(); + List headers = new ArrayList<>(); Hashtable config = new Hashtable<>(); - ArrayList portNames = new ArrayList<>(); + List portNames = new ArrayList<>(); for (int i = 0; i < handlerRef.size(); i++) if (HandlerRef.HANDLER_LOCALPART.equals(handlerRef.get(i).getType())) { String localpart = ""; @@ -301,10 +296,10 @@ public Object getObjectInstance(Object obj, Name name, Context nameCtx, handlerInfo.setHandlerConfig(config); if (!portNames.isEmpty()) { - Iterator iter = portNames.iterator(); - while (iter.hasNext()) - initHandlerChain(new QName(iter.next()), handlerRegistry, + for (String portName : portNames) { + initHandlerChain(new QName(portName), handlerRegistry, handlerInfo, soaproles); + } } else { Enumeration e = portComponentRef.elements(); while(e.hasMoreElements()) @@ -330,9 +325,7 @@ private String getSOAPLocation(Port port) { String endpoint = null; @SuppressWarnings("unchecked") List extensions = port.getExtensibilityElements(); - for (Iterator i = extensions.iterator(); - i.hasNext();) { - ExtensibilityElement ext = i.next(); + for (ExtensibilityElement ext : extensions) { if (ext instanceof SOAPAddress) { SOAPAddress addr = (SOAPAddress) ext; endpoint = addr.getLocationURI(); @@ -343,7 +336,7 @@ private String getSOAPLocation(Port port) { private void initHandlerChain(QName portName, HandlerRegistry handlerRegistry, - HandlerInfo handlerInfo, ArrayList soaprolesToAdd) { + HandlerInfo handlerInfo, List soaprolesToAdd) { HandlerChain handlerChain = (HandlerChain) handlerRegistry.getHandlerChain(portName); @SuppressWarnings("unchecked") Iterator iter = handlerChain.iterator(); diff --git a/core/src/main/java/org/apache/naming/java/package.html b/core/src/main/java/org/apache/naming/java/package.html index d3fcce1..2f5fe9e 100644 --- a/core/src/main/java/org/apache/naming/java/package.html +++ b/core/src/main/java/org/apache/naming/java/package.html @@ -18,6 +18,4 @@

    This package contains the URL context factory for the "java" namespace.

    -

    - diff --git a/core/src/main/java/org/apache/naming/package.html b/core/src/main/java/org/apache/naming/package.html index 798fb28..c16c6d3 100644 --- a/core/src/main/java/org/apache/naming/package.html +++ b/core/src/main/java/org/apache/naming/package.html @@ -18,6 +18,4 @@

    This package contains a memory based naming service provider.

    -

    - diff --git a/core/src/main/java/org/apache/tomcat/Jar.java b/core/src/main/java/org/apache/tomcat/Jar.java index 496bc47..854c745 100644 --- a/core/src/main/java/org/apache/tomcat/Jar.java +++ b/core/src/main/java/org/apache/tomcat/Jar.java @@ -39,19 +39,6 @@ public interface Jar extends AutoCloseable { */ URL getJarFileURL(); - /** - * Determines if a specific entry exists within the JAR. - * - * @param name Entry to look for - * @return true if the specified entry exists else - * false - * - * @throws IOException if an I/O error occurs while processing the JAR file - * entries - */ - boolean entryExists(String name) throws IOException; - - /** * Obtain an {@link InputStream} for a given entry in a JAR. The caller is * responsible for closing the stream. diff --git a/core/src/main/java/org/apache/tomcat/SimpleInstanceManager.java b/core/src/main/java/org/apache/tomcat/SimpleInstanceManager.java index a559fb7..035a1e0 100644 --- a/core/src/main/java/org/apache/tomcat/SimpleInstanceManager.java +++ b/core/src/main/java/org/apache/tomcat/SimpleInstanceManager.java @@ -32,30 +32,30 @@ public SimpleInstanceManager() { @Override public Object newInstance(Class clazz) throws IllegalAccessException, - InvocationTargetException, NamingException, InstantiationException { - return prepareInstance(clazz.newInstance()); + InvocationTargetException, NamingException, InstantiationException, NoSuchMethodException { + return prepareInstance(clazz.getConstructor().newInstance()); } @Override public Object newInstance(String className) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, - ClassNotFoundException { + ClassNotFoundException, NoSuchMethodException { Class clazz = Thread.currentThread().getContextClassLoader().loadClass(className); - return prepareInstance(clazz.newInstance()); + return prepareInstance(clazz.getConstructor().newInstance()); } @Override public Object newInstance(String fqcn, ClassLoader classLoader) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, - ClassNotFoundException { + ClassNotFoundException, NoSuchMethodException { Class clazz = classLoader.loadClass(fqcn); - return prepareInstance(clazz.newInstance()); + return prepareInstance(clazz.getConstructor().newInstance()); } @Override public void newInstance(Object o) throws IllegalAccessException, InvocationTargetException, NamingException { - prepareInstance(o); + // NO-OP } @Override diff --git a/core/src/main/java/org/apache/tomcat/buildutil/CheckEol.java b/core/src/main/java/org/apache/tomcat/buildutil/CheckEol.java index 04c9536..00633c7 100644 --- a/core/src/main/java/org/apache/tomcat/buildutil/CheckEol.java +++ b/core/src/main/java/org/apache/tomcat/buildutil/CheckEol.java @@ -113,7 +113,7 @@ public void execute() throws BuildException { } } - private static enum Mode { + private enum Mode { LF, CRLF } diff --git a/core/src/main/java/org/apache/tomcat/buildutil/Txt2Html.java b/core/src/main/java/org/apache/tomcat/buildutil/Txt2Html.java index 6ba82a8..40b8484 100644 --- a/core/src/main/java/org/apache/tomcat/buildutil/Txt2Html.java +++ b/core/src/main/java/org/apache/tomcat/buildutil/Txt2Html.java @@ -25,7 +25,6 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -97,9 +96,7 @@ public void execute() int count = 0; // Step through each file and convert. - Iterator iter = filesets.iterator(); - while( iter.hasNext() ) { - FileSet fs = iter.next(); + for (FileSet fs : filesets) { DirectoryScanner ds = fs.getDirectoryScanner(getProject()); File basedir = ds.getBasedir(); String[] files = ds.getIncludedFiles(); diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java index b061f33..8b92d1f 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.java @@ -106,7 +106,7 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean /** * The default auto-commit state of connections created by this pool. */ - private volatile Boolean defaultAutoCommit = null; + private volatile Boolean defaultAutoCommit; /** * Returns the default auto-commit property. @@ -137,7 +137,7 @@ public void setDefaultAutoCommit(final Boolean defaultAutoCommit) { /** * The default read-only state of connections created by this pool. */ - private transient Boolean defaultReadOnly = null; + private transient Boolean defaultReadOnly; /** * Returns the default readOnly property. @@ -198,7 +198,7 @@ public void setDefaultTransactionIsolation(final int defaultTransactionIsolation } - private Integer defaultQueryTimeout = null; + private Integer defaultQueryTimeout; /** * Obtain the default query timeout that will be used for {@link java.sql.Statement Statement}s @@ -225,7 +225,7 @@ public void setDefaultQueryTimeout(final Integer defaultQueryTimeout) { /** * The default "catalog" of connections created by this pool. */ - private volatile String defaultCatalog = null; + private volatile String defaultCatalog; /** * Returns the default catalog. @@ -284,7 +284,7 @@ public void setCacheState(final boolean cacheState) { /** * The instance of the JDBC Driver to use. */ - private Driver driver = null; + private Driver driver; /** * Returns the JDBC Driver that has been configured for use by this pool. @@ -317,7 +317,7 @@ public synchronized void setDriver(final Driver driver) { /** * The fully qualified Java class name of the JDBC driver to be used. */ - private String driverClassName = null; + private String driverClassName; /** * Returns the JDBC driver class name. @@ -358,7 +358,7 @@ public synchronized void setDriverClassName(final String driverClassName) { * If specified, {@link Class#forName(String, boolean, ClassLoader)} is * used. */ - private ClassLoader driverClassLoader = null; + private ClassLoader driverClassLoader; /** * Returns the class loader specified for loading the JDBC driver. Returns @@ -1008,7 +1008,7 @@ public int getNumIdle() { * The connection password to be passed to our JDBC driver to establish * a connection. */ - private volatile String password = null; + private volatile String password; /** * Returns the password passed to the JDBC driver to establish connections. @@ -1038,7 +1038,7 @@ public void setPassword(final String password) { * The connection URL to be passed to our JDBC driver to establish * a connection. */ - private String url = null; + private String url; /** * Returns the JDBC connection {@link #url} property. @@ -1069,7 +1069,7 @@ public synchronized void setUrl(final String url) { * The connection username to be passed to our JDBC driver to * establish a connection. */ - private String username = null; + private String username; /** * Returns the JDBC connection {@link #username} property. @@ -1103,7 +1103,7 @@ public void setUsername(final String username) { * one row. If not specified, {@link Connection#isValid(int)} will be used * to validate connections. */ - private volatile String validationQuery = null; + private volatile String validationQuery; /** * Returns the validation query used to validate connections before @@ -1315,7 +1315,7 @@ public void setLogExpiredConnections(final boolean logExpiredConnections) { this.logExpiredConnections = logExpiredConnections; } - private String jmxName = null; + private String jmxName; /** * @return the JMX name that has been requested for this DataSource. If the @@ -1484,7 +1484,7 @@ public void setFastFailValidation(final boolean fastFailValidation) { /** * The object pool that internally manages our connections. */ - private volatile GenericObjectPool connectionPool = null; + private volatile GenericObjectPool connectionPool; protected GenericObjectPool getConnectionPool() { return connectionPool; @@ -1508,7 +1508,7 @@ Properties getConnectionProperties() { * be acquired ONLY by calls to the * createDataSource() method. */ - private volatile DataSource dataSource = null; + private volatile DataSource dataSource; /** * The PrintWriter to which log messages should be directed. @@ -1677,6 +1677,10 @@ public void setRemoveAbandonedOnMaintenance( } abandonedConfig.setRemoveAbandonedOnMaintenance( removeAbandonedOnMaintenance); + final GenericObjectPool gop = this.connectionPool; + if (gop != null) { + gop.setAbandonedConfig(abandonedConfig); + } } /** @@ -1709,6 +1713,10 @@ public void setRemoveAbandonedOnBorrow(final boolean removeAbandonedOnBorrow) { abandonedConfig = new AbandonedConfig(); } abandonedConfig.setRemoveAbandonedOnBorrow(removeAbandonedOnBorrow); + final GenericObjectPool gop = this.connectionPool; + if (gop != null) { + gop.setAbandonedConfig(abandonedConfig); + } } /** @@ -1754,6 +1762,10 @@ public void setRemoveAbandonedTimeout(final int removeAbandonedTimeout) { abandonedConfig = new AbandonedConfig(); } abandonedConfig.setRemoveAbandonedTimeout(removeAbandonedTimeout); + final GenericObjectPool gop = this.connectionPool; + if (gop != null) { + gop.setAbandonedConfig(abandonedConfig); + } } /** @@ -1782,6 +1794,10 @@ public void setLogAbandoned(final boolean logAbandoned) { abandonedConfig = new AbandonedConfig(); } abandonedConfig.setLogAbandoned(logAbandoned); + final GenericObjectPool gop = this.connectionPool; + if (gop != null) { + gop.setAbandonedConfig(abandonedConfig); + } } /** @@ -1807,6 +1823,10 @@ public void setAbandonedLogWriter(final PrintWriter logWriter) { abandonedConfig = new AbandonedConfig(); } abandonedConfig.setLogWriter(logWriter); + final GenericObjectPool gop = this.connectionPool; + if (gop != null) { + gop.setAbandonedConfig(abandonedConfig); + } } /** @@ -1840,6 +1860,10 @@ public void setAbandonedUsageTracking(final boolean usageTracking) { abandonedConfig = new AbandonedConfig(); } abandonedConfig.setUseUsageTracking(usageTracking); + final GenericObjectPool gop = this.connectionPool; + if (gop != null) { + gop.setAbandonedConfig(abandonedConfig); + } } // --------------------------------------------------------- Public Methods @@ -2044,7 +2068,7 @@ protected DataSource createDataSource() driverConnectionFactory); poolableConnectionFactory.setPoolStatements( poolPreparedStatements); - poolableConnectionFactory.setMaxOpenPrepatedStatements( + poolableConnectionFactory.setMaxOpenPreparedStatements( maxOpenPreparedStatements); success = true; } catch (final SQLException se) { @@ -2153,7 +2177,7 @@ protected ConnectionFactory createConnectionFactory() throws SQLException { // Usage of DriverManager is not possible, as it does not // respect the ContextClassLoader // N.B. This cast may cause ClassCastException which is handled below - driverToUse = (Driver) driverFromCCL.newInstance(); + driverToUse = (Driver) driverFromCCL.getConstructor().newInstance(); if (!driverToUse.acceptsURL(url)) { throw new SQLException("No suitable driver", "08001"); } @@ -2204,15 +2228,7 @@ protected void createConnectionPool(final PoolableConnectionFactory factory) { final GenericObjectPoolConfig config = new GenericObjectPoolConfig(); updateJmxName(config); config.setJmxEnabled(registeredJmxName != null); // Disable JMX on the underlying pool if the DS is not registered. - GenericObjectPool gop; - if (abandonedConfig != null && - (abandonedConfig.getRemoveAbandonedOnBorrow() || - abandonedConfig.getRemoveAbandonedOnMaintenance())) { - gop = new GenericObjectPool<>(factory, config, abandonedConfig); - } - else { - gop = new GenericObjectPool<>(factory, config); - } + final GenericObjectPool gop = createObjectPool(factory, config, abandonedConfig); gop.setMaxTotal(maxTotal); gop.setMaxIdle(maxIdle); gop.setMinIdle(minIdle); @@ -2231,6 +2247,29 @@ protected void createConnectionPool(final PoolableConnectionFactory factory) { connectionPool = gop; } + /** + * Creates an object pool used to provide pooling support for {@link Connection JDBC connections}. + * + * @param factory the object factory + * @param poolConfig the object pool configuration + * @param abandonedConfig the abandoned objects configuration + * @return a non-null instance + */ + protected GenericObjectPool createObjectPool( + final PoolableConnectionFactory factory, final GenericObjectPoolConfig poolConfig, + final AbandonedConfig abandonedConfig) { + GenericObjectPool gop; + if (abandonedConfig != null && + (abandonedConfig.getRemoveAbandonedOnBorrow() || + abandonedConfig.getRemoveAbandonedOnMaintenance())) { + gop = new GenericObjectPool<>(factory, poolConfig, abandonedConfig); + } + else { + gop = new GenericObjectPool<>(factory, poolConfig); + } + return gop; + } + /** * Closes the connection pool, silently swallowing any exception that occurs. */ @@ -2289,7 +2328,7 @@ protected PoolableConnectionFactory createPoolableConnectionFactory( connectionFactory.setDefaultCatalog(defaultCatalog); connectionFactory.setCacheState(cacheState); connectionFactory.setPoolStatements(poolPreparedStatements); - connectionFactory.setMaxOpenPrepatedStatements(maxOpenPreparedStatements); + connectionFactory.setMaxOpenPreparedStatements(maxOpenPreparedStatements); connectionFactory.setMaxConnLifetimeMillis(maxConnLifetimeMillis); connectionFactory.setRollbackOnReturn(getRollbackOnReturn()); connectionFactory.setEnableAutoCommitOnReturn(getEnableAutoCommitOnReturn()); diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java index 7eff210..5723d49 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingDatabaseMetaData.java @@ -59,7 +59,7 @@ public DatabaseMetaData getDelegate() { * Hence this method will return the first * delegate that is not a {@code DelegatingResultSet}, * or {@code null} when no non-{@code DelegatingResultSet} - * delegate can be found by transversing this chain. + * delegate can be found by traversing this chain. *

    * This method is useful when you may have nested * {@code DelegatingResultSet}s, and you want to make diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java index 5b65d71..448e92a 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingResultSet.java @@ -128,7 +128,7 @@ public ResultSet getDelegate() { * Hence this method will return the first * delegate that is not a {@code DelegatingResultSet}, * or {@code null} when no non-{@code DelegatingResultSet} - * delegate can be found by transversing this chain. + * delegate can be found by traversing this chain. *

    * This method is useful when you may have nested * {@code DelegatingResultSet}s, and you want to make diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java index e470f39..cfaa586 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/DelegatingStatement.java @@ -81,7 +81,7 @@ public Statement getDelegate() { * Hence this method will return the first * delegate that is not a {@code DelegatingStatement} * or {@code null} when no non-{@code DelegatingStatement} - * delegate can be found by transversing this chain. + * delegate can be found by traversing this chain. *

    * This method is useful when you may have nested * {@code DelegatingStatement}s, and you want to make diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java index 8ca706d..f986d68 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PStmtKey.java @@ -16,6 +16,12 @@ */ package org.apache.tomcat.dbcp.dbcp2; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Arrays; + import org.apache.tomcat.dbcp.dbcp2.PoolingConnection.StatementType; /** @@ -33,22 +39,51 @@ public class PStmtKey { /** Result set concurrency */ private final Integer _resultSetConcurrency; + /** Result set holdability */ + private final Integer _resultSetHoldability; + /** Database catalog */ private final String _catalog; /** Auto generated keys */ private final Integer _autoGeneratedKeys; + /** column indexes */ + private final int[] _columnIndexes; + + /** column names */ + private final String[] _columnNames; + /** Statement type */ private final StatementType _stmtType; + /** Statement builder */ + private StatementBuilder builder; public PStmtKey(final String sql) { - this(sql, null, StatementType.PREPARED_STATEMENT, null); + this(sql, null, StatementType.PREPARED_STATEMENT); } public PStmtKey(final String sql, final String catalog) { - this(sql, catalog, StatementType.PREPARED_STATEMENT, null); + this(sql, catalog, StatementType.PREPARED_STATEMENT); + } + + public PStmtKey(final String sql, final String catalog, final StatementType stmtType) { + _sql = sql; + _catalog = catalog; + _stmtType = stmtType; + _autoGeneratedKeys = null; + _columnIndexes = null; + _columnNames = null; + _resultSetType = null; + _resultSetConcurrency = null; + _resultSetHoldability = null; + // create builder + if (stmtType == StatementType.PREPARED_STATEMENT) { + builder = new PreparedStatementSQL(); + } else if (stmtType == StatementType.CALLABLE_STATEMENT) { + builder = new PreparedCallSQL(); + } } public PStmtKey(final String sql, final String catalog, final int autoGeneratedKeys) { @@ -60,8 +95,45 @@ public PStmtKey(final String sql, final String catalog, final StatementType stmt _catalog = catalog; _stmtType = stmtType; _autoGeneratedKeys = autoGeneratedKeys; + _columnIndexes = null; + _columnNames = null; _resultSetType = null; _resultSetConcurrency = null; + _resultSetHoldability = null; + // create builder + if (stmtType == StatementType.PREPARED_STATEMENT) { + builder = new PreparedStatementWithAutoGeneratedKeys(); + } else if (stmtType == StatementType.CALLABLE_STATEMENT) { + builder = new PreparedCallSQL(); + } + } + + public PStmtKey(final String sql, final String catalog, final int[] columnIndexes) { + _sql = sql; + _catalog = catalog; + _stmtType = StatementType.PREPARED_STATEMENT; + _autoGeneratedKeys = null; + _columnIndexes = columnIndexes; + _columnNames = null; + _resultSetType = null; + _resultSetConcurrency = null; + _resultSetHoldability = null; + // create builder + builder = new PreparedStatementWithColumnIndexes(); + } + + public PStmtKey(final String sql, final String catalog, final String[] columnNames) { + _sql = sql; + _catalog = catalog; + _stmtType = StatementType.PREPARED_STATEMENT; + _autoGeneratedKeys = null; + _columnIndexes = null; + _columnNames = columnNames; + _resultSetType = null; + _resultSetConcurrency = null; + _resultSetHoldability = null; + // create builder + builder = new PreparedStatementWithColumnNames(); } public PStmtKey(final String sql, final int resultSetType, final int resultSetConcurrency) { @@ -77,8 +149,41 @@ public PStmtKey(final String sql, final String catalog, final int resultSetType, _catalog = catalog; _resultSetType = Integer.valueOf(resultSetType); _resultSetConcurrency = Integer.valueOf(resultSetConcurrency); + _resultSetHoldability = null; _stmtType = stmtType; _autoGeneratedKeys = null; + _columnIndexes = null; + _columnNames = null; + // create builder + if (stmtType == StatementType.PREPARED_STATEMENT) { + builder = new PreparedStatementWithResultSetConcurrency(); + } else if (stmtType == StatementType.CALLABLE_STATEMENT) { + builder = new PreparedCallWithResultSetConcurrency(); + } + } + + public PStmtKey(final String sql, final String catalog, final int resultSetType, final int resultSetConcurrency, + final int resultSetHoldability) { + this(sql, catalog, resultSetType, resultSetConcurrency, resultSetHoldability, StatementType.PREPARED_STATEMENT); + } + + public PStmtKey(final String sql, final String catalog, final int resultSetType, final int resultSetConcurrency, + final int resultSetHoldability, final StatementType stmtType) { + _sql = sql; + _catalog = catalog; + _resultSetType = Integer.valueOf(resultSetType); + _resultSetConcurrency = Integer.valueOf(resultSetConcurrency); + _resultSetHoldability = Integer.valueOf(resultSetHoldability); + _stmtType = stmtType; + _autoGeneratedKeys = null; + _columnIndexes = null; + _columnNames = null; + // create builder + if (stmtType == StatementType.PREPARED_STATEMENT) { + builder = new PreparedStatementWithResultSetHoldability(); + } else if (stmtType == StatementType.CALLABLE_STATEMENT) { + builder = new PreparedCallWithResultSetHoldability(); + } } @@ -94,10 +199,22 @@ public Integer getResultSetConcurrency() { return _resultSetConcurrency; } + public Integer getResultSetHoldability() { + return _resultSetHoldability; + } + public Integer getAutoGeneratedKeys() { return _autoGeneratedKeys; } + public int[] getColumnIndexes() { + return _columnIndexes; + } + + public String[] getColumnNames() { + return _columnNames; + } + public String getCatalog() { return _catalog; } @@ -139,6 +256,13 @@ public boolean equals(final Object obj) { } else if (!_resultSetType.equals(other._resultSetType)) { return false; } + if (_resultSetHoldability == null) { + if (other._resultSetHoldability != null) { + return false; + } + } else if (!_resultSetHoldability.equals(other._resultSetHoldability)) { + return false; + } if (_autoGeneratedKeys == null) { if (other._autoGeneratedKeys != null) { return false; @@ -146,6 +270,12 @@ public boolean equals(final Object obj) { } else if (!_autoGeneratedKeys.equals(other._autoGeneratedKeys)) { return false; } + if (!Arrays.equals(_columnIndexes, other._columnIndexes)) { + return false; + } + if (!Arrays.equals(_columnNames, other._columnNames)) { + return false; + } if (_sql == null) { if (other._sql != null) { return false; @@ -166,8 +296,11 @@ public int hashCode() { result = prime * result + (_catalog == null ? 0 : _catalog.hashCode()); result = prime * result + (_resultSetConcurrency == null ? 0 : _resultSetConcurrency.hashCode()); result = prime * result + (_resultSetType == null ? 0 : _resultSetType.hashCode()); + result = prime * result + (_resultSetHoldability == null ? 0 : _resultSetHoldability.hashCode()); result = prime * result + (_sql == null ? 0 : _sql.hashCode()); result = prime * result + (_autoGeneratedKeys == null ? 0 : _autoGeneratedKeys.hashCode()); + result = prime * result + Arrays.hashCode(_columnIndexes); + result = prime * result + Arrays.hashCode(_columnNames); result = prime * result + _stmtType.hashCode(); return result; } @@ -183,10 +316,138 @@ public String toString() { buf.append(_resultSetType); buf.append(", resultSetConcurrency="); buf.append(_resultSetConcurrency); + buf.append(", resultSetHoldability="); + buf.append(_resultSetHoldability); buf.append(", autoGeneratedKeys="); buf.append(_autoGeneratedKeys); - buf.append(", statmentType="); + buf.append(", columnIndexes="); + buf.append(Arrays.toString(_columnIndexes)); + buf.append(", columnNames="); + buf.append(Arrays.toString(_columnNames)); + buf.append(", statementType="); buf.append(_stmtType); return buf.toString(); } + + public Statement createStatement(final Connection connection) throws SQLException { + if (builder == null) { + throw new IllegalStateException("Prepared statement key is invalid."); + } + return builder.createStatement(connection); + } + + /** + * Interface for Prepared or Callable Statement + */ + private interface StatementBuilder { + public Statement createStatement(Connection connection) throws SQLException; + } + + /** + * Builder for prepareStatement(String sql) + */ + private class PreparedStatementSQL implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareStatement(_sql); + return statement; + } + } + + /** + * Builder for prepareStatement(String sql, int autoGeneratedKeys) + */ + private class PreparedStatementWithAutoGeneratedKeys implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareStatement( + _sql, _autoGeneratedKeys.intValue()); + return statement; + } + } + + /** + * Builder for prepareStatement(String sql, int[] columnIndexes) + */ + private class PreparedStatementWithColumnIndexes implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareStatement( + _sql, _columnIndexes); + return statement; + } + } + + /** + * Builder for prepareStatement(String sql, int resultSetType, int resultSetConcurrency) + */ + private class PreparedStatementWithResultSetConcurrency implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareStatement( + _sql, _resultSetType.intValue(), _resultSetConcurrency.intValue()); + return statement; + } + } + + /** + * Builder for prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) + */ + private class PreparedStatementWithResultSetHoldability implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareStatement( + _sql, _resultSetType.intValue(), _resultSetConcurrency.intValue(), + _resultSetHoldability.intValue()); + return statement; + } + } + + /** + * Builder for prepareStatement(String sql, String[] columnNames) + */ + private class PreparedStatementWithColumnNames implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareStatement( + _sql, _columnNames); + return statement; + } + } + + /** + * Builder for prepareCall(String sql) + */ + private class PreparedCallSQL implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareCall(_sql); + return statement; + } + } + + /** + * Builder for prepareCall(String sql, int resultSetType, int resultSetConcurrency) + */ + private class PreparedCallWithResultSetConcurrency implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareCall( + _sql, _resultSetType.intValue(), _resultSetConcurrency.intValue()); + return statement; + } + } + + /** + * Builder for prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) + */ + private class PreparedCallWithResultSetHoldability implements StatementBuilder { + @Override + public Statement createStatement(final Connection connection) throws SQLException { + final PreparedStatement statement = connection.prepareCall( + _sql, _resultSetType.intValue(), _resultSetConcurrency.intValue(), + _resultSetHoldability.intValue()); + return statement; + } + } } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java index f005d73..3b356dd 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnection.java @@ -164,9 +164,9 @@ public synchronized void close() throws SQLException { return; } - boolean isUnderlyingConectionClosed; + boolean isUnderlyingConnectionClosed; try { - isUnderlyingConectionClosed = getDelegateInternal().isClosed(); + isUnderlyingConnectionClosed = getDelegateInternal().isClosed(); } catch (final SQLException e) { try { _pool.invalidateObject(this); @@ -186,7 +186,7 @@ public synchronized void close() throws SQLException { * may have been borrowed by another thread. Therefore, the close flag * is set in passivate(). */ - if (isUnderlyingConectionClosed) { + if (isUnderlyingConnectionClosed) { // Abnormal close: underlying connection closed unexpectedly, so we // must destroy this proxy try { @@ -325,7 +325,8 @@ private boolean isDisconnectionSqlException(final SQLException e) { fatalException = _disconnectionSqlCodes == null ? sqlState.startsWith(Utils.DISCONNECTION_SQL_CODE_PREFIX) || Utils.DISCONNECTION_SQL_CODES.contains(sqlState) : _disconnectionSqlCodes.contains(sqlState); if (!fatalException) { - if (e.getNextException() != null) { + final SQLException nextException = e.getNextException(); + if (nextException != null && nextException != e) { fatalException = isDisconnectionSqlException(e.getNextException()); } } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java index 4bc0690..80fc95c 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolableConnectionFactory.java @@ -158,7 +158,12 @@ public void setPoolStatements(final boolean poolStatements) { this.poolStatements = poolStatements; } + @Deprecated // Due to typo in method name. public void setMaxOpenPrepatedStatements(final int maxOpenPreparedStatements) { + setMaxOpenPreparedStatements(maxOpenPreparedStatements); + } + + public void setMaxOpenPreparedStatements(final int maxOpenPreparedStatements) { this.maxOpenPreparedStatements = maxOpenPreparedStatements; } @@ -318,7 +323,7 @@ protected void initializeConnection(final Connection conn) throws SQLException { throw new SQLException("initializeConnection: connection closed"); } if(null != sqls) { - try (Statement stmt = conn.createStatement();) { + try (Statement stmt = conn.createStatement()) { for (final String sql : sqls) { if (sql == null) { throw new NullPointerException( diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java index d22de60..436d8d1 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingConnection.java @@ -203,26 +203,104 @@ public CallableStatement prepareCall(final String sql, final int resultSetType, } } + /** + * Create or obtain a {@link PreparedStatement} from the pool. + * @param sql the sql string used to define the PreparedStatement + * @param resultSetType result set type + * @param resultSetConcurrency result set concurrency + * @param resultSetHoldability result set holdability + * @return a {@link PoolablePreparedStatement} + */ + @Override + public PreparedStatement prepareStatement(final String sql, final int resultSetType, + final int resultSetConcurrency, final int resultSetHoldability) throws SQLException { + if (null == _pstmtPool) { + throw new SQLException( + "Statement pool is null - closed or invalid PoolingConnection."); + } + try { + return _pstmtPool.borrowObject(createKey(sql, resultSetType, resultSetConcurrency, resultSetHoldability)); + } catch(final NoSuchElementException e) { + throw new SQLException("MaxOpenPreparedStatements limit reached", e); + } catch(final RuntimeException e) { + throw e; + } catch(final Exception e) { + throw new SQLException("Borrow prepareStatement from pool failed", e); + } + } -// TODO: possible enhancement, cache these preparedStatements as well - -// public PreparedStatement prepareStatement(String sql, int resultSetType, -// int resultSetConcurrency, -// int resultSetHoldability) -// throws SQLException { -// return super.prepareStatement( -// sql, resultSetType, resultSetConcurrency, resultSetHoldability); -// } -// -// public PreparedStatement prepareStatement(String sql, int columnIndexes[]) -// throws SQLException { -// return super.prepareStatement(sql, columnIndexes); -// } -// -// public PreparedStatement prepareStatement(String sql, String columnNames[]) -// throws SQLException { -// return super.prepareStatement(sql, columnNames); -// } + /** + * Create or obtain a {@link PreparedStatement} from the pool. + * @param sql the sql string used to define the PreparedStatement + * @param columnIndexes column indexes + * @return a {@link PoolablePreparedStatement} + */ + @Override + public PreparedStatement prepareStatement(final String sql, final int columnIndexes[]) + throws SQLException { + if (null == _pstmtPool) { + throw new SQLException( + "Statement pool is null - closed or invalid PoolingConnection."); + } + try { + return _pstmtPool.borrowObject(createKey(sql, columnIndexes)); + } catch(final NoSuchElementException e) { + throw new SQLException("MaxOpenPreparedStatements limit reached", e); + } catch(final RuntimeException e) { + throw e; + } catch(final Exception e) { + throw new SQLException("Borrow prepareStatement from pool failed", e); + } + } + + /** + * Create or obtain a {@link PreparedStatement} from the pool. + * @param sql the sql string used to define the PreparedStatement + * @param columnNames column names + * @return a {@link PoolablePreparedStatement} + */ + @Override + public PreparedStatement prepareStatement(final String sql, final String columnNames[]) + throws SQLException { + if (null == _pstmtPool) { + throw new SQLException( + "Statement pool is null - closed or invalid PoolingConnection."); + } + try { + return _pstmtPool.borrowObject(createKey(sql, columnNames)); + } catch(final NoSuchElementException e) { + throw new SQLException("MaxOpenPreparedStatements limit reached", e); + } catch(final RuntimeException e) { + throw e; + } catch(final Exception e) { + throw new SQLException("Borrow prepareStatement from pool failed", e); + } + } + + /** + * Create or obtain a {@link CallableStatement} from the pool. + * @param sql the sql string used to define the CallableStatement + * @param resultSetType result set type + * @param resultSetConcurrency result set concurrency + * @param resultSetHoldability result set holdability + * @return a {@link PoolableCallableStatement} + * @throws SQLException if a {@link CallableStatement} cannot be obtained + * from the pool + */ + @Override + public CallableStatement prepareCall(final String sql, final int resultSetType, + final int resultSetConcurrency, final int resultSetHoldability) throws SQLException { + try { + return (CallableStatement) _pstmtPool.borrowObject(createKey(sql, resultSetType, + resultSetConcurrency, resultSetHoldability, StatementType.CALLABLE_STATEMENT)); + } catch (final NoSuchElementException e) { + throw new SQLException("MaxOpenCallableStatements limit reached", e); + } catch (final RuntimeException e) { + throw e; + } catch (final Exception e) { + throw new SQLException("Borrow callableStatement from pool failed", e); + } + } protected PStmtKey createKey(final String sql, final int autoGeneratedKeys) { String catalog = null; @@ -300,6 +378,77 @@ protected PStmtKey createKey(final String sql, final StatementType stmtType) { return new PStmtKey(normalizeSQL(sql), catalog, stmtType, null); } + /** + * Create a PStmtKey for the given arguments. + * @param sql the sql string used to define the statement + * @param resultSetType result set type + * @param resultSetConcurrency result set concurrency + * @param resultSetHoldability result set holdability + * @return a newly created key for the given arguments + */ + protected PStmtKey createKey(final String sql, final int resultSetType, final int resultSetConcurrency, + final int resultSetHoldability) { + String catalog = null; + try { + catalog = getCatalog(); + } catch (final SQLException e) { + // Ignored + } + return new PStmtKey(normalizeSQL(sql), catalog, resultSetType, resultSetConcurrency, resultSetHoldability); + } + + /** + * Create a PStmtKey for the given arguments. + * @param sql the sql string used to define the statement + * @param resultSetType result set type + * @param resultSetConcurrency result set concurrency + * @param resultSetHoldability result set holdability + * @param stmtType statement type + * @return a newly created key for the given arguments + */ + protected PStmtKey createKey(final String sql, final int resultSetType, final int resultSetConcurrency, + final int resultSetHoldability, final StatementType stmtType) { + String catalog = null; + try { + catalog = getCatalog(); + } catch (final SQLException e) { + // Ignored + } + return new PStmtKey(normalizeSQL(sql), catalog, resultSetType, resultSetConcurrency, resultSetHoldability, stmtType); + } + + /** + * Create a PStmtKey for the given arguments. + * @param sql the sql string used to define the statement + * @param columnIndexes column indexes + * @return a newly created key for the given arguments + */ + protected PStmtKey createKey(final String sql, final int columnIndexes[]) { + String catalog = null; + try { + catalog = getCatalog(); + } catch (final SQLException e) { + // Ignored + } + return new PStmtKey(normalizeSQL(sql), catalog, columnIndexes); + } + + /** + * Create a PStmtKey for the given arguments. + * @param sql the sql string used to define the statement + * @param columnNames column names + * @return a newly created key for the given arguments + */ + protected PStmtKey createKey(final String sql, final String columnNames[]) { + String catalog = null; + try { + catalog = getCatalog(); + } catch (final SQLException e) { + // Ignored + } + return new PStmtKey(normalizeSQL(sql), catalog, columnNames); + } + /** * Normalize the given SQL statement, producing a * canonical form that is semantically equivalent to the original. @@ -327,34 +476,16 @@ public PooledObject makeObject(final PStmtKey key) if(null == key) { throw new IllegalArgumentException("Prepared statement key is null or invalid."); } - if (null == key.getResultSetType() && null == key.getResultSetConcurrency() && null == key.getAutoGeneratedKeys()) { - if (key.getStmtType() == StatementType.PREPARED_STATEMENT ) { - @SuppressWarnings({"rawtypes", "unchecked"}) // Unable to find way to avoid this - final - PoolablePreparedStatement pps = new PoolablePreparedStatement( - getDelegate().prepareStatement(key.getSql()), key, _pstmtPool, this); - return new DefaultPooledObject<>(pps); - } - return new DefaultPooledObject<>( - new PoolableCallableStatement(getDelegate().prepareCall( key.getSql()), key, _pstmtPool, this)); - } else if (null == key.getResultSetType() && null == key.getResultSetConcurrency()){ + if (key.getStmtType() == StatementType.PREPARED_STATEMENT ) { + final PreparedStatement statement = (PreparedStatement) key.createStatement(getDelegate()); @SuppressWarnings({"rawtypes", "unchecked"}) // Unable to find way to avoid this final - PoolablePreparedStatement pps = new PoolablePreparedStatement( - getDelegate().prepareStatement(key.getSql(), key.getAutoGeneratedKeys().intValue()), key, _pstmtPool, this); + PoolablePreparedStatement pps = new PoolablePreparedStatement(statement, key, _pstmtPool, this); return new DefaultPooledObject<>(pps); - } else { // Both _resultSetType and _resultSetConcurrency are non-null here (both or neither are set by constructors) - if(key.getStmtType() == StatementType.PREPARED_STATEMENT) { - @SuppressWarnings({"rawtypes", "unchecked"}) // Unable to find way to avoid this - final - PoolablePreparedStatement pps = new PoolablePreparedStatement(getDelegate().prepareStatement( - key.getSql(), key.getResultSetType().intValue(),key.getResultSetConcurrency().intValue()), key, _pstmtPool, this); - return new DefaultPooledObject<>(pps); - } - return new DefaultPooledObject<>( - new PoolableCallableStatement( getDelegate().prepareCall( - key.getSql(),key.getResultSetType().intValue(), key.getResultSetConcurrency().intValue()), key, _pstmtPool, this)); } + final CallableStatement statement = (CallableStatement) key.createStatement(getDelegate()); + final PoolableCallableStatement pcs = new PoolableCallableStatement(statement, key, _pstmtPool, this); + return new DefaultPooledObject<>(pcs); } /** diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java index 32ddccd..9eee2f0 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/PoolingDataSource.java @@ -142,6 +142,10 @@ public Connection getConnection() throws SQLException { throw new SQLException("Cannot get a connection, pool error " + e.getMessage(), e); } catch(final RuntimeException e) { throw e; + } catch(final InterruptedException e) { + // Reset the interrupt status so it is visible to callers + Thread.currentThread().interrupt(); + throw new SQLException("Cannot get a connection, general error", e); } catch(final Exception e) { throw new SQLException("Cannot get a connection, general error", e); } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java index 4213010..2fcda55 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/DriverAdapterCPDS.java @@ -70,7 +70,7 @@ * *

    * The DriverAdapterCPDS also provides PreparedStatement pooling - * which is not generally available in jbdc2 + * which is not generally available in jdbc2 * ConnectionPoolDataSource implementation, but is * addressed within the jdbc3 specification. The PreparedStatement * pool in DriverAdapterCPDS has been in the dbcp package for some time, but diff --git a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java index a8c5534..7d7144a 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/dbcp2/cpdsadapter/PStmtKeyCPDS.java @@ -124,7 +124,7 @@ public String toString() { buf.append(getResultSetType()); buf.append(", resultSetConcurrency="); buf.append(getResultSetConcurrency()); - buf.append(", statmentType="); + buf.append(", statementType="); buf.append(getStmtType()); buf.append(", resultSetHoldability="); buf.append(_resultSetHoldability); diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java index 129c55c..8a3b5a5 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/BaseKeyedPooledObjectFactory.java @@ -66,11 +66,12 @@ public PooledObject makeObject(final K key) throws Exception { * The default implementation is a no-op. * * @param key the key used when selecting the instance - * @param p a {@code PooledObject} wrapping the the instance to be destroyed + * @param p a {@code PooledObject} wrapping the instance to be destroyed */ @Override public void destroyObject(final K key, final PooledObject p) throws Exception { + // The default implementation is a no-op. } /** @@ -79,7 +80,7 @@ public void destroyObject(final K key, final PooledObject p) * The default implementation always returns {@code true}. * * @param key the key used when selecting the object - * @param p a {@code PooledObject} wrapping the the instance to be validated + * @param p a {@code PooledObject} wrapping the instance to be validated * @return always true in the default implementation */ @Override @@ -93,11 +94,12 @@ public boolean validateObject(final K key, final PooledObject p) { * The default implementation is a no-op. * * @param key the key used when selecting the object - * @param p a {@code PooledObject} wrapping the the instance to be activated + * @param p a {@code PooledObject} wrapping the instance to be activated */ @Override public void activateObject(final K key, final PooledObject p) throws Exception { + // The default implementation is a no-op. } /** @@ -106,10 +108,11 @@ public void activateObject(final K key, final PooledObject p) * The default implementation is a no-op. * * @param key the key used when selecting the object - * @param p a {@code PooledObject} wrapping the the instance to be passivated + * @param p a {@code PooledObject} wrapping the instance to be passivated */ @Override public void passivateObject(final K key, final PooledObject p) throws Exception { + // The default implementation is a no-op. } } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java index e815191..7c58532 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/BasePooledObjectFactory.java @@ -66,6 +66,7 @@ public PooledObject makeObject() throws Exception { @Override public void destroyObject(final PooledObject p) throws Exception { + // The default implementation is a no-op. } /** @@ -87,6 +88,7 @@ public boolean validateObject(final PooledObject p) { */ @Override public void activateObject(final PooledObject p) throws Exception { + // The default implementation is a no-op. } /** @@ -97,5 +99,6 @@ public void activateObject(final PooledObject p) throws Exception { @Override public void passivateObject(final PooledObject p) throws Exception { + // The default implementation is a no-op. } } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java index aa5cf06..5b376f7 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/KeyedObjectPool.java @@ -16,6 +16,7 @@ */ package org.apache.tomcat.dbcp.pool2; +import java.io.Closeable; import java.util.NoSuchElementException; /** @@ -60,7 +61,7 @@ * * @since 2.0 */ -public interface KeyedObjectPool { +public interface KeyedObjectPool extends Closeable { /** * Obtains an instance from this pool for the specified key. *

    @@ -224,5 +225,6 @@ void addObject(K key) throws Exception, IllegalStateException, *

    * Implementations should silently fail if not all resources can be freed. */ + @Override void close(); } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java index 1d8deae..59c005a 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/ObjectPool.java @@ -16,6 +16,7 @@ */ package org.apache.tomcat.dbcp.pool2; +import java.io.Closeable; import java.util.NoSuchElementException; /** @@ -54,7 +55,7 @@ * * @since 2.0 */ -public interface ObjectPool { +public interface ObjectPool extends Closeable { /** * Obtains an instance from this pool. *

    @@ -172,5 +173,6 @@ void addObject() throws Exception, IllegalStateException, *

    * Implementations should silently fail if not all resources can be freed. */ + @Override void close(); } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java index cf593d2..cef0275 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/PoolUtils.java @@ -562,6 +562,8 @@ private static Timer getMinIdleTimer() { * Timer task that adds objects to the pool until the number of idle * instances reaches the configured minIdle. Note that this is not the same * as the pool's minIdle setting. + * + * @param type of objects in the pool */ private static final class ObjectPoolMinIdleTimerTask extends TimerTask { @@ -631,6 +633,9 @@ public String toString() { * Timer task that adds objects to the pool until the number of idle * instances for the given key reaches the configured minIdle. Note that * this is not the same as the pool's minIdle setting. + * + * @param object pool key type + * @param object pool value type */ private static final class KeyedObjectPoolMinIdleTimerTask extends TimerTask { @@ -715,6 +720,8 @@ public String toString() { * another layer of synchronization will cause liveliness issues or a * deadlock. *

    + * + * @param type of objects in the pool */ private static final class SynchronizedObjectPool implements ObjectPool { @@ -888,6 +895,9 @@ public String toString() { * another layer of synchronization will cause liveliness issues or a * deadlock. *

    + * + * @param object pool key type + * @param object pool value type */ private static final class SynchronizedKeyedObjectPool implements KeyedObjectPool { @@ -1103,6 +1113,8 @@ public String toString() { * provide proper synchronization such as the pools provided in the Commons * Pool library. *

    + * + * @param pooled object factory type */ private static final class SynchronizedPooledObjectFactory implements PooledObjectFactory { @@ -1216,6 +1228,9 @@ public String toString() { * provide proper synchronization such as the pools provided in the Commons * Pool library. *

    + * + * @param pooled object factory key type + * @param pooled object factory key value */ private static final class SynchronizedKeyedPooledObjectFactory implements KeyedPooledObjectFactory { @@ -1399,6 +1414,8 @@ public String toString() { * Decorates an object pool, adding "eroding" behavior. Based on the * configured {@link #factor erosion factor}, objects returning to the pool * may be invalidated instead of being added to idle capacity. + * + * @param type of objects in the pool */ private static class ErodingObjectPool implements ObjectPool { /** Underlying object pool */ @@ -1540,6 +1557,9 @@ public String toString() { * Decorates a keyed object pool, adding "eroding" behavior. Based on the * configured erosion factor, objects returning to the pool * may be invalidated instead of being added to idle capacity. + * + * @param object pool key type + * @param object pool value type */ private static class ErodingKeyedObjectPool implements KeyedObjectPool { @@ -1750,6 +1770,9 @@ public String toString() { * Extends ErodingKeyedObjectPool to allow erosion to take place on a * per-key basis. Timing of erosion events is tracked separately for * separate keyed pools. + * + * @param object pool key type + * @param object pool value type */ private static final class ErodingPerKeyKeyedObjectPool extends ErodingKeyedObjectPool { diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java index f6bb68c..1e3ba52 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/PooledObject.java @@ -48,7 +48,7 @@ public interface PooledObject extends Comparable> { long getCreateTime(); /** - * Obtain the time in milliseconds that this object last spent in the the + * Obtain the time in milliseconds that this object last spent in the * active state (it may still be active in which case subsequent calls will * return an increased value). * @@ -57,7 +57,7 @@ public interface PooledObject extends Comparable> { long getActiveTimeMillis(); /** - * Obtain the time in milliseconds that this object last spend in the the + * Obtain the time in milliseconds that this object last spend in the * idle state (it may still be idle in which case subsequent calls will * return an increased value). * @@ -167,6 +167,18 @@ public interface PooledObject extends Comparable> { */ void setLogAbandoned(boolean logAbandoned); +// TODO: uncomment in 3.0 (API compatibility) +// /** +// * Configures the stack trace generation strategy based on whether or not fully +// * detailed stack traces are required. When set to false, abandoned logs may +// * only include caller class information rather than method names, line numbers, +// * and other normal metadata available in a full stack trace. +// * +// * @param requireFullStackTrace the new configuration setting for abandoned object +// * logging +// */ +// void setRequireFullStackTrace(boolean requireFullStackTrace); + /** * Record the current stack trace as the last time the object was used. */ diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java index b5c8007..b018962 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/AbandonedConfig.java @@ -167,6 +167,43 @@ public void setLogAbandoned(final boolean logAbandoned) { this.logAbandoned = logAbandoned; } + /** + * Determines whether or not to log full stack traces when logAbandoned is true. + * If disabled, then a faster method for logging stack traces with only class data + * may be used if possible. + * + * @since 2.5 + */ + private boolean requireFullStackTrace = true; + + /** + * Indicates if full stack traces are required when {@link #getLogAbandoned() logAbandoned} + * is true. Defaults to true. Logging of abandoned objects requiring a full stack trace will + * generate an entire stack trace to generate for every object created. If this is disabled, + * a faster but less informative stack walking mechanism may be used if available. + * + * @return true if full stack traces are required for logging abandoned connections, or false + * if abbreviated stack traces are acceptable + * @see CallStack + * @since 2.5 + */ + public boolean getRequireFullStackTrace() { + return requireFullStackTrace; + } + + /** + * Sets the flag to require full stack traces for logging abandoned connections when enabled. + * + * @param requireFullStackTrace indicates whether or not full stack traces are required in + * abandoned connection logs + * @see CallStack + * @see #getRequireFullStackTrace() + * @since 2.5 + */ + public void setRequireFullStackTrace(boolean requireFullStackTrace) { + this.requireFullStackTrace = requireFullStackTrace; + } + /** * PrintWriter to use to log information on abandoned objects. * Use of default system encoding is deliberate. diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java index 2c93e34..6e89e6a 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java @@ -25,6 +25,7 @@ import java.util.Deque; import java.util.Iterator; import java.util.TimerTask; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import javax.management.InstanceAlreadyExistsException; @@ -85,6 +86,8 @@ public abstract class BaseGenericObjectPool extends BaseObject { private volatile long softMinEvictableIdleTimeMillis = BaseObjectPoolConfig.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS; private volatile EvictionPolicy evictionPolicy; + private volatile long evictorShutdownTimeoutMillis = + BaseObjectPoolConfig.DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS; // Internal (primarily state) attributes @@ -605,28 +608,52 @@ public final void setEvictionPolicyClassName( } catch (final ClassNotFoundException e) { clazz = Class.forName(evictionPolicyClassName); } - final Object policy = clazz.newInstance(); + final Object policy = clazz.getConstructor().newInstance(); if (policy instanceof EvictionPolicy) { @SuppressWarnings("unchecked") // safe, because we just checked the class final EvictionPolicy evicPolicy = (EvictionPolicy) policy; this.evictionPolicy = evicPolicy; + } else { + throw new IllegalArgumentException("[" + evictionPolicyClassName + + "] does not implement EvictionPolicy"); } } catch (final ClassNotFoundException e) { throw new IllegalArgumentException( "Unable to create EvictionPolicy instance of type " + evictionPolicyClassName, e); - } catch (final InstantiationException e) { - throw new IllegalArgumentException( - "Unable to create EvictionPolicy instance of type " + - evictionPolicyClassName, e); - } catch (final IllegalAccessException e) { + } catch (final ReflectiveOperationException e) { throw new IllegalArgumentException( "Unable to create EvictionPolicy instance of type " + evictionPolicyClassName, e); } } + /** + * Gets the timeout that will be used when waiting for the Evictor to + * shutdown if this pool is closed and it is the only pool still using the + * the value for the Evictor. + * + * @return The timeout in milliseconds that will be used while waiting for + * the Evictor to shut down. + */ + public final long getEvictorShutdownTimeoutMillis() { + return evictorShutdownTimeoutMillis; + } + + /** + * Sets the timeout that will be used when waiting for the Evictor to + * shutdown if this pool is closed and it is the only pool still using the + * the value for the Evictor. + * + * @param evictorShutdownTimeoutMillis the timeout in milliseconds that + * will be used while waiting for the + * Evictor to shut down. + */ + public final void setEvictorShutdownTimeoutMillis( + final long evictorShutdownTimeoutMillis) { + this.evictorShutdownTimeoutMillis = evictorShutdownTimeoutMillis; + } /** * Closes the pool, destroys the remaining idle objects and, if registered @@ -687,7 +714,7 @@ final void assertOpen() throws IllegalStateException { final void startEvictor(final long delay) { synchronized (evictionLock) { if (null != evictor) { - EvictionTimer.cancel(evictor); + EvictionTimer.cancel(evictor, evictorShutdownTimeoutMillis, TimeUnit.MILLISECONDS); evictor = null; evictionIterator = null; } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java index 51554e7..5528716 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java @@ -67,6 +67,15 @@ public abstract class BaseObjectPoolConfig extends BaseObject implements Cloneab */ public static final long DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS = -1; + /** + * The default value for {@code evictorShutdownTimeoutMillis} configuration + * attribute. + * @see GenericObjectPool#getEvictorShutdownTimeoutMillis() + * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutMillis() + */ + public static final long DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS = + 10L * 1000L; + /** * The default value for the {@code numTestsPerEvictionRun} configuration * attribute. @@ -161,13 +170,16 @@ public abstract class BaseObjectPoolConfig extends BaseObject implements Cloneab private long maxWaitMillis = DEFAULT_MAX_WAIT_MILLIS; private long minEvictableIdleTimeMillis = - DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + + private long evictorShutdownTimeoutMillis = + DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS; private long softMinEvictableIdleTimeMillis = - DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS; private int numTestsPerEvictionRun = - DEFAULT_NUM_TESTS_PER_EVICTION_RUN; + DEFAULT_NUM_TESTS_PER_EVICTION_RUN; private String evictionPolicyClassName = DEFAULT_EVICTION_POLICY_CLASS_NAME; @@ -180,7 +192,7 @@ public abstract class BaseObjectPoolConfig extends BaseObject implements Cloneab private boolean testWhileIdle = DEFAULT_TEST_WHILE_IDLE; private long timeBetweenEvictionRunsMillis = - DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; + DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; private boolean blockWhenExhausted = DEFAULT_BLOCK_WHEN_EXHAUSTED; @@ -364,6 +376,36 @@ public void setNumTestsPerEvictionRun(final int numTestsPerEvictionRun) { this.numTestsPerEvictionRun = numTestsPerEvictionRun; } + /** + * Get the value for the {@code evictorShutdownTimeoutMillis} configuration + * attribute for pools created with this configuration instance. + * + * @return The current setting of {@code evictorShutdownTimeoutMillis} for + * this configuration instance + * + * @see GenericObjectPool#getEvictorShutdownTimeoutMillis() + * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutMillis() + */ + public long getEvictorShutdownTimeoutMillis() { + return evictorShutdownTimeoutMillis; + } + + /** + * Set the value for the {@code evictorShutdownTimeoutMillis} configuration + * attribute for pools created with this configuration instance. + * + * @param evictorShutdownTimeoutMillis The new setting of + * {@code evictorShutdownTimeoutMillis} for this configuration + * instance + * + * @see GenericObjectPool#getEvictorShutdownTimeoutMillis() + * @see GenericKeyedObjectPool#getEvictorShutdownTimeoutMillis() + */ + public void setEvictorShutdownTimeoutMillis( + final long evictorShutdownTimeoutMillis) { + this.evictorShutdownTimeoutMillis = evictorShutdownTimeoutMillis; + } + /** * Get the value for the {@code testOnCreate} configuration attribute for * pools created with this configuration instance. diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/CallStack.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/CallStack.java new file mode 100644 index 0000000..fe7aa0d --- /dev/null +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/CallStack.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 org.apache.tomcat.dbcp.pool2.impl; + +import java.io.PrintWriter; + +/** + * Strategy for obtaining and printing the current call stack. This is primarily useful for + * {@link org.apache.tomcat.dbcp.pool2.UsageTracking usage tracking} so + * that different JVMs and configurations can use more efficient strategies + * for obtaining the current call stack depending on metadata needs. + * + * @see CallStackUtils + * @since 2.4.3 + */ +public interface CallStack { + + /** + * Prints the current stack trace if available to a PrintWriter. The format is undefined and is primarily useful + * for debugging issues with {@link org.apache.tomcat.dbcp.pool2.PooledObject} usage in user code. + * + * @param writer a PrintWriter to write the current stack trace to if available + * @return true if a stack trace was available to print or false if nothing was printed + */ + boolean printStackTrace(final PrintWriter writer); + + /** + * Takes a snapshot of the current call stack. Subsequent calls to {@link #printStackTrace(PrintWriter)} will print + * out that stack trace until it is {@linkplain #clear() cleared}. + */ + void fillInStackTrace(); + + /** + * Clears the current stack trace snapshot. Subsequent calls to {@link #printStackTrace(PrintWriter)} will be + * no-ops until another call to {@link #fillInStackTrace()}. + */ + void clear(); +} diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/CallStackUtils.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/CallStackUtils.java new file mode 100644 index 0000000..d5089c3 --- /dev/null +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/CallStackUtils.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.tomcat.dbcp.pool2.impl; + +import java.security.AccessControlException; + +/** + * Utility methods for {@link CallStack}. + * + * @since 2.4.3 + */ +public final class CallStackUtils { + + private static final boolean CAN_CREATE_SECURITY_MANAGER; + + static { + CAN_CREATE_SECURITY_MANAGER = canCreateSecurityManager(); + } + + /** + * @return {@code true} if it is able to create a security manager in the current environment, {@code false} + * otherwise. + */ + private static boolean canCreateSecurityManager() { + final SecurityManager manager = System.getSecurityManager(); + if (manager == null) { + return true; + } + try { + manager.checkPermission(new RuntimePermission("createSecurityManager")); + return true; + } catch (final AccessControlException ignored) { + return false; + } + } + + /** + * Constructs a new {@link CallStack} using the fastest allowed strategy. + * + * @param messageFormat message (or format) to print first in stack traces + * @param useTimestamp if true, interpret message as a SimpleDateFormat and print the created timestamp; otherwise, + * print message format literally + * @return a new CallStack + * @deprecated use {@link #newCallStack(String, boolean, boolean)} + */ + @Deprecated + public static CallStack newCallStack(final String messageFormat, final boolean useTimestamp) { + return newCallStack(messageFormat, useTimestamp, false); + } + + /** + * Constructs a new {@link CallStack} using the fasted allowed strategy. + * + * @param messageFormat message (or format) to print first in stack traces + * @param useTimestamp if true, interpret message as a SimpleDateFormat and print the created timestamp; + * otherwise, print message format literally + * @param requireFullStackTrace if true, forces the use of a stack walking mechanism that includes full stack trace + * information; otherwise, uses a faster implementation if possible + * @return a new CallStack + * @since 2.5 + */ + public static CallStack newCallStack(final String messageFormat, + final boolean useTimestamp, + final boolean requireFullStackTrace) { + return CAN_CREATE_SECURITY_MANAGER && !requireFullStackTrace + ? new SecurityManagerCallStack(messageFormat, useTimestamp) + : new ThrowableCallStack(messageFormat, useTimestamp); + } + + /** + * Hidden constructor. + */ + private CallStackUtils() { + } +} diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java index 8ffbd17..fe1224e 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObject.java @@ -17,8 +17,6 @@ package org.apache.tomcat.dbcp.pool2.impl; import java.io.PrintWriter; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.Deque; import org.apache.tomcat.dbcp.pool2.PooledObject; @@ -44,8 +42,8 @@ public class DefaultPooledObject implements PooledObject { private volatile long lastUseTime = createTime; private volatile long lastReturnTime = createTime; private volatile boolean logAbandoned = false; - private volatile Exception borrowedBy = null; - private volatile Exception usedBy = null; + private volatile CallStack borrowedBy = NoOpCallStack.INSTANCE; + private volatile CallStack usedBy = NoOpCallStack.INSTANCE; private volatile long borrowedCount = 0; /** @@ -191,7 +189,7 @@ public synchronized boolean allocate() { lastUseTime = lastBorrowTime; borrowedCount++; if (logAbandoned) { - borrowedBy = new AbandonedObjectCreatedException(); + borrowedBy.fillInStackTrace(); } return true; } else if (state == PooledObjectState.EVICTION) { @@ -216,7 +214,7 @@ public synchronized boolean deallocate() { state == PooledObjectState.RETURNING) { state = PooledObjectState.IDLE; lastReturnTime = System.currentTimeMillis(); - borrowedBy = null; + borrowedBy.clear(); return true; } @@ -234,22 +232,13 @@ public synchronized void invalidate() { @Override public void use() { lastUseTime = System.currentTimeMillis(); - usedBy = new Exception("The last code to use this object was:"); + usedBy.fillInStackTrace(); } @Override public void printStackTrace(final PrintWriter writer) { - boolean written = false; - final Exception borrowedByCopy = this.borrowedBy; - if (borrowedByCopy != null) { - borrowedByCopy.printStackTrace(writer); - written = true; - } - final Exception usedByCopy = this.usedBy; - if (usedByCopy != null) { - usedByCopy.printStackTrace(writer); - written = true; - } + boolean written = borrowedBy.printStackTrace(writer); + written |= usedBy.printStackTrace(writer); if (written) { writer.flush(); } @@ -286,41 +275,23 @@ public void setLogAbandoned(final boolean logAbandoned) { } /** - * Used to track how an object was obtained from the pool (the stack trace - * of the exception will show which code borrowed the object) and when the - * object was borrowed. + * Configures the stack trace generation strategy based on whether or not fully + * detailed stack traces are required. When set to false, abandoned logs may + * only include caller class information rather than method names, line numbers, + * and other normal metadata available in a full stack trace. + * + * @param requireFullStackTrace the new configuration setting for abandoned object + * logging + * @since 2.5 */ - static class AbandonedObjectCreatedException extends Exception { - - private static final long serialVersionUID = 7398692158058772916L; - - /** Date format */ - //@GuardedBy("format") - private static final SimpleDateFormat format = new SimpleDateFormat - ("'Pooled object created' yyyy-MM-dd HH:mm:ss Z " + - "'by the following code has not been returned to the pool:'"); - - private final long _createdTime; - - /** - * Create a new instance. - *

    - * @see Exception#Exception() - */ - public AbandonedObjectCreatedException() { - super(); - _createdTime = System.currentTimeMillis(); - } - - // Override getMessage to avoid creating objects and formatting - // dates unless the log message will actually be used. - @Override - public String getMessage() { - String msg; - synchronized(format) { - msg = format.format(new Date(_createdTime)); - } - return msg; - } + // TODO: uncomment below in 3.0 + // @Override + public void setRequireFullStackTrace(final boolean requireFullStackTrace) { + borrowedBy = CallStackUtils.newCallStack("'Pooled object created' " + + "yyyy-MM-dd HH:mm:ss Z 'by the following code has not been returned to the pool:'", + true, requireFullStackTrace); + usedBy = CallStackUtils.newCallStack("The last code to use this object was:", + false, requireFullStackTrace); } + } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java index 2af7ebd..27480e9 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/DefaultPooledObjectInfoMBean.java @@ -41,7 +41,7 @@ public interface DefaultPooledObjectInfoMBean { /** * Obtain the time that pooled object was created. * - * @return The creation time for the pooled object formated as + * @return The creation time for the pooled object formatted as * yyyy-MM-dd HH:mm:ss Z */ String getCreateTimeFormatted(); diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java index 455b269..06e9f73 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/EvictionTimer.java @@ -18,16 +18,19 @@ import java.security.AccessController; import java.security.PrivilegedAction; -import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; /** - * Provides a shared idle object eviction timer for all pools. This class wraps - * the standard {@link Timer} and keeps track of how many pools are using it. - * If no pools are using the timer, it is canceled. This prevents a thread - * being left running which, in application server environments, can lead to - * memory leads and/or prevent applications from shutting down or reloading - * cleanly. + * Provides a shared idle object eviction timer for all pools. This class is + * currently implemented using {@link ScheduledThreadPoolExecutor}. This + * implementation may change in any future release. This class keeps track of + * how many pools are using it. If no pools are using the timer, it is cancelled. + * This prevents a thread being left running which, in application server + * environments, can lead to memory leads and/or prevent applications from + * shutting down or reloading cleanly. *

    * This class has package scope to prevent its inclusion in the pool public API. * The class declaration below should *not* be changed to public. @@ -38,17 +41,29 @@ */ class EvictionTimer { - /** Timer instance */ - private static Timer _timer; //@GuardedBy("EvictionTimer.class") + /** Executor instance */ + private static ScheduledThreadPoolExecutor executor; //@GuardedBy("EvictionTimer.class") /** Static usage count tracker */ - private static int _usageCount; //@GuardedBy("EvictionTimer.class") + private static int usageCount; //@GuardedBy("EvictionTimer.class") /** Prevent instantiation */ private EvictionTimer() { // Hide the default constructor } + + /** + * @since 2.4.3 + */ + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("EvictionTimer []"); + return builder.toString(); + } + + /** * Add the specified eviction task to the timer. Tasks that are added with a * call to this method *must* call {@link #cancel(TimerTask)} to cancel the @@ -58,112 +73,57 @@ private EvictionTimer() { * @param delay Delay in milliseconds before task is executed * @param period Time in milliseconds between executions */ - static synchronized void schedule(final TimerTask task, final long delay, final long period) { - if (null == _timer) { - // Force the new Timer thread to be created with a context class - // loader set to the class loader that loaded this library - final ClassLoader ccl = AccessController.doPrivileged( - new PrivilegedGetTccl()); - try { - AccessController.doPrivileged(new PrivilegedSetTccl( - EvictionTimer.class.getClassLoader())); - _timer = AccessController.doPrivileged(new PrivilegedNewEvictionTimer()); - } finally { - AccessController.doPrivileged(new PrivilegedSetTccl(ccl)); - } + static synchronized void schedule(final Runnable task, final long delay, final long period) { + if (null == executor) { + executor = new ScheduledThreadPoolExecutor(1, new EvictorThreadFactory()); } - _usageCount++; - _timer.schedule(task, delay, period); + usageCount++; + executor.scheduleWithFixedDelay(task, delay, period, TimeUnit.MILLISECONDS); } /** * Remove the specified eviction task from the timer. - * @param task Task to be scheduled + * + * @param task Task to be cancelled + * @param timeout If the associated executor is no longer required, how + * long should this thread wait for the executor to + * terminate? + * @param unit The units for the specified timeout */ - static synchronized void cancel(final TimerTask task) { + static synchronized void cancel(final TimerTask task, final long timeout, final TimeUnit unit) { task.cancel(); - _usageCount--; - if (_usageCount == 0) { - _timer.cancel(); - _timer = null; - } - } - - /** - * {@link PrivilegedAction} used to get the ContextClassLoader - */ - private static class PrivilegedGetTccl implements PrivilegedAction { - - /** - * {@inheritDoc} - */ - @Override - public ClassLoader run() { - return Thread.currentThread().getContextClassLoader(); - } - } - - /** - * {@link PrivilegedAction} used to set the ContextClassLoader - */ - private static class PrivilegedSetTccl implements PrivilegedAction { - - /** ClassLoader */ - private final ClassLoader classLoader; - - /** - * Create a new PrivilegedSetTccl using the given classloader - * @param classLoader ClassLoader to use - */ - PrivilegedSetTccl(final ClassLoader cl) { - this.classLoader = cl; - } - - /** - * {@inheritDoc} - */ - @Override - public Void run() { - Thread.currentThread().setContextClassLoader(classLoader); - return null; - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("PrivilegedSetTccl [classLoader="); - builder.append(classLoader); - builder.append("]"); - return builder.toString(); + usageCount--; + if (usageCount == 0) { + executor.shutdown(); + try { + executor.awaitTermination(timeout, unit); + } catch (final InterruptedException e) { + // Swallow + // Significant API changes would be required to propagate this + } + executor.setCorePoolSize(0); + executor = null; } } /** - * {@link PrivilegedAction} used to create a new Timer. Creating the timer - * with a privileged action means the associated Thread does not inherit the - * current access control context. In a container environment, inheriting - * the current access control context is likely to result in retaining a - * reference to the thread context class loader which would be a memory - * leak. + * Thread factory that creates a thread, with the context classloader from this class. */ - private static class PrivilegedNewEvictionTimer implements PrivilegedAction { + private static class EvictorThreadFactory implements ThreadFactory { - /** - * {@inheritDoc} - */ @Override - public Timer run() { - return new Timer("commons-pool-EvictionTimer", true); + public Thread newThread(final Runnable r) { + final Thread t = new Thread(null, r, "commons-pool-evictor-thread"); + + AccessController.doPrivileged(new PrivilegedAction() { + @Override + public Void run() { + t.setContextClassLoader(EvictorThreadFactory.class.getClassLoader()); + return null; + } + }); + + return t; } } - - /** - * @since 2.4.3 - */ - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("EvictionTimer []"); - return builder.toString(); - } } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java index 9f7429d..eb4b3f6 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java @@ -51,6 +51,10 @@ * provided to one of these methods, a sub-new pool is created under the given * key to be managed by the containing GenericKeyedObjectPool. *

    + * Note that the current implementation uses a ConcurrentHashMap which uses + * equals() to compare keys. + * This means that distinct instance keys must be distinguishable using equals. + *

    * Optionally, one may configure the pool to examine and possibly evict objects * as they sit idle in the pool and to ensure that a minimum number of idle * objects is maintained for each key. This is performed by an "idle object @@ -144,7 +148,7 @@ public void setMaxTotalPerKey(final int maxTotalPerKey) { * If maxIdlePerKey is set too low on heavily loaded systems it is possible * you will see objects being destroyed and almost immediately new objects * being created. This is a result of the active threads momentarily - * returning objects faster than they are requesting them them, causing the + * returning objects faster than they are requesting them, causing the * number of idle objects to rise above maxIdlePerKey. The best value for * maxIdlePerKey for heavily loaded system will vary but the default is a * good starting point. @@ -164,7 +168,7 @@ public int getMaxIdlePerKey() { * If maxIdlePerKey is set too low on heavily loaded systems it is possible * you will see objects being destroyed and almost immediately new objects * being created. This is a result of the active threads momentarily - * returning objects faster than they are requesting them them, causing the + * returning objects faster than they are requesting them, causing the * number of idle objects to rise above maxIdlePerKey. The best value for * maxIdlePerKey for heavily loaded system will vary but the default is a * good starting point. @@ -252,6 +256,7 @@ public void setConfig(final GenericKeyedObjectPoolConfig conf) { setTimeBetweenEvictionRunsMillis( conf.getTimeBetweenEvictionRunsMillis()); setEvictionPolicyClassName(conf.getEvictionPolicyClassName()); + setEvictorShutdownTimeoutMillis(conf.getEvictorShutdownTimeoutMillis()); } /** @@ -521,7 +526,7 @@ public void returnObject(final K key, final T obj) { final int maxIdle = getMaxIdlePerKey(); final LinkedBlockingDeque> idleObjects = - objectDeque.getIdleObjects(); + objectDeque.getIdleObjects(); if (isClosed() || maxIdle > -1 && maxIdle <= idleObjects.size()) { try { @@ -736,7 +741,7 @@ public void clearOldest() { // build sorted map of idle objects final Map, K> map = new TreeMap<>(); - for (Map.Entry> entry : poolMap.entrySet()) { + for (final Map.Entry> entry : poolMap.entrySet()) { final K k = entry.getKey(); final ObjectDeque deque = entry.getValue(); // Protect against possible NPE if key has been removed in another @@ -756,7 +761,7 @@ public void clearOldest() { // for zero int itemsToRemove = ((int) (map.size() * 0.15)) + 1; final Iterator, K>> iter = - map.entrySet().iterator(); + map.entrySet().iterator(); while (iter.hasNext() && itemsToRemove > 0) { final Map.Entry, K> entry = iter.next(); @@ -799,7 +804,7 @@ private void reuseCapacity() { int maxQueueLength = 0; LinkedBlockingDeque> mostLoaded = null; K loadedKey = null; - for (Map.Entry> entry : poolMap.entrySet()) { + for (final Map.Entry> entry : poolMap.entrySet()) { final K k = entry.getKey(); final ObjectDeque deque = entry.getValue(); if (deque != null) { @@ -837,11 +842,11 @@ private void reuseCapacity() { * {@code false} */ private boolean hasBorrowWaiters() { - for (Map.Entry> entry : poolMap.entrySet()) { + for (final Map.Entry> entry : poolMap.entrySet()) { final ObjectDeque deque = entry.getValue(); if (deque != null) { final LinkedBlockingDeque> pool = - deque.getIdleObjects(); + deque.getIdleObjects(); if(pool.hasTakeWaiters()) { return true; } @@ -929,16 +934,16 @@ public void evict() throws Exception { continue; } - // User provided eviction policy could throw all sorts of crazy - // exceptions. Protect against such an exception killing the - // eviction thread. + // User provided eviction policy could throw all sorts of + // crazy exceptions. Protect against such an exception + // killing the eviction thread. boolean evict; try { evict = evictionPolicy.evict(evictionConfig, underTest, poolMap.get(evictionKey).getIdleObjects().size()); } catch (final Throwable t) { - // Slightly convoluted as SwallowedExceptionListener uses - // Exception rather than Throwable + // Slightly convoluted as SwallowedExceptionListener + // uses Exception rather than Throwable PoolUtils.checkRethrow(t); swallowException(new Exception(t)); // Don't evict on error conditions @@ -1208,7 +1213,7 @@ void ensureMinIdle() throws Exception { */ private void ensureMinIdle(final K key) throws Exception { // Calculate current pool objects - final ObjectDeque objectDeque = poolMap.get(key); + ObjectDeque objectDeque = poolMap.get(key); // objectDeque == null is OK here. It is handled correctly by both // methods called below. @@ -1222,6 +1227,12 @@ private void ensureMinIdle(final K key) throws Exception { for (int i = 0; i < deficit && calculateDeficit(objectDeque) > 0; i++) { addObject(key); + // If objectDeque was null, it won't be any more. Obtain a reference + // to it so the deficit can be correctly calculated. It needs to + // take account of objects created in other threads. + if (objectDeque == null) { + objectDeque = poolMap.get(key); + } } } @@ -1399,7 +1410,7 @@ public int getNumWaiters() { public Map getNumWaitersByKey() { final Map result = new HashMap<>(); - for (Map.Entry> entry : poolMap.entrySet()) { + for (final Map.Entry> entry : poolMap.entrySet()) { final K k = entry.getKey(); final ObjectDeque deque = entry.getValue(); if (deque != null) { @@ -1430,7 +1441,7 @@ public Map> listAllObjects() { final Map> result = new HashMap<>(); - for (Map.Entry> entry : poolMap.entrySet()) { + for (final Map.Entry> entry : poolMap.entrySet()) { final K k = entry.getKey(); final ObjectDeque deque = entry.getValue(); if (deque != null) { @@ -1450,6 +1461,8 @@ public Map> listAllObjects() { /** * Maintains information on the per key queue for a given key. + * + * @param type of objects in the pool */ private class ObjectDeque { @@ -1546,9 +1559,9 @@ public String toString() { private volatile int maxIdlePerKey = GenericKeyedObjectPoolConfig.DEFAULT_MAX_IDLE_PER_KEY; private volatile int minIdlePerKey = - GenericKeyedObjectPoolConfig.DEFAULT_MIN_IDLE_PER_KEY; + GenericKeyedObjectPoolConfig.DEFAULT_MIN_IDLE_PER_KEY; private volatile int maxTotalPerKey = - GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY; + GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY; private final KeyedPooledObjectFactory factory; private final boolean fairness; @@ -1582,7 +1595,7 @@ public String toString() { // JMX specific attributes private static final String ONAME_BASE = - "org.apache.tomcat.dbcp.pool2:type=GenericKeyedObjectPool,name="; + "org.apache.tomcat.dbcp.pool2:type=GenericKeyedObjectPool,name="; @Override protected void toStringAppendFields(final StringBuilder builder) { diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java index 3e49757..965f91a 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java @@ -140,7 +140,7 @@ public GenericObjectPool(final PooledObjectFactory factory, * is set too low on heavily loaded systems it is possible you will see * objects being destroyed and almost immediately new objects being created. * This is a result of the active threads momentarily returning objects - * faster than they are requesting them them, causing the number of idle + * faster than they are requesting them, causing the number of idle * objects to rise above maxIdle. The best value for maxIdle for heavily * loaded system will vary but the default is a good starting point. * @@ -159,7 +159,7 @@ public int getMaxIdle() { * is set too low on heavily loaded systems it is possible you will see * objects being destroyed and almost immediately new objects being created. * This is a result of the active threads momentarily returning objects - * faster than they are requesting them them, causing the number of idle + * faster than they are requesting them, causing the number of idle * objects to rise above maxIdle. The best value for maxIdle for heavily * loaded system will vary but the default is a good starting point. * @@ -315,6 +315,7 @@ public void setConfig(final GenericObjectPoolConfig conf) { setSoftMinEvictableIdleTimeMillis( conf.getSoftMinEvictableIdleTimeMillis()); setEvictionPolicyClassName(conf.getEvictionPolicyClassName()); + setEvictorShutdownTimeoutMillis(conf.getEvictorShutdownTimeoutMillis()); } /** @@ -335,6 +336,7 @@ public void setAbandonedConfig(final AbandonedConfig abandonedConfig) { this.abandonedConfig.setRemoveAbandonedOnMaintenance(abandonedConfig.getRemoveAbandonedOnMaintenance()); this.abandonedConfig.setRemoveAbandonedTimeout(abandonedConfig.getRemoveAbandonedTimeout()); this.abandonedConfig.setUseUsageTracking(abandonedConfig.getUseUsageTracking()); + this.abandonedConfig.setRequireFullStackTrace(abandonedConfig.getRequireFullStackTrace()); } } @@ -758,16 +760,16 @@ public void evict() throws Exception { continue; } - // User provided eviction policy could throw all sorts of crazy - // exceptions. Protect against such an exception killing the - // eviction thread. + // User provided eviction policy could throw all sorts of + // crazy exceptions. Protect against such an exception + // killing the eviction thread. boolean evict; try { evict = evictionPolicy.evict(evictionConfig, underTest, idleObjects.size()); } catch (final Throwable t) { - // Slightly convoluted as SwallowedExceptionListener uses - // Exception rather than Throwable + // Slightly convoluted as SwallowedExceptionListener + // uses Exception rather than Throwable PoolUtils.checkRethrow(t); swallowException(new Exception(t)); // Don't evict on error conditions @@ -886,7 +888,7 @@ private PooledObject create() throws Exception { final PooledObject p; try { p = factory.makeObject(); - } catch (Exception e) { + } catch (final Exception e) { createCount.decrementAndGet(); throw e; } finally { @@ -899,6 +901,10 @@ private PooledObject create() throws Exception { final AbandonedConfig ac = this.abandonedConfig; if (ac != null && ac.getLogAbandoned()) { p.setLogAbandoned(true); + // TODO: in 3.0, this can use the method defined on PooledObject + if (p instanceof DefaultPooledObject) { + ((DefaultPooledObject) p).setRequireFullStackTrace(ac.getRequireFullStackTrace()); + } } createdCount.incrementAndGet(); @@ -1194,4 +1200,5 @@ protected void toStringAppendFields(final StringBuilder builder) { builder.append(", abandonedConfig="); builder.append(abandonedConfig); } + } diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java index e6c62c3..3c89f5a 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java @@ -88,7 +88,11 @@ class LinkedBlockingDeque extends AbstractQueue private static final long serialVersionUID = -387911632671998426L; - /** Doubly-linked list node class */ + /** + * Doubly-linked list node class. + * + * @param node item type + */ private static final class Node { /** * The item, or null if this node has been removed. diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/NoOpCallStack.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/NoOpCallStack.java new file mode 100644 index 0000000..ffb91b5 --- /dev/null +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/NoOpCallStack.java @@ -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. + */ +package org.apache.tomcat.dbcp.pool2.impl; + +import java.io.PrintWriter; + +/** + * CallStack strategy using no-op implementations of all functionality. Can be used by default when abandoned object + * logging is disabled. + * + * @since 2.5 + */ +public class NoOpCallStack implements CallStack { + + public static final CallStack INSTANCE = new NoOpCallStack(); + + private NoOpCallStack() { + } + + @Override + public boolean printStackTrace(PrintWriter writer) { + return false; + } + + @Override + public void fillInStackTrace() { + // no-op + } + + @Override + public void clear() { + // no-op + } +} diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SecurityManagerCallStack.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SecurityManagerCallStack.java new file mode 100644 index 0000000..032a558 --- /dev/null +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SecurityManagerCallStack.java @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.tomcat.dbcp.pool2.impl; + +import java.io.PrintWriter; +import java.lang.ref.WeakReference; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; + +/** + * CallStack strategy using a {@link SecurityManager}. Obtaining the current call stack is much faster via a + * SecurityManger, but access to the underlying method may be restricted by the current SecurityManager. In environments + * where a SecurityManager cannot be created, {@link ThrowableCallStack} should be used instead. + * + * @see RuntimePermission + * @see SecurityManager#getClassContext() + * @since 2.4.3 + */ +public class SecurityManagerCallStack implements CallStack { + + private final String messageFormat; + //@GuardedBy("dateFormat") + private final DateFormat dateFormat; + private final PrivateSecurityManager securityManager; + + private volatile Snapshot snapshot; + + /** + * Create a new instance. + * + * @param messageFormat message format + * @param useTimestamp whether to format the dates in the output message or not + */ + public SecurityManagerCallStack(final String messageFormat, final boolean useTimestamp) { + this.messageFormat = messageFormat; + this.dateFormat = useTimestamp ? new SimpleDateFormat(messageFormat) : null; + this.securityManager = AccessController.doPrivileged(new PrivilegedAction() { + @Override + public PrivateSecurityManager run() { + return new PrivateSecurityManager(); + } + }); + } + + @Override + public boolean printStackTrace(final PrintWriter writer) { + final Snapshot snapshotRef = this.snapshot; + if (snapshotRef == null) { + return false; + } + final String message; + if (dateFormat == null) { + message = messageFormat; + } else { + synchronized (dateFormat) { + message = dateFormat.format(Long.valueOf(snapshotRef.timestamp)); + } + } + writer.println(message); + for (final WeakReference> reference : snapshotRef.stack) { + writer.println(reference.get()); + } + return true; + } + + @Override + public void fillInStackTrace() { + snapshot = new Snapshot(securityManager.getCallStack()); + } + + @Override + public void clear() { + snapshot = null; + } + + /** + * A custom security manager. + */ + private static class PrivateSecurityManager extends SecurityManager { + /** + * Get the class stack. + * + * @return class stack + */ + private List>> getCallStack() { + final Class[] classes = getClassContext(); + final List>> stack = new ArrayList<>(classes.length); + for (final Class klass : classes) { + stack.add(new WeakReference>(klass)); + } + return stack; + } + } + + /** + * A snapshot of a class stack. + */ + private static class Snapshot { + private final long timestamp = System.currentTimeMillis(); + private final List>> stack; + + /** + * Create a new snapshot with a class stack. + * + * @param stack class stack + */ + private Snapshot(final List>> stack) { + this.stack = stack; + } + } +} diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java index c898647..a05abc2 100644 --- a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/SoftReferenceObjectPool.java @@ -16,6 +16,7 @@ */ package org.apache.tomcat.dbcp.pool2.impl; +import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.util.ArrayList; @@ -375,7 +376,9 @@ private void pruneClearedReferences() { // Remove wrappers for enqueued references from idle and allReferences lists removeClearedReferences(idleReferences.iterator()); removeClearedReferences(allReferences.iterator()); - while (refQueue.poll() != null) {} + while (refQueue.poll() != null) { + // empty + } } /** diff --git a/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/ThrowableCallStack.java b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/ThrowableCallStack.java new file mode 100644 index 0000000..393a479 --- /dev/null +++ b/core/src/main/java/org/apache/tomcat/dbcp/pool2/impl/ThrowableCallStack.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.tomcat.dbcp.pool2.impl; + +import java.io.PrintWriter; +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +/** + * CallStack strategy that uses the stack trace from a {@link Throwable}. This strategy, while slower than the + * SecurityManager implementation, provides call stack method names and other metadata in addition to the call stack + * of classes. + * + * @see Throwable#fillInStackTrace() + * @since 2.4.3 + */ +public class ThrowableCallStack implements CallStack { + + private final String messageFormat; + //@GuardedBy("dateFormat") + private final DateFormat dateFormat; + + private volatile Snapshot snapshot; + + /** + * Create a new instance. + * + * @param messageFormat message format + * @param useTimestamp whether to format the dates in the output message or not + */ + public ThrowableCallStack(final String messageFormat, final boolean useTimestamp) { + this.messageFormat = messageFormat; + this.dateFormat = useTimestamp ? new SimpleDateFormat(messageFormat) : null; + } + + @Override + public synchronized boolean printStackTrace(final PrintWriter writer) { + final Snapshot snapshotRef = this.snapshot; + if (snapshotRef == null) { + return false; + } + final String message; + if (dateFormat == null) { + message = messageFormat; + } else { + synchronized (dateFormat) { + message = dateFormat.format(Long.valueOf(snapshotRef.timestamp)); + } + } + writer.println(message); + snapshotRef.printStackTrace(writer); + return true; + } + + @Override + public void fillInStackTrace() { + snapshot = new Snapshot(); + } + + @Override + public void clear() { + snapshot = null; + } + + /** + * A snapshot of a throwable. + */ + private static class Snapshot extends Throwable { + private static final long serialVersionUID = 1L; + private final long timestamp = System.currentTimeMillis(); + } +} diff --git a/core/src/main/java/org/apache/tomcat/jni/SSL.java b/core/src/main/java/org/apache/tomcat/jni/SSL.java index da588b8..e270693 100644 --- a/core/src/main/java/org/apache/tomcat/jni/SSL.java +++ b/core/src/main/java/org/apache/tomcat/jni/SSL.java @@ -172,6 +172,18 @@ public final class SSL { public static final int SSL_MODE_SERVER = 1; public static final int SSL_MODE_COMBINED = 2; + public static final int SSL_CONF_FLAG_CMDLINE = 0x0001; + public static final int SSL_CONF_FLAG_FILE = 0x0002; + public static final int SSL_CONF_FLAG_CLIENT = 0x0004; + public static final int SSL_CONF_FLAG_SERVER = 0x0008; + public static final int SSL_CONF_FLAG_SHOW_ERRORS = 0x0010; + public static final int SSL_CONF_FLAG_CERTIFICATE = 0x0020; + + public static final int SSL_CONF_TYPE_UNKNOWN = 0x0000; + public static final int SSL_CONF_TYPE_STRING = 0x0001; + public static final int SSL_CONF_TYPE_FILE = 0x0002; + public static final int SSL_CONF_TYPE_DIR = 0x0003; + public static final int SSL_SHUTDOWN_TYPE_UNSET = 0; public static final int SSL_SHUTDOWN_TYPE_STANDARD = 1; public static final int SSL_SHUTDOWN_TYPE_UNCLEAN = 2; @@ -646,7 +658,7 @@ public static native long newBIO(long pool, BIOCallback callback) public static native int getOptions(long ssl); /** - * Returns all Returns the cipher suites that are available for negotiation in an SSL handshake. + * Returns all cipher suites that are enabled for negotiation in an SSL handshake. * @param ssl the SSL instance (SSL *) * @return ciphers */ diff --git a/core/src/main/java/org/apache/tomcat/jni/SSLConf.java b/core/src/main/java/org/apache/tomcat/jni/SSLConf.java new file mode 100644 index 0000000..272c0a1 --- /dev/null +++ b/core/src/main/java/org/apache/tomcat/jni/SSLConf.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.tomcat.jni; + +/** SSL Conf + */ +public final class SSLConf { + + /** + * Create a new SSL_CONF context. + * + * @param pool The pool to use. + * @param flags The SSL_CONF flags to use. It can be any combination of + * the following: + *

    +     * {@link SSL#SSL_CONF_FLAG_CMDLINE}
    +     * {@link SSL#SSL_CONF_FLAG_FILE}
    +     * {@link SSL#SSL_CONF_FLAG_CLIENT}
    +     * {@link SSL#SSL_CONF_FLAG_SERVER}
    +     * {@link SSL#SSL_CONF_FLAG_SHOW_ERRORS}
    +     * {@link SSL#SSL_CONF_FLAG_CERTIFICATE}
    +     * 
    + * + * @return The Java representation of a pointer to the newly created + * SSL_CONF Context + * + * @throws Exception If the SSL_CONF context could not be created + * + * @see OpenSSL SSL_CONF_CTX_new + * @see OpenSSL SSL_CONF_CTX_set_flags + */ + public static native long make(long pool, int flags) throws Exception; + + /** + * Free the resources used by the context + * + * @param cctx SSL_CONF context to free. + * + * @see OpenSSL SSL_CONF_CTX_free + */ + public static native void free(long cctx); + + /** + * Check a command with an SSL_CONF context. + * + * @param cctx SSL_CONF context to use. + * @param name command name. + * @param value command value. + * + * @return The result of the check based on the {@code SSL_CONF_cmd_value_type} + * call. Unknown types will result in an exception, as well as + * file and directory types with invalid file or directory names. + * + * @throws Exception If the check fails. + * + * @see OpenSSL SSL_CONF_cmd_value_type + */ + public static native int check(long cctx, String name, String value) throws Exception; + + /** + * Assign an SSL context to a SSL_CONF context. + * All following calls to {@link #apply(long, String, String)} will be + * applied to this SSL context. + * + * @param cctx SSL_CONF context to use. + * @param ctx SSL context to assign to the given SSL_CONF context. + * + * @see OpenSSL SSL_CONF_CTX_set_ssl_ctx + */ + public static native void assign(long cctx, long ctx); + + /** + * Apply a command to an SSL_CONF context. + * + * @param cctx SSL_CONF context to use. + * @param name command name. + * @param value command value. + * + * @return The result of the native {@code SSL_CONF_cmd} call + * + * @throws Exception If the SSL_CONF context is {@code 0} + * + * @see OpenSSL SSL_CONF_cmd + */ + public static native int apply(long cctx, String name, String value) throws Exception; + + /** + * Finish commands for an SSL_CONF context. + * + * @param cctx SSL_CONF context to use. + * + * @return The result of the native {@code SSL_CONF_CTX_finish} call + * + * @see OpenSSL SSL_CONF_CTX_finish + */ + public static native int finish(long cctx); + +} diff --git a/core/src/main/java/org/apache/tomcat/jni/SSLContext.java b/core/src/main/java/org/apache/tomcat/jni/SSLContext.java index 50a2908..607d126 100644 --- a/core/src/main/java/org/apache/tomcat/jni/SSLContext.java +++ b/core/src/main/java/org/apache/tomcat/jni/SSLContext.java @@ -26,6 +26,9 @@ */ public final class SSLContext { + public static final byte[] DEFAULT_SESSION_ID_CONTEXT = + new byte[] { 'd', 'e', 'f', 'a', 'u', 'l', 't' }; + /** * Create a new SSL context. * @@ -110,6 +113,13 @@ public final class SSLContext { */ public static native void clearOptions(long ctx, int options); + /** + * Returns all cipher suites that are enabled for negotiation in an SSL handshake. + * @param ctx Server or Client context to use. + * @return ciphers + */ + public static native String[] getCiphers(long ctx); + /** * Sets the "quiet shutdown" flag for ctx to be * mode. SSL objects created from ctx inherit the @@ -562,4 +572,12 @@ public static native void setTmpECDHByCurveName(long ctx, String curveName) * @return {@code true} if success, {@code false} otherwise. */ public static native boolean addChainCertificateRaw(long ctx, byte[] cert); + + /** + * Add a CA certificate we accept as issuer for peer certs + * @param ctx Server or Client context to use. + * @param cert Byte array with the certificate in DER encoding. + * @return {@code true} if success, {@code false} otherwise. + */ + public static native boolean addClientCACertificateRaw(long ctx, byte[] cert); } diff --git a/core/src/main/java/org/apache/tomcat/util/bcel/Const.java b/core/src/main/java/org/apache/tomcat/util/bcel/Const.java index 9948d96..d3da9a0 100644 --- a/core/src/main/java/org/apache/tomcat/util/bcel/Const.java +++ b/core/src/main/java/org/apache/tomcat/util/bcel/Const.java @@ -44,86 +44,122 @@ public final class Const { */ public static final short ACC_ANNOTATION = 0x2000; - /** Marks a constant pool entry as type UTF-8. + /** + * Marks a constant pool entry as type UTF-8. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_Utf8 = 1; - /** Marks a constant pool entry as type Integer. + /** + * Marks a constant pool entry as type Integer. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_Integer = 3; - /** Marks a constant pool entry as type Float. + /** + * Marks a constant pool entry as type Float. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_Float = 4; - /** Marks a constant pool entry as type Long. + /** + * Marks a constant pool entry as type Long. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_Long = 5; - /** Marks a constant pool entry as type Double. + /** + * Marks a constant pool entry as type Double. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_Double = 6; - /** Marks a constant pool entry as a Class + /** + * Marks a constant pool entry as a Class * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_Class = 7; - /** Marks a constant pool entry as a Field Reference. + /** + * Marks a constant pool entry as a Field Reference. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_Fieldref = 9; - /** Marks a constant pool entry as type String + /** + * Marks a constant pool entry as type String * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_String = 8; - /** Marks a constant pool entry as a Method Reference. + /** + * Marks a constant pool entry as a Method Reference. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_Methodref = 10; - /** Marks a constant pool entry as an Interface Method Reference. + /** + * Marks a constant pool entry as an Interface Method Reference. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_InterfaceMethodref = 11; - /** Marks a constant pool entry as a name and type. + /** + * Marks a constant pool entry as a name and type. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_NameAndType = 12; - /** Marks a constant pool entry as a Method Handle. + /** + * Marks a constant pool entry as a Method Handle. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_MethodHandle = 15; - /** Marks a constant pool entry as a Method Type. + /** + * Marks a constant pool entry as a Method Type. * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_MethodType = 16; - /** Marks a constant pool entry as an Invoke Dynamic + /** + * Marks a constant pool entry as an Invoke Dynamic * @see - * The Constant Pool in The Java Virtual Machine Specification */ + * The Constant Pool in The Java Virtual Machine Specification + */ public static final byte CONSTANT_InvokeDynamic = 18; - /** Marks a constant pool entry as a Module Reference. - * Note: Early access Java 9 support- currently subject to change. + /** + * Marks a constant pool entry as a Module Reference. + * + *

    Note: Early access Java 9 support- currently subject to change

    + * * @see - * JPMS: Modules in the Java Language and JVM */ + * JPMS: Modules in the Java Language and JVM + */ public static final byte CONSTANT_Module = 19; - /** Marks a constant pool entry as a Package Reference. - * Note: Early access Java 9 support- currently subject to change. + /** + * Marks a constant pool entry as a Package Reference. + * + *

    Note: Early access Java 9 support- currently subject to change

    + * * @see - * JPMS: Modules in the Java Language and JVM */ + * JPMS: Modules in the Java Language and JVM + */ public static final byte CONSTANT_Package = 20; /** diff --git a/core/src/main/java/org/apache/tomcat/util/buf/AbstractChunk.java b/core/src/main/java/org/apache/tomcat/util/buf/AbstractChunk.java new file mode 100644 index 0000000..1573fd4 --- /dev/null +++ b/core/src/main/java/org/apache/tomcat/util/buf/AbstractChunk.java @@ -0,0 +1,181 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.tomcat.util.buf; + +import java.io.Serializable; + +/** + * Base class for the *Chunk implementation to reduce duplication. + */ +public abstract class AbstractChunk implements Cloneable, Serializable { + + private static final long serialVersionUID = 1L; + + /* + * JVMs may limit the maximum array size to slightly less than + * Integer.MAX_VALUE. On markt's desktop the limit is MAX_VALUE - 2. + * Comments in the JRE source code for ArrayList and other classes indicate + * that it may be as low as MAX_VALUE - 8 on some systems. + */ + public static final int ARRAY_MAX_SIZE = Integer.MAX_VALUE - 8; + + private int hashCode = 0; + protected boolean hasHashCode = false; + + protected boolean isSet; + + private int limit = -1; + + protected int start; + protected int end; + + + /** + * Maximum amount of data in this buffer. If -1 or not set, the buffer will + * grow to {{@link #ARRAY_MAX_SIZE}. Can be smaller than the current buffer + * size ( which will not shrink ). When the limit is reached, the buffer + * will be flushed (if out is set) or throw exception. + * + * @param limit The new limit + */ + public void setLimit(int limit) { + this.limit = limit; + } + + + public int getLimit() { + return limit; + } + + + protected int getLimitInternal() { + if (limit > 0) { + return limit; + } else { + return ARRAY_MAX_SIZE; + } + } + + + /** + * @return the start position of the data in the buffer + */ + public int getStart() { + return start; + } + + + public int getEnd() { + return end; + } + + + public void setEnd(int i) { + end = i; + } + + + // TODO: Deprecate offset and use start + + public int getOffset() { + return start; + } + + + public void setOffset(int off) { + if (end < off) { + end = off; + } + start = off; + } + + + /** + * @return the length of the data in the buffer + */ + public int getLength() { + return end - start; + } + + + public boolean isNull() { + if (end > 0) { + return false; + } + return !isSet; + } + + + public int indexOf(String src, int srcOff, int srcLen, int myOff) { + char first = src.charAt(srcOff); + + // Look for first char + int srcEnd = srcOff + srcLen; + + mainLoop: for (int i = myOff + start; i <= (end - srcLen); i++) { + if (getBufferElement(i) != first) { + continue; + } + // found first char, now look for a match + int myPos = i + 1; + for (int srcPos = srcOff + 1; srcPos < srcEnd;) { + if (getBufferElement(myPos++) != src.charAt(srcPos++)) { + continue mainLoop; + } + } + return i - start; // found it + } + return -1; + } + + + /** + * Resets the chunk to an uninitialized state. + */ + public void recycle() { + hasHashCode = false; + isSet = false; + start = 0; + end = 0; + } + + + @Override + public int hashCode() { + if (hasHashCode) { + return hashCode; + } + int code = 0; + + code = hash(); + hashCode = code; + hasHashCode = true; + return code; + } + + + public int hash() { + int code = 0; + for (int i = start; i < end; i++) { + code = code * 37 + getBufferElement(i); + } + return code; + } + + + protected abstract int getBufferElement(int index); +} diff --git a/core/src/main/java/org/apache/tomcat/util/buf/ByteChunk.java b/core/src/main/java/org/apache/tomcat/util/buf/ByteChunk.java index 150e740..43d7cb0 100644 --- a/core/src/main/java/org/apache/tomcat/util/buf/ByteChunk.java +++ b/core/src/main/java/org/apache/tomcat/util/buf/ByteChunk.java @@ -17,7 +17,8 @@ package org.apache.tomcat.util.buf; import java.io.IOException; -import java.io.Serializable; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -41,16 +42,15 @@ // inside this way it could provide the search/etc on ByteBuffer, as a helper. /** - * This class is used to represent a chunk of bytes, and - * utilities to manipulate byte[]. + * This class is used to represent a chunk of bytes, and utilities to manipulate + * byte[]. * * The buffer can be modified and used for both input and output. * * There are 2 modes: The chunk can be associated with a sink - ByteInputChannel * or ByteOutputChannel, which will be used when the buffer is empty (on input) - * or filled (on output). - * For output, it can also grow. This operating mode is selected by calling - * setLimit() or allocate(initial, limit) with limit != -1. + * or filled (on output). For output, it can also grow. This operating mode is + * selected by calling setLimit() or allocate(initial, limit) with limit != -1. * * Various search and append method are defined - similar with String and * StringBuffer, but operating on bytes. @@ -65,43 +65,50 @@ * @author Costin Manolache * @author Remy Maucherat */ -public final class ByteChunk implements Cloneable, Serializable { +public final class ByteChunk extends AbstractChunk { private static final long serialVersionUID = 1L; - /** Input interface, used when the buffer is empty + /** + * Input interface, used when the buffer is empty. * - * Same as java.nio.channel.ReadableByteChannel + * Same as java.nio.channels.ReadableByteChannel */ public static interface ByteInputChannel { + /** * Read new bytes. * * @return The number of bytes read * - * @throws IOException If an I/O occurs while reading the bytes + * @throws IOException If an I/O error occurs during reading */ public int realReadBytes() throws IOException; } - /** Same as java.nio.channel.WritableByteChannel. + /** + * When we need more space we'll either grow the buffer ( up to the limit ) + * or send it to a channel. + * + * Same as java.nio.channel.WritableByteChannel. */ public static interface ByteOutputChannel { + /** - * Send the bytes ( usually the internal conversion buffer ). - * Expect 8k output if the buffer is full. + * Send the bytes ( usually the internal conversion buffer ). Expect 8k + * output if the buffer is full. * - * @param cbuf bytes that will be written + * @param buf bytes that will be written * @param off offset in the bytes array * @param len length that will be written * @throws IOException If an I/O occurs while writing the bytes */ - public void realWriteBytes(byte cbuf[], int off, int len) - throws IOException; + public void realWriteBytes(byte buf[], int off, int len) throws IOException; + /** - * Send the bytes ( usually the internal conversion buffer ). - * Expect 8k output if the buffer is full. + * Send the bytes ( usually the internal conversion buffer ). Expect 8k + * output if the buffer is full. * * @param from bytes that will be written * @throws IOException If an I/O occurs while writing the bytes @@ -111,73 +118,76 @@ public void realWriteBytes(byte cbuf[], int off, int len) // -------------------- - /** Default encoding used to convert to strings. It should be UTF8, - as most standards seem to converge, but the servlet API requires - 8859_1, and this object is used mostly for servlets. - */ + /** + * Default encoding used to convert to strings. It should be UTF8, as most + * standards seem to converge, but the servlet API requires 8859_1, and this + * object is used mostly for servlets. + */ public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1; - private int hashCode=0; - // did we compute the hashcode ? - private boolean hasHashCode = false; + private transient Charset charset; // byte[] private byte[] buff; - private int start=0; - private int end; + // transient as serialization is primarily for values via, e.g. JMX + private transient ByteInputChannel in = null; + private transient ByteOutputChannel out = null; - private Charset charset; - - private boolean isSet=false; // XXX - - // How much can it grow, when data is added - private int limit=-1; - - private ByteInputChannel in = null; - private ByteOutputChannel out = null; /** * Creates a new, uninitialized ByteChunk object. */ public ByteChunk() { - // NO-OP } - public ByteChunk( int initial ) { - allocate( initial, -1 ); + + public ByteChunk(int initial) { + allocate(initial, -1); } - public boolean isNull() { - return ! isSet; // buff==null; + + private void writeObject(ObjectOutputStream oos) throws IOException { + oos.defaultWriteObject(); + oos.writeUTF(getCharset().name()); } - /** - * Resets the message buff to an uninitialized state. - */ + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { + ois.defaultReadObject(); + this.charset = Charset.forName(ois.readUTF()); + } + + + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + + @Override public void recycle() { - charset=null; - start=0; - end=0; - isSet=false; - hasHashCode = false; + super.recycle(); + charset = null; } + // -------------------- Setup -------------------- - public void allocate( int initial, int limit ) { - if( buff==null || buff.length < initial ) { - buff=new byte[initial]; + public void allocate(int initial, int limit) { + if (buff == null || buff.length < initial) { + buff = new byte[initial]; } - this.limit=limit; - start=0; - end=0; - isSet=true; + setLimit(limit); + start = 0; + end = 0; + isSet = true; hasHashCode = false; } + /** - * Sets the message bytes to the specified subarray of bytes. + * Sets the buffer to the specified subarray of bytes. * * @param b the ascii bytes * @param off the start offset of the bytes @@ -186,15 +196,17 @@ public void allocate( int initial, int limit ) { public void setBytes(byte[] b, int off, int len) { buff = b; start = off; - end = start+ len; - isSet=true; + end = start + len; + isSet = true; hasHashCode = false; } + public void setCharset(Charset charset) { this.charset = charset; } + public Charset getCharset() { if (charset == null) { charset = DEFAULT_CHARSET; @@ -202,109 +214,67 @@ public Charset getCharset() { return charset; } + /** - * @return the message bytes. + * @return the buffer. */ public byte[] getBytes() { return getBuffer(); } + /** - * @return the message bytes. + * @return the buffer. */ public byte[] getBuffer() { return buff; } - /** - * @return the start offset of the bytes. - * For output this is the end of the buffer. - */ - public int getStart() { - return start; - } - - public int getOffset() { - return start; - } - - public void setOffset(int off) { - if (end < off ) { - end=off; - } - start=off; - } - - /** - * @return the length of the bytes. - */ - public int getLength() { - return end-start; - } - - /** - * Maximum amount of data in this buffer. - * If -1 or not set, the buffer will grow indefinitely. - * Can be smaller than the current buffer size ( which will not shrink ). - * When the limit is reached, the buffer will be flushed ( if out is set ) - * or throw exception. - * @param limit The new limit - */ - public void setLimit(int limit) { - this.limit=limit; - } - - public int getLimit() { - return limit; - } /** * When the buffer is empty, read the data from the input channel. + * * @param in The input channel */ public void setByteInputChannel(ByteInputChannel in) { this.in = in; } + /** - * When the buffer is full, write the data to the output channel. - * Also used when large amount of data is appended. - * If not set, the buffer will grow to the limit. + * When the buffer is full, write the data to the output channel. Also used + * when large amount of data is appended. If not set, the buffer will grow + * to the limit. + * * @param out The output channel */ public void setByteOutputChannel(ByteOutputChannel out) { - this.out=out; + this.out = out; } - public int getEnd() { - return end; - } - - public void setEnd( int i ) { - end=i; - } // -------------------- Adding data to the buffer -------------------- - public void append( byte b ) - throws IOException - { - makeSpace( 1 ); + + public void append(byte b) throws IOException { + makeSpace(1); + int limit = getLimitInternal(); // couldn't make space - if( limit >0 && end >= limit ) { + if (end >= limit) { flushBuffer(); } - buff[end++]=b; + buff[end++] = b; } - public void append( ByteChunk src ) - throws IOException - { - append( src.getBytes(), src.getStart(), src.getLength()); + + public void append(ByteChunk src) throws IOException { + append(src.getBytes(), src.getStart(), src.getLength()); } + /** * Add data to the buffer. + * * @param src Bytes array * @param off Offset * @param len Length @@ -312,42 +282,33 @@ public void append( ByteChunk src ) */ public void append(byte src[], int off, int len) throws IOException { // will grow, up to limit - makeSpace( len ); - - // if we don't have limit: makeSpace can grow as it wants - if( limit < 0 ) { - // assert: makeSpace made enough space - System.arraycopy( src, off, buff, end, len ); - end+=len; - return; - } + makeSpace(len); + int limit = getLimitInternal(); // Optimize on a common case. // If the buffer is empty and the source is going to fill up all the // space in buffer, may as well write it directly to the output, // and avoid an extra copy - if ( len == limit && end == start && out != null ) { - out.realWriteBytes( src, off, len ); + if (len == limit && end == start && out != null) { + out.realWriteBytes(src, off, len); return; } - // if we have limit and we're below - if( len <= limit - end ) { - // makeSpace will grow the buffer to the limit, - // so we have space - System.arraycopy( src, off, buff, end, len ); - end+=len; + + // if we are below the limit + if (len <= limit - end) { + System.arraycopy(src, off, buff, end, len); + end += len; return; } - // need more space than we can afford, need to flush - // buffer + // Need more space than we can afford, need to flush buffer. - // the buffer is already at ( or bigger than ) limit + // The buffer is already at (or bigger than) limit. // We chunk the data into slices fitting in the buffer limit, although - // if the data is written directly if it doesn't fit + // if the data is written directly if it doesn't fit. - int avail=limit-end; + int avail = limit - end; System.arraycopy(src, off, buff, end, avail); end += avail; @@ -356,13 +317,12 @@ public void append(byte src[], int off, int len) throws IOException { int remain = len - avail; while (remain > (limit - end)) { - out.realWriteBytes( src, (off + len) - remain, limit - end ); + out.realWriteBytes(src, (off + len) - remain, limit - end); remain = remain - (limit - end); } System.arraycopy(src, (off + len) - remain, buff, end, remain); end += remain; - } @@ -377,14 +337,7 @@ public void append(ByteBuffer from) throws IOException { // will grow, up to limit makeSpace(len); - - // if we don't have limit: makeSpace can grow as it wants - if (limit < 0) { - // assert: makeSpace made enough space - from.get(buff, end, len); - end += len; - return; - } + int limit = getLimitInternal(); // Optimize on a common case. // If the buffer is empty and the source is going to fill up all the @@ -452,7 +405,7 @@ public byte substractB() throws IOException { } - public int substract(byte dest[], int off, int len ) throws IOException { + public int substract(byte dest[], int off, int len) throws IOException { if (checkEof()) { return -1; } @@ -469,8 +422,8 @@ public int substract(byte dest[], int off, int len ) throws IOException { /** * Transfers bytes from the buffer to the specified ByteBuffer. After the * operation the position of the ByteBuffer will be returned to the one - * before the operation, the limit will be the position incremented by - * the number of the transfered bytes. + * before the operation, the limit will be the position incremented by the + * number of the transfered bytes. * * @param to the ByteBuffer into which bytes are to be written. * @return an integer specifying the actual number of bytes read, or -1 if @@ -510,79 +463,81 @@ private boolean checkEof() throws IOException { * * @throws IOException Writing overflow data to the output channel failed */ - public void flushBuffer() - throws IOException - { - //assert out!=null - if( out==null ) { - throw new IOException( "Buffer overflow, no sink " + limit + " " + - buff.length ); + public void flushBuffer() throws IOException { + // assert out!=null + if (out == null) { + throw new IOException("Buffer overflow, no sink " + getLimit() + " " + buff.length); } - out.realWriteBytes( buff, start, end-start ); - end=start; + out.realWriteBytes(buff, start, end - start); + end = start; } + /** * Make space for len bytes. If len is small, allocate a reserve space too. - * Never grow bigger than limit. + * Never grow bigger than the limit or {@link AbstractChunk#ARRAY_MAX_SIZE}. + * * @param count The size */ public void makeSpace(int count) { byte[] tmp = null; - int newSize; - int desiredSize=end + count; + int limit = getLimitInternal(); + + long newSize; + long desiredSize = end + count; // Can't grow above the limit - if( limit > 0 && - desiredSize > limit) { - desiredSize=limit; + if (desiredSize > limit) { + desiredSize = limit; } - if( buff==null ) { - if( desiredSize < 256 ) - { - desiredSize=256; // take a minimum + if (buff == null) { + if (desiredSize < 256) { + desiredSize = 256; // take a minimum } - buff=new byte[desiredSize]; + buff = new byte[(int) desiredSize]; } - // limit < buf.length ( the buffer is already big ) + // limit < buf.length (the buffer is already big) // or we already have space XXX - if( desiredSize <= buff.length ) { + if (desiredSize <= buff.length) { return; } // grow in larger chunks - if( desiredSize < 2 * buff.length ) { - newSize= buff.length * 2; + if (desiredSize < 2L * buff.length) { + newSize = buff.length * 2L; } else { - newSize= buff.length * 2 + count ; + newSize = buff.length * 2L + count; } - if (limit > 0 && newSize > limit) { + if (newSize > limit) { newSize = limit; } - tmp = new byte[newSize]; + tmp = new byte[(int) newSize]; - System.arraycopy(buff, start, tmp, 0, end-start); + // Compacts buffer + System.arraycopy(buff, start, tmp, 0, end - start); buff = tmp; tmp = null; - end=end-start; - start=0; + end = end - start; + start = 0; } + // -------------------- Conversion and getters -------------------- @Override public String toString() { if (null == buff) { return null; - } else if (end-start == 0) { + } else if (end - start == 0) { return ""; } return StringCache.toString(this); } + public String toStringInternal() { if (charset == null) { charset = DEFAULT_CHARSET; @@ -590,12 +545,13 @@ public String toStringInternal() { // new String(byte[], int, int, Charset) takes a defensive copy of the // entire byte array. This is expensive if only a small subset of the // bytes will be used. The code below is from Apache Harmony. - CharBuffer cb = charset.decode(ByteBuffer.wrap(buff, start, end-start)); + CharBuffer cb = charset.decode(ByteBuffer.wrap(buff, start, end - start)); return new String(cb.array(), cb.arrayOffset(), cb.length()); } + public long getLong() { - return Ascii.parseLong(buff, start,end-start); + return Ascii.parseLong(buff, start, end - start); } @@ -609,67 +565,75 @@ public boolean equals(Object obj) { return false; } + /** * Compares the message bytes to the specified String object. + * * @param s the String to compare - * @return true if the comparison succeeded, false otherwise + * @return true if the comparison succeeded, false + * otherwise */ public boolean equals(String s) { // XXX ENCODING - this only works if encoding is UTF8-compat // ( ok for tomcat, where we compare ascii - header names, etc )!!! byte[] b = buff; - int blen = end-start; - if (b == null || blen != s.length()) { + int len = end - start; + if (b == null || len != s.length()) { return false; } - int boff = start; - for (int i = 0; i < blen; i++) { - if (b[boff++] != s.charAt(i)) { + int off = start; + for (int i = 0; i < len; i++) { + if (b[off++] != s.charAt(i)) { return false; } } return true; } + /** * Compares the message bytes to the specified String object. + * * @param s the String to compare - * @return true if the comparison succeeded, false otherwise + * @return true if the comparison succeeded, false + * otherwise */ public boolean equalsIgnoreCase(String s) { byte[] b = buff; - int blen = end-start; - if (b == null || blen != s.length()) { + int len = end - start; + if (b == null || len != s.length()) { return false; } - int boff = start; - for (int i = 0; i < blen; i++) { - if (Ascii.toLower(b[boff++]) != Ascii.toLower(s.charAt(i))) { + int off = start; + for (int i = 0; i < len; i++) { + if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } return true; } - public boolean equals( ByteChunk bb ) { - return equals( bb.getBytes(), bb.getStart(), bb.getLength()); + + public boolean equals(ByteChunk bb) { + return equals(bb.getBytes(), bb.getStart(), bb.getLength()); } - public boolean equals( byte b2[], int off2, int len2) { - byte b1[]=buff; - if( b1==null && b2==null ) { + + public boolean equals(byte b2[], int off2, int len2) { + byte b1[] = buff; + if (b1 == null && b2 == null) { return true; } - int len=end-start; - if ( len2 != len || b1==null || b2==null ) { + int len = end - start; + if (len != len2 || b1 == null || b2 == null) { return false; } int off1 = start; - while ( len-- > 0) { + while (len-- > 0) { if (b1[off1++] != b2[off2++]) { return false; } @@ -677,141 +641,99 @@ public boolean equals( byte b2[], int off2, int len2) { return true; } - public boolean equals( CharChunk cc ) { - return equals( cc.getChars(), cc.getStart(), cc.getLength()); + + public boolean equals(CharChunk cc) { + return equals(cc.getChars(), cc.getStart(), cc.getLength()); } - public boolean equals( char c2[], int off2, int len2) { + + public boolean equals(char c2[], int off2, int len2) { // XXX works only for enc compatible with ASCII/UTF !!! - byte b1[]=buff; - if( c2==null && b1==null ) { + byte b1[] = buff; + if (c2 == null && b1 == null) { return true; } - if (b1== null || c2==null || end-start != len2 ) { + if (b1 == null || c2 == null || end - start != len2) { return false; } int off1 = start; - int len=end-start; + int len = end - start; - while ( len-- > 0) { - if ( (char)b1[off1++] != c2[off2++]) { + while (len-- > 0) { + if ((char) b1[off1++] != c2[off2++]) { return false; } } return true; } + /** - * Returns true if the message bytes starts with the specified string. + * Returns true if the buffer starts with the specified string. + * * @param s the string * @param pos The position + * * @return true if the start matches */ public boolean startsWithIgnoreCase(String s, int pos) { byte[] b = buff; int len = s.length(); - if (b == null || len+pos > end-start) { + if (b == null || len + pos > end - start) { return false; } - int off = start+pos; + int off = start + pos; for (int i = 0; i < len; i++) { - if (Ascii.toLower( b[off++] ) != Ascii.toLower( s.charAt(i))) { + if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } return true; } - public int indexOf( String src, int srcOff, int srcLen, int myOff ) { - char first=src.charAt( srcOff ); - - // Look for first char - int srcEnd = srcOff + srcLen; - - mainLoop: - for( int i=myOff+start; i <= (end - srcLen); i++ ) { - if( buff[i] != first ) { - continue; - } - // found first char, now look for a match - int myPos=i+1; - for( int srcPos=srcOff + 1; srcPos< srcEnd;) { - if( buff[myPos++] != src.charAt( srcPos++ )) { - continue mainLoop; - } - } - return i-start; // found it - } - return -1; - } - - // -------------------- Hash code -------------------- @Override - public int hashCode() { - if (hasHashCode) { - return hashCode; - } - int code = 0; - - code = hash(); - hashCode = code; - hasHashCode = true; - return code; + protected int getBufferElement(int index) { + return buff[index]; } - // normal hash. - public int hash() { - return hashBytes( buff, start, end-start); - } - - private static int hashBytes( byte buff[], int start, int bytesLen ) { - int max=start+bytesLen; - byte bb[]=buff; - int code=0; - for (int i = start; i < max ; i++) { - code = code * 37 + bb[i]; - } - return code; - } /** * Returns the first instance of the given character in this ByteChunk * starting at the specified byte. If the character is not found, -1 is - * returned. - *
    + * returned.
    * NOTE: This only works for characters in the range 0-127. * - * @param c The character - * @param starting The start position - * @return The position of the first instance of the character or - * -1 if the character is not found. + * @param c The character + * @param starting The start position + * @return The position of the first instance of the character or -1 if the + * character is not found. */ public int indexOf(char c, int starting) { int ret = indexOf(buff, start + starting, end, c); return (ret >= start) ? ret - start : -1; } + /** * Returns the first instance of the given character in the given byte array - * between the specified start and end. - *
    + * between the specified start and end.
    * NOTE: This only works for characters in the range 0-127. * - * @param bytes The byte array to search - * @param start The point to start searching from in the byte array - * @param end The point to stop searching in the byte array - * @param c The character to search for - * @return The position of the first instance of the character or -1 - * if the character is not found. + * @param bytes The array to search + * @param start The point to start searching from in the array + * @param end The point to stop searching in the array + * @param s The character to search for + * @return The position of the first instance of the character or -1 if the + * character is not found. */ - public static int indexOf(byte bytes[], int start, int end, char c) { + public static int indexOf(byte bytes[], int start, int end, char s) { int offset = start; while (offset < end) { - byte b=bytes[offset]; - if (b == c) { + byte b = bytes[offset]; + if (b == s) { return offset; } offset++; @@ -819,16 +741,17 @@ public static int indexOf(byte bytes[], int start, int end, char c) { return -1; } + /** * Returns the first instance of the given byte in the byte array between * the specified start and end. * * @param bytes The byte array to search * @param start The point to start searching from in the byte array - * @param end The point to stop searching in the byte array - * @param b The byte to search for - * @return The position of the first instance of the byte or -1 if the - * byte is not found. + * @param end The point to stop searching in the byte array + * @param b The byte to search for + * @return The position of the first instance of the byte or -1 if the byte + * is not found. */ public static int findByte(byte bytes[], int start, int end, byte b) { int offset = start; @@ -841,22 +764,23 @@ public static int findByte(byte bytes[], int start, int end, byte b) { return -1; } + /** * Returns the first instance of any of the given bytes in the byte array * between the specified start and end. * * @param bytes The byte array to search * @param start The point to start searching from in the byte array - * @param end The point to stop searching in the byte array - * @param b The array of bytes to search for - * @return The position of the first instance of the byte or -1 if the - * byte is not found. + * @param end The point to stop searching in the byte array + * @param b The array of bytes to search for + * @return The position of the first instance of the byte or -1 if the byte + * is not found. */ public static int findBytes(byte bytes[], int start, int end, byte b[]) { int blen = b.length; int offset = start; while (offset < end) { - for (int i = 0; i < blen; i++) { + for (int i = 0; i < blen; i++) { if (bytes[offset] == b[i]) { return offset; } @@ -866,6 +790,7 @@ public static int findBytes(byte bytes[], int start, int end, byte b[]) { return -1; } + /** * Convert specified String to a byte array. This ONLY WORKS for ascii, UTF * chars will be truncated. diff --git a/core/src/main/java/org/apache/tomcat/util/buf/CharChunk.java b/core/src/main/java/org/apache/tomcat/util/buf/CharChunk.java index 7c082b4..7cd73e9 100644 --- a/core/src/main/java/org/apache/tomcat/util/buf/CharChunk.java +++ b/core/src/main/java/org/apache/tomcat/util/buf/CharChunk.java @@ -17,74 +17,63 @@ package org.apache.tomcat.util.buf; import java.io.IOException; -import java.io.Serializable; /** - * Utilities to manipulate char chunks. While String is - * the easiest way to manipulate chars ( search, substrings, etc), - * it is known to not be the most efficient solution - Strings are - * designed as immutable and secure objects. + * Utilities to manipulate char chunks. While String is the easiest way to + * manipulate chars ( search, substrings, etc), it is known to not be the most + * efficient solution - Strings are designed as immutable and secure objects. * * @author dac@sun.com * @author James Todd [gonzo@sun.com] * @author Costin Manolache * @author Remy Maucherat */ -public final class CharChunk implements Cloneable, Serializable, CharSequence { +public final class CharChunk extends AbstractChunk implements CharSequence { private static final long serialVersionUID = 1L; - // Input interface, used when the buffer is emptied. + /** + * Input interface, used when the buffer is empty. + */ public static interface CharInputChannel { + /** * Read new characters. * * @return The number of characters read * - * @throws IOException If an I/O error occurs reading the characters + * @throws IOException If an I/O error occurs during reading */ public int realReadChars() throws IOException; } + /** - * When we need more space we'll either - * grow the buffer ( up to the limit ) or send it to a channel. + * When we need more space we'll either grow the buffer ( up to the limit ) + * or send it to a channel. */ public static interface CharOutputChannel { + /** - * Send the bytes ( usually the internal conversion buffer ). - * Expect 8k output if the buffer is full. + * Send the bytes ( usually the internal conversion buffer ). Expect 8k + * output if the buffer is full. * - * @param cbuf characters that will be written + * @param buf characters that will be written * @param off offset in the characters array * @param len length that will be written * @throws IOException If an I/O occurs while writing the characters */ - public void realWriteChars(char cbuf[], int off, int len) - throws IOException; + public void realWriteChars(char buf[], int off, int len) throws IOException; } // -------------------- - private int hashCode = 0; - // did we compute the hashcode ? - private boolean hasHashCode = false; - // char[] - private char buff[]; - - private int start; - private int end; - - private boolean isSet=false; // XXX + private char[] buff; - // -1: grow indefinitely - // maximum amount to be cached - private int limit=-1; + // transient as serialization is primarily for values via, e.g. JMX + private transient CharInputChannel in = null; + private transient CharOutputChannel out = null; - private CharInputChannel in = null; - private CharOutputChannel out = null; - - private boolean optimizedWrite=true; /** * Creates a new, uninitialized CharChunk object. @@ -92,233 +81,174 @@ public void realWriteChars(char cbuf[], int off, int len) public CharChunk() { } - public CharChunk(int size) { - allocate( size, -1 ); + + public CharChunk(int initial) { + allocate(initial, -1); } + // -------------------- - public boolean isNull() { - if( end > 0 ) { - return false; - } - return !isSet; //XXX + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); } - /** - * Resets the message bytes to an uninitialized state. - */ - public void recycle() { - // buff=null; - isSet=false; // XXX - hasHashCode = false; - start=0; - end=0; - } // -------------------- Setup -------------------- - public void allocate( int initial, int limit ) { - if( buff==null || buff.length < initial ) { - buff=new char[initial]; + public void allocate(int initial, int limit) { + if (buff == null || buff.length < initial) { + buff = new char[initial]; } - this.limit=limit; - start=0; - end=0; - isSet=true; + setLimit(limit); + start = 0; + end = 0; + isSet = true; hasHashCode = false; } - public void setOptimizedWrite(boolean optimizedWrite) { - this.optimizedWrite = optimizedWrite; - } - - public void setChars( char[] c, int off, int len ) { - buff=c; - start=off; - end=start + len; - isSet=true; - hasHashCode = false; - } - /** - * Maximum amount of data in this buffer. - * If -1 or not set, the buffer will grow indefinitely. - * Can be smaller than the current buffer size ( which will not shrink ). - * When the limit is reached, the buffer will be flushed ( if out is set ) - * or throw exception. - * @param limit The new limit + * Sets the buffer to the specified subarray of characters. + * + * @param c the characters + * @param off the start offset of the characters + * @param len the length of the characters */ - public void setLimit(int limit) { - this.limit=limit; - } - - public int getLimit() { - return limit; + public void setChars(char[] c, int off, int len) { + buff = c; + start = off; + end = start + len; + isSet = true; + hasHashCode = false; } - /** - * When the buffer is empty, read the data from the input channel. - * @param in The input channel - */ - public void setCharInputChannel(CharInputChannel in) { - this.in = in; - } /** - * When the buffer is full, write the data to the output channel. - * Also used when large amount of data is appended. - * If not set, the buffer will grow to the limit. - * @param out The output channel + * @return the buffer. */ - public void setCharOutputChannel(CharOutputChannel out) { - this.out=out; - } - - // compat - public char[] getChars() - { + public char[] getChars() { return getBuffer(); } - public char[] getBuffer() - { - return buff; - } /** - * @return the start offset of the chars. - * For output this is the end of the buffer. + * @return the buffer. */ - public int getStart() { - return start; + public char[] getBuffer() { + return buff; } - public int getOffset() { - return start; - } /** - * @param off The offset + * When the buffer is empty, read the data from the input channel. + * + * @param in The input channel */ - public void setOffset(int off) { - start=off; + public void setCharInputChannel(CharInputChannel in) { + this.in = in; } + /** - * @return the length of the bytes. + * When the buffer is full, write the data to the output channel. Also used + * when large amount of data is appended. If not set, the buffer will grow + * to the limit. + * + * @param out The output channel */ - public int getLength() { - return end-start; - } - - - public int getEnd() { - return end; + public void setCharOutputChannel(CharOutputChannel out) { + this.out = out; } - public void setEnd( int i ) { - end=i; - } - // -------------------- Adding data -------------------- + // -------------------- Adding data to the buffer -------------------- - public void append( char b ) - throws IOException - { - makeSpace( 1 ); + public void append(char b) throws IOException { + makeSpace(1); + int limit = getLimitInternal(); // couldn't make space - if( limit >0 && end >= limit ) { + if (end >= limit) { flushBuffer(); } - buff[end++]=b; + buff[end++] = b; } - public void append( CharChunk src ) - throws IOException - { - append( src.getBuffer(), src.getOffset(), src.getLength()); + + public void append(CharChunk src) throws IOException { + append(src.getBuffer(), src.getOffset(), src.getLength()); } + /** * Add data to the buffer. + * * @param src Char array * @param off Offset * @param len Length * @throws IOException Writing overflow data to the output channel failed */ - public void append( char src[], int off, int len ) - throws IOException - { + public void append(char src[], int off, int len) throws IOException { // will grow, up to limit - makeSpace( len ); - - // if we don't have limit: makeSpace can grow as it wants - if( limit < 0 ) { - // assert: makeSpace made enough space - System.arraycopy( src, off, buff, end, len ); - end+=len; - return; - } + makeSpace(len); + int limit = getLimitInternal(); // Optimize on a common case. - // If the source is going to fill up all the space in buffer, may - // as well write it directly to the output, and avoid an extra copy - if ( optimizedWrite && len == limit && end == start && out != null ) { - out.realWriteChars( src, off, len ); + // If the buffer is empty and the source is going to fill up all the + // space in buffer, may as well write it directly to the output, + // and avoid an extra copy + if (len == limit && end == start && out != null) { + out.realWriteChars(src, off, len); return; } - // if we have limit and we're below - if( len <= limit - end ) { - // makeSpace will grow the buffer to the limit, - // so we have space - System.arraycopy( src, off, buff, end, len ); - - end+=len; + // if we are below the limit + if (len <= limit - end) { + System.arraycopy(src, off, buff, end, len); + end += len; return; } - // need more space than we can afford, need to flush - // buffer + // Need more space than we can afford, need to flush buffer. - // the buffer is already at ( or bigger than ) limit + // The buffer is already at (or bigger than) limit. // Optimization: - // If len-avail < length ( i.e. after we fill the buffer with - // what we can, the remaining will fit in the buffer ) we'll just - // copy the first part, flush, then copy the second part - 1 write - // and still have some space for more. We'll still have 2 writes, but - // we write more on the first. - - if( len + end < 2 * limit ) { - /* If the request length exceeds the size of the output buffer, - flush the output buffer and then write the data directly. - We can't avoid 2 writes, but we can write more on the second - */ - int avail=limit-end; + // If len-avail < length (i.e. after we fill the buffer with what we + // can, the remaining will fit in the buffer) we'll just copy the first + // part, flush, then copy the second part - 1 write and still have some + // space for more. We'll still have 2 writes, but we write more on the first. + + if (len + end < 2 * limit) { + /* + * If the request length exceeds the size of the output buffer, + * flush the output buffer and then write the data directly. We + * can't avoid 2 writes, but we can write more on the second + */ + int avail = limit - end; System.arraycopy(src, off, buff, end, avail); end += avail; flushBuffer(); - System.arraycopy(src, off+avail, buff, end, len - avail); - end+= len - avail; + System.arraycopy(src, off + avail, buff, end, len - avail); + end += len - avail; - } else { // len > buf.length + avail + } else { // len > buf.length + avail // long write - flush the buffer and write the rest // directly from source flushBuffer(); - out.realWriteChars( src, off, len ); + out.realWriteChars(src, off, len); } } /** * Append a string to the buffer. + * * @param s The string * @throws IOException Writing overflow data to the output channel failed */ @@ -326,34 +256,29 @@ public void append(String s) throws IOException { append(s, 0, s.length()); } + /** * Append a string to the buffer. + * * @param s The string * @param off Offset * @param len Length * @throws IOException Writing overflow data to the output channel failed */ public void append(String s, int off, int len) throws IOException { - if (s==null) { + if (s == null) { return; } // will grow, up to limit - makeSpace( len ); - - // if we don't have limit: makeSpace can grow as it wants - if( limit < 0 ) { - // assert: makeSpace made enough space - s.getChars(off, off+len, buff, end ); - end+=len; - return; - } + makeSpace(len); + int limit = getLimitInternal(); int sOff = off; int sEnd = off + len; while (sOff < sEnd) { int d = min(limit - end, sEnd - sOff); - s.getChars( sOff, sOff+d, buff, end); + s.getChars(sOff, sOff + d, buff, end); sOff += d; end += d; if (end >= limit) { @@ -362,32 +287,21 @@ public void append(String s, int off, int len) throws IOException { } } + // -------------------- Removing data from the buffer -------------------- public int substract() throws IOException { - if ((end - start) == 0) { - if (in == null) { - return -1; - } - int n = in.realReadChars(); - if (n < 0) { - return -1; - } + if (checkEof()) { + return -1; } - return (buff[start++]); + return buff[start++]; } + public int substract(char dest[], int off, int len) throws IOException { - if ((end - start) == 0) { - if (in == null) { - return -1; - } - int n = in.realReadChars(); - if (n < 0) { - return -1; - } + if (checkEof()) { + return -1; } - int n = len; if (len > getLength()) { n = getLength(); @@ -398,80 +312,104 @@ public int substract(char dest[], int off, int len) throws IOException { } + private boolean checkEof() throws IOException { + if ((end - start) == 0) { + if (in == null) { + return true; + } + int n = in.realReadChars(); + if (n < 0) { + return true; + } + } + return false; + } + + + /** + * Send the buffer to the sink. Called by append() when the limit is + * reached. You can also call it explicitly to force the data to be written. + * + * @throws IOException Writing overflow data to the output channel failed + */ public void flushBuffer() throws IOException { - //assert out!=null - if( out==null ) { - throw new IOException( "Buffer overflow, no sink " + limit + " " + - buff.length ); + // assert out!=null + if (out == null) { + throw new IOException("Buffer overflow, no sink " + getLimit() + " " + buff.length); } - out.realWriteChars( buff, start, end - start ); - end=start; + out.realWriteChars(buff, start, end - start); + end = start; } + /** - * Make space for len chars. If len is small, allocate - * a reserve space too. Never grow bigger than limit. + * Make space for len chars. If len is small, allocate a reserve space too. + * Never grow bigger than the limit or {@link AbstractChunk#ARRAY_MAX_SIZE}. + * * @param count The size */ - public void makeSpace(int count) - { + public void makeSpace(int count) { char[] tmp = null; - int newSize; - int desiredSize=end + count; + int limit = getLimitInternal(); + + long newSize; + long desiredSize = end + count; // Can't grow above the limit - if( limit > 0 && - desiredSize > limit) { - desiredSize=limit; + if (desiredSize > limit) { + desiredSize = limit; } - if( buff==null ) { - if( desiredSize < 256 ) - { - desiredSize=256; // take a minimum + if (buff == null) { + if (desiredSize < 256) { + desiredSize = 256; // take a minimum } - buff=new char[desiredSize]; + buff = new char[(int) desiredSize]; } - // limit < buf.length ( the buffer is already big ) + // limit < buf.length (the buffer is already big) // or we already have space XXX - if( desiredSize <= buff.length) { + if (desiredSize <= buff.length) { return; } // grow in larger chunks - if( desiredSize < 2 * buff.length ) { - newSize= buff.length * 2; + if (desiredSize < 2L * buff.length) { + newSize = buff.length * 2L; } else { - newSize= buff.length * 2 + count ; + newSize = buff.length * 2L + count; } - if (limit > 0 && newSize > limit) { + if (newSize > limit) { newSize = limit; } - tmp = new char[newSize]; + tmp = new char[(int) newSize]; + // Some calling code assumes buffer will not be compacted System.arraycopy(buff, 0, tmp, 0, end); buff = tmp; tmp = null; } + // -------------------- Conversion and getters -------------------- @Override public String toString() { if (null == buff) { return null; - } else if (end-start == 0) { + } else if (end - start == 0) { return ""; } return StringCache.toString(this); } + public String toStringInternal() { - return new String(buff, start, end-start); + return new String(buff, start, end - start); } + // -------------------- equals -------------------- @Override @@ -482,14 +420,17 @@ public boolean equals(Object obj) { return false; } + /** * Compares the message bytes to the specified String object. + * * @param s the String to compare - * @return true if the comparison succeeded, false otherwise + * @return true if the comparison succeeded, false + * otherwise */ public boolean equals(String s) { char[] c = buff; - int len = end-start; + int len = end - start; if (c == null || len != s.length()) { return false; } @@ -502,42 +443,49 @@ public boolean equals(String s) { return true; } + /** * Compares the message bytes to the specified String object. + * * @param s the String to compare - * @return true if the comparison succeeded, false otherwise + * @return true if the comparison succeeded, false + * otherwise */ public boolean equalsIgnoreCase(String s) { char[] c = buff; - int len = end-start; + int len = end - start; if (c == null || len != s.length()) { return false; } int off = start; for (int i = 0; i < len; i++) { - if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) { + if (Ascii.toLower(c[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } return true; } + public boolean equals(CharChunk cc) { - return equals( cc.getChars(), cc.getOffset(), cc.getLength()); + return equals(cc.getChars(), cc.getOffset(), cc.getLength()); } + public boolean equals(char b2[], int off2, int len2) { - char b1[]=buff; - if( b1==null && b2==null ) { + char b1[] = buff; + if (b1 == null && b2 == null) { return true; } - if (b1== null || b2==null || end-start != len2) { + int len = end - start; + if (len != len2 || b1 == null || b2 == null) { return false; } + int off1 = start; - int len=end-start; - while ( len-- > 0) { + + while (len-- > 0) { if (b1[off1++] != b2[off2++]) { return false; } @@ -545,14 +493,16 @@ public boolean equals(char b2[], int off2, int len2) { return true; } + /** - * @return true if the message bytes starts with the specified string. + * @return true if the message bytes starts with the specified + * string. * @param s The string */ public boolean startsWith(String s) { char[] c = buff; int len = s.length(); - if (c == null || len > end-start) { + if (c == null || len > end - start) { return false; } int off = start; @@ -564,20 +514,24 @@ public boolean startsWith(String s) { return true; } + /** - * @return true if the message bytes starts with the specified string. - * @param s The string - * @param pos The position at which the comparison will be made + * Returns true if the buffer starts with the specified string. + * + * @param s the string + * @param pos The position + * + * @return true if the start matches */ public boolean startsWithIgnoreCase(String s, int pos) { char[] c = buff; int len = s.length(); - if (c == null || len+pos > end-start) { + if (c == null || len + pos > end - start) { return false; } - int off = start+pos; + int off = start + pos; for (int i = 0; i < len; i++) { - if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) { + if (Ascii.toLower(c[off++]) != Ascii.toLower(s.charAt(i))) { return false; } } @@ -586,13 +540,14 @@ public boolean startsWithIgnoreCase(String s, int pos) { /** - * @return true if the message bytes end with the specified string. + * @return true if the message bytes end with the specified + * string. * @param s The string */ public boolean endsWith(String s) { char[] c = buff; int len = s.length(); - if (c == null || len > end-start) { + if (c == null || len > end - start) { return false; } int off = end - len; @@ -604,82 +559,59 @@ public boolean endsWith(String s) { return true; } - // -------------------- Hash code -------------------- @Override - public int hashCode() { - if (hasHashCode) { - return hashCode; - } - int code = 0; - - code = hash(); - hashCode = code; - hasHashCode = true; - return code; + protected int getBufferElement(int index) { + return buff[index]; } - // normal hash. - public int hash() { - int code=0; - for (int i = start; i < start + end-start; i++) { - code = code * 37 + buff[i]; - } - return code; - } public int indexOf(char c) { - return indexOf( c, start); + return indexOf(c, start); } + /** - * @return true if the message bytes starts with the specified string. - * @param c the character - * @param starting Start position + * Returns the first instance of the given character in this CharChunk + * starting at the specified char. If the character is not found, -1 is + * returned.
    + * + * @param c The character + * @param starting The start position + * @return The position of the first instance of the character or -1 if the + * character is not found. */ public int indexOf(char c, int starting) { - int ret = indexOf( buff, start+starting, end, c ); + int ret = indexOf(buff, start + starting, end, c); return (ret >= start) ? ret - start : -1; } - public static int indexOf( char chars[], int off, int cend, char qq ) - { - while( off < cend ) { - char b=chars[off]; - if( b==qq ) { - return off; - } - off++; - } - return -1; - } - - public int indexOf( String src, int srcOff, int srcLen, int myOff ) { - char first=src.charAt( srcOff ); - - // Look for first char - int srcEnd = srcOff + srcLen; + /** + * Returns the first instance of the given character in the given char array + * between the specified start and end.
    + * + * @param chars The array to search + * @param start The point to start searching from in the array + * @param end The point to stop searching in the array + * @param s The character to search for + * @return The position of the first instance of the character or -1 if the + * character is not found. + */ + public static int indexOf(char chars[], int start, int end, char s) { + int offset = start; - for( int i=myOff+start; i <= (end - srcLen); i++ ) { - if( buff[i] != first ) { - continue; - } - // found first char, now look for a match - int myPos=i+1; - for( int srcPos=srcOff + 1; srcPos< srcEnd;) { - if( buff[myPos++] != src.charAt( srcPos++ )) { - break; - } - if( srcPos==srcEnd ) - { - return i-start; // found it - } + while (offset < end) { + char c = chars[offset]; + if (c == s) { + return offset; } + offset++; } return -1; } + // -------------------- utils private int min(int a, int b) { if (a < b) { @@ -688,6 +620,7 @@ private int min(int a, int b) { return b; } + // Char sequence impl @Override @@ -695,6 +628,7 @@ public char charAt(int index) { return buff[index + start]; } + @Override public CharSequence subSequence(int start, int end) { try { @@ -708,9 +642,21 @@ public CharSequence subSequence(int start, int end) { } } + @Override public int length() { return end - start; } + /** + * NO-OP. + * + * @param optimizedWrite Ignored + * + * @deprecated Unused code. This is now a NO-OP and will be removed without + * replacement in Tomcat 10. + */ + @Deprecated + public void setOptimizedWrite(boolean optimizedWrite) { + } } diff --git a/core/src/main/java/org/apache/tomcat/util/buf/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/buf/LocalStrings.properties index 6df7da3..c8a8d3b 100644 --- a/core/src/main/java/org/apache/tomcat/util/buf/LocalStrings.properties +++ b/core/src/main/java/org/apache/tomcat/util/buf/LocalStrings.properties @@ -19,7 +19,8 @@ c2bConverter.recycleFailed=Failed to recycle the C2B Converter. Creating new Buf hexUtils.fromHex.oddDigits=The input must consist of an even number of hex digits hexUtils.fromHex.nonHex=The input must consist only of hex digits -uDecoder.urlDecode.missingDigit=The % character must be followed by two hexademical digits +uDecoder.urlDecode.conversionError=Failed to decode [{0}] using character set [{1}] +uDecoder.urlDecode.missingDigit=Failed to decode [{0}] because the % character must be followed by two hexademical digits uDecoder.convertHexDigit.notHex=[{0}] is not a hexadecimal digit byteBufferUtils.cleaner=Cannot use direct ByteBuffer cleaner, memory leaking may occur diff --git a/core/src/main/java/org/apache/tomcat/util/buf/MessageBytes.java b/core/src/main/java/org/apache/tomcat/util/buf/MessageBytes.java index 6b9d275..728accc 100644 --- a/core/src/main/java/org/apache/tomcat/util/buf/MessageBytes.java +++ b/core/src/main/java/org/apache/tomcat/util/buf/MessageBytes.java @@ -81,6 +81,11 @@ public static MessageBytes newInstance() { return factory.newInstance(); } + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + public boolean isNull() { return byteC.isNull() && charC.isNull() && ! hasStrValue; } diff --git a/core/src/main/java/org/apache/tomcat/util/buf/StringUtils.java b/core/src/main/java/org/apache/tomcat/util/buf/StringUtils.java index 292d7f4..2a9eeb0 100644 --- a/core/src/main/java/org/apache/tomcat/util/buf/StringUtils.java +++ b/core/src/main/java/org/apache/tomcat/util/buf/StringUtils.java @@ -23,7 +23,8 @@ /** * Utility methods to build a separated list from a given set (not * java.util.Set) of inputs and return that list as a string or append it to an - * existing StringBuilder. + * existing StringBuilder. If the given set is null or empty, an empty string + * will be returned. */ public final class StringUtils { @@ -35,11 +36,17 @@ private StringUtils() { public static String join(String[] array) { + if (array == null) { + return EMPTY_STRING; + } return join(Arrays.asList(array)); } public static void join(String[] array, char separator, StringBuilder sb) { + if (array == null) { + return; + } join(Arrays.asList(array), separator, sb); } @@ -51,7 +58,7 @@ public static String join(Collection collection) { public static String join(Collection collection, char separator) { // Shortcut - if (collection.isEmpty()) { + if (collection == null || collection.isEmpty()) { return EMPTY_STRING; } @@ -68,12 +75,18 @@ public static void join(Iterable iterable, char separator, StringBuilder public static void join(T[] array, char separator, Function function, StringBuilder sb) { + if (array == null) { + return; + } join(Arrays.asList(array), separator, function, sb); } public static void join(Iterable iterable, char separator, Function function, StringBuilder sb) { + if (iterable == null) { + return; + } boolean first = true; for (T value : iterable) { if (first) { diff --git a/core/src/main/java/org/apache/tomcat/util/buf/UDecoder.java b/core/src/main/java/org/apache/tomcat/util/buf/UDecoder.java index d431765..6403456 100644 --- a/core/src/main/java/org/apache/tomcat/util/buf/UDecoder.java +++ b/core/src/main/java/org/apache/tomcat/util/buf/UDecoder.java @@ -16,8 +16,10 @@ */ package org.apache.tomcat.util.buf; +import java.io.ByteArrayOutputStream; import java.io.CharConversionException; import java.io.IOException; +import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -121,8 +123,6 @@ public void convert( ByteChunk mb, boolean query ) } mb.setEnd( idx ); - - return; } // -------------------- Additional methods -------------------- @@ -319,39 +319,67 @@ public static String URLDecode(String str, Charset charset) { return null; } - byte[] bytes = str.getBytes(StandardCharsets.US_ASCII); + if (str.indexOf('%') == -1) { + // No %nn sequences, so return string unchanged + return str; + } if (charset == null) { charset = StandardCharsets.UTF_8; } - int len = bytes.length; + /* + * Decoding is required. + * + * Potential complications: + * - The source String may be partially decoded so it is not valid to + * assume that the source String is ASCII. + * - Have to process as characters since there is no guarantee that the + * byte sequence for '%' is going to be the same in all character + * sets. + * - We don't know how many '%nn' sequences are required for a single + * character. It varies between character sets and some use a variable + * length. + */ + + // This isn't perfect but it is a reasonable guess for the size of the + // array required + ByteArrayOutputStream baos = new ByteArrayOutputStream(str.length() * 2); + + OutputStreamWriter osw = new OutputStreamWriter(baos, charset); + + char[] sourceChars = str.toCharArray(); + int len = sourceChars.length; int ix = 0; - int ox = 0; - while (ix < len) { - byte b = bytes[ix++]; // Get byte to test - if (b == '%') { - if (ix + 2 > len) { - throw new IllegalArgumentException( - sm.getString("uDecoder.urlDecode.missingDigit")); + + try { + while (ix < len) { + char c = sourceChars[ix++]; + if (c == '%') { + osw.flush(); + if (ix + 2 > len) { + throw new IllegalArgumentException( + sm.getString("uDecoder.urlDecode.missingDigit", str)); + } + char c1 = sourceChars[ix++]; + char c2 = sourceChars[ix++]; + if (isHexDigit(c1) && isHexDigit(c2)) { + baos.write(x2c(c1, c2)); + } else { + throw new IllegalArgumentException( + sm.getString("uDecoder.urlDecode.missingDigit", str)); + } + } else { + osw.append(c); } - b = (byte) ((convertHexDigit(bytes[ix++]) << 4) - + convertHexDigit(bytes[ix++])); } - bytes[ox++] = b; - } + osw.flush(); - return new String(bytes, 0, ox, charset); - } - - - private static byte convertHexDigit( byte b ) { - if ((b >= '0') && (b <= '9')) return (byte)(b - '0'); - if ((b >= 'a') && (b <= 'f')) return (byte)(b - 'a' + 10); - if ((b >= 'A') && (b <= 'F')) return (byte)(b - 'A' + 10); - throw new IllegalArgumentException( - sm.getString("uDecoder.convertHexDigit.notHex", - Character.valueOf((char)b))); + return baos.toString(charset.name()); + } catch (IOException ioe) { + throw new IllegalArgumentException( + sm.getString("uDecoder.urlDecode.conversionError", str, charset.name()), ioe); + } } diff --git a/core/src/main/java/org/apache/tomcat/util/buf/UriUtil.java b/core/src/main/java/org/apache/tomcat/util/buf/UriUtil.java index acb2f0c..6eecfda 100644 --- a/core/src/main/java/org/apache/tomcat/util/buf/UriUtil.java +++ b/core/src/main/java/org/apache/tomcat/util/buf/UriUtil.java @@ -121,13 +121,12 @@ public static URL buildJarUrl(String fileUrlString) throws MalformedURLException public static URL buildJarUrl(String fileUrlString, String entryPath) throws MalformedURLException { String safeString = makeSafeForJarUrl(fileUrlString); StringBuilder sb = new StringBuilder(); - sb.append("jar:"); sb.append(safeString); sb.append("!/"); if (entryPath != null) { sb.append(makeSafeForJarUrl(entryPath)); } - return new URL(sb.toString()); + return new URL("jar", null, -1, sb.toString()); } diff --git a/core/src/main/java/org/apache/tomcat/util/buf/package.html b/core/src/main/java/org/apache/tomcat/util/buf/package.html index 389cd86..e25fef9 100644 --- a/core/src/main/java/org/apache/tomcat/util/buf/package.html +++ b/core/src/main/java/org/apache/tomcat/util/buf/package.html @@ -34,5 +34,4 @@

    Buffers and Encodings

    My benchmarks ( I'm costin :-) show only small differences between C2B, B2C and hand-written codders/decoders, so UTF8Decoder may be disabled. -

    diff --git a/core/src/main/java/org/apache/tomcat/util/codec/binary/Base64.java b/core/src/main/java/org/apache/tomcat/util/codec/binary/Base64.java index 5496fed..9f17e37 100644 --- a/core/src/main/java/org/apache/tomcat/util/codec/binary/Base64.java +++ b/core/src/main/java/org/apache/tomcat/util/codec/binary/Base64.java @@ -550,7 +550,7 @@ public static byte[] encodeBase64(final byte[] binaryData) { * @since 1.4 (NOTE: 1.4 chunked the output, whereas 1.5 does not). */ public static String encodeBase64String(final byte[] binaryData) { - return StringUtils.newStringUtf8(encodeBase64(binaryData, false)); + return StringUtils.newStringUsAscii(encodeBase64(binaryData, false)); } /** @@ -576,7 +576,7 @@ public static byte[] encodeBase64URLSafe(final byte[] binaryData) { * @since 1.4 */ public static String encodeBase64URLSafeString(final byte[] binaryData) { - return StringUtils.newStringUtf8(encodeBase64(binaryData, false, true)); + return StringUtils.newStringUsAscii(encodeBase64(binaryData, false, true)); } /** diff --git a/core/src/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java b/core/src/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java index 5a3929e..4541356 100644 --- a/core/src/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java +++ b/core/src/main/java/org/apache/tomcat/util/codec/binary/BaseNCodec.java @@ -42,12 +42,6 @@ static class Context { */ int ibitWorkArea; - /** - * Place holder for the bytes we're dealing with for our based logic. - * Bitwise operations store and extract the encoding or decoding from this variable. - */ - long lbitWorkArea; - /** * Buffer for streaming. */ @@ -93,10 +87,10 @@ static class Context { @Override public String toString() { return String.format("%s[buffer=%s, currentLinePos=%s, eof=%s, " + - "ibitWorkArea=%s, lbitWorkArea=%s, modulus=%s, pos=%s, " + + "ibitWorkArea=%s, modulus=%s, pos=%s, " + "readPos=%s]", this.getClass().getSimpleName(), HexUtils.toHexString(buffer), currentLinePos, eof, - ibitWorkArea, lbitWorkArea, modulus, pos, readPos); + ibitWorkArea, modulus, pos, readPos); } } @@ -326,6 +320,8 @@ public String encodeToString(final byte[] pArray) { * * @param pArray a byte array containing binary data * @return String containing only character data in the appropriate alphabet. + * @since 1.5 + * This is a duplicate of {@link #encodeToString(byte[])}; it was merged during refactoring. */ public String encodeAsString(final byte[] pArray){ return StringUtils.newStringUtf8(encode(pArray)); @@ -392,7 +388,7 @@ public byte[] encode(final byte[] pArray) { * @return A byte array containing only the base N alphabetic character data * @since 1.11 */ - public byte[] encode(final byte[] pArray, int offset, int length) { + public byte[] encode(final byte[] pArray, final int offset, final int length) { if (pArray == null || pArray.length == 0) { return pArray; } @@ -431,7 +427,7 @@ public byte[] encode(final byte[] pArray, int offset, int length) { * false, otherwise */ public boolean isInAlphabet(final byte[] arrayOctet, final boolean allowWSPad) { - for (byte octet : arrayOctet) { + for (final byte octet : arrayOctet) { if (!isInAlphabet(octet) && (!allowWSPad || (octet != pad) && !isWhiteSpace(octet))) { return false; diff --git a/core/src/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java b/core/src/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java index 00f32f2..f2a92b4 100644 --- a/core/src/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java +++ b/core/src/main/java/org/apache/tomcat/util/codec/binary/StringUtils.java @@ -21,12 +21,12 @@ /** * Converts String to and from bytes using the encodings required by the Java specification. These encodings are - * specified in + * specified in * Standard charsets. * *

    This class is immutable and thread-safe.

    * - * @see Standard charsets + * @see Standard charsets * @since 1.4 */ public class StringUtils { @@ -54,7 +54,7 @@ private static byte[] getBytes(final String string, final Charset charset) { * @param string * the String to encode, may be null * @return encoded bytes, or null if the input string was null - * @see Standard charsets + * @see Standard charsets */ public static byte[] getBytesUtf8(final String string) { return getBytes(string, StandardCharsets.UTF_8); @@ -74,6 +74,18 @@ private static String newString(final byte[] bytes, final Charset charset) { return bytes == null ? null : new String(bytes, charset); } + /** + * Constructs a new String by decoding the specified array of bytes using the US-ASCII charset. + * + * @param bytes + * The bytes to be decoded into characters + * @return A new String decoded from the specified array of bytes using the US-ASCII charset, + * or null if the input byte array was null. + */ + public static String newStringUsAscii(final byte[] bytes) { + return newString(bytes, StandardCharsets.US_ASCII); + } + /** * Constructs a new String by decoding the specified array of bytes using the UTF-8 charset. * diff --git a/core/src/main/java/org/apache/tomcat/util/compat/Jre9Compat.java b/core/src/main/java/org/apache/tomcat/util/compat/Jre9Compat.java index 0ce41a2..193ea5b 100644 --- a/core/src/main/java/org/apache/tomcat/util/compat/Jre9Compat.java +++ b/core/src/main/java/org/apache/tomcat/util/compat/Jre9Compat.java @@ -16,35 +16,119 @@ */ package org.apache.tomcat.util.compat; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.net.URLConnection; +import java.util.Deque; +import java.util.Set; +import java.util.jar.JarFile; +import java.util.zip.ZipFile; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLParameters; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.util.res.StringManager; + class Jre9Compat extends JreCompat { + private static final Log log = LogFactory.getLog(Jre9Compat.class); + private static final StringManager sm = StringManager.getManager(Jre9Compat.class); + private static final Class inaccessibleObjectExceptionClazz; private static final Method setApplicationProtocolsMethod; private static final Method getApplicationProtocolMethod; + private static final Method setDefaultUseCachesMethod; + private static final Method bootMethod; + private static final Method configurationMethod; + private static final Method modulesMethod; + private static final Method referenceMethod; + private static final Method locationMethod; + private static final Method isPresentMethod; + private static final Method getMethod; + private static final Constructor jarFileConstructor; + private static final Method isMultiReleaseMethod; + + private static final Object RUNTIME_VERSION; + private static final int RUNTIME_MAJOR_VERSION; static { Class c1 = null; Method m2 = null; Method m3 = null; + Method m4 = null; + Method m5 = null; + Method m6 = null; + Method m7 = null; + Method m8 = null; + Method m9 = null; + Method m10 = null; + Method m11 = null; + Constructor c12 = null; + Method m13 = null; + Object o14 = null; + Object o15 = null; try { + Class moduleLayerClazz = Class.forName("java.lang.ModuleLayer"); + Class configurationClazz = Class.forName("java.lang.module.Configuration"); + Class resolvedModuleClazz = Class.forName("java.lang.module.ResolvedModule"); + Class moduleReferenceClazz = Class.forName("java.lang.module.ModuleReference"); + Class optionalClazz = Class.forName("java.util.Optional"); + Class versionClazz = Class.forName("java.lang.Runtime$Version"); + Method runtimeVersionMethod = JarFile.class.getMethod("runtimeVersion"); + Method majorMethod = versionClazz.getMethod("major"); + c1 = Class.forName("java.lang.reflect.InaccessibleObjectException"); m2 = SSLParameters.class.getMethod("setApplicationProtocols", String[].class); m3 = SSLEngine.class.getMethod("getApplicationProtocol"); - } catch (SecurityException | NoSuchMethodException e) { - // Should never happen + m4 = URLConnection.class.getMethod("setDefaultUseCaches", String.class, boolean.class); + m5 = moduleLayerClazz.getMethod("boot"); + m6 = moduleLayerClazz.getMethod("configuration"); + m7 = configurationClazz.getMethod("modules"); + m8 = resolvedModuleClazz.getMethod("reference"); + m9 = moduleReferenceClazz.getMethod("location"); + m10 = optionalClazz.getMethod("isPresent"); + m11 = optionalClazz.getMethod("get"); + c12 = JarFile.class.getConstructor(File.class, boolean.class, int.class, versionClazz); + m13 = JarFile.class.getMethod("isMultiRelease"); + o14 = runtimeVersionMethod.invoke(null); + o15 = majorMethod.invoke(o14); + } catch (ClassNotFoundException e) { // Must be Java 8 + } catch (ReflectiveOperationException | IllegalArgumentException e) { + // Should never happen } + inaccessibleObjectExceptionClazz = c1; setApplicationProtocolsMethod = m2; getApplicationProtocolMethod = m3; + setDefaultUseCachesMethod = m4; + bootMethod = m5; + configurationMethod = m6; + modulesMethod = m7; + referenceMethod = m8; + locationMethod = m9; + isPresentMethod = m10; + getMethod = m11; + jarFileConstructor = c12; + isMultiReleaseMethod = m13; + + RUNTIME_VERSION = o14; + if (o15 != null) { + RUNTIME_MAJOR_VERSION = ((Integer) o15).intValue(); + } else { + // Must be Java 8 + RUNTIME_MAJOR_VERSION = 8; + } } @@ -81,4 +165,67 @@ public String getApplicationProtocol(SSLEngine sslEngine) { throw new UnsupportedOperationException(e); } } + + + @Override + public void disableCachingForJarUrlConnections() throws IOException { + try { + setDefaultUseCachesMethod.invoke(null, "JAR", Boolean.FALSE); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new UnsupportedOperationException(e); + } + } + + + @Override + public void addBootModulePath(Deque classPathUrlsToProcess) { + try { + Object bootLayer = bootMethod.invoke(null); + Object bootConfiguration = configurationMethod.invoke(bootLayer); + Set resolvedModules = (Set) modulesMethod.invoke(bootConfiguration); + for (Object resolvedModule : resolvedModules) { + Object moduleReference = referenceMethod.invoke(resolvedModule); + Object optionalURI = locationMethod.invoke(moduleReference); + Boolean isPresent = (Boolean) isPresentMethod.invoke(optionalURI); + if (isPresent.booleanValue()) { + URI uri = (URI) getMethod.invoke(optionalURI); + try { + URL url = uri.toURL(); + classPathUrlsToProcess.add(url); + } catch (MalformedURLException e) { + log.warn(sm.getString("jre9Compat.invalidModuleUri", uri), e); + } + } + } + } catch (ReflectiveOperationException e) { + throw new UnsupportedOperationException(e); + } + } + + + @Override + public JarFile jarFileNewInstance(File f) throws IOException { + try { + return jarFileConstructor.newInstance( + f, Boolean.TRUE, Integer.valueOf(ZipFile.OPEN_READ), RUNTIME_VERSION); + } catch (ReflectiveOperationException | IllegalArgumentException e) { + throw new IOException(e); + } + } + + + @Override + public boolean jarFileIsMultiRelease(JarFile jarFile) { + try { + return ((Boolean) isMultiReleaseMethod.invoke(jarFile)).booleanValue(); + } catch (ReflectiveOperationException | IllegalArgumentException e) { + return false; + } + } + + + @Override + public int jarFileRuntimeMajorVersion() { + return RUNTIME_MAJOR_VERSION; + } } diff --git a/core/src/main/java/org/apache/tomcat/util/compat/JreCompat.java b/core/src/main/java/org/apache/tomcat/util/compat/JreCompat.java index 49c54a5..5e7fc68 100644 --- a/core/src/main/java/org/apache/tomcat/util/compat/JreCompat.java +++ b/core/src/main/java/org/apache/tomcat/util/compat/JreCompat.java @@ -16,6 +16,13 @@ */ package org.apache.tomcat.util.compat; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import java.util.Deque; +import java.util.jar.JarFile; + import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLParameters; @@ -28,16 +35,14 @@ */ public class JreCompat { + private static final int RUNTIME_MAJOR_VERSION = 8; + private static final JreCompat instance; private static final boolean jre9Available; private static final StringManager sm = StringManager.getManager(JreCompat.class); static { // This is Tomcat 9 with a minimum Java version of Java 8. - // At this point there are no option features that require Java > 8 but - // the memory leak detection code does need to know if it is running on - // Java 9+ since the modularisation changes break some of the reflection - // used // Look for the highest supported JVM first if (Jre9Compat.isSupported()) { instance = new Jre9Compat(); @@ -100,4 +105,81 @@ public void setApplicationProtocols(SSLParameters sslParameters, String[] protoc public String getApplicationProtocol(SSLEngine sslEngine) { throw new UnsupportedOperationException(sm.getString("jreCompat.noApplicationProtocol")); } + + + /** + * Disables caching for JAR URL connections. For Java 8 and earlier, this also disables + * caching for ALL URL connections. + * + * @throws IOException If a dummy JAR URLConnection can not be created + */ + public void disableCachingForJarUrlConnections() throws IOException { + // Doesn't matter that this JAR doesn't exist - just as + // long as the URL is well-formed + URL url = new URL("jar:file://dummy.jar!/"); + URLConnection uConn = url.openConnection(); + uConn.setDefaultUseCaches(false); + } + + + /** + * Obtains the URLs for all the JARs on the module path when the JVM starts + * and adds them to the provided Deque. + * + * @param classPathUrlsToProcess The Deque to which the modules should be + * added + */ + public void addBootModulePath(Deque classPathUrlsToProcess) { + // NO-OP for Java 8. There is no module path. + } + + + /** + * Creates a new JarFile instance. When running on Java 9 and later, the + * JarFile will be multi-release JAR aware. While this isn't strictly + * required to be in this package, it is provided as a convenience method. + * + * @param s The JAR file to open + * + * @return A JarFile instance based on the provided path + * + * @throws IOException If an I/O error occurs creating the JarFile instance + */ + public final JarFile jarFileNewInstance(String s) throws IOException { + return jarFileNewInstance(new File(s)); + } + + + /** + * Creates a new JarFile instance. When running on Java 9 and later, the + * JarFile will be multi-release JAR aware. + * + * @param f The JAR file to open + * + * @return A JarFile instance based on the provided file + * + * @throws IOException If an I/O error occurs creating the JarFile instance + */ + public JarFile jarFileNewInstance(File f) throws IOException { + return new JarFile(f); + } + + + /** + * Is this JarFile a multi-release JAR file. + * + * @param jarFile The JarFile to test + * + * @return {@code true} If it is a multi-release JAR file and is configured + * to behave as such. + */ + public boolean jarFileIsMultiRelease(JarFile jarFile) { + // Java 8 doesn't support multi-release so default to false + return false; + } + + + public int jarFileRuntimeMajorVersion() { + return RUNTIME_MAJOR_VERSION; + } } diff --git a/core/src/main/java/org/apache/tomcat/util/compat/JrePlatform.java b/core/src/main/java/org/apache/tomcat/util/compat/JrePlatform.java new file mode 100644 index 0000000..dccbd9a --- /dev/null +++ b/core/src/main/java/org/apache/tomcat/util/compat/JrePlatform.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 org.apache.tomcat.util.compat; + +import java.security.AccessController; +import java.security.PrivilegedAction; + +public class JrePlatform { + + private static final String OS_NAME_PROPERTY = "os.name"; + private static final String OS_NAME_WINDOWS_PREFIX = "Windows"; + + static { + /* + * There are a few places where a) the behaviour of the Java API depends + * on the underlying platform and b) those behavioural differences have + * an impact on Tomcat. + * + * Tomcat therefore needs to be able to determine the platform it is + * running on to account for those differences. + * + * In an ideal world this code would not exist. + */ + + // This check is derived from the check in Apache Commons Lang + String osName; + if (System.getSecurityManager() == null) { + osName = System.getProperty(OS_NAME_PROPERTY); + } else { + osName = AccessController.doPrivileged( + new PrivilegedAction() { + + @Override + public String run() { + return System.getProperty(OS_NAME_PROPERTY); + } + }); + } + + IS_WINDOWS = osName.startsWith(OS_NAME_WINDOWS_PREFIX); + } + + + public static final boolean IS_WINDOWS; +} diff --git a/core/src/main/java/org/apache/tomcat/util/compat/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/compat/LocalStrings.properties index c9c42bd..e95e2d0 100644 --- a/core/src/main/java/org/apache/tomcat/util/compat/LocalStrings.properties +++ b/core/src/main/java/org/apache/tomcat/util/compat/LocalStrings.properties @@ -14,4 +14,6 @@ # limitations under the License. jreCompat.noApplicationProtocols=Java Runtime does not support SSLParameters.setApplicationProtocols(). You must use Java 9 to use this feature. -jreCompat.noApplicationProtocol=Java Runtime does not support SSLEngine.getApplicationProtocol(). You must use Java 9 to use this feature. \ No newline at end of file +jreCompat.noApplicationProtocol=Java Runtime does not support SSLEngine.getApplicationProtocol(). You must use Java 9 to use this feature. + +jre9Compat.invalidModuleUri=The module URI provided [{0}] could not be converted to a URL for the JarScanner to process diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java b/core/src/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java index 5802c1c..37a952b 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/LocalResolver.java @@ -89,7 +89,7 @@ public InputSource resolveEntity(String name, String publicId, // If there is no systemId, can't try anything else if (systemId == null) { throw new FileNotFoundException(sm.getString("localResolver.unresolvedEntity", - name, publicId, systemId, base)); + name, publicId, null, base)); } // Try resolving with the supplied systemId diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java index b3be866..80530d6 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/tagplugin/TagPluginParser.java @@ -29,7 +29,7 @@ import org.apache.tomcat.util.descriptor.DigesterFactory; import org.apache.tomcat.util.descriptor.XmlErrorHandler; import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.digester.RuleSetBase; +import org.apache.tomcat.util.digester.RuleSet; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -78,7 +78,7 @@ public Map getPlugins() { return plugins; } - private static class TagPluginRuleSet extends RuleSetBase { + private static class TagPluginRuleSet implements RuleSet { @Override public void addRuleInstances(Digester digester) { digester.addCallMethod(PREFIX, "addPlugin", 2); diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java index 7502ebd..bd7e5fd 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/ImplicitTldRuleSet.java @@ -18,7 +18,7 @@ import org.apache.tomcat.util.digester.Digester; import org.apache.tomcat.util.digester.Rule; -import org.apache.tomcat.util.digester.RuleSetBase; +import org.apache.tomcat.util.digester.RuleSet; import org.apache.tomcat.util.res.StringManager; import org.xml.sax.Attributes; @@ -27,7 +27,7 @@ * * Only version information used and short names are allowed. */ -public class ImplicitTldRuleSet extends RuleSetBase { +public class ImplicitTldRuleSet implements RuleSet { private static final StringManager sm = StringManager.getManager(ImplicitTldRuleSet.class); diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java index 69094e1..f298fd3 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/tld/TldRuleSet.java @@ -24,13 +24,13 @@ import org.apache.tomcat.util.digester.Digester; import org.apache.tomcat.util.digester.Rule; -import org.apache.tomcat.util.digester.RuleSetBase; +import org.apache.tomcat.util.digester.RuleSet; import org.xml.sax.Attributes; /** * RulesSet for digesting TLD files. */ -public class TldRuleSet extends RuleSetBase { +public class TldRuleSet implements RuleSet { private static final String PREFIX = "taglib"; private static final String VALIDATOR_PREFIX = PREFIX + "/validator"; private static final String TAG_PREFIX = PREFIX + "/tag"; diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java index 0feff17..e280614 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ApplicationParameter.java @@ -43,7 +43,7 @@ public class ApplicationParameter implements Serializable { private String description = null; public String getDescription() { - return (this.description); + return this.description; } public void setDescription(String description) { @@ -57,7 +57,7 @@ public void setDescription(String description) { private String name = null; public String getName() { - return (this.name); + return this.name; } public void setName(String name) { @@ -72,7 +72,7 @@ public void setName(String name) { private boolean override = true; public boolean getOverride() { - return (this.override); + return this.override; } public void setOverride(boolean override) { @@ -86,7 +86,7 @@ public void setOverride(boolean override) { private String value = null; public String getValue() { - return (this.value); + return this.value; } public void setValue(String value) { @@ -114,7 +114,7 @@ public String toString() { sb.append(", override="); sb.append(override); sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java index 97dfb60..4190253 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEjb.java @@ -40,7 +40,7 @@ public class ContextEjb extends ResourceBase { private String home = null; public String getHome() { - return (this.home); + return this.home; } public void setHome(String home) { @@ -54,7 +54,7 @@ public void setHome(String home) { private String link = null; public String getLink() { - return (this.link); + return this.link; } public void setLink(String link) { @@ -67,7 +67,7 @@ public void setLink(String link) { private String remote = null; public String getRemote() { - return (this.remote); + return this.remote; } public void setRemote(String remote) { @@ -108,7 +108,7 @@ public String toString() { sb.append(link); } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java index b49d896..f51b250 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextEnvironment.java @@ -38,7 +38,7 @@ public class ContextEnvironment extends ResourceBase { private boolean override = true; public boolean getOverride() { - return (this.override); + return this.override; } public void setOverride(boolean override) { @@ -52,7 +52,7 @@ public void setOverride(boolean override) { private String value = null; public String getValue() { - return (this.value); + return this.value; } public void setValue(String value) { @@ -87,7 +87,7 @@ public String toString() { sb.append(", override="); sb.append(override); sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java index 4b35fa3..c0ee25c 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextHandler.java @@ -19,6 +19,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; +import java.util.Map; /** @@ -41,7 +43,7 @@ public class ContextHandler extends ResourceBase { private String handlerclass = null; public String getHandlerclass() { - return (this.handlerclass); + return this.handlerclass; } public void setHandlerclass(String handlerclass) { @@ -57,7 +59,7 @@ public void setHandlerclass(String handlerclass) { * soapHeader[0] : namespaceURI * soapHeader[1] : localpart */ - private final HashMap soapHeaders = new HashMap<>(); + private final Map soapHeaders = new HashMap<>(); public Iterator getLocalparts() { return soapHeaders.keySet().iterator(); @@ -83,7 +85,7 @@ public void setProperty(String name, String value) { /** * The soapRole. */ - private final ArrayList soapRoles = new ArrayList<>(); + private final List soapRoles = new ArrayList<>(); public String getSoapRole(int i) { return this.soapRoles.get(i); @@ -100,7 +102,7 @@ public void addSoapRole(String soapRole) { /** * The portName. */ - private final ArrayList portNames = new ArrayList<>(); + private final List portNames = new ArrayList<>(); public String getPortName(int i) { return this.portNames.get(i); @@ -147,7 +149,7 @@ public String toString() { sb.append(this.listProperties()); } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java index 73ccafd..29e8d5e 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextLocalEjb.java @@ -38,7 +38,7 @@ public class ContextLocalEjb extends ResourceBase { private String home = null; public String getHome() { - return (this.home); + return this.home; } public void setHome(String home) { @@ -52,7 +52,7 @@ public void setHome(String home) { private String link = null; public String getLink() { - return (this.link); + return this.link; } public void setLink(String link) { @@ -66,7 +66,7 @@ public void setLink(String link) { private String local = null; public String getLocal() { - return (this.local); + return this.local; } public void setLocal(String local) { @@ -107,7 +107,7 @@ public String toString() { sb.append(local); } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java index affd9dd..f31905a 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResource.java @@ -40,7 +40,7 @@ public class ContextResource extends ResourceBase { private String auth = null; public String getAuth() { - return (this.auth); + return this.auth; } public void setAuth(String auth) { @@ -54,7 +54,7 @@ public void setAuth(String auth) { private String scope = "Shareable"; public String getScope() { - return (this.scope); + return this.scope; } public void setScope(String scope) { @@ -124,7 +124,7 @@ public String toString() { sb.append(scope); } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java index 8902974..ba3169c 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceEnvRef.java @@ -38,7 +38,7 @@ public class ContextResourceEnvRef extends ResourceBase { private boolean override = true; public boolean getOverride() { - return (this.override); + return this.override; } public void setOverride(boolean override) { @@ -64,7 +64,7 @@ public String toString() { sb.append(", override="); sb.append(override); sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java index 82e6de1..e50dcf9 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextResourceLink.java @@ -42,7 +42,7 @@ public class ContextResourceLink extends ResourceBase { private String factory = null; public String getGlobal() { - return (this.global); + return this.global; } public void setGlobal(String global) { @@ -77,7 +77,7 @@ public String toString() { sb.append(getGlobal()); } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java index 45c6ccb..cefdc56 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextService.java @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; +import java.util.Map; /** @@ -41,7 +42,7 @@ public class ContextService extends ResourceBase { private String displayname = null; public String getDisplayname() { - return (this.displayname); + return this.displayname; } public void setDisplayname(String displayname) { @@ -54,7 +55,7 @@ public void setDisplayname(String displayname) { private String largeIcon = null; public String getLargeIcon() { - return (this.largeIcon); + return this.largeIcon; } public void setLargeIcon(String largeIcon) { @@ -67,7 +68,7 @@ public void setLargeIcon(String largeIcon) { private String smallIcon = null; public String getSmallIcon() { - return (this.smallIcon); + return this.smallIcon; } public void setSmallIcon(String smallIcon) { @@ -95,7 +96,7 @@ public void setInterface(String serviceInterface) { private String wsdlfile = null; public String getWsdlfile() { - return (this.wsdlfile); + return this.wsdlfile; } public void setWsdlfile(String wsdlfile) { @@ -109,7 +110,7 @@ public void setWsdlfile(String wsdlfile) { private String jaxrpcmappingfile = null; public String getJaxrpcmappingfile() { - return (this.jaxrpcmappingfile); + return this.jaxrpcmappingfile; } public void setJaxrpcmappingfile(String jaxrpcmappingfile) { @@ -130,7 +131,7 @@ public void setJaxrpcmappingfile(String jaxrpcmappingfile) { private String[] serviceqname = new String[2]; public String[] getServiceqname() { - return (this.serviceqname); + return this.serviceqname; } public String getServiceqname(int i) { @@ -186,7 +187,7 @@ public void addPortcomponent(String serviceendpoint, String portlink) { * * The instantiation of the handler have to be done. */ - private final HashMap handlers = new HashMap<>(); + private final Map handlers = new HashMap<>(); public Iterator getHandlers() { return handlers.keySet().iterator(); @@ -258,7 +259,7 @@ public String toString() { sb.append(handlers); } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java index ee1f605..5a9e9e0 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ContextTransaction.java @@ -21,6 +21,7 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Iterator; +import java.util.Map; /** @@ -39,7 +40,7 @@ public class ContextTransaction implements Serializable { /** * Holder for our configured properties. */ - private final HashMap properties = new HashMap<>(); + private final Map properties = new HashMap<>(); /** * @param name The property name @@ -83,10 +84,8 @@ public Iterator listProperties() { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("Transaction["); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java index 731f7e1..f55dc5a 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ErrorPage.java @@ -60,9 +60,7 @@ public class ErrorPage implements Serializable { * @return the error code. */ public int getErrorCode() { - - return (this.errorCode); - + return this.errorCode; } @@ -72,9 +70,7 @@ public int getErrorCode() { * @param errorCode The new error code */ public void setErrorCode(int errorCode) { - this.errorCode = errorCode; - } @@ -97,9 +93,7 @@ public void setErrorCode(String errorCode) { * @return the exception type. */ public String getExceptionType() { - - return (this.exceptionType); - + return this.exceptionType; } @@ -109,9 +103,7 @@ public String getExceptionType() { * @param exceptionType The new exception type */ public void setExceptionType(String exceptionType) { - this.exceptionType = exceptionType; - } @@ -119,9 +111,7 @@ public void setExceptionType(String exceptionType) { * @return the location. */ public String getLocation() { - - return (this.location); - + return this.location; } @@ -148,7 +138,6 @@ public void setLocation(String location) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("ErrorPage["); if (exceptionType == null) { sb.append("errorCode="); @@ -160,8 +149,7 @@ public String toString() { sb.append(", location="); sb.append(location); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } public String getName() { diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java index 04fd807..8d70c79 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterDef.java @@ -47,7 +47,7 @@ public class FilterDef implements Serializable { private String description = null; public String getDescription() { - return (this.description); + return this.description; } public void setDescription(String description) { @@ -61,7 +61,7 @@ public void setDescription(String description) { private String displayName = null; public String getDisplayName() { - return (this.displayName); + return this.displayName; } public void setDisplayName(String displayName) { @@ -89,7 +89,7 @@ public void setFilter(Filter filter) { private String filterClass = null; public String getFilterClass() { - return (this.filterClass); + return this.filterClass; } public void setFilterClass(String filterClass) { @@ -104,7 +104,7 @@ public void setFilterClass(String filterClass) { private String filterName = null; public String getFilterName() { - return (this.filterName); + return this.filterName; } public void setFilterName(String filterName) { @@ -122,7 +122,7 @@ public void setFilterName(String filterName) { private String largeIcon = null; public String getLargeIcon() { - return (this.largeIcon); + return this.largeIcon; } public void setLargeIcon(String largeIcon) { @@ -137,9 +137,7 @@ public void setLargeIcon(String largeIcon) { private final Map parameters = new HashMap<>(); public Map getParameterMap() { - - return (this.parameters); - + return this.parameters; } @@ -149,7 +147,7 @@ public Map getParameterMap() { private String smallIcon = null; public String getSmallIcon() { - return (this.smallIcon); + return this.smallIcon; } public void setSmallIcon(String smallIcon) { @@ -194,15 +192,13 @@ public void addInitParameter(String name, String value) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("FilterDef["); sb.append("filterName="); sb.append(this.filterName); sb.append(", filterClass="); sb.append(this.filterClass); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java index 44268b4..c432d95 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/FilterMap.java @@ -18,6 +18,7 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.List; import java.util.Locale; import javax.servlet.DispatcherType; @@ -60,7 +61,7 @@ public class FilterMap extends XmlEncodingBase implements Serializable { private String filterName = null; public String getFilterName() { - return (this.filterName); + return this.filterName; } public void setFilterName(String filterName) { @@ -77,7 +78,7 @@ public String[] getServletNames() { if (matchAllServletNames) { return new String[] {}; } else { - return (this.servletNames); + return this.servletNames; } } @@ -122,7 +123,7 @@ public String[] getURLPatterns() { if (matchAllUrlPatterns) { return new String[] {}; } else { - return (this.urlPatterns); + return this.urlPatterns; } } @@ -176,20 +177,20 @@ public int getDispatcherMapping() { } public String[] getDispatcherNames() { - ArrayList result = new ArrayList<>(); - if ((dispatcherMapping & FORWARD) > 0) { + List result = new ArrayList<>(); + if ((dispatcherMapping & FORWARD) != 0) { result.add(DispatcherType.FORWARD.name()); } - if ((dispatcherMapping & INCLUDE) > 0) { + if ((dispatcherMapping & INCLUDE) != 0) { result.add(DispatcherType.INCLUDE.name()); } - if ((dispatcherMapping & REQUEST) > 0) { + if ((dispatcherMapping & REQUEST) != 0) { result.add(DispatcherType.REQUEST.name()); } - if ((dispatcherMapping & ERROR) > 0) { + if ((dispatcherMapping & ERROR) != 0) { result.add(DispatcherType.ERROR.name()); } - if ((dispatcherMapping & ASYNC) > 0) { + if ((dispatcherMapping & ASYNC) != 0) { result.add(DispatcherType.ASYNC.name()); } return result.toArray(new String[result.size()]); @@ -203,7 +204,6 @@ public String[] getDispatcherNames() { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("FilterMap["); sb.append("filterName="); sb.append(this.filterName); @@ -216,8 +216,7 @@ public String toString() { sb.append(urlPatterns[i]); } sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties index 7d0e30e..5de0eba 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/LocalStrings.properties @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + filterDef.invalidFilterName=Invalid [{0}] in filter definition. securityConstraint.uncoveredHttpMethod=For security constraints with URL pattern [{0}] only the HTTP methods [{1}] are covered. All other methods are uncovered. diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java index cfc5d2e..e1c6952 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/LoginConfig.java @@ -76,7 +76,7 @@ public LoginConfig(String authMethod, String realmName, private String authMethod = null; public String getAuthMethod() { - return (this.authMethod); + return this.authMethod; } public void setAuthMethod(String authMethod) { @@ -90,7 +90,7 @@ public void setAuthMethod(String authMethod) { private String errorPage = null; public String getErrorPage() { - return (this.errorPage); + return this.errorPage; } public void setErrorPage(String errorPage) { @@ -107,7 +107,7 @@ public void setErrorPage(String errorPage) { private String loginPage = null; public String getLoginPage() { - return (this.loginPage); + return this.loginPage; } public void setLoginPage(String loginPage) { @@ -125,7 +125,7 @@ public void setLoginPage(String loginPage) { private String realmName = null; public String getRealmName() { - return (this.realmName); + return this.realmName; } public void setRealmName(String realmName) { @@ -141,7 +141,6 @@ public void setRealmName(String realmName) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("LoginConfig["); sb.append("authMethod="); sb.append(authMethod); @@ -158,8 +157,7 @@ public String toString() { sb.append(errorPage); } sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java index ffc7945..be9fcfb 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestination.java @@ -38,7 +38,7 @@ public class MessageDestination extends ResourceBase { private String displayName = null; public String getDisplayName() { - return (this.displayName); + return this.displayName; } public void setDisplayName(String displayName) { @@ -52,7 +52,7 @@ public void setDisplayName(String displayName) { private String largeIcon = null; public String getLargeIcon() { - return (this.largeIcon); + return this.largeIcon; } public void setLargeIcon(String largeIcon) { @@ -66,7 +66,7 @@ public void setLargeIcon(String largeIcon) { private String smallIcon = null; public String getSmallIcon() { - return (this.smallIcon); + return this.smallIcon; } public void setSmallIcon(String smallIcon) { @@ -82,7 +82,6 @@ public void setSmallIcon(String smallIcon) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("MessageDestination["); sb.append("name="); sb.append(getName()); @@ -103,7 +102,7 @@ public String toString() { sb.append(getDescription()); } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java index 40d264c..25d9f67 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/MessageDestinationRef.java @@ -38,7 +38,7 @@ public class MessageDestinationRef extends ResourceBase { private String link = null; public String getLink() { - return (this.link); + return this.link; } public void setLink(String link) { @@ -52,7 +52,7 @@ public void setLink(String link) { private String usage = null; public String getUsage() { - return (this.usage); + return this.usage; } public void setUsage(String usage) { @@ -67,7 +67,6 @@ public void setUsage(String usage) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("MessageDestination["); sb.append("name="); sb.append(getName()); @@ -88,7 +87,7 @@ public String toString() { sb.append(getDescription()); } sb.append("]"); - return (sb.toString()); + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java index 0d447b1..a97a34a 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ResourceBase.java @@ -21,7 +21,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; - +import java.util.Map; /** @@ -42,7 +42,7 @@ public class ResourceBase implements Serializable, Injectable { private String description = null; public String getDescription() { - return (this.description); + return this.description; } public void setDescription(String description) { @@ -58,7 +58,7 @@ public void setDescription(String description) { @Override public String getName() { - return (this.name); + return this.name; } public void setName(String name) { @@ -72,7 +72,7 @@ public void setName(String name) { private String type = null; public String getType() { - return (this.type); + return this.type; } public void setType(String type) { @@ -83,7 +83,7 @@ public void setType(String type) { /** * Holder for our configured properties. */ - private final HashMap properties = new HashMap<>(); + private final Map properties = new HashMap<>(); /** * @param name The property name @@ -207,7 +207,7 @@ public boolean equals(Object obj) { private NamingResources resources = null; public NamingResources getNamingResources() { - return (this.resources); + return this.resources; } public void setNamingResources(NamingResources resources) { diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java index c857f4a..9130eb8 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityCollection.java @@ -18,6 +18,7 @@ import java.io.Serializable; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import org.apache.tomcat.util.buf.UDecoder; @@ -112,9 +113,7 @@ public SecurityCollection(String name, String description) { * @return the description of this web resource collection. */ public String getDescription() { - - return (this.description); - + return this.description; } @@ -124,9 +123,7 @@ public String getDescription() { * @param description The new description */ public void setDescription(String description) { - this.description = description; - } @@ -134,9 +131,7 @@ public void setDescription(String description) { * @return the name of this web resource collection. */ public String getName() { - - return (this.name); - + return this.name; } @@ -146,9 +141,7 @@ public String getName() { * @param name The new name */ public void setName(String name) { - this.name = name; - } @@ -181,9 +174,7 @@ public void addMethod(String method) { if (method == null) return; - String results[] = new String[methods.length + 1]; - for (int i = 0; i < methods.length; i++) - results[i] = methods[i]; + String[] results = Arrays.copyOf(methods, methods.length + 1); results[methods.length] = method; methods = results; @@ -198,9 +189,7 @@ public void addMethod(String method) { public void addOmittedMethod(String method) { if (method == null) return; - String results[] = new String[omittedMethods.length + 1]; - for (int i = 0; i < omittedMethods.length; i++) - results[i] = omittedMethods[i]; + String[] results = Arrays.copyOf(omittedMethods, omittedMethods.length + 1); results[omittedMethods.length] = method; omittedMethods = results; } @@ -218,10 +207,7 @@ public void addPatternDecoded(String pattern) { return; String decodedPattern = UDecoder.URLDecode(pattern); - String results[] = new String[patterns.length + 1]; - for (int i = 0; i < patterns.length; i++) { - results[i] = patterns[i]; - } + String[] results = Arrays.copyOf(patterns, patterns.length + 1); results[patterns.length] = decodedPattern; patterns = results; } @@ -260,9 +246,7 @@ public boolean findMethod(String method) { * explicitly included. */ public String[] findMethods() { - - return (methods); - + return methods; } @@ -272,9 +256,7 @@ public String[] findMethods() { * methods are excluded. */ public String[] findOmittedMethods() { - - return (omittedMethods); - + return omittedMethods; } @@ -285,13 +267,11 @@ public String[] findOmittedMethods() { * @return true if the pattern is part of the collection */ public boolean findPattern(String pattern) { - for (int i = 0; i < patterns.length; i++) { if (patterns[i].equals(pattern)) return true; } return false; - } @@ -301,9 +281,7 @@ public boolean findPattern(String pattern) { * returned. */ public String[] findPatterns() { - - return (patterns); - + return patterns; } @@ -402,7 +380,6 @@ public void removePattern(String pattern) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("SecurityCollection["); sb.append(name); if (description != null) { @@ -410,8 +387,7 @@ public String toString() { sb.append(description); } sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java index 1b93192..66e033d 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityConstraint.java @@ -22,7 +22,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -227,9 +226,7 @@ public void treatAllAuthenticatedUsersAsApplicationRole() { if (authenticatedUsers) { authenticatedUsers = false; - String results[] = new String[authRoles.length + 1]; - for (int i = 0; i < authRoles.length; i++) - results[i] = authRoles[i]; + String[] results = Arrays.copyOf(authRoles, authRoles.length + 1); results[authRoles.length] = ROLE_ALL_AUTHENTICATED_USERS; authRoles = results; authConstraint = true; @@ -261,9 +258,7 @@ public void addAuthRole(String authRole) { return; } - String results[] = new String[authRoles.length + 1]; - for (int i = 0; i < authRoles.length; i++) - results[i] = authRoles[i]; + String[] results = Arrays.copyOf(authRoles, authRoles.length + 1); results[authRoles.length] = authRole; authRoles = results; authConstraint = true; @@ -283,10 +278,7 @@ public void addCollection(SecurityCollection collection) { collection.setCharset(getCharset()); - SecurityCollection results[] = - new SecurityCollection[collections.length + 1]; - for (int i = 0; i < collections.length; i++) - results[i] = collections[i]; + SecurityCollection results[] = Arrays.copyOf(collections, collections.length + 1); results[collections.length] = collection; collections = results; @@ -321,9 +313,7 @@ public boolean findAuthRole(String role) { * @return the roles array */ public String[] findAuthRoles() { - - return (authRoles); - + return authRoles; } @@ -335,15 +325,13 @@ public String[] findAuthRoles() { * @return the collection */ public SecurityCollection findCollection(String name) { - if (name == null) - return (null); + return null; for (int i = 0; i < collections.length; i++) { if (name.equals(collections[i].getName())) - return (collections[i]); + return collections[i]; } - return (null); - + return null; } @@ -354,9 +342,7 @@ public SecurityCollection findCollection(String name) { * @return the collections array */ public SecurityCollection[] findCollections() { - - return (collections); - + return collections; } @@ -466,7 +452,6 @@ public void removeCollection(SecurityCollection collection) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("SecurityConstraint["); for (int i = 0; i < collections.length; i++) { if (i > 0) @@ -474,8 +459,7 @@ public String toString() { sb.append(collections[i].getName()); } sb.append("]"); - return (sb.toString()); - + return sb.toString(); } @@ -558,9 +542,7 @@ public static SecurityConstraint[] createConstraints( // Add the per method constraints Collection methods = element.getHttpMethodConstraints(); - Iterator methodIter = methods.iterator(); - while (methodIter.hasNext()) { - HttpMethodConstraintElement methodElement = methodIter.next(); + for (HttpMethodConstraintElement methodElement : methods) { SecurityConstraint constraint = createConstraint(methodElement, urlPattern, true); // There will always be a single collection @@ -574,9 +556,8 @@ public static SecurityConstraint[] createConstraints( if (constraint != null) { // There will always be a single collection SecurityCollection collection = constraint.findCollections()[0]; - Iterator ommittedMethod = element.getMethodNames().iterator(); - while (ommittedMethod.hasNext()) { - collection.addOmittedMethod(ommittedMethod.next()); + for (String name : element.getMethodNames()) { + collection.addOmittedMethod(name); } result.add(constraint); diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java index 264ba25..360ea7c 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/SecurityRoleRef.java @@ -41,7 +41,7 @@ public class SecurityRoleRef implements Serializable { private String name = null; public String getName() { - return (this.name); + return this.name; } public void setName(String name) { @@ -55,7 +55,7 @@ public void setName(String name) { private String link = null; public String getLink() { - return (this.link); + return this.link; } public void setLink(String link) { @@ -72,7 +72,6 @@ public void setLink(String link) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("SecurityRoleRef["); sb.append("name="); sb.append(name); @@ -81,8 +80,7 @@ public String toString() { sb.append(link); } sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java index aa1adf0..1499f7b 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/ServletDef.java @@ -46,7 +46,7 @@ public class ServletDef implements Serializable { private String description = null; public String getDescription() { - return (this.description); + return this.description; } public void setDescription(String description) { @@ -60,7 +60,7 @@ public void setDescription(String description) { private String displayName = null; public String getDisplayName() { - return (this.displayName); + return this.displayName; } public void setDisplayName(String displayName) { @@ -74,7 +74,7 @@ public void setDisplayName(String displayName) { private String smallIcon = null; public String getSmallIcon() { - return (this.smallIcon); + return this.smallIcon; } public void setSmallIcon(String smallIcon) { @@ -87,7 +87,7 @@ public void setSmallIcon(String smallIcon) { private String largeIcon = null; public String getLargeIcon() { - return (this.largeIcon); + return this.largeIcon; } public void setLargeIcon(String largeIcon) { @@ -102,7 +102,7 @@ public void setLargeIcon(String largeIcon) { private String servletName = null; public String getServletName() { - return (this.servletName); + return this.servletName; } public void setServletName(String servletName) { @@ -120,7 +120,7 @@ public void setServletName(String servletName) { private String servletClass = null; public String getServletClass() { - return (this.servletClass); + return this.servletClass; } public void setServletClass(String servletClass) { @@ -134,7 +134,7 @@ public void setServletClass(String servletClass) { private String jspFile = null; public String getJspFile() { - return (this.jspFile); + return this.jspFile; } public void setJspFile(String jspFile) { @@ -149,9 +149,7 @@ public void setJspFile(String jspFile) { private final Map parameters = new HashMap<>(); public Map getParameterMap() { - - return (this.parameters); - + return this.parameters; } /** @@ -178,7 +176,7 @@ public void addInitParameter(String name, String value) { private Integer loadOnStartup = null; public Integer getLoadOnStartup() { - return (this.loadOnStartup); + return this.loadOnStartup; } public void setLoadOnStartup(String loadOnStartup) { @@ -192,7 +190,7 @@ public void setLoadOnStartup(String loadOnStartup) { private String runAs = null; public String getRunAs() { - return (this.runAs); + return this.runAs; } public void setRunAs(String runAs) { @@ -206,7 +204,7 @@ public void setRunAs(String runAs) { private final Set securityRoleRefs = new HashSet<>(); public Set getSecurityRoleRefs() { - return (this.securityRoleRefs); + return this.securityRoleRefs; } /** diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java index 7a5fe20..28478bf 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebRuleSet.java @@ -24,19 +24,18 @@ import org.apache.tomcat.util.digester.CallParamRule; import org.apache.tomcat.util.digester.Digester; import org.apache.tomcat.util.digester.Rule; -import org.apache.tomcat.util.digester.RuleSetBase; +import org.apache.tomcat.util.digester.RuleSet; import org.apache.tomcat.util.digester.SetNextRule; import org.apache.tomcat.util.res.StringManager; import org.xml.sax.Attributes; - /** *

    RuleSet for processing the contents of a web application * deployment descriptor (/WEB-INF/web.xml) resource.

    * * @author Craig R. McClanahan */ -public class WebRuleSet extends RuleSetBase { +public class WebRuleSet implements RuleSet { /** * The string resources for this package. @@ -136,9 +135,6 @@ public WebRuleSet(boolean fragment) { * @param fragment true if this is a web fragment */ public WebRuleSet(String prefix, boolean fragment) { - - super(); - this.namespaceURI = null; this.prefix = prefix; this.fragment = fragment; @@ -152,8 +148,8 @@ public WebRuleSet(String prefix, boolean fragment) { relativeOrdering = new RelativeOrderingRule(fragment); } - // --------------------------------------------------------- Public Methods + // --------------------------------------------------------- Public Methods /** *

    Add the set of Rule instances defined in this RuleSet to the diff --git a/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java b/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java index de16817..636883c 100644 --- a/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java +++ b/core/src/main/java/org/apache/tomcat/util/descriptor/web/WebXml.java @@ -46,6 +46,7 @@ import org.apache.tomcat.util.descriptor.XmlIdentifiers; import org.apache.tomcat.util.digester.DocumentProperties; import org.apache.tomcat.util.res.StringManager; +import org.apache.tomcat.util.security.Escape; /** * Representation of common elements of web.xml and web-fragment.xml. Provides @@ -1386,7 +1387,7 @@ private static void appendElement(StringBuilder sb, String indent, sb.append('<'); sb.append(elementName); sb.append('>'); - sb.append(escapeXml(value)); + sb.append(Escape.xml(value)); sb.append("\n"); @@ -1400,33 +1401,6 @@ private static void appendElement(StringBuilder sb, String indent, } - /** - * Escape the 5 entities defined by XML. - */ - private static String escapeXml(String s) { - if (s == null) - return null; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c == '<') { - sb.append("<"); - } else if (c == '>') { - sb.append(">"); - } else if (c == '\'') { - sb.append("'"); - } else if (c == '&') { - sb.append("&"); - } else if (c == '"') { - sb.append("""); - } else { - sb.append(c); - } - } - return sb.toString(); - } - - /** * Merge the supplied web fragments into this main web.xml. * diff --git a/core/src/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java b/core/src/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java index d315669..01faa53 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/AbstractObjectCreationFactory.java @@ -59,9 +59,7 @@ public abstract class AbstractObjectCreationFactory */ @Override public Digester getDigester() { - - return (this.digester); - + return this.digester; } @@ -73,9 +71,7 @@ public Digester getDigester() { */ @Override public void setDigester(Digester digester) { - this.digester = digester; - } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/CallMethodRule.java b/core/src/main/java/org/apache/tomcat/util/digester/CallMethodRule.java index 0c2896e..c55a72b 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/CallMethodRule.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/CallMethodRule.java @@ -14,15 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.tomcat.util.digester; - import org.apache.tomcat.util.IntrospectionUtils; import org.xml.sax.Attributes; - /** *

    Rule implementation that calls a method on an object on the stack * (normally the top/parent object), passing arguments collected from @@ -63,7 +59,6 @@ * then it is always invoked, regardless of whether the parameters were * available or not (missing parameters are passed as null values).

    */ - public class CallMethodRule extends Rule { // ----------------------------------------------------------- Constructors @@ -76,11 +71,11 @@ public class CallMethodRule extends Rule { * @param paramCount The number of parameters to collect, or * zero for a single argument from the body of this element. */ - public CallMethodRule(String methodName, - int paramCount) { + public CallMethodRule(String methodName, int paramCount) { this(0, methodName, paramCount); } + /** * Construct a "call method" rule with the specified method name. The * parameter types (if any) default to java.lang.String. @@ -93,10 +88,7 @@ public CallMethodRule(String methodName, * @param paramCount The number of parameters to collect, or * zero for a single argument from the body of this element. */ - public CallMethodRule(int targetOffset, - String methodName, - int paramCount) { - + public CallMethodRule(int targetOffset, String methodName, int paramCount) { this.targetOffset = targetOffset; this.methodName = methodName; this.paramCount = paramCount; @@ -108,9 +100,9 @@ public CallMethodRule(int targetOffset, this.paramTypes[i] = String.class; } } - this.paramClassNames = null; } + /** * Construct a "call method" rule with the specified method name. * The method should accept no parameters. @@ -118,9 +110,7 @@ public CallMethodRule(int targetOffset, * @param methodName Method name of the parent method to call */ public CallMethodRule(String methodName) { - - this(0, methodName, 0, (Class[]) null); - + this(0, methodName, 0, null); } @@ -144,10 +134,8 @@ public CallMethodRule(String methodName) { * Java wrapper class instead, such as java.lang.Boolean.TYPE * for a boolean parameter) */ - public CallMethodRule( int targetOffset, - String methodName, - int paramCount, - Class paramTypes[]) { + public CallMethodRule(int targetOffset, String methodName, int paramCount, + Class paramTypes[]) { this.targetOffset = targetOffset; this.methodName = methodName; @@ -159,17 +147,13 @@ public CallMethodRule( int targetOffset, } } else { this.paramTypes = new Class[paramTypes.length]; - for (int i = 0; i < this.paramTypes.length; i++) { - this.paramTypes[i] = paramTypes[i]; - } + System.arraycopy(paramTypes, 0, this.paramTypes, 0, this.paramTypes.length); } - this.paramClassNames = null; } // ----------------------------------------------------- Instance Variables - /** * The body text collected from this element. */ @@ -183,6 +167,7 @@ public CallMethodRule( int targetOffset, */ protected final int targetOffset; + /** * The method name to call on the parent object. */ @@ -202,17 +187,13 @@ public CallMethodRule( int targetOffset, */ protected Class paramTypes[] = null; - /** - * The names of the classes of the parameters to be collected. - * This attribute allows creation of the classes to be postponed until the digester is set. - */ - protected final String paramClassNames[]; /** * Should MethodUtils.invokeExactMethod be used for reflection. */ protected boolean useExactMatch = false; + // --------------------------------------------------------- Public Methods /** @@ -224,40 +205,16 @@ public boolean getUseExactMatch() { return useExactMatch; } + /** * Set whether MethodUtils.invokeExactMethod * should be used for the reflection. * @param useExactMatch The flag value */ - public void setUseExactMatch(boolean useExactMatch) - { + public void setUseExactMatch(boolean useExactMatch) { this.useExactMatch = useExactMatch; } - /** - * Set the associated digester. - * If needed, this class loads the parameter classes from their names. - */ - @Override - public void setDigester(Digester digester) - { - // call superclass - super.setDigester(digester); - // if necessary, load parameter classes - if (this.paramClassNames != null) { - this.paramTypes = new Class[paramClassNames.length]; - for (int i = 0; i < this.paramClassNames.length; i++) { - try { - this.paramTypes[i] = - digester.getClassLoader().loadClass(this.paramClassNames[i]); - } catch (ClassNotFoundException e) { - // use the digester log - digester.getLogger().error("(CallMethodRule) Cannot load class " + this.paramClassNames[i], e); - this.paramTypes[i] = null; // Will cause NPE later - } - } - } - } /** * Process the start of this element. @@ -432,11 +389,10 @@ public void end(String namespace, String name) throws Exception { */ @Override public void finish() throws Exception { - bodyText = null; - } + /** * Subclasses may override this method to perform additional processing of the * invoked method's result. @@ -447,12 +403,12 @@ protected void processMethodCallResult(Object result) { // do nothing } + /** * Render a printable version of this Rule. */ @Override public String toString() { - StringBuilder sb = new StringBuilder("CallMethodRule["); sb.append("methodName="); sb.append(methodName); @@ -469,9 +425,6 @@ public String toString() { } sb.append("}"); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } - - -} +} \ No newline at end of file diff --git a/core/src/main/java/org/apache/tomcat/util/digester/CallParamRule.java b/core/src/main/java/org/apache/tomcat/util/digester/CallParamRule.java index 43aefe3..a952f3a 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/CallParamRule.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/CallParamRule.java @@ -191,7 +191,6 @@ public void end(String namespace, String name) { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("CallParamRule["); sb.append("paramIndex="); sb.append(paramIndex); @@ -200,8 +199,7 @@ public String toString() { sb.append(", from stack="); sb.append(fromStack); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/Digester.java b/core/src/main/java/org/apache/tomcat/util/digester/Digester.java index b648385..aaaf20b 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/Digester.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/Digester.java @@ -27,10 +27,11 @@ import java.security.Permission; import java.util.EmptyStackException; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.PropertyPermission; +import java.util.Set; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; @@ -81,17 +82,20 @@ public class Digester extends DefaultHandler2 { // ---------------------------------------------------------- Static Fields - protected static IntrospectionUtils.PropertySource propertySource = null; + protected static IntrospectionUtils.PropertySource propertySource; + private static boolean propertySourceSet = false; static { String className = System.getProperty("org.apache.tomcat.util.digester.PROPERTY_SOURCE"); + IntrospectionUtils.PropertySource source = null; if (className != null) { ClassLoader[] cls = new ClassLoader[] { Digester.class.getClassLoader(), Thread.currentThread().getContextClassLoader() }; for (int i = 0; i < cls.length; i++) { try { Class clazz = Class.forName(className, true, cls[i]); - propertySource = (IntrospectionUtils.PropertySource) clazz.newInstance(); + source = (IntrospectionUtils.PropertySource) + clazz.getConstructor().newInstance(); break; } catch (Throwable t) { ExceptionUtils.handleThrowable(t); @@ -100,8 +104,21 @@ public class Digester extends DefaultHandler2 { } } } + if (source != null) { + propertySource = source; + propertySourceSet = true; + } + if (Boolean.getBoolean("org.apache.tomcat.util.digester.REPLACE_SYSTEM_PROPERTIES")) { + replaceSystemProperties(); + } } + public static void setPropertySource(IntrospectionUtils.PropertySource propertySource) { + if (!propertySourceSet) { + Digester.propertySource = propertySource; + propertySourceSet = true; + } + } // --------------------------------------------------- Instance Variables @@ -292,7 +309,7 @@ public String getProperty(String key) { * The Log to which most logging calls will be made. */ protected Log log = LogFactory.getLog(Digester.class); - protected StringManager sm = StringManager.getManager(Digester.class); + protected static final StringManager sm = StringManager.getManager(Digester.class); /** * The Log to which all SAX event related logging calls will be made. @@ -301,12 +318,37 @@ public String getProperty(String key) { public Digester() { + propertySourceSet = true; if (propertySource != null) { source = new IntrospectionUtils.PropertySource[] { propertySource, source[0] }; } } + public static void replaceSystemProperties() { + Log log = LogFactory.getLog(Digester.class); + if (propertySource != null) { + IntrospectionUtils.PropertySource[] propertySources = + new IntrospectionUtils.PropertySource[] { propertySource }; + Properties properties = System.getProperties(); + Set names = properties.stringPropertyNames(); + for (String name : names) { + String value = System.getProperty(name); + if (value != null) { + try { + String newValue = IntrospectionUtils.replaceProperties(value, null, propertySources); + if (!value.equals(newValue)) { + System.setProperty(name, newValue); + } + } catch (Exception e) { + log.warn(sm.getString("digester.failedToUpdateSystemProperty", name, value), e); + } + } + } + } + } + + // ------------------------------------------------------------- Properties /** @@ -318,17 +360,15 @@ public Digester() { * @return the namespace URI */ public String findNamespaceURI(String prefix) { - ArrayStack stack = namespaces.get(prefix); if (stack == null) { - return (null); + return null; } try { return stack.peek(); } catch (EmptyStackException e) { - return (null); + return null; } - } @@ -344,18 +384,16 @@ public String findNamespaceURI(String prefix) { * @return the classloader */ public ClassLoader getClassLoader() { - if (this.classLoader != null) { - return (this.classLoader); + return this.classLoader; } if (this.useContextClassLoader) { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (classLoader != null) { - return (classLoader); + return classLoader; } } - return (this.getClass().getClassLoader()); - + return this.getClass().getClassLoader(); } @@ -367,9 +405,7 @@ public ClassLoader getClassLoader() { * to revert to the standard rules */ public void setClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } @@ -377,9 +413,7 @@ public void setClassLoader(ClassLoader classLoader) { * @return the current depth of the element stack. */ public int getCount() { - - return (stack.size()); - + return stack.size(); } @@ -387,14 +421,12 @@ public int getCount() { * @return the name of the XML element that is currently being processed. */ public String getCurrentElementName() { - String elementName = match; int lastSlash = elementName.lastIndexOf('/'); if (lastSlash >= 0) { elementName = elementName.substring(lastSlash + 1); } - return (elementName); - + return elementName; } @@ -402,9 +434,7 @@ public String getCurrentElementName() { * @return the error handler for this Digester. */ public ErrorHandler getErrorHandler() { - - return (this.errorHandler); - + return this.errorHandler; } @@ -414,9 +444,7 @@ public ErrorHandler getErrorHandler() { * @param errorHandler The new error handler */ public void setErrorHandler(ErrorHandler errorHandler) { - this.errorHandler = errorHandler; - } @@ -447,8 +475,7 @@ public SAXParserFactory getFactory() throws SAXNotRecognizedException, SAXNotSup factory.setFeature("http://apache.org/xml/features/validation/schema", true); } } - return (factory); - + return factory; } @@ -539,9 +566,7 @@ public String getMatch() { * @return the "namespace aware" flag for parsers we create. */ public boolean getNamespaceAware() { - - return (this.namespaceAware); - + return this.namespaceAware; } @@ -551,9 +576,7 @@ public boolean getNamespaceAware() { * @param namespaceAware The new "namespace aware" flag */ public void setNamespaceAware(boolean namespaceAware) { - this.namespaceAware = namespaceAware; - } @@ -571,35 +594,7 @@ public void setPublicId(String publicId) { * parsing under, if any. */ public String getPublicId() { - - return (this.publicId); - - } - - - /** - * @return the namespace URI that will be applied to all subsequently - * added Rule objects. - */ - public String getRuleNamespaceURI() { - - return (getRules().getNamespaceURI()); - - } - - - /** - * Set the namespace URI that will be applied to all subsequently - * added Rule objects. - * - * @param ruleNamespaceURI Namespace URI that must match on all - * subsequently added rules, or null for matching - * regardless of the current namespace URI - */ - public void setRuleNamespaceURI(String ruleNamespaceURI) { - - getRules().setNamespaceURI(ruleNamespaceURI); - + return this.publicId; } @@ -611,7 +606,7 @@ public SAXParser getParser() { // Return the parser we already created (if any) if (parser != null) { - return (parser); + return parser; } // Create a new parser @@ -619,11 +614,10 @@ public SAXParser getParser() { parser = getFactory().newSAXParser(); } catch (Exception e) { log.error("Digester.getParser: ", e); - return (null); + return null; } - return (parser); - + return parser; } @@ -644,8 +638,7 @@ public SAXParser getParser() { public Object getProperty(String property) throws SAXNotRecognizedException, SAXNotSupportedException { - return (getParser().getProperty(property)); - + return getParser().getProperty(property); } @@ -656,13 +649,11 @@ public Object getProperty(String property) * @return the rules */ public Rules getRules() { - if (this.rules == null) { this.rules = new RulesBase(); this.rules.setDigester(this); } - return (this.rules); - + return this.rules; } @@ -673,10 +664,8 @@ public Rules getRules() { * @param rules New Rules implementation */ public void setRules(Rules rules) { - this.rules = rules; this.rules.setDigester(this); - } @@ -684,9 +673,7 @@ public void setRules(Rules rules) { * @return the boolean as to whether the context classloader should be used. */ public boolean getUseContextClassLoader() { - return useContextClassLoader; - } @@ -710,9 +697,7 @@ public void setUseContextClassLoader(boolean use) { * @return the validating parser flag. */ public boolean getValidating() { - - return (this.validating); - + return this.validating; } @@ -723,9 +708,7 @@ public boolean getValidating() { * @param validating The new validating parser flag. */ public void setValidating(boolean validating) { - this.validating = validating; - } @@ -733,9 +716,7 @@ public void setValidating(boolean validating) { * @return the rules validation flag. */ public boolean getRulesValidation() { - - return (this.rulesValidation); - + return this.rulesValidation; } @@ -746,9 +727,7 @@ public boolean getRulesValidation() { * @param rulesValidation The new rules validation flag. */ public void setRulesValidation(boolean rulesValidation) { - this.rulesValidation = rulesValidation; - } @@ -756,9 +735,7 @@ public void setRulesValidation(boolean rulesValidation) { * @return the fake attributes list. */ public Map, List> getFakeAttributes() { - - return (this.fakeAttributes); - + return this.fakeAttributes; } @@ -769,7 +746,6 @@ public Map, List> getFakeAttributes() { * @return true if this is a fake attribute */ public boolean isFakeAttribute(Object object, String name) { - if (fakeAttributes == null) { return false; } @@ -782,7 +758,6 @@ public boolean isFakeAttribute(Object object, String name) { } else { return result.contains(name); } - } @@ -872,9 +847,7 @@ public void endDocument() throws SAXException { } // Fire "finish" events for all defined rules - Iterator rules = getRules().rules().iterator(); - while (rules.hasNext()) { - Rule rule = rules.next(); + for (Rule rule : getRules().rules()) { try { rule.finish(); } catch (Exception e) { @@ -1323,7 +1296,7 @@ public InputSource resolveEntity(String name, String publicId, String baseURI, S if (log.isDebugEnabled()) { log.debug(" Cannot resolve entity: '" + publicId + "'"); } - return (null); + return null; } else { // try to resolve using system ID @@ -1353,7 +1326,7 @@ public InputSource resolveEntity(String name, String publicId, String baseURI, S } try { - return (new InputSource(entityURL)); + return new InputSource(entityURL); } catch (Exception e) { throw createSAXException(e); } @@ -1444,13 +1417,11 @@ public void warning(SAXParseException exception) throws SAXException { * @exception SAXException if a parsing exception occurs */ public Object parse(File file) throws IOException, SAXException { - configure(); InputSource input = new InputSource(new FileInputStream(file)); input.setSystemId("file://" + file.getAbsolutePath()); getXMLReader().parse(input); - return (root); - + return root; } @@ -1464,11 +1435,9 @@ public Object parse(File file) throws IOException, SAXException { * @exception SAXException if a parsing exception occurs */ public Object parse(InputSource input) throws IOException, SAXException { - configure(); getXMLReader().parse(input); - return (root); - + return root; } @@ -1482,12 +1451,10 @@ public Object parse(InputSource input) throws IOException, SAXException { * @exception SAXException if a parsing exception occurs */ public Object parse(InputStream input) throws IOException, SAXException { - configure(); InputSource is = new InputSource(input); getXMLReader().parse(is); - return (root); - + return root; } @@ -1546,20 +1513,7 @@ public void addRule(String pattern, Rule rule) { * @param ruleSet The RuleSet instance to configure from */ public void addRuleSet(RuleSet ruleSet) { - - String oldNamespaceURI = getRuleNamespaceURI(); - String newNamespaceURI = ruleSet.getNamespaceURI(); - if (log.isDebugEnabled()) { - if (newNamespaceURI == null) { - log.debug("addRuleSet() with no namespace URI"); - } else { - log.debug("addRuleSet() with namespace URI " + newNamespaceURI); - } - } - setRuleNamespaceURI(newNamespaceURI); ruleSet.addRuleInstances(this); - setRuleNamespaceURI(oldNamespaceURI); - } @@ -1724,14 +1678,12 @@ public void reset() { * @return the top object */ public Object peek() { - try { - return (stack.peek()); + return stack.peek(); } catch (EmptyStackException e) { log.warn("Empty stack (returning null)"); - return (null); + return null; } - } @@ -1745,14 +1697,12 @@ public Object peek() { * @return the specified object */ public Object peek(int n) { - try { - return (stack.peek(n)); + return stack.peek(n); } catch (EmptyStackException e) { log.warn("Empty stack (returning null)"); - return (null); + return null; } - } @@ -1762,14 +1712,12 @@ public Object peek(int n) { * @return the top object */ public Object pop() { - try { - return (stack.pop()); + return stack.pop(); } catch (EmptyStackException e) { log.warn("Empty stack (returning null)"); - return (null); + return null; } - } @@ -1841,14 +1789,12 @@ protected void configure() { * @return the top object on the parameters stack */ public Object peekParams() { - try { - return (params.peek()); + return params.peek(); } catch (EmptyStackException e) { log.warn("Empty stack (returning null)"); - return (null); + return null; } - } @@ -1861,17 +1807,15 @@ public Object peekParams() { * @return the top object on the parameters stack */ public Object popParams() { - try { if (log.isTraceEnabled()) { log.trace("Popping params"); } - return (params.pop()); + return params.pop(); } catch (EmptyStackException e) { log.warn("Empty stack (returning null)"); - return (null); + return null; } - } @@ -1985,7 +1929,7 @@ private Attributes updateAttributes(Attributes list) { newAttrs.setValue(i, newValue); } } catch (Exception e) { - // ignore - let the attribute have its original value + log.warn(sm.getString("digester.failedToUpdateAttributes", newAttrs.getLocalName(i), value), e); } } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java b/core/src/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java index 7dd127e..b6f7ad4 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/FactoryCreateRule.java @@ -168,14 +168,12 @@ public void finish() throws Exception { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("FactoryCreateRule["); if (creationFactory != null) { sb.append("creationFactory="); sb.append(creationFactory); } sb.append("]"); - return (sb.toString()); - + return sb.toString(); } } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/LocalStrings.properties b/core/src/main/java/org/apache/tomcat/util/digester/LocalStrings.properties index e490577..dba1d0f 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/LocalStrings.properties +++ b/core/src/main/java/org/apache/tomcat/util/digester/LocalStrings.properties @@ -13,4 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -disgester.encodingInvalid=The encoding [{0}] is not recognised by the JRE and will be ignored \ No newline at end of file +disgester.encodingInvalid=The encoding [{0}] is not recognised by the JRE and will be ignored +digester.failedToUpdateAttributes=Attribute [{0}] failed to update and remains [{1}] +digester.failedToUpdateSystemProperty=System property [{0}] failed to update and remains [{1}] diff --git a/core/src/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java b/core/src/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java index cbd1df5..c4d66e7 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/ObjectCreateRule.java @@ -41,7 +41,7 @@ public class ObjectCreateRule extends Rule { */ public ObjectCreateRule(String className) { - this(className, (String) null); + this(className, null); } @@ -114,7 +114,7 @@ public void begin(String namespace, String name, Attributes attributes) // Instantiate the new object and push it on the context stack Class clazz = digester.getClassLoader().loadClass(realClassName); - Object instance = clazz.newInstance(); + Object instance = clazz.getConstructor().newInstance(); digester.push(instance); } @@ -145,15 +145,13 @@ public void end(String namespace, String name) throws Exception { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("ObjectCreateRule["); sb.append("className="); sb.append(className); sb.append(", attributeName="); sb.append(attributeName); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/RuleSet.java b/core/src/main/java/org/apache/tomcat/util/digester/RuleSet.java index ebfa186..990dee3 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/RuleSet.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/RuleSet.java @@ -14,10 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.tomcat.util.digester; - /** *

    Public interface defining a shorthand means of configuring a complete * set of related Rule definitions, possibly associated with @@ -34,23 +32,8 @@ * your RuleSet to configure the necessary rules. * */ - public interface RuleSet { - - // ------------------------------------------------------------- Properties - - - /** - * @return the namespace URI that will be applied to all Rule instances - * created from this RuleSet. - */ - public String getNamespaceURI(); - - - // --------------------------------------------------------- Public Methods - - /** * Add the set of Rule instances defined in this RuleSet to the * specified Digester instance, associating them with @@ -60,7 +43,5 @@ public interface RuleSet { * @param digester Digester instance to which the new Rule instances * should be added. */ - public void addRuleInstances(Digester digester); - - + void addRuleInstances(Digester digester); } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/RuleSetBase.java b/core/src/main/java/org/apache/tomcat/util/digester/RuleSetBase.java deleted file mode 100644 index b917540..0000000 --- a/core/src/main/java/org/apache/tomcat/util/digester/RuleSetBase.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT 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 org.apache.tomcat.util.digester; - - -/** - *

    Convenience base class that implements the {@link RuleSet} interface. - * Concrete implementations should list all of their actual rule creation - * logic in the addRuleSet() implementation.

    - */ - -public abstract class RuleSetBase implements RuleSet { - - - // ----------------------------------------------------- Instance Variables - - - /** - * The namespace URI that all Rule instances created by this RuleSet - * will be associated with. - */ - protected String namespaceURI = null; - - - // ------------------------------------------------------------- Properties - - - /** - * Return the namespace URI that will be applied to all Rule instances - * created from this RuleSet. - */ - @Override - public String getNamespaceURI() { - - return (this.namespaceURI); - - } - - - // --------------------------------------------------------- Public Methods - - - /** - * Add the set of Rule instances defined in this RuleSet to the - * specified Digester instance, associating them with - * our namespace URI (if any). This method should only be called - * by a Digester instance. - * - * @param digester Digester instance to which the new Rule instances - * should be added. - */ - @Override - public abstract void addRuleInstances(Digester digester); - - -} diff --git a/core/src/main/java/org/apache/tomcat/util/digester/Rules.java b/core/src/main/java/org/apache/tomcat/util/digester/Rules.java index e12bf27..4782249 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/Rules.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/Rules.java @@ -14,27 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.tomcat.util.digester; - import java.util.List; - /** * Public interface defining a collection of Rule instances (and corresponding * matching patterns) plus an implementation of a matching policy that selects * the rules that match a particular pattern of nested elements discovered * during parsing. */ - public interface Rules { - // ------------------------------------------------------------- Properties - /** * @return the Digester instance with which this Rules instance is * associated. @@ -50,27 +43,8 @@ public interface Rules { public void setDigester(Digester digester); - /** - * @return the namespace URI that will be applied to all subsequently - * added Rule objects. - */ - public String getNamespaceURI(); - - - /** - * Set the namespace URI that will be applied to all subsequently - * added Rule objects. - * - * @param namespaceURI Namespace URI that must match on all - * subsequently added rules, or null for matching - * regardless of the current namespace URI - */ - public void setNamespaceURI(String namespaceURI); - - // --------------------------------------------------------- Public Methods - /** * Register a new Rule instance matching the specified pattern. * @@ -110,6 +84,4 @@ public interface Rules { * @return a rules list */ public List rules(); - - } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/RulesBase.java b/core/src/main/java/org/apache/tomcat/util/digester/RulesBase.java index 2025af1..6de5561 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/RulesBase.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/RulesBase.java @@ -14,17 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.tomcat.util.digester; - import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; - /** *

    Default implementation of the Rules interface that supports * the standard rule matching behavior. This class can also be used as a @@ -41,13 +36,10 @@ * element, no matter how deeply the pair is nested. * */ - public class RulesBase implements Rules { - // ----------------------------------------------------- Instance Variables - /** * The set of registered Rule instances, keyed by the matching pattern. * Each value is a List containing the Rules for that pattern, in the @@ -62,14 +54,6 @@ public class RulesBase implements Rules { protected Digester digester = null; - /** - * The namespace URI for which subsequently added Rule - * objects are relevant, or null for matching independent - * of namespaces. - */ - protected String namespaceURI = null; - - /** * The set of registered Rule instances, in the order that they were * originally registered. @@ -79,16 +63,13 @@ public class RulesBase implements Rules { // ------------------------------------------------------------- Properties - /** * Return the Digester instance with which this Rules instance is * associated. */ @Override public Digester getDigester() { - - return (this.digester); - + return this.digester; } @@ -99,48 +80,15 @@ public Digester getDigester() { */ @Override public void setDigester(Digester digester) { - this.digester = digester; - Iterator items = rules.iterator(); - while (items.hasNext()) { - Rule item = items.next(); + for (Rule item : rules) { item.setDigester(digester); } - - } - - - /** - * Return the namespace URI that will be applied to all subsequently - * added Rule objects. - */ - @Override - public String getNamespaceURI() { - - return (this.namespaceURI); - - } - - - /** - * Set the namespace URI that will be applied to all subsequently - * added Rule objects. - * - * @param namespaceURI Namespace URI that must match on all - * subsequently added rules, or null for matching - * regardless of the current namespace URI - */ - @Override - public void setNamespaceURI(String namespaceURI) { - - this.namespaceURI = namespaceURI; - } // --------------------------------------------------------- Public Methods - /** * Register a new Rule instance matching the specified pattern. * @@ -155,7 +103,6 @@ public void add(String pattern, Rule rule) { pattern = pattern.substring(0, patternLength-1); } - List list = cache.get(pattern); if (list == null) { list = new ArrayList<>(); @@ -166,10 +113,6 @@ public void add(String pattern, Rule rule) { if (this.digester != null) { rule.setDigester(this.digester); } - if (this.namespaceURI != null) { - rule.setNamespaceURI(this.namespaceURI); - } - } @@ -178,10 +121,8 @@ public void add(String pattern, Rule rule) { */ @Override public void clear() { - cache.clear(); rules.clear(); - } @@ -204,9 +145,7 @@ public List match(String namespaceURI, String pattern) { if ((rulesList == null) || (rulesList.size() < 1)) { // Find the longest key, ie more discriminant String longKey = ""; - Iterator keys = this.cache.keySet().iterator(); - while (keys.hasNext()) { - String key = keys.next(); + for (String key : this.cache.keySet()) { if (key.startsWith("*/")) { if (pattern.equals(key.substring(2)) || pattern.endsWith(key.substring(1))) { @@ -222,8 +161,7 @@ public List match(String namespaceURI, String pattern) { if (rulesList == null) { rulesList = new ArrayList<>(); } - return (rulesList); - + return rulesList; } @@ -236,15 +174,12 @@ public List match(String namespaceURI, String pattern) { */ @Override public List rules() { - - return (this.rules); - + return this.rules; } // ------------------------------------------------------ Protected Methods - /** * Return a List of Rule instances for the specified pattern that also * match the specified namespace URI (if any). If there are no such @@ -256,29 +191,23 @@ public List rules() { * @return a rules list */ protected List lookup(String namespaceURI, String pattern) { - // Optimize when no namespace URI is specified List list = this.cache.get(pattern); if (list == null) { - return (null); + return null; } if ((namespaceURI == null) || (namespaceURI.length() == 0)) { - return (list); + return list; } // Select only Rules that match on the specified namespace URI - ArrayList results = new ArrayList<>(); - Iterator items = list.iterator(); - while (items.hasNext()) { - Rule item = items.next(); + List results = new ArrayList<>(); + for (Rule item : list) { if ((namespaceURI.equals(item.getNamespaceURI())) || (item.getNamespaceURI() == null)) { results.add(item); } } - return (results); - + return results; } - - } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/SetNextRule.java b/core/src/main/java/org/apache/tomcat/util/digester/SetNextRule.java index 15f4a77..bb8eb9f 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/SetNextRule.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/SetNextRule.java @@ -153,15 +153,13 @@ public void end(String namespace, String name) throws Exception { */ @Override public String toString() { - StringBuilder sb = new StringBuilder("SetNextRule["); sb.append("methodName="); sb.append(methodName); sb.append(", paramType="); sb.append(paramType); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java b/core/src/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java index 761e1a5..3ad71f6 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java +++ b/core/src/main/java/org/apache/tomcat/util/digester/SetPropertiesRule.java @@ -86,10 +86,8 @@ public void begin(String namespace, String theName, Attributes attributes) */ @Override public String toString() { - StringBuilder sb = new StringBuilder("SetPropertiesRule["); sb.append("]"); - return (sb.toString()); - + return sb.toString(); } } diff --git a/core/src/main/java/org/apache/tomcat/util/digester/package.html b/core/src/main/java/org/apache/tomcat/util/digester/package.html index dd864db..994f202 100644 --- a/core/src/main/java/org/apache/tomcat/util/digester/package.html +++ b/core/src/main/java/org/apache/tomcat/util/digester/package.html @@ -23,7 +23,7 @@ XML documents.

    -

    +
    [Introduction] [Configuration Properties] [The Object Stack] @@ -95,12 +95,13 @@

    Digester Configuration Properties

    + - - + + - + - + - + - + - + - - +
    Digester Configuration Properties
    PropertyDescriptionPropertyDescription
    classLoaderclassLoader You can optionally specify the class loader that will be used to load classes when required by the ObjectCreateRule and FactoryCreateRule rules. If not specified, @@ -110,14 +111,14 @@

    Digester Configuration Properties

    used to load the Digester class itself.
    errorHandlererrorHandler You can optionally specify a SAX ErrorHandler that is notified when parsing errors occur. By default, any parsing errors that are encountered are logged, but Digester will continue processing as well.
    namespaceAwarenamespaceAware A boolean that is set to true to perform parsing in a manner that is aware of XML namespaces. Among other things, this setting affects how elements are matched to processing rules. See @@ -125,7 +126,7 @@

    Digester Configuration Properties

    information.
    ruleNamespaceURIruleNamespaceURI The public URI of the namespace for which all subsequently added rules are associated, or null for adding rules that are not associated with any namespace. See @@ -133,7 +134,7 @@

    Digester Configuration Properties

    information.
    rulesrules The Rules component that actually performs matching of Rule instances against the current element nesting pattern is pluggable. By default, Digester includes a @@ -143,7 +144,7 @@

    Digester Configuration Properties

    more information.
    useContextClassLoader + useContextClassLoader A boolean that is set to true if you want application classes required by FactoryCreateRule and ObjectCreateRule to be loaded from the context class @@ -154,7 +155,7 @@

    Digester Configuration Properties

    will be used unconditionally.
    validatingvalidating A boolean that is set to true if you wish to validate the XML document against a Document Type Definition (DTD) that is specified in its DOCTYPE declaration. The default @@ -268,7 +269,7 @@

    Element Matching Patterns

    pattern is matched whenever an <a> top-level element is encountered in the XML document, no matter how many times it occurs. Note that nested <a> elements will not match this -pattern -- we will describe means to support this kind of matching later. +pattern -- we will describe means to support this kind of matching later.

    The next step up in matching pattern complexity is "a/b". This pattern will be matched when a <b> element is found nested inside a @@ -448,7 +449,7 @@

    Logging

    Usage Examples

    -
    Creating a Simple Object Tree
    +

    Creating a Simple Object Tree

    Let's assume that you have two simple JavaBeans, Foo and Bar, with the following method signatures:

    @@ -528,7 +529,7 @@
    Creating a Simple Object Tree
    created for you.

    -
    Processing A Struts Configuration File
    +

    Processing A Struts Configuration File

    As stated earlier, the primary reason that the Digester package was created is because the @@ -622,7 +623,7 @@

    Processing A Struts Configuration File
    servlet, as well as being exposed as servlet context attributes.

    -
    Parsing Body Text In XML Files
    +

    Parsing Body Text In XML Files

    The Digester module also allows you to process the nested body text in an XML file, not just the elements and attributes that are encountered. The @@ -861,7 +862,7 @@

    RegexRules

    digester.setRules(new RegexRules(new SimpleRegexMatcher())); ... -
    RegexMatchers
    +

    RegexMatchers

    Digester ships only with one RegexMatcher implementation: SimpleRegexMatcher. @@ -987,7 +988,7 @@

    Using Named Stacks For Inter-Rule Communication

    accessed through calls to:

    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∓?lvsQQ7i{!^QgP^YJ+2CV}_Cno&qNjN<(Vx+CCf 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