Return-Path: X-Original-To: apmail-commons-commits-archive@minotaur.apache.org Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id BE1B3183C5 for ; Sun, 7 Feb 2016 11:29:22 +0000 (UTC) Received: (qmail 32637 invoked by uid 500); 7 Feb 2016 11:29:22 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 32566 invoked by uid 500); 7 Feb 2016 11:29:22 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 32555 invoked by uid 99); 7 Feb 2016 11:29:22 -0000 Received: from Unknown (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 07 Feb 2016 11:29:22 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 1CEC01A03F2 for ; Sun, 7 Feb 2016 11:29:22 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.371 X-Spam-Level: * X-Spam-Status: No, score=1.371 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RP_MATCHES_RCVD=-0.429] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id cVRtU1FfPEPI for ; Sun, 7 Feb 2016 11:29:18 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with ESMTP id 42EA7201C0 for ; Sun, 7 Feb 2016 11:29:18 +0000 (UTC) Received: from svn01-us-west.apache.org (svn.apache.org [10.41.0.6]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id C613CE0425 for ; Sun, 7 Feb 2016 11:29:17 +0000 (UTC) Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id C411A3A05ED for ; Sun, 7 Feb 2016 11:29:17 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1728947 - in /commons/proper/jcs/trunk: commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/ commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/server/ src/changes/ Date: Sun, 07 Feb 2016 11:29:17 -0000 To: commits@commons.apache.org From: tv@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20160207112917.C411A3A05ED@svn01-us-west.apache.org> Author: tv Date: Sun Feb 7 11:29:17 2016 New Revision: 1728947 URL: http://svn.apache.org/viewvc?rev=1728947&view=rev Log: JCS-78 Fix: RemoteCacheStartupServlet can't start with config outside classpath Modified: commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/RemoteUtils.java commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java commons/proper/jcs/trunk/src/changes/changes.xml Modified: commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/RemoteUtils.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/RemoteUtils.java?rev=1728947&r1=1728946&r2=1728947&view=diff ============================================================================== --- commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/RemoteUtils.java (original) +++ commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/RemoteUtils.java Sun Feb 7 11:29:17 2016 @@ -19,11 +19,14 @@ package org.apache.commons.jcs.auxiliary * under the License. */ +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; +import java.net.URL; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; @@ -35,12 +38,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** - * This class provides some basic utilities for doing things such as starting the registry properly. + * This class provides some basic utilities for doing things such as starting + * the registry properly. */ public class RemoteUtils { /** The logger. */ - private static final Log log = LogFactory.getLog( RemoteUtils.class ); + private static final Log log = LogFactory.getLog(RemoteUtils.class); /** No instances please. */ private RemoteUtils() @@ -51,53 +55,54 @@ public class RemoteUtils /** * Creates and exports a registry on the specified port of the local host. *

+ * * @param port * @return the registry */ - public static Registry createRegistry( int port ) + public static Registry createRegistry(int port) { - Registry registry = null; + Registry registry = null; -// if ( log.isInfoEnabled() ) -// { -// log.info( "createRegistry> Setting security manager" ); -// } -// -// System.setSecurityManager( new RMISecurityManager() ); + // if ( log.isInfoEnabled() ) + // { + // log.info( "createRegistry> Setting security manager" ); + // } + // + // System.setSecurityManager( new RMISecurityManager() ); - if ( port < 1024 ) + if (port < 1024) { - if ( log.isWarnEnabled() ) + if (log.isWarnEnabled()) { - log.warn( "createRegistry> Port chosen was less than 1024, will use default [" + Registry.REGISTRY_PORT + "] instead." ); + log.warn("createRegistry> Port chosen was less than 1024, will use default [" + Registry.REGISTRY_PORT + "] instead."); } port = Registry.REGISTRY_PORT; } try { - registry = LocateRegistry.createRegistry( port ); + registry = LocateRegistry.createRegistry(port); log.info("createRegistry> Created the registry on port " + port); } - catch ( RemoteException e ) + catch (RemoteException e) { - log.warn( "createRegistry> Problem creating registry. It may already be started. " + e.getMessage() ); + log.warn("createRegistry> Problem creating registry. It may already be started. " + e.getMessage()); } - catch ( Throwable t ) + catch (Throwable t) { - log.error( "createRegistry> Problem creating registry.", t ); + log.error("createRegistry> Problem creating registry.", t); } if (registry == null) { - try - { - registry = LocateRegistry.getRegistry( port ); - } - catch (RemoteException e) - { - log.error( "createRegistry> Problem getting a registry reference.", e ); - } + try + { + registry = LocateRegistry.getRegistry(port); + } + catch (RemoteException e) + { + log.error("createRegistry> Problem getting a registry reference.", e); + } } return registry; @@ -105,44 +110,61 @@ public class RemoteUtils /** * Loads properties for the named props file. + * First tries class path, then file, then URL *

+ * * @param propFile * @return The properties object for the file * @throws IOException */ - public static Properties loadProps( String propFile ) - throws IOException + public static Properties loadProps(String propFile) + throws IOException { - InputStream is = RemoteUtils.class.getResourceAsStream( propFile ); + InputStream is = RemoteUtils.class.getResourceAsStream(propFile); + + if (null == is) // not found in class path + { + if (new File(propFile).exists()) + { + // file found + is = new FileInputStream(propFile); + } + else + { + // try URL + is = new URL(propFile).openStream(); + } + } + Properties props = new Properties(); try { - props.load( is ); - if ( log.isDebugEnabled() ) + props.load(is); + if (log.isDebugEnabled()) { - log.debug( "props.size=" + props.size() ); + log.debug("props.size=" + props.size()); } - if ( log.isDebugEnabled() ) + if (log.isDebugEnabled()) { Enumeration en = props.keys(); StringBuilder buf = new StringBuilder(); - while ( en.hasMoreElements() ) + while (en.hasMoreElements()) { String key = (String) en.nextElement(); - buf.append( "\n" + key + " = " + props.getProperty( key ) ); + buf.append("\n" + key + " = " + props.getProperty(key)); } - log.debug( buf.toString() ); + log.debug(buf.toString()); } } - catch ( Exception ex ) + catch (Exception ex) { - log.error( "Error loading remote properties, for file name [" + propFile + "]", ex ); + log.error("Error loading remote properties, for file name [" + propFile + "]", ex); } finally { - if ( is != null ) + if (is != null) { is.close(); } @@ -151,56 +173,58 @@ public class RemoteUtils } /** - * Configure a custom socket factory to set the timeout value. This sets the global socket - * factory. It's used only if a custom factory is not configured for the specific object. + * Configure a custom socket factory to set the timeout value. This sets the + * global socket factory. It's used only if a custom factory is not + * configured for the specific object. *

+ * * @param timeoutMillis */ - public static void configureGlobalCustomSocketFactory( final int timeoutMillis ) + public static void configureGlobalCustomSocketFactory(final int timeoutMillis) { try { // Don't set a socket factory if the setting is -1 - if ( timeoutMillis > 0 ) + if (timeoutMillis > 0) { - if ( log.isInfoEnabled() ) + if (log.isInfoEnabled()) { - log.info( "RmiSocketFactoryTimeoutMillis [" + timeoutMillis + "]. " - + " Configuring a custom socket factory." ); + log.info("RmiSocketFactoryTimeoutMillis [" + timeoutMillis + "]. " + + " Configuring a custom socket factory."); } // use this socket factory to add a timeout. - RMISocketFactory.setSocketFactory( new RMISocketFactory() + RMISocketFactory.setSocketFactory(new RMISocketFactory() { @Override - public Socket createSocket( String host, int port ) - throws IOException + public Socket createSocket(String host, int port) + throws IOException { Socket socket = new Socket(); - socket.setSoTimeout( timeoutMillis ); - socket.setSoLinger( false, 0 ); - socket.connect( new InetSocketAddress( host, port ), timeoutMillis ); + socket.setSoTimeout(timeoutMillis); + socket.setSoLinger(false, 0); + socket.connect(new InetSocketAddress(host, port), timeoutMillis); return socket; } @Override - public ServerSocket createServerSocket( int port ) - throws IOException + public ServerSocket createServerSocket(int port) + throws IOException { - return new ServerSocket( port ); + return new ServerSocket(port); } - } ); + }); } } - catch ( IOException e ) + catch (IOException e) { // Only try to do it once. Otherwise we // Generate errors for each region on construction. RMISocketFactory factoryInUse = RMISocketFactory.getSocketFactory(); - if ( factoryInUse != null && !factoryInUse.getClass().getName().startsWith( "org.apache.commons.jcs" ) ) + if (factoryInUse != null && !factoryInUse.getClass().getName().startsWith("org.apache.commons.jcs")) { - log.info( "Could not create new custom socket factory. " + e.getMessage() + " Factory in use = " - + RMISocketFactory.getSocketFactory() ); + log.info("Could not create new custom socket factory. " + e.getMessage() + " Factory in use = " + + RMISocketFactory.getSocketFactory()); } } } @@ -208,8 +232,10 @@ public class RemoteUtils /** * Get the naming url used for RMI registration * - * @param location the remote location - * @param serviceName the remote service name + * @param location + * the remote location + * @param serviceName + * the remote service name * @return the URL for RMI lookup */ public static String getNamingURL(final RemoteLocation location, final String serviceName) @@ -220,14 +246,18 @@ public class RemoteUtils /** * Get the naming url used for RMI registration * - * @param registryHost the remote host - * @param registryPort the remote port - * @param serviceName the remote service name + * @param registryHost + * the remote host + * @param registryPort + * the remote port + * @param serviceName + * the remote service name * @return the URL for RMI lookup */ public static String getNamingURL(final String registryHost, final int registryPort, final String serviceName) { - if (registryHost.contains(":")) { // TODO improve this check? See also JCS-133 + if (registryHost.contains(":")) + { // TODO improve this check? See also JCS-133 return "//[" + registryHost.replaceFirst("%", "%25") + "]:" + registryPort + "/" + serviceName; } final String registryURL = "//" + registryHost + ":" + registryPort + "/" + serviceName; Modified: commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java?rev=1728947&r1=1728946&r2=1728947&view=diff ============================================================================== --- commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java (original) +++ commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java Sun Feb 7 11:29:17 2016 @@ -19,25 +19,28 @@ package org.apache.commons.jcs.auxiliary * under the License. */ -import org.apache.commons.jcs.access.exception.CacheException; -import org.apache.commons.jcs.engine.control.CompositeCacheManager; -import org.apache.commons.jcs.utils.net.HostNameUtil; -import org.apache.commons.jcs.utils.props.PropertyLoader; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import java.io.IOException; +import java.io.OutputStream; +import java.net.UnknownHostException; +import java.util.Properties; +import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.OutputStream; -import java.net.UnknownHostException; -import java.util.Properties; + +import org.apache.commons.jcs.access.exception.CacheException; +import org.apache.commons.jcs.auxiliary.remote.RemoteUtils; +import org.apache.commons.jcs.engine.control.CompositeCacheManager; +import org.apache.commons.jcs.utils.net.HostNameUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** - * This servlet can be used to startup the JCS remote cache. It is easy to deploy the remote server - * in a tomcat base. This give you an easy way to monitor its activity. + * This servlet can be used to startup the JCS remote cache. It is easy to + * deploy the remote server in a tomcat base. This give you an easy way to + * monitor its activity. *

* * servlet> @@ -54,111 +57,109 @@ import java.util.Properties; <url-pattern>/jcs</url-pattern> </servlet-mapping> * + * * @author Aaron Smuts */ public class RemoteCacheStartupServlet - extends HttpServlet + extends HttpServlet { /** Don't change */ private static final long serialVersionUID = 1L; /** The logger */ - private static final Log log = LogFactory.getLog( RemoteCacheStartupServlet.class ); + private static final Log log = LogFactory.getLog(RemoteCacheStartupServlet.class); - /** The default port to start the registry on. */ + /** The default port to start the registry on. */ private static final int DEFAULT_REGISTRY_PORT = 1101; /** properties file name */ - private static final String DEFAULT_PROPS_FILE_NAME = "cache"; - - /** properties file Suffix */ - private static final String DEFAULT_PROPS_FILE_SUFFIX = "ccf"; + private static final String DEFAULT_PROPS_FILE_NAME = "/cache.ccf"; /** properties file name, must set prior to calling get instance */ - private final String propsFileName = DEFAULT_PROPS_FILE_NAME; + private String propsFileName = DEFAULT_PROPS_FILE_NAME; - /** properties file name, must set prior to calling get instance */ - private final String fullPropsFileName = DEFAULT_PROPS_FILE_NAME + "." + DEFAULT_PROPS_FILE_SUFFIX; + /** Configuration properties */ + private int registryPort = DEFAULT_REGISTRY_PORT; + + /** Configuration properties */ + private String registryHost = null; /** * Starts the registry and then tries to bind to it. *

- * Gets the port from a props file. Uses the local host name for the registry host. Tries to - * start the registry, ignoring failure. Starts the server. + * Gets the port from a props file. Uses the local host name for the + * registry host. Tries to start the registry, ignoring failure. Starts the + * server. *

+ * * @throws ServletException */ @Override public void init() - throws ServletException + throws ServletException { super.init(); - // TODO load from props file or get as init param or get from jndi, or - // all three - int registryPort = DEFAULT_REGISTRY_PORT; - Properties props = PropertyLoader.loadProperties( propsFileName ); - if ( props != null ) - { - String portS = props.getProperty( "registry.port", String.valueOf( DEFAULT_REGISTRY_PORT ) ); + loadInitParams(); + Properties props = loadPropertiesFromFile(); + if (registryHost == null) + { + // we will always use the local machine for the registry try { - registryPort = Integer.parseInt( portS ); + registryHost = HostNameUtil.getLocalHostAddress(); } - catch ( NumberFormatException e ) + catch (UnknownHostException e) { - log.error( "Problem converting port to an int.", e ); + log.error("Could not get local address to use for the registry!", e); } } - // we will always use the local machine for the registry - String registryHost; - try + if (log.isDebugEnabled()) { - registryHost = HostNameUtil.getLocalHostAddress(); + log.debug("registryHost = [" + registryHost + "]"); + } - if ( log.isDebugEnabled() ) - { - log.debug( "registryHost = [" + registryHost + "]" ); - } + if ("localhost".equals(registryHost) || "127.0.0.1".equals(registryHost)) + { + log.warn("The local address [" + registryHost + + "] is INVALID. Other machines must be able to use the address to reach this server."); + } - if ( "localhost".equals( registryHost ) || "127.0.0.1".equals( registryHost ) ) + try + { + if (props == null) { - log.warn( "The local address [" + registryHost - + "] is INVALID. Other machines must be able to use the address to reach this server." ); + RemoteCacheServerFactory.startup(registryHost, registryPort, propsFileName); } - - try + else { - RemoteCacheServerFactory.startup( registryHost, registryPort, "/" + fullPropsFileName ); - if ( log.isInfoEnabled() ) - { - log.info( "Remote JCS Server started with properties from " + fullPropsFileName ); - } + RemoteCacheServerFactory.startup(registryHost, registryPort, props, propsFileName); } - catch ( IOException e ) + if (log.isInfoEnabled()) { - log.error( "Problem starting remote cache server.", e ); + log.info("Remote JCS Server started with properties from " + propsFileName); } } - catch ( UnknownHostException e ) + catch (IOException e) { - log.error( "Could not get local address to use for the registry!", e ); + log.error("Problem starting remote cache server.", e); } } /** * It just dumps the stats. *

+ * * @param request * @param response * @throws ServletException * @throws IOException */ @Override - protected void service( HttpServletRequest request, HttpServletResponse response ) - throws ServletException, IOException + protected void service(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { String stats = ""; @@ -171,9 +172,9 @@ public class RemoteCacheStartupServlet throw new ServletException(e); } - if ( log.isInfoEnabled() ) + if (log.isInfoEnabled()) { - log.info( stats ); + log.info(stats); } try @@ -185,12 +186,12 @@ public class RemoteCacheStartupServlet response.setCharacterEncoding(characterEncoding); } OutputStream os = response.getOutputStream(); - os.write( stats.getBytes(characterEncoding) ); + os.write(stats.getBytes(characterEncoding)); os.close(); } - catch ( IOException e ) + catch (IOException e) { - log.error( "Problem writing response.", e ); + log.error("Problem writing response.", e); } } @@ -202,7 +203,16 @@ public class RemoteCacheStartupServlet { super.destroy(); - log.info( "Shutting down remote cache " ); + log.info("Shutting down remote cache "); + + try + { + RemoteCacheServerFactory.shutdownImpl(registryHost, registryPort); + } + catch (IOException e) + { + log.error("Problem shutting down.", e); + } try { @@ -213,4 +223,71 @@ public class RemoteCacheStartupServlet log.error("Could not retrieve cache manager instance", e); } } + + /** + * Load configuration values from config file if possible + */ + private Properties loadPropertiesFromFile() + { + Properties props = null; + + try + { + props = RemoteUtils.loadProps(propsFileName); + if (props != null) + { + registryHost = props.getProperty("registry.host", registryHost); + String portS = props.getProperty("registry.port", String.valueOf(registryPort)); + setRegistryPort(portS); + } + } + catch (IOException e) + { + log.error("Problem loading props.", e); + } + + return props; + } + + /** + * Load configuration values from init params if possible + */ + private void loadInitParams() + { + ServletConfig config = getServletConfig(); + String _propsFileName = config.getInitParameter("propsFileName"); + if (null != _propsFileName) + { + this.propsFileName = _propsFileName; + } + String _registryHost = config.getInitParameter("registryHost"); + if (null != _registryHost) + { + this.registryHost = _registryHost; + } + String regPortString = config.getInitParameter("registryPort"); + if (null != regPortString) + { + setRegistryPort(regPortString); + } + } + + /** + * Set registry port from string If the string cannot be parsed, the default + * value is used + * + * @param portS + */ + private void setRegistryPort(String portS) + { + try + { + this.registryPort = Integer.parseInt(portS); + } + catch (NumberFormatException e) + { + log.error("Problem converting port to an int.", e); + this.registryPort = DEFAULT_REGISTRY_PORT; + } + } } Modified: commons/proper/jcs/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/changes/changes.xml?rev=1728947&r1=1728946&r2=1728947&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/changes/changes.xml (original) +++ commons/proper/jcs/trunk/src/changes/changes.xml Sun Feb 7 11:29:17 2016 @@ -20,6 +20,9 @@ + + Fix: RemoteCacheStartupServlet can't start with config outside classpath + Add verification of block disk cache key file.