在java前台程序的开发过程中,经常要把大量JSP中的文本key抽取出来,放到Property文件中,非常麻烦,于是写了这么一个工具。
这个程序在JSP文件中查找"jsp.xxxxxx"这样的字符串(一行上如果有多个这样的字符串也能找出来),然后填充到一个HashMap中(利用这个字符串做key,这样避免我们过滤出来的字符串有duplicated的问题),最后写到Property文件中,接下来只需要到Property文件中填写value就可以了。
同样的,对于java文件,也会查找action.xxx, form.xxx, bean.xxx等这样的字符串,然后抽取出来。
所以说,本工具最关键的地方就是那两个正则表达式。:)
代码使用了Jakarta的ORO正则表达式库,参考了之前发的一篇来自IBM DeveloperWorks的文章。
目前已经修正了不少bug,这个工具已经可以用了,实用效果很不错。
这个程序在JSP文件中查找"jsp.xxxxxx"这样的字符串(一行上如果有多个这样的字符串也能找出来),然后填充到一个HashMap中(利用这个字符串做key,这样避免我们过滤出来的字符串有duplicated的问题),最后写到Property文件中,接下来只需要到Property文件中填写value就可以了。
同样的,对于java文件,也会查找action.xxx, form.xxx, bean.xxx等这样的字符串,然后抽取出来。
所以说,本工具最关键的地方就是那两个正则表达式。:)
代码使用了Jakarta的ORO正则表达式库,参考了之前发的一篇来自IBM DeveloperWorks的文章。
目前已经修正了不少bug,这个工具已经可以用了,实用效果很不错。
/*
* GenerateProperties.java
*/
package cn.com.jointforce.common;
import org.apache.oro.text.regex.*;
import java.io.*;
import java.util.*;
/**
*
* @author Eric
*/
public class GenerateProperties {
/**
* Creates a new instance of GenerateProperties
*/
public GenerateProperties() {
}
//============================================================== Definition BEGIN ===================================================================================================//
// jsp file reside directory path
private String jsp_directory = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\web\\admin\\jsp";
// java file reside directory path
private String java_directory = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\src\\cn\\com\\jointforce\\admin";
// root module property file
private String root_property_file = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\src\\cn\\com\\jointforce\\root\\resource\\ApplicationResource.properties";
// portal module property file
private String portal_property_file = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\src\\cn\\com\\jointforce\\portal\\resource\\ApplicationResource.properties";
// admin module property file
private String admin_property_file = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\src\\cn\\com\\jointforce\\admin\\resource\\ApplicationResource.properties";
// distill resources from jsp, default output property file
private String default_property_file = "portal"; // portal or admin or root
// recursive jsp directory?
private boolean recursive_jsp_directory = true;
// recursive java directory
private boolean recursive_java_directory = true;
// jsp filter Regular String
String jsp_restring = "['\"](jsp|error)\\.[^'\"]+['\"]";
// java filter Regular String
String java_restring = "['\"](action|bean|error|form)\\.[^'\"]+['\"]";
// All filenames container
private ArrayList fileContainer = new ArrayList();
// root properties container
private Properties root_props = new Properties();
// portal properties container
private Properties portal_props = new Properties();
// admin properties container
private Properties admin_props = new Properties();
//============================================================== Definition END ===================================================================================================//
/**
* Set default property files
*/
public void SetDefaultOutputProperty(String value) {
default_property_file = value;
}
/**
* List files function, using recursion
*/
private void searchFiles(String dir, String jsp_or_java) {
File root = new File(dir);
File[] file_array = root.listFiles();
for (int i=0; i<file_array.length; i++) {
if (file_array[i].isDirectory()) {
if (jsp_or_java.equalsIgnoreCase("jsp")) {
if (recursive_jsp_directory) {
searchFiles(file_array[i].getAbsolutePath(), jsp_or_java);
}
} else if (jsp_or_java.equalsIgnoreCase("java")) {
if (recursive_java_directory) {
searchFiles(file_array[i].getAbsolutePath(), jsp_or_java);
}
}
} else {
fileContainer.add(file_array[i].getAbsolutePath());
}
}
}
/**
* Load root, portal, admin current properties
*/
private void LoadProperties() {
InputStream root_is = null;
InputStream portal_is = null;
InputStream admin_is = null;
try {
// Looking for properties file
root_is = new FileInputStream(root_property_file);
portal_is = new FileInputStream(portal_property_file);
admin_is = new FileInputStream(admin_property_file);
if (root_is != null) {
root_props.load(root_is);
}
if (portal_is != null) {
portal_props.load(portal_is);
}
if (admin_is != null) {
admin_props.load(admin_is);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (root_is != null)
root_is.close();
if (admin_is != null)
admin_is.close();
if (portal_is != null)
portal_is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Process JSP files
*/
public void DistillJSP() {
fileContainer.clear();
// Get all filenames under JSP directory
searchFiles(jsp_directory, "jsp");
// Load root, portal, admin current properties
LoadProperties();
try {
// Prepare the Writers
FileWriter root_props_writer = new FileWriter(root_property_file, true);
BufferedWriter root_props_bufwriter = new BufferedWriter(root_props_writer);
FileWriter portal_props_writer = new FileWriter(portal_property_file, true);
BufferedWriter portal_props_bufwriter = new BufferedWriter(portal_props_writer);
FileWriter admin_props_writer = new FileWriter(admin_property_file, true);
BufferedWriter admin_props_bufwriter = new BufferedWriter(admin_props_writer);
// Iterate the files
int file_number = fileContainer.size();
// The result string container
HashMap result_container = new HashMap();
for (int i=0; i<file_number; i++) {
// Ignore files don't end with `jsp'
String filename = (String)fileContainer.get(i);
if (filename == null || filename.trim().length() < 1 ||
!filename.substring(filename.length() - 3, filename.length()).equalsIgnoreCase("jsp")) {
continue;
}
// Open the JSP File and read out the resources
FileReader jsp_file_reader = new FileReader(filename);
BufferedReader buffer_reader = new BufferedReader(jsp_file_reader);
String input_line = null;
PatternCompiler orocom = new Perl5Compiler();
Pattern pattern = orocom.compile(jsp_restring);
PatternMatcher matcher = new Perl5Matcher();
while((input_line = buffer_reader.readLine()) != null) {
// System.out.println("Got one line from jsp file: " + input_line);
// Begin filter
// Use PatternMatcherInput class, we can find the next string in one line string
// Otherwise ORO will find the first match string in one line then ignore the rest string of this line
PatternMatcherInput reinput = new PatternMatcherInput(input_line);
while (matcher.contains(reinput, pattern)) {
MatchResult result = matcher.getMatch();
String result_string = result.group(0);
// Get rid of the quotations
result_string = result_string.substring(1, result_string.length() - 1);
// if we got the duplicated result_string, HashMap will overcome this issue
result_container.put(result_string, "dummy object");
}
}
buffer_reader.close();
jsp_file_reader.close();
}
// Iterate the HashMap and write the result
Iterator it = result_container.keySet().iterator();
while (it.hasNext()) {
String key = (String)it.next();
if (default_property_file.equalsIgnoreCase("portal")) {
// check whether this key has been added?
if (portal_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
portal_props_bufwriter.newLine();
portal_props_bufwriter.write(key + "=dummy");
portal_props_bufwriter.newLine();
}
} else if (default_property_file.equalsIgnoreCase("admin")) {
// check whether this key has been added?
if (admin_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
admin_props_bufwriter.newLine();
admin_props_bufwriter.write(key + "=dummy");
admin_props_bufwriter.newLine();
}
} else if (default_property_file.equalsIgnoreCase("root")) {
// check whether this key has been added?
if (root_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
root_props_bufwriter.newLine();
root_props_bufwriter.write(key + "=dummy");
root_props_bufwriter.newLine();
}
}
}
root_props_bufwriter.close();
root_props_writer.close();
admin_props_bufwriter.close();
admin_props_writer.close();
portal_props_bufwriter.close();
portal_props_writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Process JAVA Files
*/
public void DistillJava() {
fileContainer.clear();
// Get all filenames under Java directory
searchFiles(java_directory, "java");
// Load root, portal, admin current properties
LoadProperties();
try {
// Prepare the Writers
FileWriter root_props_writer = new FileWriter(root_property_file, true);
BufferedWriter root_props_bufwriter = new BufferedWriter(root_props_writer);
FileWriter portal_props_writer = new FileWriter(portal_property_file, true);
BufferedWriter portal_props_bufwriter = new BufferedWriter(portal_props_writer);
FileWriter admin_props_writer = new FileWriter(admin_property_file, true);
BufferedWriter admin_props_bufwriter = new BufferedWriter(admin_props_writer);
// Iterate the files
int file_number = fileContainer.size();
// The result string container
HashMap result_container = new HashMap();
for (int i=0; i<file_number; i++) {
// Ignore files don't end with `java'
String filename = (String)fileContainer.get(i);
if (filename == null || filename.trim().length() < 1 ||
!filename.substring(filename.length() - 4, filename.length()).equalsIgnoreCase("java")) {
continue;
}
// Open the Java File and read out the resources
FileReader java_file_reader = new FileReader(filename);
BufferedReader buffer_reader = new BufferedReader(java_file_reader);
String input_line = null;
PatternCompiler orocom = new Perl5Compiler();
Pattern pattern = orocom.compile(java_restring);
PatternMatcher matcher = new Perl5Matcher();
while((input_line = buffer_reader.readLine()) != null) {
// System.out.println("Got one line from java file: " + input_line);
// Begin filter
// Use PatternMatcherInput class, we can find the next string in one line string
// Otherwise ORO will find the first match string in one line then ignore the rest string of this line
PatternMatcherInput reinput = new PatternMatcherInput(input_line);
while (matcher.contains(reinput, pattern)) {
MatchResult result = matcher.getMatch();
String result_string = result.group(0);
// Get rid of the quotations
result_string = result_string.substring(1, result_string.length() - 1);
// if we got the duplicated result_string, HashMap will overcome this issue
result_container.put(result_string, "dummy object");
}
}
buffer_reader.close();
java_file_reader.close();
}
// Iterate the HashMap and write the result
Iterator it = result_container.keySet().iterator();
while (it.hasNext()) {
String key = (String)it.next();
if (default_property_file.equalsIgnoreCase("portal")) {
// check whether this key has been added?
if (portal_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
portal_props_bufwriter.newLine();
portal_props_bufwriter.write(key + "=dummy");
portal_props_bufwriter.newLine();
}
} else if (default_property_file.equalsIgnoreCase("admin")) {
// check whether this key has been added?
if (admin_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
admin_props_bufwriter.newLine();
admin_props_bufwriter.write(key + "=dummy");
admin_props_bufwriter.newLine();
}
} else if (default_property_file.equalsIgnoreCase("root")) {
// check whether this key has been added?
if (root_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
root_props_bufwriter.newLine();
root_props_bufwriter.write(key + "=dummy");
root_props_bufwriter.newLine();
}
}
}
root_props_bufwriter.close();
root_props_writer.close();
admin_props_bufwriter.close();
admin_props_writer.close();
portal_props_bufwriter.close();
portal_props_writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
GenerateProperties handle = new GenerateProperties();
handle.SetDefaultOutputProperty("admin");
handle.DistillJSP();
handle.DistillJava();
}
}
* GenerateProperties.java
*/
package cn.com.jointforce.common;
import org.apache.oro.text.regex.*;
import java.io.*;
import java.util.*;
/**
*
* @author Eric
*/
public class GenerateProperties {
/**
* Creates a new instance of GenerateProperties
*/
public GenerateProperties() {
}
//============================================================== Definition BEGIN ===================================================================================================//
// jsp file reside directory path
private String jsp_directory = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\web\\admin\\jsp";
// java file reside directory path
private String java_directory = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\src\\cn\\com\\jointforce\\admin";
// root module property file
private String root_property_file = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\src\\cn\\com\\jointforce\\root\\resource\\ApplicationResource.properties";
// portal module property file
private String portal_property_file = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\src\\cn\\com\\jointforce\\portal\\resource\\ApplicationResource.properties";
// admin module property file
private String admin_property_file = "D:\\JointForce\\S.EasyCluster-2.0\\InterfaceSrc\\easycluster\\src\\cn\\com\\jointforce\\admin\\resource\\ApplicationResource.properties";
// distill resources from jsp, default output property file
private String default_property_file = "portal"; // portal or admin or root
// recursive jsp directory?
private boolean recursive_jsp_directory = true;
// recursive java directory
private boolean recursive_java_directory = true;
// jsp filter Regular String
String jsp_restring = "['\"](jsp|error)\\.[^'\"]+['\"]";
// java filter Regular String
String java_restring = "['\"](action|bean|error|form)\\.[^'\"]+['\"]";
// All filenames container
private ArrayList fileContainer = new ArrayList();
// root properties container
private Properties root_props = new Properties();
// portal properties container
private Properties portal_props = new Properties();
// admin properties container
private Properties admin_props = new Properties();
//============================================================== Definition END ===================================================================================================//
/**
* Set default property files
*/
public void SetDefaultOutputProperty(String value) {
default_property_file = value;
}
/**
* List files function, using recursion
*/
private void searchFiles(String dir, String jsp_or_java) {
File root = new File(dir);
File[] file_array = root.listFiles();
for (int i=0; i<file_array.length; i++) {
if (file_array[i].isDirectory()) {
if (jsp_or_java.equalsIgnoreCase("jsp")) {
if (recursive_jsp_directory) {
searchFiles(file_array[i].getAbsolutePath(), jsp_or_java);
}
} else if (jsp_or_java.equalsIgnoreCase("java")) {
if (recursive_java_directory) {
searchFiles(file_array[i].getAbsolutePath(), jsp_or_java);
}
}
} else {
fileContainer.add(file_array[i].getAbsolutePath());
}
}
}
/**
* Load root, portal, admin current properties
*/
private void LoadProperties() {
InputStream root_is = null;
InputStream portal_is = null;
InputStream admin_is = null;
try {
// Looking for properties file
root_is = new FileInputStream(root_property_file);
portal_is = new FileInputStream(portal_property_file);
admin_is = new FileInputStream(admin_property_file);
if (root_is != null) {
root_props.load(root_is);
}
if (portal_is != null) {
portal_props.load(portal_is);
}
if (admin_is != null) {
admin_props.load(admin_is);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (root_is != null)
root_is.close();
if (admin_is != null)
admin_is.close();
if (portal_is != null)
portal_is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Process JSP files
*/
public void DistillJSP() {
fileContainer.clear();
// Get all filenames under JSP directory
searchFiles(jsp_directory, "jsp");
// Load root, portal, admin current properties
LoadProperties();
try {
// Prepare the Writers
FileWriter root_props_writer = new FileWriter(root_property_file, true);
BufferedWriter root_props_bufwriter = new BufferedWriter(root_props_writer);
FileWriter portal_props_writer = new FileWriter(portal_property_file, true);
BufferedWriter portal_props_bufwriter = new BufferedWriter(portal_props_writer);
FileWriter admin_props_writer = new FileWriter(admin_property_file, true);
BufferedWriter admin_props_bufwriter = new BufferedWriter(admin_props_writer);
// Iterate the files
int file_number = fileContainer.size();
// The result string container
HashMap result_container = new HashMap();
for (int i=0; i<file_number; i++) {
// Ignore files don't end with `jsp'
String filename = (String)fileContainer.get(i);
if (filename == null || filename.trim().length() < 1 ||
!filename.substring(filename.length() - 3, filename.length()).equalsIgnoreCase("jsp")) {
continue;
}
// Open the JSP File and read out the resources
FileReader jsp_file_reader = new FileReader(filename);
BufferedReader buffer_reader = new BufferedReader(jsp_file_reader);
String input_line = null;
PatternCompiler orocom = new Perl5Compiler();
Pattern pattern = orocom.compile(jsp_restring);
PatternMatcher matcher = new Perl5Matcher();
while((input_line = buffer_reader.readLine()) != null) {
// System.out.println("Got one line from jsp file: " + input_line);
// Begin filter
// Use PatternMatcherInput class, we can find the next string in one line string
// Otherwise ORO will find the first match string in one line then ignore the rest string of this line
PatternMatcherInput reinput = new PatternMatcherInput(input_line);
while (matcher.contains(reinput, pattern)) {
MatchResult result = matcher.getMatch();
String result_string = result.group(0);
// Get rid of the quotations
result_string = result_string.substring(1, result_string.length() - 1);
// if we got the duplicated result_string, HashMap will overcome this issue
result_container.put(result_string, "dummy object");
}
}
buffer_reader.close();
jsp_file_reader.close();
}
// Iterate the HashMap and write the result
Iterator it = result_container.keySet().iterator();
while (it.hasNext()) {
String key = (String)it.next();
if (default_property_file.equalsIgnoreCase("portal")) {
// check whether this key has been added?
if (portal_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
portal_props_bufwriter.newLine();
portal_props_bufwriter.write(key + "=dummy");
portal_props_bufwriter.newLine();
}
} else if (default_property_file.equalsIgnoreCase("admin")) {
// check whether this key has been added?
if (admin_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
admin_props_bufwriter.newLine();
admin_props_bufwriter.write(key + "=dummy");
admin_props_bufwriter.newLine();
}
} else if (default_property_file.equalsIgnoreCase("root")) {
// check whether this key has been added?
if (root_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
root_props_bufwriter.newLine();
root_props_bufwriter.write(key + "=dummy");
root_props_bufwriter.newLine();
}
}
}
root_props_bufwriter.close();
root_props_writer.close();
admin_props_bufwriter.close();
admin_props_writer.close();
portal_props_bufwriter.close();
portal_props_writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Process JAVA Files
*/
public void DistillJava() {
fileContainer.clear();
// Get all filenames under Java directory
searchFiles(java_directory, "java");
// Load root, portal, admin current properties
LoadProperties();
try {
// Prepare the Writers
FileWriter root_props_writer = new FileWriter(root_property_file, true);
BufferedWriter root_props_bufwriter = new BufferedWriter(root_props_writer);
FileWriter portal_props_writer = new FileWriter(portal_property_file, true);
BufferedWriter portal_props_bufwriter = new BufferedWriter(portal_props_writer);
FileWriter admin_props_writer = new FileWriter(admin_property_file, true);
BufferedWriter admin_props_bufwriter = new BufferedWriter(admin_props_writer);
// Iterate the files
int file_number = fileContainer.size();
// The result string container
HashMap result_container = new HashMap();
for (int i=0; i<file_number; i++) {
// Ignore files don't end with `java'
String filename = (String)fileContainer.get(i);
if (filename == null || filename.trim().length() < 1 ||
!filename.substring(filename.length() - 4, filename.length()).equalsIgnoreCase("java")) {
continue;
}
// Open the Java File and read out the resources
FileReader java_file_reader = new FileReader(filename);
BufferedReader buffer_reader = new BufferedReader(java_file_reader);
String input_line = null;
PatternCompiler orocom = new Perl5Compiler();
Pattern pattern = orocom.compile(java_restring);
PatternMatcher matcher = new Perl5Matcher();
while((input_line = buffer_reader.readLine()) != null) {
// System.out.println("Got one line from java file: " + input_line);
// Begin filter
// Use PatternMatcherInput class, we can find the next string in one line string
// Otherwise ORO will find the first match string in one line then ignore the rest string of this line
PatternMatcherInput reinput = new PatternMatcherInput(input_line);
while (matcher.contains(reinput, pattern)) {
MatchResult result = matcher.getMatch();
String result_string = result.group(0);
// Get rid of the quotations
result_string = result_string.substring(1, result_string.length() - 1);
// if we got the duplicated result_string, HashMap will overcome this issue
result_container.put(result_string, "dummy object");
}
}
buffer_reader.close();
java_file_reader.close();
}
// Iterate the HashMap and write the result
Iterator it = result_container.keySet().iterator();
while (it.hasNext()) {
String key = (String)it.next();
if (default_property_file.equalsIgnoreCase("portal")) {
// check whether this key has been added?
if (portal_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
portal_props_bufwriter.newLine();
portal_props_bufwriter.write(key + "=dummy");
portal_props_bufwriter.newLine();
}
} else if (default_property_file.equalsIgnoreCase("admin")) {
// check whether this key has been added?
if (admin_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
admin_props_bufwriter.newLine();
admin_props_bufwriter.write(key + "=dummy");
admin_props_bufwriter.newLine();
}
} else if (default_property_file.equalsIgnoreCase("root")) {
// check whether this key has been added?
if (root_props.getProperty(key) == null) {
System.out.println("Found one resource: " + key);
root_props_bufwriter.newLine();
root_props_bufwriter.write(key + "=dummy");
root_props_bufwriter.newLine();
}
}
}
root_props_bufwriter.close();
root_props_writer.close();
admin_props_bufwriter.close();
admin_props_writer.close();
portal_props_bufwriter.close();
portal_props_writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
GenerateProperties handle = new GenerateProperties();
handle.SetDefaultOutputProperty("admin");
handle.DistillJSP();
handle.DistillJava();
}
}