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/07 15:28:27 UTC

svn commit: r683614 - in /mina/ftpserver/trunk/core/src: main/java/org/apache/ftpserver/ main/java/org/apache/ftpserver/message/ main/java/org/apache/ftpserver/usermanager/ main/java/org/apache/ftpserver/util/ test/java/org/apache/ftpserver/clienttests/

Author: ngn
Date: Thu Aug  7 06:28:26 2008
New Revision: 683614

URL: http://svn.apache.org/viewvc?rev=683614&view=rev
Log:
Make sure PropertiesUserManager does not start writing to disc unless asked to (FTPSERVER-144)
Make DefaultFtpServerContext init less messy

Modified:
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpServerContext.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpServer.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceImpl.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/usermanager/PropertiesUserManager.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/BaseProperties.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpServerContext.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpServerContext.java?rev=683614&r1=683613&r2=683614&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpServerContext.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpServerContext.java Thu Aug  7 06:28:26 2008
@@ -53,12 +53,12 @@
 	private final Logger LOG = LoggerFactory
 			.getLogger(DefaultFtpServerContext.class);
 
-	private MessageResource messageResource;
-	private UserManager userManager;
-	private FileSystemManager fileSystemManager;
-	private FtpletContainer ftpletContainer;
-	private FtpStatistics statistics;
-	private CommandFactory commandFactory;
+	private MessageResource messageResource = new MessageResourceImpl();
+	private UserManager userManager = new PropertiesUserManager();
+	private FileSystemManager fileSystemManager = new NativeFileSystemManager();
+	private FtpletContainer ftpletContainer = new DefaultFtpletContainer();
+	private FtpStatistics statistics = new FtpStatisticsImpl();
+	private CommandFactory commandFactory = new DefaultCommandFactory();
 	private ConnectionConfig connectionConfig = new DefaultConnectionConfig();
 
 	private Map<String, Listener> listeners = new HashMap<String, Listener>();
@@ -69,53 +69,15 @@
 			new ConcurrentLoginPermission(20, 2),
 			new TransferRatePermission(4800, 4800) };
 
-	/**
-	 * Constructor - set the root configuration.
-	 */
 	public DefaultFtpServerContext() throws Exception {
-		this(true);
-	}
-
-	public DefaultFtpServerContext(boolean createDefaultUsers) throws Exception {
-
-		try {
-			createListeners();
-
-			// create all the components
-			messageResource = new MessageResourceImpl();
-			((MessageResourceImpl) messageResource)
-					.configure();
-
-			userManager = new PropertiesUserManager();
-			((PropertiesUserManager) userManager).configure();
-
-			fileSystemManager = new NativeFileSystemManager();
-
-			statistics = new FtpStatisticsImpl();
-
-			commandFactory = new DefaultCommandFactory();
-
-			// create user if necessary
-			// TODO turn into a setter
-			if (createDefaultUsers) {
-				createDefaultUsers();
-			}
-
-			ftpletContainer = new DefaultFtpletContainer();
-		} catch (Exception ex) {
-			dispose();
-			throw ex;
-		}
-	}
-
-	private void createListeners() throws Exception {
-		listeners.put("default", new NioListener());
+        // create the default listener
+	    listeners.put("default", new NioListener());
 	}
 
 	/**
 	 * Create default users.
 	 */
-	private void createDefaultUsers() throws Exception {
+	public void createDefaultUsers() throws Exception {
 		UserManager userManager = getUserManager();
 
 		// create admin user

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=683614&r1=683613&r2=683614&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 Thu Aug  7 06:28:26 2008
@@ -44,9 +44,10 @@
     
     private FtpServerContext serverContext;
 
-    private boolean suspended;
+    private boolean suspended = false;
 
     private boolean started = false;
+    
 
     /**
      * Creates a server with the default configuration
@@ -59,7 +60,6 @@
     /**
      * Constructor. Set a custom the server context.
      * @throws Exception
-     * TODO consider removing 
      */
     public FtpServer(final FtpServerContext serverContext) throws Exception {
         this.serverContext = serverContext;
@@ -69,6 +69,7 @@
      * Start the server. Open a new listener thread.
      */
     public void start() throws Exception {
+       
         Map<String, Listener> listeners = serverContext.getListeners(); 
         for (Listener listener : listeners.values()) {
             listener.start(serverContext);
@@ -115,6 +116,10 @@
      * Suspend further requests
      */
     public void suspend() {
+        if(!started) {
+            return;
+        }
+        
         // stop all listeners
         Map<String, Listener> listeners = serverContext.getListeners();
         for (Listener listener : listeners.values()) {
@@ -128,6 +133,10 @@
      * Resume the server handler
      */
     public void resume() {
+        if(!suspended) {
+            return;
+        }
+        
         Map<String, Listener> listeners = serverContext.getListeners();
         for (Listener listener : listeners.values()) {
             listener.resume();
@@ -150,14 +159,6 @@
     public FtpServerContext getServerContext() {
         return serverContext;
     }
-
-    /**
-     * Set a custom server context to be used for this server
-     * @param serverContext The custom server context
-     */
-	public void setServerContext(final FtpServerContext serverContext) {
-		this.serverContext = serverContext;
-	}
 	
     private DefaultFtpServerContext checkAndGetContext() {
         if(getServerContext() instanceof DefaultFtpServerContext) {

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceImpl.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceImpl.java?rev=683614&r1=683613&r2=683614&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceImpl.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceImpl.java Thu Aug  7 06:28:26 2008
@@ -27,8 +27,10 @@
 import java.io.OutputStream;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Properties;
 
+import org.apache.ftpserver.FtpServerConfigurationException;
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.interfaces.MessageResource;
 import org.apache.ftpserver.util.IoUtils;
@@ -51,9 +53,11 @@
     private final static String RESOURCE_PATH = "org/apache/ftpserver/message/";
     
     private String[] languages;
-    private HashMap<String, PropertiesPair> messages;
+    private Map<String, PropertiesPair> messages;
     private File customMessageDirectory;
 
+    private boolean isConfigured = false;
+
     private static class PropertiesPair {
         public Properties defaultProperties = new Properties();
         public Properties customProperties = new Properties();
@@ -86,7 +90,7 @@
 	/**
      * Configure - load properties file.
      */
-    public void configure() throws FtpException {
+    public void configure() {
         // populate different properties
         messages = new HashMap<String, PropertiesPair>();
         if(languages != null) {
@@ -100,10 +104,19 @@
     }
     
     /**
+     * Lazy init the user manager
+     */
+    private void lazyInit() {
+        if(!isConfigured ) {
+            configure();
+        }
+    }
+    
+    /**
      * Create Properties pair object. It stores the default 
      * and the custom messages.
      */
-    private PropertiesPair createPropertiesPair(String lang) throws FtpException {
+    private PropertiesPair createPropertiesPair(String lang) {
         PropertiesPair pair = new PropertiesPair();
         
         // load default resource
@@ -123,7 +136,7 @@
         }
         catch(Exception ex) {
             LOG.warn("MessageResourceImpl.createPropertiesPair()", ex);
-            throw new FtpException("MessageResourceImpl.createPropertiesPair()", ex);
+            throw new FtpServerConfigurationException("MessageResourceImpl.createPropertiesPair()", ex);
         }
         finally {
             IoUtils.close(in);
@@ -146,7 +159,7 @@
         }
         catch(Exception ex) {
             LOG.warn("MessageResourceImpl.createPropertiesPair()", ex);
-            throw new FtpException("MessageResourceImpl.createPropertiesPair()", ex);
+            throw new FtpServerConfigurationException("MessageResourceImpl.createPropertiesPair()", ex);
         }
         finally {
             IoUtils.close(in);
@@ -170,6 +183,7 @@
      * Get the message. If the message not found, it will return null.
      */
     public String getMessage(int code, String subId, String language) {
+        lazyInit();
         
         // find the message key
         String key = String.valueOf(code);
@@ -209,6 +223,8 @@
      * Get all messages.
      */
     public Properties getMessages(String language) {
+        lazyInit();
+        
         Properties messages = new Properties();
         
         // load properties sequentially 
@@ -233,6 +249,7 @@
      * Save properties in file.
      */
     public void save(Properties prop, String language) throws FtpException {
+        lazyInit();
         
         // null properties - nothing to save
         if(prop == null) {

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/usermanager/PropertiesUserManager.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/usermanager/PropertiesUserManager.java?rev=683614&r1=683613&r2=683614&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/usermanager/PropertiesUserManager.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/usermanager/PropertiesUserManager.java Thu Aug  7 06:28:26 2008
@@ -20,6 +20,7 @@
 package org.apache.ftpserver.usermanager;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -119,21 +120,18 @@
      */
     public void configure() {
         isConfigured  = true;
-        File dir = userDataFile.getParentFile();
-        if( (!dir.exists()) && (!dir.mkdirs()) ) {
-            String dirName = dir.getAbsolutePath();
-            throw new FtpServerConfigurationException("Cannot create directory for user data file : " + dirName);
-        }
-        
-        if(!userDataFile.exists()) {
-            try {
-                userDataFile.createNewFile();
-            } catch (IOException e) {
-                throw new FtpServerConfigurationException("Cannot user data file : " + userDataFile.getAbsolutePath(), e);
-            }
-        }
         try {
-            userDataProp = new BaseProperties(userDataFile);
+            userDataProp = new BaseProperties();
+            
+            if(userDataFile != null && userDataFile.exists()) {
+                FileInputStream fis = null;
+                try {
+                    fis = new FileInputStream(userDataFile);
+                    userDataProp.load(fis);
+                } finally {
+                    IoUtils.close(fis);
+                }
+            }
         } catch (IOException e) {
             throw new FtpServerConfigurationException("Error loading user data file : " + userDataFile.getAbsolutePath(), e);
         }
@@ -226,19 +224,23 @@
      * @throws FtpException
      */
     private void saveUserData() throws FtpException {
+        File dir = userDataFile.getParentFile();
+        if(dir != null && !dir.exists() && !dir.mkdirs() ) {
+            String dirName = dir.getAbsolutePath();
+            throw new FtpServerConfigurationException("Cannot create directory for user data file : " + dirName);
+        }
+        
         // save user data
-           FileOutputStream fos = null;
-           try {
-               fos = new FileOutputStream(userDataFile);
-               userDataProp.store(fos, "Generated file - don't edit (please)");
-           }
-           catch(IOException ex) {
-               LOG.error("Failed saving user data", ex);
-               throw new FtpException("Failed saving user data", ex);
-           }
-           finally {
-               IoUtils.close(fos);
-           }
+        FileOutputStream fos = null;
+        try {
+            fos = new FileOutputStream(userDataFile);
+            userDataProp.store(fos, "Generated file - don't edit (please)");
+        } catch (IOException ex) {
+            LOG.error("Failed saving user data", ex);
+            throw new FtpException("Failed saving user data", ex);
+        } finally {
+            IoUtils.close(fos);
+        }
     }
      
     /**

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/BaseProperties.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/BaseProperties.java?rev=683614&r1=683613&r2=683614&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/BaseProperties.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/BaseProperties.java Thu Aug  7 06:28:26 2008
@@ -20,9 +20,6 @@
 package org.apache.ftpserver.util;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.text.DateFormat;
@@ -56,27 +53,6 @@
         super(prop);
     }
     
-    /**
-     * Load properties from file
-     */
-    public BaseProperties(final File fl) throws IOException {
-        FileInputStream fis = null;
-        try {
-            fis = new FileInputStream(fl);
-            load(fis);
-        } finally {
-            IoUtils.close(fis);
-        }
-    }
-    
-    /**
-     * Load properties from <code>InputStream</code>
-     */
-    public BaseProperties(final InputStream is) throws IOException  {
-        load(is);
-    }
-    
-    
     //////////////////////////////////////////
     ////////  Properties Get Methods  ////////
     //////////////////////////////////////////

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java?rev=683614&r1=683613&r2=683614&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/ClientTestTemplate.java Thu Aug  7 06:28:26 2008
@@ -63,7 +63,7 @@
     protected FtpServer createServer() throws Exception {
         assertTrue(USERS_FILE.getAbsolutePath() + " must exist", USERS_FILE.exists());
 
-        DefaultFtpServerContext context = new DefaultFtpServerContext(false);
+        DefaultFtpServerContext context = new DefaultFtpServerContext();
 
         NioListener listener = new NioListener();
         listener.setPort(port);