You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2008/08/18 16:12:15 UTC

svn commit: r686767 - in /mina/ftpserver/trunk/core/src: main/java/org/apache/ftpserver/ main/java/org/apache/ftpserver/ftplet/ test/java/org/apache/ftpserver/ftplet/

Author: ngn
Date: Mon Aug 18 07:12:14 2008
New Revision: 686767

URL: http://svn.apache.org/viewvc?rev=686767&view=rev
Log:
Fixed bug where Ftplet.init() would not be called correctly. Added test to make sure both init and destroy are sent to the Ftplets (FTPSERVER-163)

Modified:
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpServer.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/FtpletContainer.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpServer.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpServer.java?rev=686767&r1=686766&r2=686767&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpServer.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpServer.java Mon Aug 18 07:12:14 2008
@@ -77,6 +77,9 @@
             listener.start(serverContext);
         }
 
+        // init the Ftplet container
+        serverContext.getFtpletContainer().init(serverContext);
+        
         started = true;
 
         LOG.info("FTP server started");

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java?rev=686767&r1=686766&r2=686767&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java Mon Aug 18 07:12:14 2008
@@ -38,9 +38,11 @@
     private final Logger LOG = LoggerFactory
             .getLogger(DefaultFtpletContainer.class);
 
+    private FtpletContext ftpletContext;
+    
     private Map<String, Ftplet> ftplets = new ConcurrentHashMap<String, Ftplet>();
 
-    public void dispose() {
+    public synchronized void dispose() {
 
         for (Entry<String, Ftplet> entry : ftplets.entrySet()) {
             try {
@@ -52,16 +54,20 @@
         ftplets.clear();
     }
 
-    public void addFtplet(String name, Ftplet ftplet) {
+    public synchronized void addFtplet(String name, Ftplet ftplet) throws FtpException {
         if (getFtplet(name) != null) {
             throw new IllegalArgumentException("Ftplet with name \"" + name
                     + "\" already registred with container");
         }
 
         ftplets.put(name, ftplet);
+        
+        if(ftpletContext != null) {
+            ftplet.init(ftpletContext);
+        }
     }
 
-    public Ftplet removeFtplet(String name) {
+    public synchronized Ftplet removeFtplet(String name) {
         Ftplet ftplet = ftplets.get(name);
 
         if (ftplet != null) {
@@ -75,7 +81,7 @@
     /**
      * Get Ftplet for the given name.
      */
-    public Ftplet getFtplet(String name) {
+    public synchronized Ftplet getFtplet(String name) {
         if (name == null) {
             return null;
         }
@@ -83,21 +89,27 @@
         return ftplets.get(name);
     }
 
-    public void init(FtpletContext ftpletContext) throws FtpException {
-        // dummy, forced by Ftplet API
+    public synchronized void init(FtpletContext ftpletContext) throws FtpException {
+        this.ftpletContext = ftpletContext;
+        
+        // initialize Ftplets already added
+
+        for (Entry<String, Ftplet> entry : ftplets.entrySet()) {
+            entry.getValue().init(ftpletContext);
+        }
     }
 
     /**
      * @see FtpletContainer#getFtplets()
      */
-    public Map<String, Ftplet> getFtplets() {
+    public synchronized Map<String, Ftplet> getFtplets() {
         return ftplets;
     }
 
     /**
      * @see FtpletContainer#setFtplets(Map)
      */
-    public void setFtplets(Map<String, Ftplet> ftplets) {
+    public synchronized void setFtplets(Map<String, Ftplet> ftplets) {
         this.ftplets = ftplets;
     }
 

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/FtpletContainer.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/FtpletContainer.java?rev=686767&r1=686766&r2=686767&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/FtpletContainer.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/FtpletContainer.java Mon Aug 18 07:12:14 2008
@@ -38,11 +38,12 @@
      *            The name of the Ftplet to be added
      * @param ftplet
      *            The Ftplet
+     * @throws FtpException 
      * @throws IllegalArgumentException
      *             If an Ftplet with the same name already exist within the
      *             container
      */
-    void addFtplet(String name, Ftplet ftplet);
+    void addFtplet(String name, Ftplet ftplet) throws FtpException;
 
     /**
      * Remove the {@link Ftplet} identified by the name (as provided in the

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java?rev=686767&r1=686766&r2=686767&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java Mon Aug 18 07:12:14 2008
@@ -41,7 +41,25 @@
 
     protected abstract FtpletContainer createFtpletContainer();
 
-    public void testAddAndGetFtplet() {
+    private static class MockFtpletContext implements FtpletContext {
+        public FileSystemManager getFileSystemManager() {
+            return null;
+        }
+
+        public FtpStatistics getFtpStatistics() {
+            return null;
+        }
+
+        public Ftplet getFtplet(String name) {
+            return null;
+        }
+
+        public UserManager getUserManager() {
+            return null;
+        }
+    }
+    
+    public void testAddAndGetFtplet() throws FtpException {
         MockFtplet ftplet1 = new MockFtplet();
         MockFtplet ftplet2 = new MockFtplet();
 
@@ -50,12 +68,51 @@
 
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
-
+        
         assertSame(ftplet1, container.getFtplet("ftplet1"));
         assertSame(ftplet2, container.getFtplet("ftplet2"));
     }
+    
+    public void testFtpletLifecyclePreContainerInit() throws FtpException {
+        MockFtplet ftplet = new MockFtplet();
+
+        container.addFtplet("ftplet1", ftplet);
+        
+        // ftplet should be initialized before the container is
+        assertNull(ftplet.context);
+        container.init(new MockFtpletContext());
+        assertNotNull(ftplet.context);
+        
+        // make sure ftplets get's destroyed
+        assertFalse(ftplet.destroyed);
+        
+        container.destroy();
+
+        assertTrue(ftplet.destroyed);
+        
+    }
+
+    public void testFtpletLifecyclePostContainerInit() throws FtpException {
+        MockFtplet ftplet = new MockFtplet();
+
+        assertNull(ftplet.context);
+        container.init(new MockFtpletContext());
+
+        container.addFtplet("ftplet1", ftplet);
+        
+        assertNotNull(ftplet.context);
+        
+        // make sure ftplets get's destroyed
+        assertFalse(ftplet.destroyed);
+        
+        container.destroy();
+
+        assertTrue(ftplet.destroyed);
+        
+    }
 
-    public void testAddFtpletWithDuplicateName() {
+    
+    public void testAddFtpletWithDuplicateName() throws FtpException {
         MockFtplet ftplet1 = new MockFtplet();
         MockFtplet ftplet2 = new MockFtplet();
 
@@ -73,7 +130,7 @@
         assertSame(ftplet1, container.getFtplet("ftplet1"));
     }
 
-    public void testRemoveFtplet() {
+    public void testRemoveFtplet() throws FtpException {
         MockFtplet ftplet1 = new MockFtplet();
         MockFtplet ftplet2 = new MockFtplet();
 

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java?rev=686767&r1=686766&r2=686767&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java Mon Aug 18 07:12:14 2008
@@ -31,11 +31,18 @@
 
     protected static MockFtpletCallback callback = new MockFtpletCallback();
 
+    public FtpletContext context;
+    public boolean destroyed = false;
+    
     public void destroy() {
+        destroyed = true;
+        
         callback.destroy();
     }
 
     public void init(FtpletContext ftpletContext) throws FtpException {
+        this.context = ftpletContext;
+        
         callback.init(ftpletContext);
     }