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/10/05 23:11:37 UTC

svn commit: r701887 - in /mina/ftpserver/trunk/core/src: main/java/org/apache/ftpserver/ main/java/org/apache/ftpserver/config/spring/ main/java/org/apache/ftpserver/message/ main/java/org/apache/ftpserver/message/impl/ test/java/org/apache/ftpserver/c...

Author: ngn
Date: Sun Oct  5 14:11:36 2008
New Revision: 701887

URL: http://svn.apache.org/viewvc?rev=701887&view=rev
Log:
Make message resource immutable (FTPSERVER-187)

Added:
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceFactory.java   (with props)
Modified:
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpServerContext.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ServerBeanDefinitionParser.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResource.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/impl/DefaultMessageResource.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LangTest.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=701887&r1=701886&r2=701887&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 Sun Oct  5 14:11:36 2008
@@ -37,7 +37,7 @@
 import org.apache.ftpserver.listener.Listener;
 import org.apache.ftpserver.listener.ListenerFactory;
 import org.apache.ftpserver.message.MessageResource;
-import org.apache.ftpserver.message.impl.DefaultMessageResource;
+import org.apache.ftpserver.message.MessageResourceFactory;
 import org.apache.ftpserver.usermanager.BaseUser;
 import org.apache.ftpserver.usermanager.ConcurrentLoginPermission;
 import org.apache.ftpserver.usermanager.PropertiesUserManager;
@@ -57,7 +57,7 @@
     private final Logger LOG = LoggerFactory
             .getLogger(DefaultFtpServerContext.class);
 
-    private MessageResource messageResource = new DefaultMessageResource();
+    private MessageResource messageResource = new MessageResourceFactory().createMessageResource();
 
     private UserManager userManager = new PropertiesUserManager();
 

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ServerBeanDefinitionParser.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ServerBeanDefinitionParser.java?rev=701887&r1=701886&r2=701887&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ServerBeanDefinitionParser.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/config/spring/ServerBeanDefinitionParser.java Sun Oct  5 14:11:36 2008
@@ -27,7 +27,7 @@
 import org.apache.ftpserver.FtpServer;
 import org.apache.ftpserver.FtpServerConfigurationException;
 import org.apache.ftpserver.message.MessageResource;
-import org.apache.ftpserver.message.impl.DefaultMessageResource;
+import org.apache.ftpserver.message.MessageResourceFactory;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.support.ManagedMap;
 import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
@@ -140,7 +140,7 @@
             final ParserContext parserContext,
             final BeanDefinitionBuilder builder) {
 
-        DefaultMessageResource mr = new DefaultMessageResource();
+        MessageResourceFactory mr = new MessageResourceFactory();
 
         if (StringUtils.hasText(childElm.getAttribute("languages"))) {
             String langString = childElm.getAttribute("languages");
@@ -156,7 +156,7 @@
 
         }
 
-        return mr;
+        return mr.createMessageResource();
     }
 
     /**

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResource.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResource.java?rev=701887&r1=701886&r2=701887&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResource.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResource.java Sun Oct  5 14:11:36 2008
@@ -21,8 +21,6 @@
 
 import java.util.Properties;
 
-import org.apache.ftpserver.ftplet.FtpException;
-
 /**
  * This is message resource interface.
  *
@@ -43,12 +41,6 @@
     String getMessage(int code, String subId, String language);
 
     /**
-     * Save properties. This properties object contain all the available
-     * messages. Old properties will not be overwritten.
-     */
-    void save(Properties prop, String language) throws FtpException;
-
-    /**
      * Get all the messages.
      */
     Properties getMessages(String language);

Added: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceFactory.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceFactory.java?rev=701887&view=auto
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceFactory.java (added)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceFactory.java Sun Oct  5 14:11:36 2008
@@ -0,0 +1,57 @@
+/*
+ * 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.ftpserver.message;
+
+import java.io.File;
+
+import org.apache.ftpserver.message.impl.DefaultMessageResource;
+
+/**
+ * Factory for creating message resource implementation
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ * @version $Rev: 693604 $, $Date: 2008-09-09 22:55:19 +0200 (Tue, 09 Sep 2008) $
+ */
+public class MessageResourceFactory {
+
+    private String[] languages;
+
+    private File customMessageDirectory;
+
+    public MessageResource createMessageResource() {
+        return new DefaultMessageResource(languages, customMessageDirectory);
+    }
+    
+    public String[] getLanguages() {
+        return languages;
+    }
+
+    public void setLanguages(String[] languages) {
+        this.languages = languages;
+    }
+
+    public File getCustomMessageDirectory() {
+        return customMessageDirectory;
+    }
+
+    public void setCustomMessageDirectory(File customMessageDirectory) {
+        this.customMessageDirectory = customMessageDirectory;
+    }
+}

Propchange: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/MessageResourceFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/impl/DefaultMessageResource.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/impl/DefaultMessageResource.java?rev=701887&r1=701886&r2=701887&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/impl/DefaultMessageResource.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/message/impl/DefaultMessageResource.java Sun Oct  5 14:11:36 2008
@@ -21,18 +21,15 @@
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
 import java.io.InputStream;
-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.message.MessageResource;
+import org.apache.ftpserver.message.MessageResourceFactory;
 import org.apache.ftpserver.util.IoUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,6 +38,8 @@
  * Class to get ftp server reply messages. This supports i18n. Basic message
  * search path is:
  * 
+ * <strong>Internal class, do not use directly</strong>
+ * 
  * Custom Language Specific Messages -> Default Language Specific Messages ->
  * Custom Common Messages -> Default Common Messages -> null (not found)
  *
@@ -60,42 +59,16 @@
 
     private File customMessageDirectory;
 
-    private boolean isConfigured = false;
-
-    private static class PropertiesPair {
-        public Properties defaultProperties = new Properties();
-
-        public Properties customProperties = new Properties();
-    }
-
-    public String[] getLanguages() {
-        if (languages != null) {
-            return languages.clone();
-        } else {
-            return null;
-        }
-    }
-
-    public void setLanguages(String[] languages) {
-        if (languages != null) {
+    /**
+     * Internal constructor, do not use directly. Use {@link MessageResourceFactory} instead.
+     */
+    public DefaultMessageResource(String[] languages,
+            File customMessageDirectory) {
+        this.customMessageDirectory = customMessageDirectory;
+        if(languages != null) {
             this.languages = languages.clone();
-        } else {
-            this.languages = null;
         }
-    }
-
-    public File getCustomMessageDirectory() {
-        return customMessageDirectory;
-    }
 
-    public void setCustomMessageDirectory(File customMessageDirectory) {
-        this.customMessageDirectory = customMessageDirectory;
-    }
-
-    /**
-     * Configure - load properties file.
-     */
-    public void configure() {
         // populate different properties
         messages = new HashMap<String, PropertiesPair>();
         if (languages != null) {
@@ -106,15 +79,13 @@
         }
         PropertiesPair pair = createPropertiesPair(null);
         messages.put(null, pair);
+
     }
 
-    /**
-     * Lazy init the user manager
-     */
-    private void lazyInit() {
-        if (!isConfigured) {
-            configure();
-        }
+    private static class PropertiesPair {
+        public Properties defaultProperties = new Properties();
+
+        public Properties customProperties = new Properties();
     }
 
     /**
@@ -187,8 +158,6 @@
      * 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);
         if (subId != null) {
@@ -227,8 +196,6 @@
      * Get all messages.
      */
     public Properties getMessages(String language) {
-        lazyInit();
-
         Properties messages = new Properties();
 
         // load properties sequentially
@@ -250,53 +217,6 @@
     }
 
     /**
-     * Save properties in file.
-     */
-    public void save(Properties prop, String language) throws FtpException {
-        lazyInit();
-
-        // null properties - nothing to save
-        if (prop == null) {
-            return;
-        }
-
-        // empty properties - nothing to save
-        if (prop.isEmpty()) {
-            return;
-        }
-
-        // get custom resource file name
-        File resourceFile = null;
-        if (language == null) {
-            resourceFile = new File(customMessageDirectory, "FtpStatus.gen");
-        } else {
-            language = language.toLowerCase();
-            resourceFile = new File(customMessageDirectory, "FtpStatus_"
-                    + language + ".gen");
-        }
-
-        // save resource file
-        OutputStream out = null;
-        try {
-            out = new FileOutputStream(resourceFile);
-            prop.store(out, "Custom Messages");
-        } catch (IOException ex) {
-            LOG.error("MessageResourceImpl.save()", ex);
-            throw new FtpException("MessageResourceImpl.save()", ex);
-        } finally {
-            IoUtils.close(out);
-        }
-
-        // assign new messages
-        PropertiesPair pair = messages.get(language);
-        if (pair == null) {
-            pair = new PropertiesPair();
-            messages.put(language, pair);
-        }
-        pair.customProperties = prop;
-    }
-
-    /**
      * Dispose component - clear all maps.
      */
     public void dispose() {

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LangTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LangTest.java?rev=701887&r1=701886&r2=701887&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LangTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LangTest.java Sun Oct  5 14:11:36 2008
@@ -19,9 +19,8 @@
 
 package org.apache.ftpserver.clienttests;
 
-import org.apache.ftpserver.DefaultFtpServerContext;
 import org.apache.ftpserver.FtpServer;
-import org.apache.ftpserver.message.impl.DefaultMessageResource;
+import org.apache.ftpserver.message.MessageResourceFactory;
 
 /**
 *
@@ -39,12 +38,10 @@
     protected FtpServer createServer() throws Exception {
         FtpServer server = super.createServer();
 
-        DefaultFtpServerContext context = (DefaultFtpServerContext) server
-                .getServerContext();
-
-        DefaultMessageResource resource = (DefaultMessageResource) context
-                .getMessageResource();
-        resource.setLanguages(new String[] { "en", "zh-tw" });
+        MessageResourceFactory factory = new MessageResourceFactory();
+        factory.setLanguages(new String[] { "en", "zh-tw" });
+        server.setMessageResource(factory.createMessageResource());
+        
         return server;
     }