You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by ju...@apache.org on 2013/05/03 21:23:29 UTC
svn commit: r1478935 - in /incubator/jspwiki/trunk: ./
src/main/java/org/apache/wiki/ src/main/java/org/apache/wiki/ui/
src/main/java/org/apache/wiki/util/ src/test/java/org/apache/wiki/util/
Author: juanpablo
Date: Fri May 3 19:23:17 2013
New Revision: 1478935
URL: http://svn.apache.org/r1478935
Log:
* 2.9.1-incubating-9
* Refactored TemplateManager#listLanguages(PageContext pageContext) so it doesn't search for i18n files under a specific jar filename
Modified:
incubator/jspwiki/trunk/ChangeLog
incubator/jspwiki/trunk/pom.xml
incubator/jspwiki/trunk/src/main/java/org/apache/wiki/Release.java
incubator/jspwiki/trunk/src/main/java/org/apache/wiki/ui/TemplateManager.java
incubator/jspwiki/trunk/src/main/java/org/apache/wiki/util/ClassUtil.java
incubator/jspwiki/trunk/src/test/java/org/apache/wiki/util/ClassUtilTest.java
Modified: incubator/jspwiki/trunk/ChangeLog
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/ChangeLog?rev=1478935&r1=1478934&r2=1478935&view=diff
==============================================================================
--- incubator/jspwiki/trunk/ChangeLog (original)
+++ incubator/jspwiki/trunk/ChangeLog Fri May 3 19:23:17 2013
@@ -1,3 +1,10 @@
+2013-05-03 Juan Pablo Santos (juanpablo AT apache DOT org)
+
+ * 2.9.1-incubating-9
+
+ * Refactored TemplateManager#listLanguages(PageContext pageContext) so it doesn't search for
+ i18n files under a specific jar filename
+
2013-05-03 Glen Mazza (glenmazza AT apache DOT org)
* 2.9.1-incubating-8
Modified: incubator/jspwiki/trunk/pom.xml
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/pom.xml?rev=1478935&r1=1478934&r2=1478935&view=diff
==============================================================================
--- incubator/jspwiki/trunk/pom.xml (original)
+++ incubator/jspwiki/trunk/pom.xml Fri May 3 19:23:17 2013
@@ -146,7 +146,7 @@
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
- <scope>runtime</scope>
+ <scope>compile</scope>
</dependency>
<dependency>
<groupId>nekohtml</groupId>
Modified: incubator/jspwiki/trunk/src/main/java/org/apache/wiki/Release.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/main/java/org/apache/wiki/Release.java?rev=1478935&r1=1478934&r2=1478935&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/main/java/org/apache/wiki/Release.java (original)
+++ incubator/jspwiki/trunk/src/main/java/org/apache/wiki/Release.java Fri May 3 19:23:17 2013
@@ -75,7 +75,7 @@ public final class Release
* <p>
* If the build identifier is empty, it is not added.
*/
- public static final String BUILD = "8";
+ public static final String BUILD = "9";
/**
* This is the generic version string you should use
Modified: incubator/jspwiki/trunk/src/main/java/org/apache/wiki/ui/TemplateManager.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/main/java/org/apache/wiki/ui/TemplateManager.java?rev=1478935&r1=1478934&r2=1478935&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/main/java/org/apache/wiki/ui/TemplateManager.java (original)
+++ incubator/jspwiki/trunk/src/main/java/org/apache/wiki/ui/TemplateManager.java Fri May 3 19:23:17 2013
@@ -22,8 +22,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
@@ -32,7 +30,6 @@ import javax.servlet.jsp.jstl.fmt.Locale
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
-
import org.apache.wiki.InternalWikiException;
import org.apache.wiki.WikiContext;
import org.apache.wiki.WikiEngine;
@@ -40,6 +37,7 @@ import org.apache.wiki.i18n.Internationa
import org.apache.wiki.modules.ModuleManager;
import org.apache.wiki.preferences.Preferences;
import org.apache.wiki.preferences.Preferences.TimeFormat;
+import org.apache.wiki.util.ClassUtil;
/**
* This class takes care of managing JSPWiki templates. This class also provides
@@ -89,8 +87,6 @@ public class TemplateManager
/** Location of I18N Resource bundles, and path prefix and suffixes */
- public static final String I18NRESOURCE_PATH = "/WEB-INF/lib/JSPWiki.jar";
-
public static final String I18NRESOURCE_PREFIX = "templates/default_";
public static final String I18NRESOURCE_SUFFIX = ".properties";
@@ -420,58 +416,26 @@ public class TemplateManager
* List all installed i18n language properties
*
* @param pageContext
- * @return map of installed Languages (with help of Juan Pablo Santos Rodriguez)
+ * @return map of installed Languages
* @since 2.7.x
*/
public Map listLanguages(PageContext pageContext)
{
- LinkedHashMap<String,String> resultMap = new LinkedHashMap<String,String>();
-
+ Map< String, String > resultMap = new LinkedHashMap< String, String >();
String clientLanguage = ((HttpServletRequest) pageContext.getRequest()).getLocale().toString();
- JarInputStream jarStream = null;
- try
- {
- JarEntry entry;
- InputStream inputStream = pageContext.getServletContext().getResourceAsStream(I18NRESOURCE_PATH);
- jarStream = new JarInputStream(inputStream);
-
- while ((entry = jarStream.getNextJarEntry()) != null)
- {
- String name = entry.getName();
-
- if (!entry.isDirectory() && name.startsWith(I18NRESOURCE_PREFIX) && name.endsWith(I18NRESOURCE_SUFFIX))
+ List< String > entries = ClassUtil.classpathEntriesUnder( DIRECTORY );
+ for( String name : entries ) {
+ if ( name.startsWith( I18NRESOURCE_PREFIX ) && name.endsWith( I18NRESOURCE_SUFFIX ) )
+ {
+ name = name.substring(I18NRESOURCE_PREFIX.length(), name.lastIndexOf(I18NRESOURCE_SUFFIX));
+ Locale locale = new Locale(name.substring(0, 2), ((name.indexOf("_") == -1) ? "" : name.substring(3, 5)));
+ String defaultLanguage = "";
+ if (clientLanguage.startsWith(name))
{
- name = name.substring(I18NRESOURCE_PREFIX.length(), name.lastIndexOf(I18NRESOURCE_SUFFIX));
-
- Locale locale = new Locale(name.substring(0, 2), ((name.indexOf("_") == -1) ? "" : name.substring(3, 5)));
-
- String defaultLanguage = "";
-
- if (clientLanguage.startsWith(name))
- {
- defaultLanguage = LocaleSupport.getLocalizedMessage(pageContext, I18NDEFAULT_LOCALE);
- }
-
- resultMap.put(name, locale.getDisplayName(locale) + " " + defaultLanguage);
+ defaultLanguage = LocaleSupport.getLocalizedMessage(pageContext, I18NDEFAULT_LOCALE);
}
- }
- }
- catch (IOException ioe)
- {
- if (log.isDebugEnabled())
- log.debug("Could not search jar file '" + I18NRESOURCE_PATH +
- "'for properties files due to an IOException: \n" + ioe.getMessage());
- }
- finally
- {
- if( jarStream != null )
- {
- try
- {
- jarStream.close();
- }
- catch(IOException e) {}
+ resultMap.put(name, locale.getDisplayName(locale) + " " + defaultLanguage);
}
}
Modified: incubator/jspwiki/trunk/src/main/java/org/apache/wiki/util/ClassUtil.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/main/java/org/apache/wiki/util/ClassUtil.java?rev=1478935&r1=1478934&r2=1478935&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/main/java/org/apache/wiki/util/ClassUtil.java (original)
+++ incubator/jspwiki/trunk/src/main/java/org/apache/wiki/util/ClassUtil.java Fri May 3 19:23:17 2013
@@ -18,19 +18,26 @@
*/
package org.apache.wiki.util;
+import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
+import java.net.JarURLConnection;
+import java.net.URL;
import java.util.*;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
+import org.apache.wiki.api.exceptions.WikiException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
-import org.apache.wiki.api.exceptions.WikiException;
-
/**
* Contains useful utilities for class file manipulation. This is a static class,
* so there is no need to instantiate it.
@@ -170,6 +177,120 @@ public final class ClassUtil
}
/**
+ * Lists all the files in classpath under a given package.
+ *
+ * @param rootPackage the base package. Can be {code null}.
+ * @return all files entries in classpath under the given package
+ */
+ public static List< String > classpathEntriesUnder( final String rootPackage )
+ {
+ List< String > results = new ArrayList< String >();
+ Enumeration< URL > en = null;
+ if( StringUtils.isNotEmpty( rootPackage ) ) {
+ try
+ {
+ en = ClassUtil.class.getClassLoader().getResources( rootPackage );
+ }
+ catch( IOException e )
+ {
+ log.error( e.getMessage(), e );
+ }
+ }
+
+ while( en != null && en.hasMoreElements() )
+ {
+ URL url = en.nextElement();
+ try
+ {
+ if( "jar".equals( url.getProtocol() ) )
+ {
+ jarEntriesUnder( results, ( JarURLConnection )url.openConnection(), rootPackage );
+ }
+ else if( "file".equals( url.getProtocol() ) )
+ {
+ fileEntriesUnder( results, new File( url.getFile() ), rootPackage );
+ }
+
+ }
+ catch (IOException ioe)
+ {
+ log.error( ioe.getMessage(), ioe );
+ }
+ }
+ return results;
+ }
+
+ /**
+ * Searchs for all the files in classpath under a given package, for a given {@link File}. If the
+ * {@link File} is a directory all files inside it are stored, otherwise the {@link File} itself is
+ * stored
+ *
+ * @param results collection in which the found entries are stored
+ * @param file given {@link File} to search in.
+ * @param rootPackage base package.
+ */
+ static void fileEntriesUnder( List< String > results, File file, String rootPackage )
+ {
+ log.debug( "scanning [" + file.getName() +"]" );
+ if( file.isDirectory() ) {
+ @SuppressWarnings( "unchecked" )Iterator< File > files = FileUtils.iterateFiles( file, null, true );
+ while( files.hasNext() )
+ {
+ File subfile = files.next();
+ // store an entry similar to the jarSearch(..) below ones
+ String entry = StringUtils.replace( subfile.getAbsolutePath(), file.getAbsolutePath() + File.separatorChar, StringUtils.EMPTY );
+ results.add( rootPackage + "/" + entry );
+ }
+ } else {
+ results.add( file.getName() );
+ }
+ }
+
+ /**
+ * Searchs for all the files in classpath under a given package, for a given {@link JarURLConnection}.
+ *
+ * @param results collection in which the found entries are stored
+ * @param jurlcon given {@link JarURLConnection} to search in.
+ * @param rootPackage base package.
+ */
+ static void jarEntriesUnder( List< String > results, JarURLConnection jurlcon, String rootPackage )
+ {
+ JarFile jar = null;
+ try
+ {
+ jar = jurlcon.getJarFile();
+ log.debug( "scanning [" + jar.getName() +"]" );
+ Enumeration< JarEntry > entries = jar.entries();
+ while( entries.hasMoreElements() )
+ {
+ JarEntry entry = entries.nextElement();
+ if( entry.getName().startsWith( rootPackage ) && !entry.isDirectory() )
+ {
+ results.add( entry.getName() );
+ }
+ }
+ }
+ catch( IOException ioe )
+ {
+ log.error( ioe.getMessage(), ioe );
+ }
+ finally
+ {
+ if (jar != null)
+ {
+ try
+ {
+ jar.close();
+ }
+ catch( IOException ioe )
+ {
+ log.error( ioe.getMessage(), ioe );
+ }
+ }
+ }
+ }
+
+ /**
* This method is used to locate and instantiate a mapped class.
* You may redefine anything in the resource file which is located in your classpath
* under the name <code>ClassUtil.MAPPINGS ({@value #MAPPINGS})</code>.
Modified: incubator/jspwiki/trunk/src/test/java/org/apache/wiki/util/ClassUtilTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/test/java/org/apache/wiki/util/ClassUtilTest.java?rev=1478935&r1=1478934&r2=1478935&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/test/java/org/apache/wiki/util/ClassUtilTest.java (original)
+++ incubator/jspwiki/trunk/src/test/java/org/apache/wiki/util/ClassUtilTest.java Fri May 3 19:23:17 2013
@@ -19,7 +19,11 @@
package org.apache.wiki.util;
-import junit.framework.*;
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
public class ClassUtilTest extends TestCase
{
@@ -27,6 +31,28 @@ public class ClassUtilTest extends TestC
{
super( s );
}
+
+ /**
+ * tests various kinds of searches on classpath items
+ */
+ public void testClasspathSearch() throws Exception
+ {
+ List< String > jarSearch = ClassUtil.classpathEntriesUnder( "META-INF" );
+ assertNotNull( jarSearch );
+ assertTrue( jarSearch.size() > 0 );
+
+ List< String > fileSearch = ClassUtil.classpathEntriesUnder( "templates" );
+ assertNotNull( fileSearch );
+ assertTrue( fileSearch.size() > 0 );
+
+ List< String > nullSearch = ClassUtil.classpathEntriesUnder( "blurb" );
+ assertNotNull( nullSearch );
+ assertTrue( nullSearch.size() == 0 );
+
+ List< String > nullInputSearch = ClassUtil.classpathEntriesUnder( null );
+ assertNotNull( nullInputSearch );
+ assertTrue( nullSearch.size() == 0 );
+ }
/**
* Tries to find an existing class.