| <!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> |