Author: andygumbrecht
Date: Mon Apr 15 13:44:22 2013
New Revision: 1468065

URL: http://svn.apache.org/r1468065
Log:
Reduce logging level and prevent runaway exception logging - i.e. Caused by a 
rogue client that keeps attempting a bad call.
TODO - Currently limiting to 10 logged errors at warning level, but really need 
to have a timer reset after a certain period.
Prevent service start if stop has already been called - Rare case where the 
server needs to be killed aggressively during a startup, for example due to a 
bad configuration.
Finals.

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
    
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
    
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
    
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
    
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java
    
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/activemq/ActiveMQResourceAdapter.java
 Mon Apr 15 13:44:22 2013
@@ -55,7 +55,7 @@ public class ActiveMQResourceAdapter ext
         return Integer.parseInt(this.startupTimeout);
     }
 
-    public void setStartupTimeout(Duration startupTimeout) {
+    public void setStartupTimeout(final Duration startupTimeout) {
         if (startupTimeout.getUnit() == null) {
             startupTimeout.setUnit(TimeUnit.MILLISECONDS);
         }
@@ -121,7 +121,7 @@ public class ActiveMQResourceAdapter ext
         }
     }
 
-    private void createInternalBroker(String brokerXmlConfig, Properties 
properties) {
+    private void createInternalBroker(final String brokerXmlConfig, final 
Properties properties) {
         ActiveMQFactory.setThreadProperties(properties);
 
         try {

Modified: 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
 Mon Apr 15 13:44:22 2013
@@ -521,8 +521,8 @@ class EjbRequestHandler {
     private void replyWithFatalError(final byte version, final 
ObjectOutputStream out, final Throwable error, final String message) {
 
         //This is fatal for the client, but not the server.
-        if (logger.isWarningEnabled()) {
-            logger.warning(message + " - Debug " + logger + " for stacktrace: 
" + error);
+        if (logger.isInfoEnabled()) {
+            logger.info(message + " - Enable DEBUG for stacktrace: " + error);
         } else if (logger.isDebugEnabled()) {
             logger.debug(message, error);
         }
@@ -536,8 +536,8 @@ class EjbRequestHandler {
         } catch (Throwable t) {
             if (logger.isDebugEnabled()) {
                 logger.debug("Failed to write EjbResponse", t);
-            } else if (logger.isWarningEnabled()) {
-                logger.warning("Failed to write EjbResponse - Debug for 
stacktrace: " + t);
+            } else if (logger.isInfoEnabled()) {
+                logger.info("Failed to write EjbResponse - Debug for 
stacktrace: " + t);
             }
         }
     }

Modified: 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
 Mon Apr 15 13:44:22 2013
@@ -34,6 +34,7 @@ import java.util.Properties;
 @Managed
 public class ServiceLogger extends ServerServiceFilter {
 
+    private volatile int errors = 0;
     private Logger logger;
     private boolean debug = false;
 
@@ -95,11 +96,12 @@ public class ServiceLogger extends Serve
                 this.logger.debug("[request] for '" + name + "' by '" + 
address + "' took " + (System.nanoTime() - start) + "ns");
             }
         } catch (Exception e) {
-            final String msg = "[Request failed] for '" + name + "' by '" + 
address + "' : " + e.getMessage();
             if (this.debug) {
-                this.logger.error(msg, e);
-            } else {
-                this.logger.error(msg + " - Debug for StackTrace");
+                //Only log on debug else there is a DOS risk
+                this.logger.debug("[Request failed] for '" + name + "' by '" + 
address + "' : " + e.getMessage(), e);
+            } else if (this.logger.isWarningEnabled() && (errors < 
Integer.getInteger("openejb.max.log.socket.errors", 10))) {
+                errors++;
+                this.logger.warning("[Request failed] for '" + name + "' by '" 
+ address + "' : " + e.getMessage());
             }
         }
     }

Modified: 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceManager.java
 Mon Apr 15 13:44:22 2013
@@ -55,7 +55,7 @@ public abstract class ServiceManager {
     public ServiceManager() {
     }
 
-    public static ServiceManager getManager() {
+    public static synchronized ServiceManager getManager() {
         if (manager == null) {
             manager = new SimpleServiceManager();
         }
@@ -63,11 +63,11 @@ public abstract class ServiceManager {
         return manager;
     }
 
-    public static ServiceManager get() {
+    public static synchronized ServiceManager get() {
         return manager;
     }
 
-    protected static void setServiceManager(final ServiceManager newManager) {
+    protected static synchronized void setServiceManager(final ServiceManager 
newManager) {
         manager = newManager;
     }
 
@@ -307,10 +307,19 @@ public abstract class ServiceManager {
 
     abstract public void init() throws Exception;
 
-    public void start() throws ServiceException {
+    public final void start() throws ServiceException {
         start(true);
     }
 
+    /**
+     * Start the services managed by this instance.
+     * <p/>
+     * Services should not be started if {@link #stop()} has already been 
called,
+     * in which case a ServiceException should be thrown
+     *
+     * @param block A request to block
+     * @throws ServiceException On error or if the manager has been stopped 
already
+     */
     abstract public void start(boolean block) throws ServiceException;
 
     abstract public void stop() throws ServiceException;

Modified: 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/SimpleServiceManager.java
 Mon Apr 15 13:44:22 2013
@@ -43,7 +43,7 @@ public class SimpleServiceManager extend
     private static ObjectName objectName = null;
 
     private ServerService[] daemons;
-    private boolean stop = false;
+    private volatile boolean stopped = false;
     private final ServiceFinder serviceFinder;
 
     public SimpleServiceManager() {
@@ -149,10 +149,16 @@ public class SimpleServiceManager extend
         final List<ServerService> enabledServers = 
initServers(availableServices);
 
         daemons = enabledServers.toArray(new 
ServerService[enabledServers.size()]);
+        stopped = false;
     }
 
     @Override
     public synchronized void start(final boolean block) throws 
ServiceException {
+
+        if(stopped){
+            throw new ServiceException("Stop has already been called on 
ServiceManager");
+        }
+
         final boolean display = 
SystemInstance.get().getOptions().get("openejb.nobanner", (String) null) == 
null;
 
         // starting then displaying to get a more relevant log
@@ -207,7 +213,7 @@ public class SimpleServiceManager extend
          *  which will set 'stop' to true and notify the user thread.
          */
         try {
-            while (!stop) {
+            while (!stopped) {
 
                 this.wait(Long.MAX_VALUE);
             }
@@ -220,7 +226,7 @@ public class SimpleServiceManager extend
     @Override
     public synchronized void stop() throws ServiceException {
         logger.info("Stopping server services");
-        stop = true;
+        stopped = true;
 
         final ServerService[] services = daemons.clone();
 

Modified: 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java?rev=1468065&r1=1468064&r2=1468065&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-server/src/main/java/org/apache/openejb/server/osgi/ServiceManagerExtender.java
 Mon Apr 15 13:44:22 2013
@@ -20,6 +20,7 @@ import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.server.DiscoveryRegistry;
 import org.apache.openejb.server.ServerService;
+import org.apache.openejb.server.ServiceException;
 import org.apache.openejb.server.ServiceManager;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
@@ -30,9 +31,7 @@ import org.osgi.framework.ServiceRegistr
 import org.osgi.util.tracker.BundleTracker;
 import org.osgi.util.tracker.BundleTrackerCustomizer;
 
-import java.io.BufferedInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -49,136 +48,145 @@ public class ServiceManagerExtender exte
 
     static Logger logger = 
Logger.getInstance(LogCategory.OPENEJB_SERVER_REMOTE, 
"org.apache.openejb.server.util.resources");
 
-    private BundleContext bundleContext;
-    private BundleTracker tracker;    
-    private Map<Bundle, List<Service>> serverMap = new HashMap<Bundle, 
List<Service>>();
+    private final BundleContext bundleContext;
+    private BundleTracker tracker;
+    private final Map<Bundle, List<Service>> serverMap = new HashMap<Bundle, 
List<Service>>();
     private Boolean started;
-    
-    public ServiceManagerExtender(BundleContext bundleContext) {
+    private volatile boolean stopped = false;
+
+    public ServiceManagerExtender(final BundleContext bundleContext) {
         setServiceManager(this);
-        
+
         this.bundleContext = bundleContext;
     }
-        
+
+    @Override
     public void init() throws Exception {
         if (started != null && started.equals(Boolean.TRUE)) {
             throw new IllegalStateException("ServiceManager is already 
initialized");
         }
-        DiscoveryRegistry registry = new DiscoveryRegistry();
+        final DiscoveryRegistry registry = new DiscoveryRegistry();
         SystemInstance.get().setComponent(DiscoveryRegistry.class, registry);
-        
+
         started = Boolean.FALSE;
-        ServerServiceTracker t = new ServerServiceTracker();
+        stopped = false;
+        final ServerServiceTracker t = new ServerServiceTracker();
         tracker = new BundleTracker(bundleContext, Bundle.ACTIVE | 
Bundle.STOPPING, t);
-        tracker.open();       
-    }
-    
-    public synchronized void start(boolean block) {
-        start();
+        tracker.open();
     }
 
-    public synchronized void start() {
+    @Override
+    public synchronized void start(final boolean block) throws 
ServiceException {
+
+        //This implementaion ignores block
+
         if (started == null) {
-            throw new IllegalStateException("ServiceManager not initialized");
+            throw new ServiceException("ServiceManager not initialized");
+        }
+        if (stopped) {
+            throw new ServiceException("ServiceManager has already been 
stopped");
         }
+
         started = Boolean.TRUE;
-        for (Map.Entry<Bundle, List<Service>> entry : serverMap.entrySet()) {
-            for (Service service : entry.getValue()) {
+        for (final Map.Entry<Bundle, List<Service>> entry : 
serverMap.entrySet()) {
+            for (final Service service : entry.getValue()) {
                 service.start();
             }
         }
     }
-    
-    private synchronized void startServers(Bundle bundle, List<Service> 
services) {
+
+    private synchronized void startServers(final Bundle bundle, final 
List<Service> services) {
         serverMap.put(bundle, services);
-        if (started == Boolean.TRUE) { 
-            for (Service service : services) {
+        if (started == Boolean.TRUE) {
+            for (final Service service : services) {
                 service.start();
             }
         }
     }
-    
-    protected void addedServers(Bundle bundle, Map<String, Properties> 
resources) {
-        List<Service> services = new ArrayList<Service>();
-        for (Map.Entry<String, Properties> entry : resources.entrySet()) {
+
+    protected void addedServers(final Bundle bundle, final Map<String, 
Properties> resources) {
+        final List<Service> services = new ArrayList<Service>();
+        for (final Map.Entry<String, Properties> entry : resources.entrySet()) 
{
             services.add(new Service(bundle, entry.getKey(), 
entry.getValue()));
         }
         startServers(bundle, services);
     }
-        
+
+    @Override
     public synchronized void stop() {
         if (started == Boolean.TRUE) {
             started = Boolean.FALSE;
-            for (Map.Entry<Bundle, List<Service>> entry : 
serverMap.entrySet()) {
-                for (Service service : entry.getValue()) {
+            for (final Map.Entry<Bundle, List<Service>> entry : 
serverMap.entrySet()) {
+                for (final Service service : entry.getValue()) {
                     service.stop();
                 }
             }
         }
     }
-        
-    protected synchronized void removedServers(Bundle bundle) {
-        List<Service> services = serverMap.remove(bundle);
+
+    protected synchronized void removedServers(final Bundle bundle) {
+        final List<Service> services = serverMap.remove(bundle);
         if (services != null) {
-            for (Service service : services) {
+            for (final Service service : services) {
                 service.stop();
             }
         }
     }
-        
+
     protected void shutdown() {
         if (tracker != null) {
             tracker.close();
         }
         stop();
     }
-    
+
     private class Service {
-        
-        private String name;
-        private Properties description;
-        private Bundle bundle;
-        
+
+        private final String name;
+        private final Properties description;
+        private final Bundle bundle;
+
         private ServiceRegistration registration;
         private ServerService server;
-        
-        public Service(Bundle bundle, String name, Properties description) {
+
+        public Service(final Bundle bundle, final String name, final 
Properties description) {
             this.bundle = bundle;
             this.name = name;
             this.description = description;
         }
-        
+
         public void start() {
             try {
                 server = initServer(name, description);
             } catch (IOException e) {
                 logger.error("Error initializing " + name + " service.", e);
             }
-            
+
             if (server != null) {
                 try {
-                    server.start();                
+                    server.start();
                 } catch (Exception e) {
                     logger.error("Service Start Failed: " + name + " " + 
server.getIP() + " " + server.getPort() + ". Exception: " + e.getMessage(), e);
                 }
-            
-                BundleContext context = bundle.getBundleContext();
-                registration = 
context.registerService(ServerService.class.getName(), 
-                                                       server, 
+
+                final BundleContext context = bundle.getBundleContext();
+                registration = 
context.registerService(ServerService.class.getName(),
+                                                       server,
                                                        getServiceProperties());
             }
         }
-        
+
+        @SuppressWarnings({"UseOfObsoleteCollectionType", "unchecked"})
         private Hashtable getServiceProperties() {
-            Hashtable props = new Hashtable();
-            for (Map.Entry<Object, Object> entry : description.entrySet()) {
+            final Hashtable props = new Hashtable();
+            for (final Map.Entry<Object, Object> entry : 
description.entrySet()) {
                 if (entry.getKey() instanceof String) {
                     props.put(entry.getKey(), entry.getValue());
                 }
             }
             return props;
         }
-        
+
         public void stop() {
             if (server != null) {
                 try {
@@ -188,34 +196,41 @@ public class ServiceManagerExtender exte
                 }
             }
             if (registration != null) {
-                try { registration.unregister(); } catch 
(IllegalStateException ignore) {}
+                try {
+                    registration.unregister();
+                } catch (IllegalStateException ignore) {
+                }
             }
         }
     }
-    
+
     private class ServerServiceTracker implements BundleTrackerCustomizer {
 
-        public Object addingBundle(Bundle bundle, BundleEvent event) {
+        @Override
+        public Object addingBundle(final Bundle bundle, final BundleEvent 
event) {
             return scan(bundle);
         }
 
-        public void modifiedBundle(Bundle bundle, BundleEvent event, Object 
arg2) {
+        @Override
+        public void modifiedBundle(final Bundle bundle, final BundleEvent 
event, final Object arg2) {
         }
 
-        public void removedBundle(Bundle bundle, BundleEvent event, Object 
arg2) {
+        @Override
+        public void removedBundle(final Bundle bundle, final BundleEvent 
event, final Object arg2) {
             removedServers(bundle);
         }
-        
-        private Object scan(Bundle bundle) {
-            String basePath = "/META-INF/" + ServerService.class.getName() + 
"/";
-            Enumeration<URL> entries = bundle.findEntries(basePath, "*", 
false);
-            if (entries != null) {             
-                Map<String, Properties> resources = new HashMap<String, 
Properties>();
+
+        @SuppressWarnings("unchecked")
+        private Object scan(final Bundle bundle) {
+            final String basePath = "/META-INF/" + 
ServerService.class.getName() + "/";
+            final Enumeration<URL> entries = bundle.findEntries(basePath, "*", 
false);
+            if (entries != null) {
+                final Map<String, Properties> resources = new HashMap<String, 
Properties>();
                 while (entries.hasMoreElements()) {
-                    URL entry = entries.nextElement();
-                    String name = entry.getPath().substring(basePath.length());
+                    final URL entry = entries.nextElement();
+                    final String name = 
entry.getPath().substring(basePath.length());
                     try {
-                        Properties props = loadProperties(entry);
+                        final Properties props = loadProperties(entry);
                         setClass(props, bundle, ServerService.class);
                         setRawProperties(props, entry);
                         resources.put(name, props);
@@ -225,11 +240,11 @@ public class ServiceManagerExtender exte
                 }
                 addedServers(bundle, resources);
                 return bundle;
-            }   
+            }
             return null;
         }
-        
-        private void setClass(Properties properties, Bundle bundle, Class 
interfase) throws ClassNotFoundException {
+
+        private void setClass(final Properties properties, final Bundle 
bundle, final Class interfase) throws ClassNotFoundException {
             String className = properties.getProperty("className");
             if (className == null) {
                 className = properties.getProperty("classname");
@@ -238,20 +253,20 @@ public class ServiceManagerExtender exte
                 }
             }
 
-            Class impl = bundle.loadClass(className);
+            final Class impl = bundle.loadClass(className);
             properties.put(interfase, impl);
         }
 
-        private void setRawProperties(Properties properties, URL entry) throws 
IOException {
-            String rawProperties = readContents(entry);
+        private void setRawProperties(final Properties properties, final URL 
entry) throws IOException {
+            final String rawProperties = readContents(entry);
             properties.put(Properties.class, rawProperties);
         }
 
-        private Properties loadProperties(URL resource) throws IOException {
+        private Properties loadProperties(final URL resource) throws 
IOException {
             return IO.readProperties(resource);
         }
-        
-        private String readContents(URL resource) throws IOException {
+
+        private String readContents(final URL resource) throws IOException {
             return IO.slurp(resource);
         }
 


Reply via email to