This is an automated email from the ASF dual-hosted git repository. juanpablo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jspwiki.git
commit cf21830bf6b16d1ec4067e379f9a33559b694219 Author: Juan Pablo Santos RodrÃguez <juanpablo.san...@gmail.com> AuthorDate: Sat Dec 7 16:02:22 2024 +0100 remove Jetty usage --- LICENSE | 1 - .../java/org/apache/wiki/web/StreamRedirector.java | 46 ---- .../java/org/apache/wiki/web/TestContainer.java | 302 --------------------- 3 files changed, 349 deletions(-) diff --git a/LICENSE b/LICENSE index 9500ddea5..c22f264a5 100644 --- a/LICENSE +++ b/LICENSE @@ -291,7 +291,6 @@ jetty-all-9.4.54.v20240208.jar LICENSE junit-5.13.4 ./jspwiki-war/src/main/config/doc/LICENSE.cpl mockito-core-5.18.0.jar ./jspwiki-war/src/main/config/doc/LICENSE.mit selenide-6.19.0.jar ./jspwiki-war/src/main/config/doc/LICENSE.mit -stripes-1.7.0-async.jar LICENSE yuicompressor-2.4.7.jar ./jspwiki-war/src/main/config/doc/LICENSE.yui JS LIBRARY LICENSE FILE diff --git a/jspwiki-main/src/test/java/org/apache/wiki/web/StreamRedirector.java b/jspwiki-main/src/test/java/org/apache/wiki/web/StreamRedirector.java deleted file mode 100644 index 6c54da0ba..000000000 --- a/jspwiki-main/src/test/java/org/apache/wiki/web/StreamRedirector.java +++ /dev/null @@ -1,46 +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.wiki.web; - -import java.io.FileOutputStream; -import java.io.PrintStream; - -/** - * Catching the stdout and stderr when running under a spawned ant java task is difficult, therefore we wrap the TestContainer with this - * class and redirect the output to files. - * - */ -public class StreamRedirector -{ - public static void main(final String[] args ) throws Exception - { - final String mainClass = args[0]; - final String logFile = args[1]; - - // redirect the streams - final PrintStream outfile = new PrintStream( new FileOutputStream( logFile ) ); - System.setErr( outfile ); - System.setOut( outfile ); - - // call the TestContainer after stripping of the first two args and redirecting the output. - final String[] strippedArgs = new String[args.length - 2]; - System.arraycopy( args, 2, strippedArgs, 0, strippedArgs.length ); - Class.forName( mainClass ).getMethod( "main", String[].class ).invoke( null, (Object) strippedArgs ); - } -} diff --git a/jspwiki-main/src/test/java/org/apache/wiki/web/TestContainer.java b/jspwiki-main/src/test/java/org/apache/wiki/web/TestContainer.java deleted file mode 100644 index fb205ef44..000000000 --- a/jspwiki-main/src/test/java/org/apache/wiki/web/TestContainer.java +++ /dev/null @@ -1,302 +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.wiki.web; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.wiki.HsqlDbUtils; -import org.apache.wiki.auth.Users; -import org.eclipse.jetty.jndi.InitialContextFactory; -import org.eclipse.jetty.jndi.NamingContext; -import org.eclipse.jetty.plus.jndi.Resource; -import org.eclipse.jetty.ee10.servlet.security.ConstraintSecurityHandler; -import org.eclipse.jetty.security.HashLoginService; -import org.eclipse.jetty.security.SecurityHandler; -import org.eclipse.jetty.security.UserStore; -import org.eclipse.jetty.server.*; -import org.eclipse.jetty.server.handler.*; -import org.eclipse.jetty.util.Callback; -import org.eclipse.jetty.util.security.Password; -import org.eclipse.jetty.ee10.webapp.WebAppContext; -import org.hsqldb.jdbc.JDBCDataSource; - -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NameNotFoundException; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; - - -/** - * Lightweight wrapper that starts and stops an embedded Jetty server on a - * hard-coded port {@link #HTTP_PORT}. The server can be shut down by sending a - * request containing the hard-coded string {@link #SHUTDOWN_CMD}. - */ -public class TestContainer { - private final Server server; - - /** - * High port that listens for web application requests. - */ - public static final int HTTP_PORT = 10024; - - public static final String SHUTDOWN_CMD = "/GO_AWAY"; - - public static final String INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial"; - public static final String INITIAL_CONTEXT_FACTORY_JETTY = "org.eclipse.jetty.jndi.InitialContextFactory"; - public static final String JNDI_ENV_ROOT = "java:comp/env"; - - private static final HsqlDbUtils m_hu = new HsqlDbUtils(); - - private static final Logger LOG = LogManager.getLogger( TestContainer.class ); - - private static Context initCtx ; - private static Resource userDB; - private static Resource groupDB; - - private static final ContextHandlerCollection handlerCollection = new ContextHandlerCollection(); - - /** - * Starts up a test server for a particular web application on the specified - * port (or default if no port was specified). - * - * @param args the command-line arguments - * @throws Exception - you know, just in case. - */ - public static void main(final String[] args ) throws Exception { - // Extract key-value pairs that represent test contexts and directories - final Map<String, String> apps = extractApps( args ); - if( apps.size() == 0 ) { - throw new IllegalArgumentException( "No apps supplied!" ); - } - - // If we get here, then everything parsed ok... - - // Create a new server and load up the webapps - final TestContainer container = new TestContainer(); - for( final Map.Entry<String, String> app : apps.entrySet() ) { - final String context = app.getKey(); - final String path = app.getValue(); - LOG.error( "Adding context " + context + " at path " + path ); - container.addWebApp( context, path ); - } - - handlerCollection.addHandler( new DefaultHandler() ); - - // set up the hsqldb database engine - m_hu.setUp(); - - // Create the connection pool - final JDBCDataSource cpds = new JDBCDataSource(); - cpds.setDatabase( "jdbc:hsqldb:hsql://localhost/jspwiki" ); - cpds.setLoginTimeout( 10 ); - cpds.setUser( "SA" ); - cpds.setPassword( null ); - - // Configure and bind DataSource to JNDI for user database - userDB = new Resource( "jdbc/UserDatabase", cpds ); - LOG.error( "Configured datasource " + userDB); - userDB.bindToENC("jdbc/UserDatabase"); - - // Configure and bind DataSource to JNDI for group database - groupDB = new Resource( "jdbc/GroupDatabase", cpds ); - LOG.error( "Configured datasource " + groupDB); - userDB.bindToENC("jdbc/GroupDatabase"); - - // Start the server - try { - LOG.error( "Starting up test container." ); - container.server.setHandler( handlerCollection ); - final List<Handler> currentHandlers = container.server.getHandlers(); - LOG.error( "dumping current handlers" ); - for( final Handler handler : currentHandlers ) - { - if( handler instanceof Handler.Container ) - { - final List<Handler> collection = ((Handler.Container) handler).getHandlers(); - for( final Handler h : collection ) - { - LOG.error( "handler: " + h ); - } - } - } - container.start(); - } catch( final Throwable t ) { - // userDB.unbindENC(); - // groupDB.unbindENC(); - t.printStackTrace(); - LOG.error( t.getMessage() ); - System.exit( 1 ); - } - } - - private static Map<String, String> extractApps(final String[] args ) - { - final Map<String, String> apps = new HashMap<String, String>(); - for( final String arg : args ) { - final String[] pair = arg.split( "=" ); - - // Right length? - if( pair.length != 2 ) { - throw new IllegalArgumentException( "Malformed argument '" + arg + "'; expected 'context=path' pattern." ); - } - - // Extract and sanitize first arg - String context = pair[ 0 ].trim(); - if( !context.startsWith( "/" ) ) { - context = "/" + context; - } - - // Extract and verify the path - final String path = pair[ 1 ].trim(); - final File file = new File( path ); - if( !file.exists() ) { - throw new IllegalArgumentException( "Path " + path + " does not exist." ); - } - if( !file.isDirectory() ) { - throw new IllegalArgumentException( "Path " + path + " cannot be a file; it must be a directory." ); - } - - apps.put( context, path ); - } - - return apps; - } - - /** - * Prepares a Jetty server with its HTTP and shutdown handlers. Callers must start the server by calling {@link #start()}. - * - * @throws Exception you know, just in case - */ - public TestContainer() throws Exception { - // Initialize JNDI for the server, using the Jetty JNDI packages if not set yet - // Normally this is set at JVM startup by property -Djava.naming.factory.initial=classname - String contextFactoryClass = System.getProperty( INITIAL_CONTEXT_FACTORY ); - if ( contextFactoryClass == null ) { - System.setProperty( INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY_JETTY ); -// ContextFactory.setNameParser( new InitialContextFactory.DefaultParser() ); - LOG.error( "No JNDI context factory found; using org.eclipse.jndi.InitialContextFactory." ); - contextFactoryClass = INITIAL_CONTEXT_FACTORY_JETTY; - } - LOG.error( "Initialized JNDI with context factory class=" + contextFactoryClass + "." ); - - // Bind the "java:comp/env" namespace if not bound already - initCtx = new InitialContext(); - try { - initCtx.lookup( JNDI_ENV_ROOT ); - } catch( final NameNotFoundException e ) { - initCtx.bind( JNDI_ENV_ROOT, new NamingContext(new Hashtable<String, Object>(), JNDI_ENV_ROOT, null, new InitialContextFactory.DefaultParser()) ); - LOG.error( "No JNDI " + JNDI_ENV_ROOT + " namespace found; creating it," ); - } - LOG.info( "Initialized JNDI " + JNDI_ENV_ROOT + " namespace.=" + contextFactoryClass ); - - // Initialize new Jetty server - LOG.info( "Creating new test container." ); - System.setProperty( "org.eclipse.xml.XmlParser.NotValidating", "true" ); - server = new Server(); - server.setStopAtShutdown( true ); - - // Create HTTP listener - final NetworkTrafficServerConnector connector = new NetworkTrafficServerConnector( server ); - connector.setHost( "localhost" ); - connector.setPort( HTTP_PORT ); - connector.setIdleTimeout( 60_000 ); - - server.setConnectors( new Connector[] {connector} ); - LOG.info( "added HTTP listener for port " + HTTP_PORT ); - - // add the shutdown handler - final ContextHandler shutDownContextHandler = new ContextHandler(SHUTDOWN_CMD); - shutDownContextHandler.setHandler( new ShutdownHandler()); - handlerCollection.addHandler( shutDownContextHandler ); - } - - /** - * Configures a test web application - * - * @param context the name of the web m_context; must start with "/" - * @param path the file path for the WAR file, or expanded WAR directory - */ - public void addWebApp( final String context, final String path ) { - // Set the default users and roles for the realm (note that realm name *must* match web.xml <realm-name> - final UserStore userStore = new UserStore(); - userStore.addUser( Users.ADMIN, new Password(Users.ADMIN_PASS), new String[] {"Authenticated", "Admin"} ); - userStore.addUser( Users.JANNE, new Password(Users.JANNE_PASS), new String[] {"Authenticated"} ); - final HashLoginService loginService = new HashLoginService( "JSPWikiRealm" ); - loginService.setUserStore( userStore ); - - final WebAppContext webAppContext = new WebAppContext(path, context); - - // Add a security handler. - final SecurityHandler csh = new ConstraintSecurityHandler(); - csh.setLoginService( loginService ); - webAppContext.setSecurityHandler( csh ); - - LOG.error( "Adding webapp " + context + " for path " + path ); - handlerCollection.addHandler( webAppContext ); - } - - /** - * Starts the Jetty server - */ - public void start() throws Exception { - System.setProperty( "org.eclipse.http.HttpRequest.maxFormContentSize", "0" ); - server.start(); - LOG.error("jetty server started"); - } - - /** - * Stops the Jetty server - */ - public void stop() { - try { - server.stop(); - LOG.error("jetty server stopped"); - } catch( final Exception ex ) { - throw new RuntimeException( ex ); - } - } - - /** - * Handler that shuts down the Jetty server if a request is received containing the shutdown string {@link TestContainer#SHUTDOWN_CMD} . - */ - public static final class ShutdownHandler extends Handler.Abstract { - - - - @Override - public boolean handle(Request request, Response response, Callback callback) throws Exception { - if( request.getHttpURI().toString().contains( SHUTDOWN_CMD ) ) { - LOG.error( "stop cmd received, shutting down server" ); - System.exit( 0 ); - } else { - LOG.error("ignoring request " + request.getHttpURI()); - } - - return true; - } - } -}