You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2014/05/05 22:08:40 UTC

[26/51] [partial] FLEX-34306 - [BlazeDS] Make the BlazeDS build run on Windows machines - Added some mkdir commands to the ANT Build.java - Did some fine-tuning to resolve some compile errors

http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/4f6a3052/modules/core/src/flex/messaging/MessageBrokerServlet.java
----------------------------------------------------------------------
diff --git a/modules/core/src/flex/messaging/MessageBrokerServlet.java b/modules/core/src/flex/messaging/MessageBrokerServlet.java
old mode 100755
new mode 100644
index aaa60d8..ea0ddc8
--- a/modules/core/src/flex/messaging/MessageBrokerServlet.java
+++ b/modules/core/src/flex/messaging/MessageBrokerServlet.java
@@ -1,461 +1,461 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 flex.messaging;
-
-import flex.management.MBeanLifecycleManager;
-import flex.management.MBeanServerLocatorFactory;
-import flex.messaging.config.ConfigurationManager;
-import flex.messaging.config.FlexConfigurationManager;
-import flex.messaging.config.MessagingConfiguration;
-import flex.messaging.endpoints.Endpoint;
-import flex.messaging.io.SerializationContext;
-import flex.messaging.io.TypeMarshallingContext;
-import flex.messaging.log.HTTPRequestLog;
-import flex.messaging.log.Log;
-import flex.messaging.log.LogCategories;
-import flex.messaging.log.Logger;
-import flex.messaging.log.LoggingHttpServletRequestWrapper;
-import flex.messaging.log.ServletLogTarget;
-import flex.messaging.services.AuthenticationService;
-import flex.messaging.util.ClassUtil;
-import flex.messaging.util.ExceptionUtil;
-import flex.messaging.util.Trace;
-
-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.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.Principal;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * The MessageBrokerServlet bootstraps the MessageBroker,
- * adds endpoints to it, and starts the broker. The servlet
- * also acts as a facade for all http-based endpoints, in that
- * the servlet receives the http request and then delegates to
- * an endpoint that can handle the request's content type. This
- * does not occur for non-http endpoints, such as the rtmp endpoint.
- *
- * @author sneville
- * @see flex.messaging.MessageBroker
- * @exclude
- */
-public class MessageBrokerServlet extends HttpServlet
-{
-    static final long serialVersionUID = -5293855229461612246L;
-
-    public static final String LOG_CATEGORY_STARTUP_BROKER = LogCategories.STARTUP_MESSAGEBROKER;
-    private static final String STRING_UNDEFINED_APPLICATION = "undefined";
-
-    private MessageBroker broker;
-    private HttpFlexSessionProvider httpFlexSessionProvider;
-    private static String FLEXDIR = "/WEB-INF/flex/";
-    private boolean log_errors = false;
-
-    /**
-     * Initializes the servlet in its web container, then creates
-     * the MessageBroker and adds Endpoints and Services to that broker.
-     * This servlet may keep a reference to an endpoint if it needs to
-     * delegate to it in the <code>service</code> method.
-     */
-    public void init(ServletConfig servletConfig) throws ServletException
-    {
-        super.init(servletConfig);
-
-        // allocate thread local variables
-        createThreadLocals();
-
-        // Set the servlet config as thread local
-        FlexContext.setThreadLocalObjects(null, null, null, null, null, servletConfig);
-
-        ServletLogTarget.setServletContext(servletConfig.getServletContext());
-
-        ClassLoader loader = getClassLoader();
-
-        if ("true".equals(servletConfig.getInitParameter("useContextClassLoader")))
-        {
-            loader = Thread.currentThread().getContextClassLoader();
-        }
-
-        // Should we wrap http request for later error logging?
-        log_errors = HTTPRequestLog.init(getServletContext());
-
-        // Start the broker
-        try
-        {
-            // Get the configuration manager
-            ConfigurationManager configManager = loadMessagingConfiguration(servletConfig);
-
-            // Load configuration
-            MessagingConfiguration config = configManager.getMessagingConfiguration(servletConfig);
-
-            // Set up logging system ahead of everything else.
-            config.createLogAndTargets();
-
-            // Create broker.
-            broker = config.createBroker(servletConfig.getInitParameter("messageBrokerId"), loader);
-
-            // Set the servlet config as thread local
-            FlexContext.setThreadLocalObjects(null, null, broker, null, null, servletConfig);
-
-            setupPathResolvers();
-
-            // Set initial servlet context on broker
-            broker.setServletContext(servletConfig.getServletContext());
-
-            Logger logger = Log.getLogger(ConfigurationManager.LOG_CATEGORY);
-            if (Log.isInfo())
-            {
-                logger.info(VersionInfo.buildMessage());
-            }
-
-            // Create endpoints, services, security, and logger on the broker based on configuration
-            config.configureBroker(broker);
-
-            long timeBeforeStartup = 0;
-            if (Log.isDebug())
-            {
-                timeBeforeStartup = System.currentTimeMillis();
-                Log.getLogger(LOG_CATEGORY_STARTUP_BROKER).debug("MessageBroker with id '{0}' is starting.",
-                        new Object[]{broker.getId()});
-            }
-
-            //initialize the httpSessionToFlexSessionMap
-            synchronized(HttpFlexSession.mapLock)
-            {
-                if (servletConfig.getServletContext().getAttribute(HttpFlexSession.SESSION_MAP) == null)
-                    servletConfig.getServletContext().setAttribute(HttpFlexSession.SESSION_MAP, new ConcurrentHashMap());
-            }
-
-            broker.start();
-
-            if (Log.isDebug())
-            {
-                long timeAfterStartup = System.currentTimeMillis();
-                Long diffMillis = timeAfterStartup - timeBeforeStartup;
-                Log.getLogger(LOG_CATEGORY_STARTUP_BROKER).debug("MessageBroker with id '{0}' is ready (startup time: '{1}' ms)",
-                        new Object[]{broker.getId(), diffMillis});
-            }
-
-            // Report replaced tokens
-            configManager.reportTokens();
-
-            // Report any unused properties.
-            config.reportUnusedProperties();
-
-            // Setup provider for FlexSessions that wrap underlying J2EE HttpSessions.
-            httpFlexSessionProvider = new HttpFlexSessionProvider();
-            broker.getFlexSessionManager().registerFlexSessionProvider(HttpFlexSession.class, httpFlexSessionProvider);
-
-            // clear the broker and servlet config as this thread is done
-            FlexContext.clearThreadLocalObjects();
-        }
-        catch (Throwable t)
-        {
-            // On any unhandled exception destroy the broker, log it and rethrow.
-            String applicationName = servletConfig.getServletContext().getServletContextName();
-            if (applicationName == null)
-                applicationName = STRING_UNDEFINED_APPLICATION;
-
-            System.err.println("**** MessageBrokerServlet in application '" + applicationName
-                    + "' failed to initialize due to runtime exception: "
-                    + ExceptionUtil.exceptionFollowedByRootCausesToString(t));
-            destroy();
-            // We used to throw  UnavailableException, but Weblogic didn't mark the webapp as failed. See bug FBR-237
-            throw new ServletException(t);
-        }
-    }
-
-    private void setupPathResolvers()
-    {
-        setupExternalPathResolver();
-        setupInternalPathResolver();
-    }
-
-    private void setupExternalPathResolver()
-    {
-        broker.setExternalPathResolver(
-                new MessageBroker.PathResolver()
-                {
-                    public InputStream resolve(String filename) throws FileNotFoundException
-                    {
-                        return new FileInputStream(new File(filename));
-                    }
-                }
-        );
-    }
-
-    private void setupInternalPathResolver()
-    {
-        broker.setInternalPathResolver(
-                new MessageBroker.InternalPathResolver()
-                {
-                    public InputStream resolve(String filename)
-                    {
-                        return getServletContext().getResourceAsStream(FLEXDIR + filename);
-                    }
-                }
-        );
-    }
-
-    private static ConfigurationManager loadMessagingConfiguration(ServletConfig servletConfig)
-    {
-        ConfigurationManager manager = null;
-        Class managerClass;
-        String className;
-
-        // Check for Custom Configuration Manager Specification
-        if (servletConfig != null)
-        {
-            String p = servletConfig.getInitParameter("services.configuration.manager");
-            if (p != null)
-            {
-                className = p.trim();
-                try
-                {
-                    managerClass = ClassUtil.createClass(className);
-                    manager = (ConfigurationManager)managerClass.newInstance();
-                }
-                catch (Throwable t)
-                {
-                    if (Trace.config) // Log is not initialized yet.
-                        Trace.trace("Could not load configuration manager as: " + className);
-                }
-            }
-        }
-
-        if (manager == null)
-        {
-            manager = new FlexConfigurationManager();
-        }
-
-        return manager;
-    }
-
-    /**
-     * Stops all endpoints in the MessageBroker, giving them a chance
-     * to perform any endpoint-specific clean up.
-     */
-    public void destroy()
-    {
-        if (broker != null)
-        {
-            broker.stop();
-            if (broker.isManaged())
-            {
-                MBeanLifecycleManager.unregisterRuntimeMBeans(broker);
-            }
-            // release static thread locals
-            destroyThreadLocals();
-        }
-    }
-
-    /**
-     * Handle an incoming request, and delegate to an endpoint based on
-     * content type, if appropriate. The content type mappings for endpoints
-     * are not externally configurable, and currently the AmfEndpoint
-     * is the only delegate.
-     */
-    public void service(HttpServletRequest req, HttpServletResponse res)
-    {
-        if (log_errors)
-        {
-            // Create a wrapper for the request object so we can save the body content
-            LoggingHttpServletRequestWrapper wrapper = new LoggingHttpServletRequestWrapper(req);
-            req = wrapper;
-
-            try
-            {
-                // Read the body content
-                wrapper.doReadBody();
-            }
-            catch (IOException ignore)
-            {
-                // ignore, the wrapper will preserve what content we were able to read.
-            }
-        }
-
-        try
-        {
-            // Update thread locals
-            broker.initThreadLocals();
-            // Set this first so it is in place for the session creation event.  The
-            // current session is set by the FlexSession stuff right when it is available.
-            // The threadlocal FlexClient is set up during message deserialization in the
-            // MessageBrokerFilter.
-            FlexContext.setThreadLocalObjects(null, null, broker, req, res, getServletConfig());
-
-            HttpFlexSession fs = httpFlexSessionProvider.getOrCreateSession(req);
-            Principal principal;
-            if(FlexContext.isPerClientAuthentication())
-            {
-                principal = FlexContext.getUserPrincipal();
-            }
-            else
-            {
-                principal = fs.getUserPrincipal();
-            }
-
-            if (principal == null && req.getHeader("Authorization") != null)
-            {
-                String encoded = req.getHeader("Authorization");
-                if (encoded.indexOf("Basic") > -1)
-                {
-                    encoded = encoded.substring(6); //Basic.length()+1
-                    try
-                    {
-                        ((AuthenticationService)broker.getService(AuthenticationService.ID)).decodeAndLogin(encoded, broker.getLoginManager());
-                    }
-                    catch (Exception e)
-                    {
-                        if (Log.isDebug())
-                            Log.getLogger(LogCategories.SECURITY).info("Authentication service could not decode and login: " + e.getMessage());
-                    }
-                }
-            }
-
-            String contextPath = req.getContextPath();
-            String pathInfo = req.getPathInfo();
-            String endpointPath = req.getServletPath();
-            if (pathInfo != null)
-                endpointPath = endpointPath + pathInfo;
-
-            Endpoint endpoint;
-            try
-            {
-                endpoint = broker.getEndpoint(endpointPath, contextPath);
-            }
-            catch (MessageException me)
-            {
-                if (Log.isInfo())
-                    Log.getLogger(LogCategories.ENDPOINT_GENERAL).info("Received invalid request for endpoint path '{0}'.", new Object[] {endpointPath});
-
-                if (!res.isCommitted())
-                {
-                    try
-                    {
-                        res.sendError(HttpServletResponse.SC_NOT_FOUND);
-                    }
-                    catch (IOException ignore)
-                    {}
-                }
-
-                return;
-            }
-
-            try
-            {
-                if (Log.isInfo())
-                {
-                    Log.getLogger(LogCategories.ENDPOINT_GENERAL).info("Channel endpoint {0} received request.",
-                                                                       new Object[] {endpoint.getId()});
-                }
-                endpoint.service(req, res);
-            }
-            catch (UnsupportedOperationException ue)
-            {
-                if (Log.isInfo())
-                {
-                    Log.getLogger(LogCategories.ENDPOINT_GENERAL).info("Channel endpoint {0} received request for an unsupported operation.",
-                                                                       new Object[] {endpoint.getId()},
-                                                                       ue);
-                }
-
-                if (!res.isCommitted())
-                {
-                    try
-                    {
-                        res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
-                    }
-                    catch (IOException ignore)
-                    {}
-                }
-            }
-        }
-        catch (Throwable t)
-        {
-            // Final resort catch block as recommended by Fortify as a potential System info leak
-            try
-            {
-                Log.getLogger(LogCategories.ENDPOINT_GENERAL).error("Unexpected error encountered in Message Broker servlet", t);
-                res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-            }
-            catch (IOException ignore)
-            {
-                // ignore
-            }
-
-        }
-        finally
-        {
-            if (log_errors)
-            {
-                String info = (String) req.getAttribute(HTTPRequestLog.HTTP_ERROR_INFO);
-                if (info != null)
-                {
-                    // Log the HttpRequest data
-                    System.out.println("Exception occurred while processing HTTP request: " + info + ", request details logged in " + HTTPRequestLog.getFileName());
-                    HTTPRequestLog.outputRequest(info, req);
-                }
-            }
-
-            FlexContext.clearThreadLocalObjects();
-        }
-    }
-
-    /**
-     * Hook for subclasses to override the class loader to use for loading user defined classes.
-     *
-     * @return the class loader for this class
-     */
-    protected ClassLoader getClassLoader()
-    {
-        return this.getClass().getClassLoader();
-    }
-
-    /** @exclude */
-    // Call ONLY on servlet startup
-    public static void createThreadLocals()
-    {
-        // allocate static thread local objects
-        FlexContext.createThreadLocalObjects();
-        SerializationContext.createThreadLocalObjects();
-        TypeMarshallingContext.createThreadLocalObjects();
-    }
-
-    /** @exclude */
-    // Call ONLY on servlet shutdown
-    protected static void destroyThreadLocals()
-    {
-        // clear static member variables
-        Log.clear();
-        MBeanServerLocatorFactory.clear();
-
-        // Destroy static thread local objects
-        FlexContext.releaseThreadLocalObjects();
-        SerializationContext.releaseThreadLocalObjects();
-        TypeMarshallingContext.releaseThreadLocalObjects();
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 flex.messaging;
+
+import flex.management.MBeanLifecycleManager;
+import flex.management.MBeanServerLocatorFactory;
+import flex.messaging.config.ConfigurationManager;
+import flex.messaging.config.FlexConfigurationManager;
+import flex.messaging.config.MessagingConfiguration;
+import flex.messaging.endpoints.Endpoint;
+import flex.messaging.io.SerializationContext;
+import flex.messaging.io.TypeMarshallingContext;
+import flex.messaging.log.HTTPRequestLog;
+import flex.messaging.log.Log;
+import flex.messaging.log.LogCategories;
+import flex.messaging.log.Logger;
+import flex.messaging.log.LoggingHttpServletRequestWrapper;
+import flex.messaging.log.ServletLogTarget;
+import flex.messaging.services.AuthenticationService;
+import flex.messaging.util.ClassUtil;
+import flex.messaging.util.ExceptionUtil;
+import flex.messaging.util.Trace;
+
+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.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.Principal;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * The MessageBrokerServlet bootstraps the MessageBroker,
+ * adds endpoints to it, and starts the broker. The servlet
+ * also acts as a facade for all http-based endpoints, in that
+ * the servlet receives the http request and then delegates to
+ * an endpoint that can handle the request's content type. This
+ * does not occur for non-http endpoints, such as the rtmp endpoint.
+ *
+ * @author sneville
+ * @see flex.messaging.MessageBroker
+ * @exclude
+ */
+public class MessageBrokerServlet extends HttpServlet
+{
+    static final long serialVersionUID = -5293855229461612246L;
+
+    public static final String LOG_CATEGORY_STARTUP_BROKER = LogCategories.STARTUP_MESSAGEBROKER;
+    private static final String STRING_UNDEFINED_APPLICATION = "undefined";
+
+    private MessageBroker broker;
+    private HttpFlexSessionProvider httpFlexSessionProvider;
+    private static String FLEXDIR = "/WEB-INF/flex/";
+    private boolean log_errors = false;
+
+    /**
+     * Initializes the servlet in its web container, then creates
+     * the MessageBroker and adds Endpoints and Services to that broker.
+     * This servlet may keep a reference to an endpoint if it needs to
+     * delegate to it in the <code>service</code> method.
+     */
+    public void init(ServletConfig servletConfig) throws ServletException
+    {
+        super.init(servletConfig);
+
+        // allocate thread local variables
+        createThreadLocals();
+
+        // Set the servlet config as thread local
+        FlexContext.setThreadLocalObjects(null, null, null, null, null, servletConfig);
+
+        ServletLogTarget.setServletContext(servletConfig.getServletContext());
+
+        ClassLoader loader = getClassLoader();
+
+        if ("true".equals(servletConfig.getInitParameter("useContextClassLoader")))
+        {
+            loader = Thread.currentThread().getContextClassLoader();
+        }
+
+        // Should we wrap http request for later error logging?
+        log_errors = HTTPRequestLog.init(getServletContext());
+
+        // Start the broker
+        try
+        {
+            // Get the configuration manager
+            ConfigurationManager configManager = loadMessagingConfiguration(servletConfig);
+
+            // Load configuration
+            MessagingConfiguration config = configManager.getMessagingConfiguration(servletConfig);
+
+            // Set up logging system ahead of everything else.
+            config.createLogAndTargets();
+
+            // Create broker.
+            broker = config.createBroker(servletConfig.getInitParameter("messageBrokerId"), loader);
+
+            // Set the servlet config as thread local
+            FlexContext.setThreadLocalObjects(null, null, broker, null, null, servletConfig);
+
+            setupPathResolvers();
+
+            // Set initial servlet context on broker
+            broker.setServletContext(servletConfig.getServletContext());
+
+            Logger logger = Log.getLogger(ConfigurationManager.LOG_CATEGORY);
+            if (Log.isInfo())
+            {
+                logger.info(VersionInfo.buildMessage());
+            }
+
+            // Create endpoints, services, security, and logger on the broker based on configuration
+            config.configureBroker(broker);
+
+            long timeBeforeStartup = 0;
+            if (Log.isDebug())
+            {
+                timeBeforeStartup = System.currentTimeMillis();
+                Log.getLogger(LOG_CATEGORY_STARTUP_BROKER).debug("MessageBroker with id '{0}' is starting.",
+                        new Object[]{broker.getId()});
+            }
+
+            //initialize the httpSessionToFlexSessionMap
+            synchronized(HttpFlexSession.mapLock)
+            {
+                if (servletConfig.getServletContext().getAttribute(HttpFlexSession.SESSION_MAP) == null)
+                    servletConfig.getServletContext().setAttribute(HttpFlexSession.SESSION_MAP, new ConcurrentHashMap());
+            }
+
+            broker.start();
+
+            if (Log.isDebug())
+            {
+                long timeAfterStartup = System.currentTimeMillis();
+                Long diffMillis = timeAfterStartup - timeBeforeStartup;
+                Log.getLogger(LOG_CATEGORY_STARTUP_BROKER).debug("MessageBroker with id '{0}' is ready (startup time: '{1}' ms)",
+                        new Object[]{broker.getId(), diffMillis});
+            }
+
+            // Report replaced tokens
+            configManager.reportTokens();
+
+            // Report any unused properties.
+            config.reportUnusedProperties();
+
+            // Setup provider for FlexSessions that wrap underlying J2EE HttpSessions.
+            httpFlexSessionProvider = new HttpFlexSessionProvider();
+            broker.getFlexSessionManager().registerFlexSessionProvider(HttpFlexSession.class, httpFlexSessionProvider);
+
+            // clear the broker and servlet config as this thread is done
+            FlexContext.clearThreadLocalObjects();
+        }
+        catch (Throwable t)
+        {
+            // On any unhandled exception destroy the broker, log it and rethrow.
+            String applicationName = servletConfig.getServletContext().getServletContextName();
+            if (applicationName == null)
+                applicationName = STRING_UNDEFINED_APPLICATION;
+
+            System.err.println("**** MessageBrokerServlet in application '" + applicationName
+                    + "' failed to initialize due to runtime exception: "
+                    + ExceptionUtil.exceptionFollowedByRootCausesToString(t));
+            destroy();
+            // We used to throw  UnavailableException, but Weblogic didn't mark the webapp as failed. See bug FBR-237
+            throw new ServletException(t);
+        }
+    }
+
+    private void setupPathResolvers()
+    {
+        setupExternalPathResolver();
+        setupInternalPathResolver();
+    }
+
+    private void setupExternalPathResolver()
+    {
+        broker.setExternalPathResolver(
+                new MessageBroker.PathResolver()
+                {
+                    public InputStream resolve(String filename) throws FileNotFoundException
+                    {
+                        return new FileInputStream(new File(filename));
+                    }
+                }
+        );
+    }
+
+    private void setupInternalPathResolver()
+    {
+        broker.setInternalPathResolver(
+                new MessageBroker.InternalPathResolver()
+                {
+                    public InputStream resolve(String filename)
+                    {
+                        return getServletContext().getResourceAsStream(FLEXDIR + filename);
+                    }
+                }
+        );
+    }
+
+    private static ConfigurationManager loadMessagingConfiguration(ServletConfig servletConfig)
+    {
+        ConfigurationManager manager = null;
+        Class managerClass;
+        String className;
+
+        // Check for Custom Configuration Manager Specification
+        if (servletConfig != null)
+        {
+            String p = servletConfig.getInitParameter("services.configuration.manager");
+            if (p != null)
+            {
+                className = p.trim();
+                try
+                {
+                    managerClass = ClassUtil.createClass(className);
+                    manager = (ConfigurationManager)managerClass.newInstance();
+                }
+                catch (Throwable t)
+                {
+                    if (Trace.config) // Log is not initialized yet.
+                        Trace.trace("Could not load configuration manager as: " + className);
+                }
+            }
+        }
+
+        if (manager == null)
+        {
+            manager = new FlexConfigurationManager();
+        }
+
+        return manager;
+    }
+
+    /**
+     * Stops all endpoints in the MessageBroker, giving them a chance
+     * to perform any endpoint-specific clean up.
+     */
+    public void destroy()
+    {
+        if (broker != null)
+        {
+            broker.stop();
+            if (broker.isManaged())
+            {
+                MBeanLifecycleManager.unregisterRuntimeMBeans(broker);
+            }
+            // release static thread locals
+            destroyThreadLocals();
+        }
+    }
+
+    /**
+     * Handle an incoming request, and delegate to an endpoint based on
+     * content type, if appropriate. The content type mappings for endpoints
+     * are not externally configurable, and currently the AmfEndpoint
+     * is the only delegate.
+     */
+    public void service(HttpServletRequest req, HttpServletResponse res)
+    {
+        if (log_errors)
+        {
+            // Create a wrapper for the request object so we can save the body content
+            LoggingHttpServletRequestWrapper wrapper = new LoggingHttpServletRequestWrapper(req);
+            req = wrapper;
+
+            try
+            {
+                // Read the body content
+                wrapper.doReadBody();
+            }
+            catch (IOException ignore)
+            {
+                // ignore, the wrapper will preserve what content we were able to read.
+            }
+        }
+
+        try
+        {
+            // Update thread locals
+            broker.initThreadLocals();
+            // Set this first so it is in place for the session creation event.  The
+            // current session is set by the FlexSession stuff right when it is available.
+            // The threadlocal FlexClient is set up during message deserialization in the
+            // MessageBrokerFilter.
+            FlexContext.setThreadLocalObjects(null, null, broker, req, res, getServletConfig());
+
+            HttpFlexSession fs = httpFlexSessionProvider.getOrCreateSession(req);
+            Principal principal;
+            if(FlexContext.isPerClientAuthentication())
+            {
+                principal = FlexContext.getUserPrincipal();
+            }
+            else
+            {
+                principal = fs.getUserPrincipal();
+            }
+
+            if (principal == null && req.getHeader("Authorization") != null)
+            {
+                String encoded = req.getHeader("Authorization");
+                if (encoded.indexOf("Basic") > -1)
+                {
+                    encoded = encoded.substring(6); //Basic.length()+1
+                    try
+                    {
+                        ((AuthenticationService)broker.getService(AuthenticationService.ID)).decodeAndLogin(encoded, broker.getLoginManager());
+                    }
+                    catch (Exception e)
+                    {
+                        if (Log.isDebug())
+                            Log.getLogger(LogCategories.SECURITY).info("Authentication service could not decode and login: " + e.getMessage());
+                    }
+                }
+            }
+
+            String contextPath = req.getContextPath();
+            String pathInfo = req.getPathInfo();
+            String endpointPath = req.getServletPath();
+            if (pathInfo != null)
+                endpointPath = endpointPath + pathInfo;
+
+            Endpoint endpoint;
+            try
+            {
+                endpoint = broker.getEndpoint(endpointPath, contextPath);
+            }
+            catch (MessageException me)
+            {
+                if (Log.isInfo())
+                    Log.getLogger(LogCategories.ENDPOINT_GENERAL).info("Received invalid request for endpoint path '{0}'.", new Object[] {endpointPath});
+
+                if (!res.isCommitted())
+                {
+                    try
+                    {
+                        res.sendError(HttpServletResponse.SC_NOT_FOUND);
+                    }
+                    catch (IOException ignore)
+                    {}
+                }
+
+                return;
+            }
+
+            try
+            {
+                if (Log.isInfo())
+                {
+                    Log.getLogger(LogCategories.ENDPOINT_GENERAL).info("Channel endpoint {0} received request.",
+                                                                       new Object[] {endpoint.getId()});
+                }
+                endpoint.service(req, res);
+            }
+            catch (UnsupportedOperationException ue)
+            {
+                if (Log.isInfo())
+                {
+                    Log.getLogger(LogCategories.ENDPOINT_GENERAL).info("Channel endpoint {0} received request for an unsupported operation.",
+                                                                       new Object[] {endpoint.getId()},
+                                                                       ue);
+                }
+
+                if (!res.isCommitted())
+                {
+                    try
+                    {
+                        res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+                    }
+                    catch (IOException ignore)
+                    {}
+                }
+            }
+        }
+        catch (Throwable t)
+        {
+            // Final resort catch block as recommended by Fortify as a potential System info leak
+            try
+            {
+                Log.getLogger(LogCategories.ENDPOINT_GENERAL).error("Unexpected error encountered in Message Broker servlet", t);
+                res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            }
+            catch (IOException ignore)
+            {
+                // ignore
+            }
+
+        }
+        finally
+        {
+            if (log_errors)
+            {
+                String info = (String) req.getAttribute(HTTPRequestLog.HTTP_ERROR_INFO);
+                if (info != null)
+                {
+                    // Log the HttpRequest data
+                    System.out.println("Exception occurred while processing HTTP request: " + info + ", request details logged in " + HTTPRequestLog.getFileName());
+                    HTTPRequestLog.outputRequest(info, req);
+                }
+            }
+
+            FlexContext.clearThreadLocalObjects();
+        }
+    }
+
+    /**
+     * Hook for subclasses to override the class loader to use for loading user defined classes.
+     *
+     * @return the class loader for this class
+     */
+    protected ClassLoader getClassLoader()
+    {
+        return this.getClass().getClassLoader();
+    }
+
+    /** @exclude */
+    // Call ONLY on servlet startup
+    public static void createThreadLocals()
+    {
+        // allocate static thread local objects
+        FlexContext.createThreadLocalObjects();
+        SerializationContext.createThreadLocalObjects();
+        TypeMarshallingContext.createThreadLocalObjects();
+    }
+
+    /** @exclude */
+    // Call ONLY on servlet shutdown
+    protected static void destroyThreadLocals()
+    {
+        // clear static member variables
+        Log.clear();
+        MBeanServerLocatorFactory.clear();
+
+        // Destroy static thread local objects
+        FlexContext.releaseThreadLocalObjects();
+        SerializationContext.releaseThreadLocalObjects();
+        TypeMarshallingContext.releaseThreadLocalObjects();
+    }
+
+}