<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> | |
<html> | |
<!-- | |
Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. | |
--> | |
<head> | |
<title>Tech tip: Clean up your Bundle.properties entries with Bundlizer</title> | |
<meta name="DESCRIPTION" content="Tech Tip: How to optimize your code | |
by removing duplicate or unused Bundle.properties entries | |
from your Java project using the UNIX command line or | |
the Bundlizer tool to identify possibly 'stale' keys."> | |
<meta name="TYPE" content="ARTICLE"> | |
<meta name="AUTHOR" content="ruth.kusterer@sun.com"> | |
<meta name="AUDIENCE" content="NBUSER"> | |
<meta name="TOPIC" content="Bundle.properties"> | |
<link media="screen" href="../../netbeans.css" type="text/css" rel="stylesheet"> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | |
</head> | |
<body> | |
<div id="MainColumn"> | |
<h2>Tech Tip: Remove Duplicate and Unused Entries From Your Property Files</h2> | |
<div class="articledate" style="margin-left:0px;"> | |
Contributed by <a href="https://blogs.oracle.com/tor/entry/useful_tools_bundlizer_removes_duplicate">Tor Norbye</a>, | |
18 Aug 2005 | |
</div> | |
<div class="feedback-box"> | |
<a href="/about/contact_form.html?to=3&subject=Clean%20BundleProperties%20with%20Bundlizer">Feedback</a> | |
</div> | |
<p>This Tech Tip shows you how to clean up property files. | |
It demonstrates the use of the UNIX command line as well as | |
the Bundlizer tool to identify duplicate or unused entries. | |
<p>Removing “stale” Bundle.properties entries is important: | |
Not only do they create unnecessary work for localizers | |
who translate these files, | |
but unused keys also incur more runtime overhead. | |
It is easy to accidentally end up with unused key entries | |
while your code develops, so you ought | |
to check your property files even if you don't suspect | |
any “stale” entries. | |
</p> | |
<h3>Using the Unix Command Line to Scan Bundle Files</h3> | |
<p> | |
In Unix, you can use the command line to scan your files | |
for unused Bundle.properties entries. | |
This is an example <a href="http://openide.netbeans.org/servlets/ReadMsg?msgId=266544&listName=dev">Unix shell command</a> by Tor Norbye using nawk. | |
</p> | |
<pre class="examplecode">find . -name Bundle.properties -exec cat {} \; | /bin/grep "=" | sed | |
'/^#/d' | sed '/^OpenIDE-Module-/d' | nawk 'BEGIN { FS="=" } {print $1}' | |
| sort | uniq | nawk '{system("/bin/fgrep " $0 " `find . -name | |
\"*.class\" -o -name \"*.xml\"` \| nawk \"BEGIN \{i=0\} \{ i++ \} END \{ | |
if \(i==0\) print key \}\" key=" $0)}' | /bin/xargs -n 1 -I @ grep @ | |
`find . -name Bundle.properties` | |
</pre> | |
<h3>Using Bundlizer to Scan Bundle Files</h3> | |
<p> | |
If you prefer a graphical tool | |
to scan your Bundle files, take a look at Bundlizer. | |
Bundlizer is a stand-alone tool and | |
is not integrated into the NetBeans IDE. | |
</p> | |
<p>You can download the source code from | |
<a href="https://netbeans.org/source/browse/contrib/bundlizer/">contrib/bundlizer</a> or via the | |
<a href="https://netbeans.org/community/sources/cvs.html">NetBeans CVS</a>. | |
To start the tool, load it as a project in | |
<a href="http://www.netbeans.info/downloads/download.php?a=b&p=1">NetBeans IDE</a> and run it.</p> | |
<p> | |
Here is a screenshot of the utility in action (click for full size): | |
</p> | |
<p> | |
<a href="http://blogs.oracle.com/roller/resources/tor/bundlizer.gif"> | |
<img src="http://blogs.oracle.com/roller/resources/tor/bundlizer-small.gif" class="b-none" alt="A screenshot of the Bundlizer tool GUI."> | |
</a> | |
</p> | |
<p> | |
Bundlizer helps you clean a Bundle.properties file in several ways: | |
</p> | |
<ul> | |
<li> It looks for unused keys: These are removed from the file. </li> | |
<li> It looks for duplicates: When the same key is used more than once, | |
you are alerted to this since you will need | |
to decide which value to keep. </li> | |
<li> It cleans up formatting in the file: | |
For instance, it removes empty lines. </li> | |
<li> When you are done, it saves the resulting file.</li> | |
</ul> | |
<p> | |
Be aware that you should <em>definitely</em> check the results | |
before accepting any proposed changes. | |
Determining if a key is unused or not is not a task which can be | |
done fully automatically. | |
If for instance your code is <em>computing</em> keys | |
rather than looking them up directly, | |
Bundlizer will not be able to identify them | |
and will erroneously report these keys unused. | |
</p> | |
<h3>Patching Bundlizer</h3> | |
<p>If you have downloaded the Bundlizer's source code, | |
you can adapt this utility to your own needs. | |
For example, the | |
<a href="http://mediacast.sun.com/details.jsp?id=248">executable jar</a> | |
file mentioned above includes two improvements by Tor Norbye. | |
The first patch makes Bundlizer also look in XML files for key references; | |
the second makes the tool more robust against the encounter of | |
non-commented lines that do not contain any “=” signs. | |
</ul> | |
</p> | |
<h4>XML Suffix Patch</h4> | |
<p> | |
<pre class="examplecode">Index: contrib/bundlizer/src/org/netbeans/modules/bundlizer/BundlizerPanel.java | |
=================================================================== | |
RCS file: /cvs/contrib/bundlizer/src/org/netbeans/modules/bundlizer/BundlizerPanel.java,v | |
retrieving revision 1.3 | |
diff -u -r1.3 BundlizerPanel.java | |
--- contrib/bundlizer/src/org/netbeans/modules/bundlizer/BundlizerPanel.java 7 May 2004 23:48:40 -0000 1.3 | |
+++ contrib/bundlizer/src/org/netbeans/modules/bundlizer/BundlizerPanel.java 2 Aug 2005 05:45:46 -0000 | |
@@ -449,7 +449,7 @@ | |
private class JavaFilenameFilter implements java.io.FilenameFilter { | |
public boolean accept(java.io.File file, String str) { | |
- return str.endsWith ("java"); | |
+ return str.endsWith ("java") || str.endsWith("xml"); | |
} | |
} | |
</pre> | |
</p> | |
<h4>Ignore Missing Equal-Sign Patch</h4> | |
<p><pre class="examplecode">Index: contrib/bundlizer/src/org/netbeans/modules/bundlizer/Properties.java | |
=================================================================== | |
RCS file: /cvs/contrib/bundlizer/src/org/netbeans/modules/bundlizer/Properties.java,v | |
retrieving revision 1.2 | |
diff -u -r1.2 Properties.java | |
--- contrib/bundlizer/src/org/netbeans/modules/bundlizer/Properties.java 1 May 2004 13:52:24 -0000 1.2 | |
+++ contrib/bundlizer/src/org/netbeans/modules/bundlizer/Properties.java 2 Aug 2005 05:45:46 -0000 | |
@@ -115,6 +115,10 @@ | |
} | |
String keyValuePair = line; | |
int equals = keyValuePair.indexOf ("="); | |
+ if (equals == -1) { | |
+ continue; | |
+ } | |
assert equals != -1; | |
String key = keyValuePair.substring (0, equals).trim(); | |
@@ -203,6 +207,9 @@ | |
private boolean isKeyValuePair (String line) { | |
int equals = line.indexOf("="); | |
+ if (equals == -1) { | |
+ return false; | |
+ } | |
int cmt = line.indexOf ("#"); | |
return (cmt > 0 && equals < cmt) || (cmt < 0 && equals >= 0); | |
} | |
</pre> | |
</p> | |
<div class="feedback-box"> | |
<a href="/about/contact_form.html?to=3&subject=Feedback:clean bundles">Send Feedback on This Tutorial</a> | |
</div> | |
<br style="clear:both;" /> | |
<h2>See also</h2> | |
<ul> | |
<li><a href="https://blogs.oracle.com/tor/entry/useful_tools_bundlizer_removes_duplicate">Original blog article by Tor Norbye</a>. | |
<li>Download Bundlizer sources from <a href="https://netbeans.org/source/browse/contrib/bundlizer/">contrib/bundlizer</a> by <a href="http://weblogs.java.net/blog/timboudreau/">Tim Boudreau</a>. | |
<li>Tor's explanation of <a href="http://openide.netbeans.org/servlets/ReadMsg?msgId=266544&listName=dev">how his Unix command</a> works. | |
<li>Download <a href="http://www.netbeans.info/downloads/download.php?a=b&p=1">NetBeans IDE</a>. | |
<li><a href="https://netbeans.org/community/contribute/cvs.html">Contribute</a> your Bundlizer patches! | |
</ul> | |
</body></html> |