You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shiro.apache.org by bd...@apache.org on 2016/07/08 14:23:38 UTC

shiro git commit: SHIRO-436 Added EnvironmentLoader.finalizeEnvironment() method

Repository: shiro
Updated Branches:
  refs/heads/master 5b59da340 -> 4c1a4cf44


SHIRO-436 Added EnvironmentLoader.finalizeEnvironment() method

The primary use of this new method is to cleanup anything custom done in EnvironmentLoader.customizeEnvironment()


Project: http://git-wip-us.apache.org/repos/asf/shiro/repo
Commit: http://git-wip-us.apache.org/repos/asf/shiro/commit/4c1a4cf4
Tree: http://git-wip-us.apache.org/repos/asf/shiro/tree/4c1a4cf4
Diff: http://git-wip-us.apache.org/repos/asf/shiro/diff/4c1a4cf4

Branch: refs/heads/master
Commit: 4c1a4cf443ca451d95f4f008a1a05539418ee113
Parents: 5b59da3
Author: Brian Demers <bd...@apache.org>
Authored: Fri Jul 8 09:35:08 2016 -0400
Committer: Brian Demers <bd...@apache.org>
Committed: Fri Jul 8 09:35:08 2016 -0400

----------------------------------------------------------------------
 .../apache/shiro/web/env/EnvironmentLoader.java | 19 ++++-
 .../shiro/web/env/EnvironmentLoaderTest.groovy  | 88 ++++++++++++++++++++
 .../shiro/web/env/MockWebEnvironment.groovy     | 48 +++++++++++
 3 files changed, 154 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/shiro/blob/4c1a4cf4/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java
----------------------------------------------------------------------
diff --git a/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java b/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java
index 42a9b86..1835e43 100644
--- a/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java
+++ b/web/src/main/java/org/apache/shiro/web/env/EnvironmentLoader.java
@@ -196,7 +196,7 @@ public class EnvironmentLoader {
         Class<?> clazz = determineWebEnvironmentClass(sc);
         if (!MutableWebEnvironment.class.isAssignableFrom(clazz)) {
             throw new ConfigurationException("Custom WebEnvironment class [" + clazz.getName() +
-                    "] is not of required type [" + WebEnvironment.class.getName() + "]");
+                    "] is not of required type [" + MutableWebEnvironment.class.getName() + "]");
         }
 
         String configLocations = sc.getInitParameter(CONFIG_LOCATIONS_PARAM);
@@ -224,6 +224,11 @@ public class EnvironmentLoader {
         return environment;
     }
 
+    /**
+     * Any additional customization of the Environment can be by overriding this method. For example setup shared
+     * resources, etc. By default this method does nothing.
+     * @param environment
+     */
     protected void customizeEnvironment(WebEnvironment environment) {
     }
 
@@ -236,9 +241,21 @@ public class EnvironmentLoader {
         servletContext.log("Cleaning up Shiro Environment");
         try {
             Object environment = servletContext.getAttribute(ENVIRONMENT_ATTRIBUTE_KEY);
+            if (environment instanceof WebEnvironment) {
+                finalizeEnvironment((WebEnvironment) environment);
+            }
             LifecycleUtils.destroy(environment);
         } finally {
             servletContext.removeAttribute(ENVIRONMENT_ATTRIBUTE_KEY);
         }
     }
+
+    /**
+     * Any additional cleanup of the Environment can be done by overriding this method.  For example clean up shared
+     * resources, etc. By default this method does nothing.
+     * @param environment
+     * @since 1.3
+     */
+    protected void finalizeEnvironment(WebEnvironment environment) {
+    }
 }

http://git-wip-us.apache.org/repos/asf/shiro/blob/4c1a4cf4/web/src/test/groovy/org/apache/shiro/web/env/EnvironmentLoaderTest.groovy
----------------------------------------------------------------------
diff --git a/web/src/test/groovy/org/apache/shiro/web/env/EnvironmentLoaderTest.groovy b/web/src/test/groovy/org/apache/shiro/web/env/EnvironmentLoaderTest.groovy
new file mode 100644
index 0000000..c2b1c5c
--- /dev/null
+++ b/web/src/test/groovy/org/apache/shiro/web/env/EnvironmentLoaderTest.groovy
@@ -0,0 +1,88 @@
+/*
+ * 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.shiro.web.env
+
+import org.easymock.Capture
+import org.easymock.IAnswer
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
+import org.junit.Test
+
+import javax.servlet.ServletContext
+
+/**
+ * Unit tests for the {@link EnvironmentLoaderTest} implementation.
+ * 
+ * @since 1.3
+ */
+class EnvironmentLoaderTest {
+
+    @Test
+    void testCustomizeAndFinalizeEnvironment() {
+
+        final AtomicInteger customizeEnvironmentCalledTimes = new AtomicInteger(0);
+        final AtomicInteger finalizeEnvironmentCalledTimes = new AtomicInteger(0);
+
+        EnvironmentLoader environmentLoader = new EnvironmentLoader() {
+
+            // EasyMock supports partial mocks, and this should not be necessary, but I could not get the .times()
+            // to work correctly.
+            @Override
+            protected void customizeEnvironment(WebEnvironment environment) {
+                customizeEnvironmentCalledTimes.getAndIncrement();
+            }
+
+            @Override
+            protected void finalizeEnvironment(WebEnvironment environment) {
+                finalizeEnvironmentCalledTimes.getAndIncrement();
+            }
+        };
+
+        ServletContext servletContext = createNiceMock(ServletContext.class);
+        Capture<Object> environmentObjectCapture = new Capture<Object>();
+        // This class is loaded via ClassUtils.newInstance()
+        expect(servletContext.getInitParameter(EnvironmentLoader.ENVIRONMENT_CLASS_PARAM)).andReturn(MockWebEnvironment.class.getName());
+        servletContext.setAttribute(eq(EnvironmentLoader.ENVIRONMENT_ATTRIBUTE_KEY), capture(environmentObjectCapture));
+        expect(servletContext.getAttribute(EnvironmentLoader.ENVIRONMENT_ATTRIBUTE_KEY)).andReturn(null); // the first time it will be null
+        // after that use what was passed to the setAttribute method
+        expect(servletContext.getAttribute(EnvironmentLoader.ENVIRONMENT_ATTRIBUTE_KEY)).andAnswer(new IAnswer<Object>() {
+            @Override
+            Object answer() throws Throwable {
+                return environmentObjectCapture.getValue();
+            }
+        })
+
+        replay(servletContext);
+
+        // initEnvironment calls customizeEnvironment
+        environmentLoader.initEnvironment(servletContext);
+        assertEquals(1, customizeEnvironmentCalledTimes.get())
+        assertEquals(0, finalizeEnvironmentCalledTimes.get())
+
+        // destroyEnvironment calls finalizeEnvironment
+        environmentLoader.destroyEnvironment(servletContext);
+        assertEquals(1, customizeEnvironmentCalledTimes.get())
+        assertEquals(1, finalizeEnvironmentCalledTimes.get())
+
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/shiro/blob/4c1a4cf4/web/src/test/groovy/org/apache/shiro/web/env/MockWebEnvironment.groovy
----------------------------------------------------------------------
diff --git a/web/src/test/groovy/org/apache/shiro/web/env/MockWebEnvironment.groovy b/web/src/test/groovy/org/apache/shiro/web/env/MockWebEnvironment.groovy
new file mode 100644
index 0000000..4a2cf9e
--- /dev/null
+++ b/web/src/test/groovy/org/apache/shiro/web/env/MockWebEnvironment.groovy
@@ -0,0 +1,48 @@
+package org.apache.shiro.web.env
+
+import org.apache.shiro.mgt.SecurityManager
+import org.apache.shiro.web.filter.mgt.FilterChainResolver
+import org.apache.shiro.web.mgt.WebSecurityManager
+
+import javax.servlet.ServletContext
+
+/**
+ * Mock WebEnvironment, replaces IniWebEnvironment in EnvironmentLoader tests, to avoid extra dependencies.
+ */
+class MockWebEnvironment implements MutableWebEnvironment {
+
+    @Override
+    void setFilterChainResolver(FilterChainResolver filterChainResolver) {
+
+    }
+
+    @Override
+    void setServletContext(ServletContext servletContext) {
+
+    }
+
+    @Override
+    void setWebSecurityManager(WebSecurityManager webSecurityManager) {
+
+    }
+
+    @Override
+    FilterChainResolver getFilterChainResolver() {
+        return null
+    }
+
+    @Override
+    ServletContext getServletContext() {
+        return null
+    }
+
+    @Override
+    WebSecurityManager getWebSecurityManager() {
+        return null
+    }
+
+    @Override
+    SecurityManager getSecurityManager() {
+        return null
+    }
+}