<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog @ SIB Visions &#187; Java</title>
	<atom:link href="http://blog.sibvisions.com/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.sibvisions.com</link>
	<description>Blog @ SIB Visions</description>
	<lastBuildDate>Mon, 30 Mar 2026 11:14:36 +0000</lastBuildDate>
		<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Adding new paths for native libraries at runtime in Java (part 2)</title>
		<link>https://blog.sibvisions.com/2024/09/09/adding-new-paths-for-native-libraries-at-runtime-in-java-part-2/</link>
		<comments>https://blog.sibvisions.com/2024/09/09/adding-new-paths-for-native-libraries-at-runtime-in-java-part-2/#comments</comments>
		<pubDate>Mon, 09 Sep 2024 12:16:35 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">https://blog.sibvisions.com/?p=8893</guid>
		<description><![CDATA[Part 1 of this article is available here.
Since Java 14, ClassLoader was changed a little bit and usr_paths it not available as field anymore. It's still possible to change the java.library.path at runtime, but it's still tricky and dirty:

Method getDeclaredFields0 =
&#160; &#160; Class.class.getDeclaredMethod&#40;&#34;getDeclaredFields0&#34;, boolean.class&#41;;
getDeclaredFields0.setAccessible&#40;true&#41;;
Field&#91;&#93; fieldsClassLoader =
&#160; &#160; &#40;Field&#91;&#93;&#41;getDeclaredFields0.invoke&#40;ClassLoader.class, Boolean.FALSE&#41;;
for &#40;Field fldClassLoader : fieldsClassLoader&#41; &#123;
&#160; if [...]]]></description>
			<content:encoded><![CDATA[<p>Part 1 of this article is available <a href="https://blog.sibvisions.com/2020/05/22/adding-new-paths-for-native-libraries-at-runtime-in-java/">here</a>.</p>
<p>Since Java 14, <em>ClassLoader</em> was changed a little bit and <strong>usr_paths</strong> it not available as field anymore. It's still possible to change the <strong>java.library.path</strong> at runtime, but it's still tricky and dirty:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw3">Method</span> getDeclaredFields0 <span class="sy0">=</span><br />
&nbsp; &nbsp; <span class="kw1">Class</span>.<span class="kw1">class</span>.<span class="me1">getDeclaredMethod</span><span class="br0">&#40;</span><span class="st0">&quot;getDeclaredFields0&quot;</span>, <span class="kw4">boolean</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
getDeclaredFields0.<span class="me1">setAccessible</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Field</span><span class="br0">&#91;</span><span class="br0">&#93;</span> fieldsClassLoader <span class="sy0">=</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw3">Field</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>getDeclaredFields0.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="kw3">ClassLoader</span>.<span class="kw1">class</span>, <span class="kw3">Boolean</span>.<span class="kw2">FALSE</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">Field</span> fldClassLoader <span class="sy0">:</span> fieldsClassLoader<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&quot;libraries&quot;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>fldClassLoader.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; fldClassLoader.<span class="me1">setAccessible</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; Class<span class="sy0">&lt;?&gt;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> classesClassLoader <span class="sy0">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fldClassLoader.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getDeclaredClasses</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>Class<span class="sy0">&lt;?&gt;</span> clLibraryPaths <span class="sy0">:</span> classesClassLoader<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&quot;jdk.internal.loader.NativeLibraries$LibraryPaths&quot;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; clLibraryPaths.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Field</span><span class="br0">&#91;</span><span class="br0">&#93;</span> fieldsLibraryPaths <span class="sy0">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw3">Field</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>getDeclaredFields0.<span class="me1">invoke</span><span class="br0">&#40;</span>clLibraryPaths, <span class="kw3">Boolean</span>.<span class="kw2">FALSE</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">Field</span> fldLibPath <span class="sy0">:</span> fieldsLibraryPaths<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&quot;USER_PATHS&quot;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>fldLibPath.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">final</span> <span class="kw3">Field</span> fldUsrPaths <span class="sy0">=</span> fldLibPath<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fldUsrPaths.<span class="me1">setAccessible</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// get array of paths</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">final</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> saPath <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>fldUsrPaths.<span class="me1">get</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// check if the path to add is already present</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">String</span> path <span class="sy0">:</span> saPath<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>path.<span class="me1">equals</span><span class="br0">&#40;</span>pPath<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// add the new path</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> saNewPaths <span class="sy0">=</span> <span class="kw3">Arrays</span>.<span class="me1">copyOf</span><span class="br0">&#40;</span>saPath, saPath.<span class="me1">length</span> <span class="sy0">+</span> 1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; saNewPaths<span class="br0">&#91;</span>saNewPaths.<span class="me1">length</span> <span class="sy0">-</span> 1<span class="br0">&#93;</span> <span class="sy0">=</span> pPath<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Object</span> unsafe<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Unsafe is a hack</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Class<span class="sy0">&lt;?&gt;</span> clsUnsafe <span class="sy0">=</span> <span class="kw1">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span><span class="st0">&quot;sun.misc.Unsafe&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">final</span> <span class="kw3">Field</span> unsafeField <span class="sy0">=</span> clsUnsafe.<span class="me1">getDeclaredField</span><span class="br0">&#40;</span><span class="st0">&quot;theUnsafe&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unsafeField.<span class="me1">setAccessible</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unsafe <span class="sy0">=</span> unsafeField.<span class="me1">get</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Method</span> m1 <span class="sy0">=</span> clsUnsafe.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;staticFieldBase&quot;</span>, <span class="kw3">Field</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Method</span> m2 <span class="sy0">=</span> clsUnsafe.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;staticFieldOffset&quot;</span>, <span class="kw3">Field</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Object</span> fieldBase <span class="sy0">=</span> m1.<span class="me1">invoke</span><span class="br0">&#40;</span>unsafe, fldUsrPaths<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Long</span> fieldOffset <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">Long</span><span class="br0">&#41;</span>m2.<span class="me1">invoke</span><span class="br0">&#40;</span>unsafe, fldUsrPaths<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Method</span> m3 <span class="sy0">=</span> clsUnsafe.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;putObject&quot;</span>, <span class="kw3">Object</span>.<span class="kw1">class</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">long</span>.<span class="kw1">class</span>, <span class="kw3">Object</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m3.<span class="me1">invoke</span><span class="br0">&#40;</span>unsafe, fieldBase, fieldOffset, saNewPaths<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Here's the complete solution: <a href="https://sourceforge.net/p/topdf/code/HEAD/tree/trunk/java/src/com/sibvisions/topdf/util/PdfUtil.java">toPDF project</a> (search for <strong>addLibraryPath(String pPath)</strong>)</p>
<p>Above code requires: </p>
<div class="codesnip-container" >--add-opens java.base/java.lang=ALL-UNNAMED<br />
  --add-opens java.base/jdk.internal.loader=ALL-UNNAMED</div>
<p>for JDK > 14.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2024/09/09/adding-new-paths-for-native-libraries-at-runtime-in-java-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding new paths for native libraries at runtime in Java</title>
		<link>https://blog.sibvisions.com/2020/05/22/adding-new-paths-for-native-libraries-at-runtime-in-java/</link>
		<comments>https://blog.sibvisions.com/2020/05/22/adding-new-paths-for-native-libraries-at-runtime-in-java/#comments</comments>
		<pubDate>Thu, 21 May 2020 22:07:23 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">https://blog.sibvisions.com/?p=8354</guid>
		<description><![CDATA[If you want to add some native libraries at runtime, it was tricky with Java 8+:
This was a valid solution:

final Field fldUsrPaths = ClassLoader.class.getDeclaredField&#40;&#34;usr_paths&#34;&#41;;
fldUsrPaths.setAccessible&#40;true&#41;;
&#160;
//get array of paths
final String&#91;&#93; saPath = &#40;String&#91;&#93;&#41;fldUsrPaths.get&#40;null&#41;;
&#160;
//check if the path to add is already present
for &#40;String path : saPath&#41; 
&#123;
&#160; &#160; if &#40;path.equals&#40;pPath&#41;&#41; 
&#160; &#160; &#123;
&#160; &#160; &#160; &#160; return;
&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>If you want to add some native libraries at runtime, it was tricky with Java 8+:</p>
<p>This was a valid solution:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">final</span> <span class="kw3">Field</span> fldUsrPaths <span class="sy0">=</span> <span class="kw3">ClassLoader</span>.<span class="kw1">class</span>.<span class="me1">getDeclaredField</span><span class="br0">&#40;</span><span class="st0">&quot;usr_paths&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
fldUsrPaths.<span class="me1">setAccessible</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp;<br />
<span class="co1">//get array of paths</span><br />
<span class="kw1">final</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> saPath <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>fldUsrPaths.<span class="me1">get</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp;<br />
<span class="co1">//check if the path to add is already present</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">String</span> path <span class="sy0">:</span> saPath<span class="br0">&#41;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>path.<span class="me1">equals</span><span class="br0">&#40;</span>pPath<span class="br0">&#41;</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="co1">//add the new path</span><br />
<span class="kw1">final</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> saNewPaths <span class="sy0">=</span> <span class="kw3">Arrays</span>.<span class="me1">copyOf</span><span class="br0">&#40;</span>saPath, saPath.<span class="me1">length</span> <span class="sy0">+</span> 1<span class="br0">&#41;</span><span class="sy0">;</span><br />
saNewPaths<span class="br0">&#91;</span>saNewPaths.<span class="me1">length</span> <span class="sy0">-</span> 1<span class="br0">&#93;</span> <span class="sy0">=</span> pPath<span class="sy0">;</span><br />
fldUsrPaths.<span class="me1">set</span><span class="br0">&#40;</span><span class="kw2">null</span>, saNewPaths<span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>Since Java 10+ it's not possible anymore, because of: <a href="https://bugs.openjdk.java.net/browse/JDK-8210522">JDK-8210522</a><br />
Some details from <a href="https://stackoverflow.com/questions/15409223/adding-new-paths-for-native-libraries-at-runtime-in-java">Stackoverflow</a></p>
<p>If someone still needs a solution for Java 10+, here it is:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">Lookup cl <span class="sy0">=</span> MethodHandles.<span class="me1">privateLookupIn</span><span class="br0">&#40;</span><span class="kw3">ClassLoader</span>.<span class="kw1">class</span>, MethodHandles.<span class="me1">lookup</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
VarHandle usr_paths <span class="sy0">=</span> cl.<span class="me1">findStaticVarHandle</span><span class="br0">&#40;</span><span class="kw3">ClassLoader</span>.<span class="kw1">class</span>, <span class="st0">&quot;usr_paths&quot;</span>, <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> path <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>usr_paths.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>...</p>
<p><span class="me1">usr_paths</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;A&quot;</span>, <span class="st0">&quot;B&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>This code won't work if you are using Java 8. If you want support for e.g. Java < 10, simply use reflection <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Sounds simple, but it is not simple.....</p>
<p>Here's a working solution: <a href="https://sourceforge.net/p/topdf/code/HEAD/tree/trunk/java/src/com/sibvisions/topdf/util/PdfUtil.java">toPDF project</a> (search for <strong>addLibraryPath(String pPath)</strong>).</p>
<p>The code in detail:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">Class<span class="sy0">&lt;?&gt;</span> clsMHandles <span class="sy0">=</span> <span class="kw1">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span><span class="st0">&quot;java.lang.invoke.MethodHandles&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="kw3">Method</span> mStaticLookup <span class="sy0">=</span> clsMHandles.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;lookup&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">Object</span> oStaticLookup <span class="sy0">=</span> mStaticLookup.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Method</span> mLookup <span class="sy0">=</span> clsMHandles.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;privateLookupIn&quot;</span>, <span class="kw1">Class</span>.<span class="kw1">class</span>, <span class="kw1">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span><span class="st0">&quot;java.lang.invoke.MethodHandles$Lookup&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">Object</span> oLookup <span class="sy0">=</span> mLookup.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="kw2">null</span>, <span class="kw3">ClassLoader</span>.<span class="kw1">class</span>, oStaticLookup<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Method</span> mFindStatic <span class="sy0">=</span> oLookup.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;findStaticVarHandle&quot;</span>, <span class="kw1">Class</span>.<span class="kw1">class</span>, <span class="kw3">String</span>.<span class="kw1">class</span>, <span class="kw1">Class</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Object</span> oVarHandle <span class="sy0">=</span> mFindStatic.<span class="me1">invoke</span><span class="br0">&#40;</span>oLookup, <span class="kw3">ClassLoader</span>.<span class="kw1">class</span>, <span class="st0">&quot;usr_paths&quot;</span>, <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="co1">//MethodHandle mh = MethodHandles.lookup().findVirtual(VarHandle.class, &quot;get&quot;, MethodType.methodType(Object.class));</span><br />
<span class="co1">//mh.invoke(oVarHandle);</span></p>
<p><span class="kw3">Method</span> mFindVirtual <span class="sy0">=</span> oStaticLookup.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;findVirtual&quot;</span>, <span class="kw1">Class</span>.<span class="kw1">class</span>, <span class="kw3">String</span>.<span class="kw1">class</span>, <span class="kw1">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span><span class="st0">&quot;java.lang.invoke.MethodType&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>Class<span class="sy0">&lt;?&gt;</span> clsMethodType <span class="sy0">=</span> <span class="kw1">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span><span class="st0">&quot;java.lang.invoke.MethodType&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">Method</span> mMethodType <span class="sy0">=</span> clsMethodType.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;methodType&quot;</span>, <span class="kw1">Class</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Object</span> oMethodHandleGet <span class="sy0">=</span> mFindVirtual.<span class="me1">invoke</span><span class="br0">&#40;</span>oStaticLookup, <span class="kw1">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span><span class="st0">&quot;java.lang.invoke.VarHandle&quot;</span><span class="br0">&#41;</span>, <span class="st0">&quot;get&quot;</span>, mMethodType.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="kw2">null</span>, <span class="kw3">Object</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Method</span> mMethodHandleGet <span class="sy0">=</span> oMethodHandleGet.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;invokeWithArguments&quot;</span>, <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> saPath <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>mMethodHandleGet.<span class="me1">invoke</span><span class="br0">&#40;</span>oMethodHandleGet, <span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span>oVarHandle<span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="co1">//check if the path to add is already present</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">String</span> path <span class="sy0">:</span> saPath<span class="br0">&#41;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>path.<span class="me1">equals</span><span class="br0">&#40;</span>pPath<span class="br0">&#41;</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="co1">//add the new path</span><br />
<span class="kw1">final</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> saNewPaths <span class="sy0">=</span> <span class="kw3">Arrays</span>.<span class="me1">copyOf</span><span class="br0">&#40;</span>saPath, saPath.<span class="me1">length</span> <span class="sy0">+</span> 1<span class="br0">&#41;</span><span class="sy0">;</span><br />
saNewPaths<span class="br0">&#91;</span>saNewPaths.<span class="me1">length</span> <span class="sy0">-</span> 1<span class="br0">&#93;</span> <span class="sy0">=</span> pPath<span class="sy0">;</span></p>
<p><span class="co1">//MethodHandle mh = MethodHandles.lookup().findVirtual(VarHandle.class, &quot;set&quot;, MethodType.methodType(Void.class, Object[].class));</span><br />
<span class="co1">//mh.invoke(oVarHandle, new String[] {&quot;GEHT&quot;});</span></p>
<p>mMethodType <span class="sy0">=</span> clsMethodType.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;methodType&quot;</span>, <span class="kw1">Class</span>.<span class="kw1">class</span>, <span class="kw1">Class</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Object</span> oMethodHandleSet <span class="sy0">=</span> mFindVirtual.<span class="me1">invoke</span><span class="br0">&#40;</span>oStaticLookup, <span class="kw1">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span><span class="st0">&quot;java.lang.invoke.VarHandle&quot;</span><span class="br0">&#41;</span>, <span class="st0">&quot;set&quot;</span>, mMethodType.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="kw2">null</span>, <span class="kw3">Void</span>.<span class="kw1">class</span>, <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Method</span> mMethodHandleSet <span class="sy0">=</span> oMethodHandleSet.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getMethod</span><span class="br0">&#40;</span><span class="st0">&quot;invokeWithArguments&quot;</span>, <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span>.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>mMethodHandleSet.<span class="me1">invoke</span><span class="br0">&#40;</span>oMethodHandleSet, <span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span>oVarHandle, saNewPaths<span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>Not simple!!!</p>
<p>Summarized: It's not easy but it's still possible. So.... why are things getting more and more complex?</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2020/05/22/adding-new-paths-for-native-libraries-at-runtime-in-java/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>JVx and Java 8, Events and Lambdas</title>
		<link>https://blog.sibvisions.com/2015/01/28/jvx-and-java-8-events-and-lambdas/</link>
		<comments>https://blog.sibvisions.com/2015/01/28/jvx-and-java-8-events-and-lambdas/#comments</comments>
		<pubDate>Wed, 28 Jan 2015 13:15:04 +0000</pubDate>
		<dc:creator>rzenz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[java8]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=3657</guid>
		<description><![CDATA[With version 8, Java has received support for lambda expressions and of course also JVx and its users directly profit from this new feature.
In case you do not know what a lambda expression is, it is basically the possibility to inline functions, sometimes also called "anonymous functions" and should not be confused with "anonymous classes", [...]]]></description>
			<content:encoded><![CDATA[<p>With version 8, Java has received support for <a href="https://en.wikipedia.org/wiki/Anonymous_function">lambda expressions</a> and of course also JVx and its users directly profit from this new feature.</p>
<p>In case you do not know what a lambda expression is, it is basically the possibility to inline functions, sometimes also called "anonymous functions" and should not be confused with "anonymous classes", which Java has supported for quite some time now. Let's look at a simple example of anonymous classes:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">new</span> <span class="kw3">Thread</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">Runnable</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// your code</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>This launches a thread that does <em>something</em>. The Runnable in our example is the anonymous class. Now with the new lambda support we don't need to write the interface implementation, but can directly tell it to run a function:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">new</span> <span class="kw3">Thread</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-&gt;</span> <span class="br0">&#123;</span> <span class="coMULTI">/* your code */</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>The empty parentheses and the arrow indicate a new anonymous function. The parentheses contain the list of parameters of the function that is going to be invoked, in our case it is empty because Runnable.run() does not have any parameters. So the anatomy of a lambda looks like this:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">new</span> <span class="kw3">Thread</span><span class="br0">&#40;</span><span class="br0">&#40;</span>optional explicit cast to target <span class="kw1">interface</span><span class="br0">&#41;</span><span class="br0">&#40;</span>parameters<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; function body<br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>Internally this is still compiled into an anonymous class, but the code becomes a lot smoother and easier to read.</p>
<p>Additionally it is now possible to reference functions directly, like this:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="co1">// instance</span><br />
<span class="kw1">new</span> <span class="kw3">Thread</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">::</span>worker<span class="br0">&#41;</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="co1">// static</span><br />
<span class="kw1">new</span> <span class="kw3">Thread</span><span class="br0">&#40;</span>YourWorkClass<span class="sy0">::</span>worker<span class="br0">&#41;</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>Especially the last possibility is very exciting, as our event system has a very similar mechanism but <a href="http://blog.sibvisions.com/2014/07/15/visionx-rnd-news-ide-integration/">until recently did not have compile-time safety and checks</a>.</p>
<div style="margin: 0; line-height: 1px; height: 5px; display: block;"></div>
<p>The new lambda feature is backwards compatible and can easily be used in JVx. Here is a simple test window that shows the new lambda expressions in combination with JVx events:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">javax.rad.genui.component.UIButton</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">javax.rad.genui.container.UIFrame</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">javax.rad.genui.layout.UIBorderLayout</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">javax.rad.ui.event.UIActionEvent</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> LambdaShowcaseFrame <span class="kw1">extends</span> UIFrame <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> LambdaShowcaseFrame<span class="br0">&#40;</span><span class="br0">&#41;</span> &nbsp;<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; initializeUI<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> doJVxAction<span class="br0">&#40;</span>UIActionEvent pActionEvent<span class="br0">&#41;</span> <br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;JVx&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> doLambda2<span class="br0">&#40;</span>UIActionEvent pActionEvent<span class="br0">&#41;</span> <br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Lambda 2&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">void</span> initializeUI<span class="br0">&#40;</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//before Java 8</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; UIButton buttonJVx <span class="sy0">=</span> <span class="kw1">new</span> UIButton<span class="br0">&#40;</span><span class="st0">&quot;JVx Style&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; buttonJVx.<span class="me1">eventAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">addListener</span><span class="br0">&#40;</span><span class="kw1">this</span>, <span class="st0">&quot;doJVxAction&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// with Java 8</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; UIButton buttonLambda1 <span class="sy0">=</span> <span class="kw1">new</span> UIButton<span class="br0">&#40;</span><span class="st0">&quot;Lambda 1&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; buttonLambda1.<span class="me1">eventAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="me1">addListener</span><span class="br0">&#40;</span>pActionEvent <span class="sy0">-&gt;</span> <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Lambda 1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; UIButton buttonLambda2 <span class="sy0">=</span> <span class="kw1">new</span> UIButton<span class="br0">&#40;</span><span class="st0">&quot;Lambda 2&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; buttonLambda2.<span class="me1">eventAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">addListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">::</span>doLambda2<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; setLayout<span class="br0">&#40;</span><span class="kw1">new</span> UIBorderLayout<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add<span class="br0">&#40;</span>buttonJVx, UIBorderLayout.<span class="me1">NORTH</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add<span class="br0">&#40;</span>buttonLambda1, UIBorderLayout.<span class="me1">WEST</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add<span class="br0">&#40;</span>buttonLambda2, UIBorderLayout.<span class="me1">EAST</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/01/28/jvx-and-java-8-events-and-lambdas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New project: embedded NFC</title>
		<link>https://blog.sibvisions.com/2012/12/23/new-project-embedded-nfc/</link>
		<comments>https://blog.sibvisions.com/2012/12/23/new-project-embedded-nfc/#comments</comments>
		<pubDate>Sun, 23 Dec 2012 15:28:15 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[NFC]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=1905</guid>
		<description><![CDATA[The source code for NFC reading/writing (mifare cards, chip PN532) is available.
See http://sourceforge.net/projects/enfc.
If you use Eclipse, simply check out and open the included project. It should work without problems. A build.xml for ant is included and creates an enfc.jar under &#60;project&#62;/build/install/.
How to use the library?
First, test if your hardware works. Start the JUnit test cases:

&#60;TestNFC&#62;.testDiagnose
&#60;TestNFC&#62;.testCommunication

Both [...]]]></description>
			<content:encoded><![CDATA[<p>The source code for NFC reading/writing (mifare cards, chip PN532) is available.</p>
<p>See <a href="http://sourceforge.net/projects/enfc">http://sourceforge.net/projects/enfc</a>.</p>
<p>If you use Eclipse, simply check out and open the included project. It should work without problems. A build.xml for ant is included and creates an <strong>enfc.jar</strong> under <strong>&lt;project&gt;/build/install/</strong>.</p>
<p><strong>How to use the library?</strong></p>
<p>First, test if your hardware works. Start the JUnit test cases:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="sy0">&lt;</span>TestNFC<span class="sy0">&gt;</span>.<span class="me1">testDiagnose</span><br />
<span class="sy0">&lt;</span>TestNFC<span class="sy0">&gt;</span>.<span class="me1">testCommunication</span></div>
</div>
<p>Both should be green.</p>
<p>If you have problems, check if your authentication Key is 0xFF_FF_FF_FF_FF_FF and change the port for the serial interface (default: COM6). Add the system property "-Dserialport=xxx" to your launch configuration or change AbstractNFCTest.</p>
<p>The library has one very important class and one important class <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li>The very important class is <strong>NFC</strong>. It handles the communication with your hardware (supports read and write operations).</li>
<li>The important class is <strong>NFCReader</strong></li>
</ul>
<p>The NFCReader reads two sectors (á 3 Blocks á 16bytes). The first sector contains a name (usually your first and last name). The second sector contains an authentication key (whatever). If you manage different data or want save read operations, check the source of NFCReader and create your own reader - it's easy.</p>
<p>Before you can read data, you have to write data to your card. Use following test case to write data:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="sy0">&lt;</span>TestNFC<span class="sy0">&gt;</span>.<span class="me1">testWrite</span></div>
</div>
<p>but don't forget to change the username and auth key. The defaults are <strong>René Jahn</strong> and <strong>010203</strong> <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>A simple test application:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> pArgs<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; nfcr <span class="sy0">=</span> <span class="kw1">new</span> NFCReader<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; nfcr.<span class="me1">setPort</span><span class="br0">&#40;</span><span class="kw3">System</span>.<span class="me1">getProperty</span><span class="br0">&#40;</span><span class="st0">&quot;serialport&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; nfcr.<span class="me1">setAuthenticationKey</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#41;</span>0xFF, <span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#41;</span>0xFF, <span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#41;</span>0xFF, <span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#41;</span>0xFF, <span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#41;</span>0xFF, <span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#41;</span>0xFF<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; nfcr.<span class="me1">addListener</span><span class="br0">&#40;</span><span class="kw1">new</span> INFCListener<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> nearFieldCommunication<span class="br0">&#40;</span><span class="kw1">final</span> NFCEvent pEvent<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>pEvent.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> BlockRead<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> byData <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw4">byte</span><span class="br0">&#91;</span>48<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;?&gt;</span> liBytes <span class="sy0">=</span> <span class="br0">&#40;</span>List<span class="sy0">&lt;?&gt;</span><span class="br0">&#41;</span>pEvent.<span class="me1">getObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">3</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">arraycopy</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>liBytes.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>, 0, byData, i <span class="sy0">*</span> 16, 16<span class="br0">&#41;</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sName <span class="sy0">=</span> NFC.<span class="me1">toString</span><span class="br0">&#40;</span>byData<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; byData <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw4">byte</span><span class="br0">&#91;</span>48<span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> 3, j <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">6</span><span class="sy0">;</span> i<span class="sy0">++</span>, j<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">arraycopy</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>liBytes.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>, 0, byData, j <span class="sy0">*</span> 16, 16<span class="br0">&#41;</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sKey <span class="sy0">=</span> NFC.<span class="me1">toString</span><span class="br0">&#40;</span>byData<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Welcome: &quot;</span> <span class="sy0">+</span> sName <span class="sy0">+</span> <span class="st0">&quot; [&quot;</span> <span class="sy0">+</span> sKey <span class="sy0">+</span> <span class="st0">&quot;]&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="kw3">Error</span><span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">Exception</span><span class="br0">&#41;</span>pEvent.<span class="me1">getObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; nfcr.<span class="me1">searchCards</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2012/12/23/new-project-embedded-nfc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Source Code modification with Eclipse AST</title>
		<link>https://blog.sibvisions.com/2012/12/03/source-code-modification-with-eclipse-ast/</link>
		<comments>https://blog.sibvisions.com/2012/12/03/source-code-modification-with-eclipse-ast/#comments</comments>
		<pubDate>Mon, 03 Dec 2012 13:00:32 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[AST]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDT]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=1840</guid>
		<description><![CDATA[We heavily use Eclipse AST and JDT. The problem with both APIs is that you don't find a lot of documentation or examples. The best documentation was and is the source code. It shows all secrets.
Last friday at Eclipse DemoCamp Vienna, I discussed with CodeCop about AST and JDT and the missing documentation  
I [...]]]></description>
			<content:encoded><![CDATA[<p>We heavily use Eclipse AST and JDT. The problem with both APIs is that you don't find a lot of documentation or examples. The best documentation was and is the source code. It shows all secrets.</p>
<p>Last friday at Eclipse DemoCamp Vienna, I discussed with <a href="http://blog.code-cop.org/">CodeCop</a> about AST and JDT and the missing documentation <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I wrote a simple class for class/superclass/package/javadoc manipulation some months ago. It is included in VisionX and is not free, but no matter. Here is the source code:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="coMULTI">/* <br />
(c) SIB Visions 2012 </p>
<p>http://www.sibvisions.com<br />
*/</span><br />
<span class="kw1">public</span> <span class="kw1">class</span> SimpleSourceFile <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br />
&nbsp; &nbsp; <span class="co1">// Class members</span><br />
&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the source parser. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> ASTParser parser<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the parsed tokens of the source file. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> CompilationUnit cuSource<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the original document. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw3">Document</span> docOrig<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the class type info. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> TypeDeclaration tdClass<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the javadoc of the class. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> JavadocInfo jdoc<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the full qualified name of the class. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw3">String</span> sClassName<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the full qualified name of the super class after loading. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw3">String</span> sLoadedSuperClass<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the full qualified name of the parent class. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw3">String</span> sSuperClass<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** whether the source is changed. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> bChanged <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br />
&nbsp; &nbsp; <span class="co1">// Initialization</span><br />
&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Creates a new instance of &lt;code&gt;SimpleSourceFile&lt;/code&gt; without source<br />
&nbsp; &nbsp; &nbsp;* information.<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SimpleSourceFile<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Creates a new instance of &lt;code&gt;SimpleSourceFile&lt;/code&gt; with a given <br />
&nbsp; &nbsp; &nbsp;* source file.<br />
&nbsp; &nbsp; &nbsp;* &nbsp;<br />
&nbsp; &nbsp; &nbsp;* @param pFile the java source file<br />
&nbsp; &nbsp; &nbsp;* @throws IOException if an error occurs during reading the file<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SimpleSourceFile<span class="br0">&#40;</span><span class="kw3">File</span> pFile<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>pFile.<span class="me1">exists</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JavaSource source <span class="sy0">=</span> JavaSource.<span class="me1">get</span><span class="br0">&#40;</span>pFile.<span class="me1">getAbsolutePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>source <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">synchronized</span><span class="br0">&#40;</span>source<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getContent</span><span class="br0">&#40;</span>pFile<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getContent</span><span class="br0">&#40;</span>pFile<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Creates a new instance of &lt;code&gt;SimpleSourceFile&lt;/code&gt; with a given <br />
&nbsp; &nbsp; &nbsp;* source stream. The stream is closed after reading<br />
&nbsp; &nbsp; &nbsp;* &nbsp;<br />
&nbsp; &nbsp; &nbsp;* @param pStream the java source stream<br />
&nbsp; &nbsp; &nbsp;* @throws IOException if an error occurs during reading the stream<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SimpleSourceFile<span class="br0">&#40;</span><span class="kw3">InputStream</span> pStream<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="br0">&#40;</span>pStream, <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Creates a new instance of &lt;code&gt;SimpleSourceFile&lt;/code&gt; with a given <br />
&nbsp; &nbsp; &nbsp;* source stream.<br />
&nbsp; &nbsp; &nbsp;* &nbsp;<br />
&nbsp; &nbsp; &nbsp;* @param pStream the java source stream<br />
&nbsp; &nbsp; &nbsp;* @param pAutoClose whether the stream should be closed after reading<br />
&nbsp; &nbsp; &nbsp;* @throws IOException if an error occurs during reading the stream<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SimpleSourceFile<span class="br0">&#40;</span><span class="kw3">InputStream</span> pStream, <span class="kw4">boolean</span> pAutoClose<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getContent</span><span class="br0">&#40;</span>pStream, pAutoClose<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br />
&nbsp; &nbsp; <span class="co1">// User-defined methods</span><br />
&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Loads the properties from the source file.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pSource the java source<br />
&nbsp; &nbsp; &nbsp;*/</span>@SuppressWarnings<span class="br0">&#40;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unchecked&quot;</span>, <span class="st0">&quot;rawtypes&quot;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">void</span> load<span class="br0">&#40;</span><span class="kw3">String</span> pSource<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; jdoc <span class="sy0">=</span> <span class="kw1">new</span> JavadocInfo<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>parser <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parser <span class="sy0">=</span> ASTUtil.<span class="me1">createParser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; parser.<span class="me1">setSource</span><span class="br0">&#40;</span>pSource.<span class="me1">toCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cuSource <span class="sy0">=</span> <span class="br0">&#40;</span>CompilationUnit<span class="br0">&#41;</span> parser.<span class="me1">createAST</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>docOrig <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; docOrig.<span class="me1">set</span><span class="br0">&#40;</span>pSource<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; docOrig <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">Document</span><span class="br0">&#40;</span>pSource<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//we support only one class per file</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">List</span> types <span class="sy0">=</span> cuSource.<span class="me1">types</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>types.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 0 <span class="sy0">&amp;&amp;</span> types.<span class="me1">get</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span> <span class="kw1">instanceof</span> TypeDeclaration<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tdClass <span class="sy0">=</span> <span class="br0">&#40;</span>TypeDeclaration<span class="br0">&#41;</span> types.<span class="me1">get</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sPackage<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//we have to use the current package, if set</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>cuSource.<span class="me1">getPackage</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sPackage <span class="sy0">=</span> cuSource.<span class="me1">getPackage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;.&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sPackage <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sClassName <span class="sy0">=</span> sPackage <span class="sy0">+</span> tdClass.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>tdClass.<span class="me1">getSuperclassType</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sSuperName <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>SimpleType<span class="br0">&#41;</span><span class="br0">&#40;</span>tdClass.<span class="me1">getSuperclassType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sSuperName.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">'.'</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sSuperClass <span class="sy0">=</span> sSuperName<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//try to detect the full qualified name of the super class through the imports</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">List</span> <span class="sy0">&lt;</span> ImportDeclaration <span class="sy0">&gt;</span> liImports <span class="sy0">=</span> cuSource.<span class="me1">imports</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> bFound <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>liImports <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sTempName <span class="sy0">=</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">+</span> sSuperName<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sImport<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> 0, anz <span class="sy0">=</span> liImports.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy0">!</span>bFound <span class="sy0">&amp;&amp;</span> i <span class="sy0">&lt;</span> anz<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sImport <span class="sy0">=</span> liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sImport.<span class="me1">endsWith</span><span class="br0">&#40;</span>sTempName<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bFound <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sSuperClass <span class="sy0">=</span> liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>bFound<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//we use the current package</span><br />
<span class="co2"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sSuperClass</span> <span class="sy0">=</span> sPackage <span class="sy0">+</span> sSuperName<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//cache for optimizing imports in apply</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sLoadedSuperClass <span class="sy0">=</span> sSuperClass<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jdoc <span class="sy0">=</span> <span class="kw1">new</span> JavadocInfo<span class="br0">&#40;</span>tdClass.<span class="me1">getJavadoc</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, pSource<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tdClass <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//currently loaded file can not be changed!</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Sets the comment for the class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pText the comment<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> setClassComment<span class="br0">&#40;</span><span class="kw3">String</span> pText<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">|=</span> <span class="sy0">!</span>CommonUtil.<span class="me1">equals</span><span class="br0">&#40;</span>pText, jdoc.<span class="me1">getDescription</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; jdoc.<span class="me1">setDescription</span><span class="br0">&#40;</span>pText<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Gets the comment for the class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @return the comment<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw3">String</span> getClassComment<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> jdoc.<span class="me1">getDescription</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Sets the full qualified name of the class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pName the class name<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> setClassName<span class="br0">&#40;</span><span class="kw3">String</span> pName<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>pName <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <span class="kw1">new</span> <span class="kw3">IllegalArgumentException</span><span class="br0">&#40;</span><span class="st0">&quot;It is not allowed to remove the class definition (class name = null)!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">|=</span> <span class="sy0">!</span>CommonUtil.<span class="me1">equals</span><span class="br0">&#40;</span>pName, sClassName<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; sClassName <span class="sy0">=</span> pName<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Gets the full qualified name of the class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @return the class name<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw3">String</span> getClassName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sClassName<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Sets the full qualified class name of the parent class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pSuperClass the full qualified class name of the parent class<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> setSuperClass<span class="br0">&#40;</span><span class="kw3">String</span> pSuperClass<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">|=</span> <span class="sy0">!</span>CommonUtil.<span class="me1">equals</span><span class="br0">&#40;</span>pSuperClass, sSuperClass<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; sSuperClass <span class="sy0">=</span> pSuperClass<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Gets the full qualified class name of the parent class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @return the class name<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw3">String</span> getSuperClass<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sSuperClass<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Replaces the relevant information with the specific values<br />
&nbsp; &nbsp; &nbsp;* and saves the source file.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @throws Exception if the source modification fails<br />
&nbsp; &nbsp; &nbsp;*/</span>@SuppressWarnings<span class="br0">&#40;</span><span class="st0">&quot;unchecked&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">protected</span> <span class="kw4">void</span> apply<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>bChanged<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; AST ast <span class="sy0">=</span> cuSource.<span class="me1">getAST</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; ASTRewrite arw <span class="sy0">=</span> ASTRewrite.<span class="me1">create</span><span class="br0">&#40;</span>ast<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Change Package, Classname and Constructor</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sCurrentPackage<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//set package</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> sClassInfo <span class="sy0">=</span> ClassUtil.<span class="me1">splitName</span><span class="br0">&#40;</span>sClassName<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>cuSource.<span class="me1">getPackage</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>cuSource.<span class="me1">getPackage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, PackageDeclaration.<span class="me1">NAME_PROPERTY</span>, ast.<span class="me1">newName</span><span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sCurrentPackage <span class="sy0">=</span> sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PackageDeclaration pdcl <span class="sy0">=</span> ast.<span class="me1">newPackageDeclaration</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pdcl.<span class="me1">setName</span><span class="br0">&#40;</span>ast.<span class="me1">newName</span><span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>cuSource, CompilationUnit.<span class="me1">PACKAGE_PROPERTY</span>, pdcl, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sCurrentPackage <span class="sy0">=</span> sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>cuSource, CompilationUnit.<span class="me1">PACKAGE_PROPERTY</span>, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sCurrentPackage <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>tdClass <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//new class</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tdClass <span class="sy0">=</span> ast.<span class="me1">newTypeDeclaration</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tdClass.<span class="me1">setName</span><span class="br0">&#40;</span>ast.<span class="me1">newSimpleName</span><span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListRewrite lrwImp <span class="sy0">=</span> arw.<span class="me1">getListRewrite</span><span class="br0">&#40;</span>cuSource, CompilationUnit.<span class="me1">TYPES_PROPERTY</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lrwImp.<span class="me1">insertFirst</span><span class="br0">&#40;</span>tdClass, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//change class name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SimpleName snClass <span class="sy0">=</span> ast.<span class="me1">newSimpleName</span><span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">NAME_PROPERTY</span>, snClass, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//chage constructors</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MethodDeclaration<span class="br0">&#91;</span><span class="br0">&#93;</span> methods <span class="sy0">=</span> tdClass.<span class="me1">getMethods</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>methods <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>MethodDeclaration method<span class="sy0">:</span> methods<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>method.<span class="me1">isConstructor</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>method, MethodDeclaration.<span class="me1">NAME_PROPERTY</span>, snClass, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//change Superclass</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">List</span> <span class="sy0">&lt;</span> ImportDeclaration <span class="sy0">&gt;</span> liImports <span class="sy0">=</span> cuSource.<span class="me1">imports</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//remove &quot;old&quot; import</span><br />
<span class="co2"> &nbsp; &nbsp; &nbsp; &nbsp;if</span> <span class="br0">&#40;</span>sLoadedSuperClass <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>liImports <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> bFound <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> liImports.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="sy0">!</span>bFound <span class="sy0">&amp;&amp;</span> i <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">--</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sLoadedSuperClass.<span class="me1">equals</span><span class="br0">&#40;</span>liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bFound <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">remove</span><span class="br0">&#40;</span>liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; liImports.<span class="me1">remove</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sSuperClass <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">SUPERCLASS_TYPE_PROPERTY</span>, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//check new super class import</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> sSuperClassInfo <span class="sy0">=</span> ClassUtil.<span class="me1">splitName</span><span class="br0">&#40;</span>sSuperClass<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sSuperClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> bFound <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sCurrentPackage <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bFound <span class="sy0">=</span> sSuperClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>sCurrentPackage<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>bFound<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>liImports <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> 0, anz <span class="sy0">=</span> liImports.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy0">!</span>bFound <span class="sy0">&amp;&amp;</span> i <span class="sy0">&lt;</span> anz<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bFound <span class="sy0">=</span> sSuperClass.<span class="me1">equals</span><span class="br0">&#40;</span>liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//class not already importet -&gt; add import</span><br />
<span class="co2"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if</span> <span class="br0">&#40;</span><span class="sy0">!</span>bFound<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportDeclaration idSuper <span class="sy0">=</span> ast.<span class="me1">newImportDeclaration</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idSuper.<span class="me1">setName</span><span class="br0">&#40;</span>ast.<span class="me1">newName</span><span class="br0">&#40;</span>sSuperClass<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListRewrite lrwImp <span class="sy0">=</span> arw.<span class="me1">getListRewrite</span><span class="br0">&#40;</span>cuSource, CompilationUnit.<span class="me1">IMPORTS_PROPERTY</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lrwImp.<span class="me1">insertLast</span><span class="br0">&#40;</span>idSuper, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">SUPERCLASS_TYPE_PROPERTY</span>, ast.<span class="me1">newSimpleType</span><span class="br0">&#40;</span>ast.<span class="me1">newName</span><span class="br0">&#40;</span>sSuperClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Change Javadoc of the class</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>jdoc.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//no javadoc</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">JAVADOC_PROPERTY</span>, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">JAVADOC_PROPERTY</span>, jdoc.<span class="me1">createJavadoc</span><span class="br0">&#40;</span>tdClass.<span class="me1">getAST</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Modify AST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; TextEdit edit <span class="sy0">=</span> arw.<span class="me1">rewriteAST</span><span class="br0">&#40;</span>docOrig, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; edit.<span class="me1">apply</span><span class="br0">&#40;</span>docOrig<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; ASTUtil.<span class="me1">applyFormat</span><span class="br0">&#40;</span>docOrig<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//simple reparse (important for the comments)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; parser.<span class="me1">setSource</span><span class="br0">&#40;</span>docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cuSource <span class="sy0">=</span> <span class="br0">&#40;</span>CompilationUnit<span class="br0">&#41;</span> parser.<span class="me1">createAST</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Modify comments</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Class comment after the last bracket</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iCorr <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">List</span> <span class="sy0">&lt;</span> Comment <span class="sy0">&gt;</span> liComments <span class="sy0">=</span> cuSource.<span class="me1">getCommentList</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>liComments <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sOldName <span class="sy0">=</span> tdClass.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sText<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>Comment com<span class="sy0">:</span> liComments<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sText <span class="sy0">=</span> docOrig.<span class="me1">get</span><span class="br0">&#40;</span>com.<span class="me1">getStartPosition</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-</span> iCorr, com.<span class="me1">getLength</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iPos <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iClassLen <span class="sy0">=</span> sClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span>.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iLenDiff <span class="sy0">=</span> sOldName.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-</span> iClassLen<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iNextPos<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CharacterType ctypePrev<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CharacterType ctypeNext<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>iPos <span class="sy0">=</span> sText.<span class="me1">indexOf</span><span class="br0">&#40;</span>sOldName, iPos<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>iPos <span class="sy0">&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctypePrev <span class="sy0">=</span> StringUtil.<span class="me1">getCharacterType</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span> <span class="sy0">+</span> sText.<span class="me1">charAt</span><span class="br0">&#40;</span>iPos <span class="sy0">-</span> 1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctypePrev <span class="sy0">=</span> CharacterType.<span class="me1">OnlySpecial</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iNextPos <span class="sy0">=</span> iPos <span class="sy0">+</span> sOldName.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>iNextPos <span class="sy0">&lt;=</span> sText.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctypeNext <span class="sy0">=</span> StringUtil.<span class="me1">getCharacterType</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span> <span class="sy0">+</span> sText.<span class="me1">charAt</span><span class="br0">&#40;</span>iNextPos<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctypeNext <span class="sy0">=</span> CharacterType.<span class="me1">OnlySpecial</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//don't replace word parts e.g. ContactsWorkScreen should not be replaced with Contacts</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ctypePrev <span class="sy0">==</span> CharacterType.<span class="me1">OnlySpecial</span> <span class="sy0">||</span> ctypePrev <span class="sy0">==</span> CharacterType.<span class="me1">OnlyWhitespace</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>ctypeNext <span class="sy0">==</span> CharacterType.<span class="me1">OnlySpecial</span> <span class="sy0">||</span> ctypeNext <span class="sy0">==</span> CharacterType.<span class="me1">OnlyWhitespace</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; docOrig.<span class="me1">replace</span><span class="br0">&#40;</span>com.<span class="me1">getStartPosition</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> iPos <span class="sy0">-</span> iCorr, sOldName.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, sClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iCorr <span class="sy0">+=</span> iLenDiff<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iPos <span class="sy0">+=</span> iClassLen<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iPos <span class="sy0">=</span> iNextPos<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Update</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span>docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Stores the changed source into the given file.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pFile the target file for the source<br />
&nbsp; &nbsp; &nbsp;* @throws Exception if an error occurs during saving<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> saveAs<span class="br0">&#40;</span><span class="kw3">File</span> pFile<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; apply<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; JavaSource source <span class="sy0">=</span> JavaSource.<span class="me1">get</span><span class="br0">&#40;</span>pFile.<span class="me1">getAbsolutePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>source <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">synchronized</span><span class="br0">&#40;</span>source<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileUtil.<span class="me1">save</span><span class="br0">&#40;</span>pFile, docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; source.<span class="me1">reload</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileUtil.<span class="me1">save</span><span class="br0">&#40;</span>pFile, docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Stores the changed source into the given stream.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pStream the target stream for the source<br />
&nbsp; &nbsp; &nbsp;* @throws Exception if an error occurs during saving<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> saveAs<span class="br0">&#40;</span><span class="kw3">OutputStream</span> pStream<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; apply<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; pStream.<span class="me1">write</span><span class="br0">&#40;</span>docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pStream.<span class="me1">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Returns the modified source code.<br />
&nbsp; &nbsp; &nbsp;* &nbsp;<br />
&nbsp; &nbsp; &nbsp;* @return the modified source code<br />
&nbsp; &nbsp; &nbsp;* @throws Exception if the source modification fails<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">protected</span> <span class="kw3">String</span> getSource<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; apply<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p><span class="br0">&#125;</span> <span class="co1">// SimpleSourceFile</span></div>
</div>
<p>Important imports:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.AST</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.ASTParser</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.Comment</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.CompilationUnit</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.ImportDeclaration</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.MethodDeclaration</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.PackageDeclaration</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.SimpleName</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.SimpleType</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.TypeDeclaration</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.rewrite.ASTRewrite</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.rewrite.ListRewrite</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jface.text.Document</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.text.edits.TextEdit</span><span class="sy0">;</span></div>
</div>
<p>The class contains references to other classes like CommonUtil, FileUtil, StringUtil. These classes are included in <a href="http://sourceforge.net/projects/jvx/">JVx</a>. There are two classes (JavaSource, ClassUtil) that are not free, but you should find out how it works without these classes.</p>
<p>If you'll set a new superclass, the superclass and its import, if available, will be updated. If you'll set a new classname, all constructors will be updated.</p>
<p>And once again: The best documentation is the source code <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2012/12/03/source-code-modification-with-eclipse-ast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Swing RETRO application - MP3Tool - update</title>
		<link>https://blog.sibvisions.com/2012/03/16/swing-retro-application-mp3tool-update/</link>
		<comments>https://blog.sibvisions.com/2012/03/16/swing-retro-application-mp3tool-update/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 20:35:56 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Retro]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=1371</guid>
		<description><![CDATA[In the Swing RETRO application article, I wrote about my personal MP3Tool. When the tool was developed, the ID3v2 Tag was not very important and the cover image was not relevant. Now, every modern mp3 file has a cover or front or band image. The problem is that the "original" MP3Tool does not support images.
Because [...]]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://blog.sibvisions.com/2012/01/09/swing-retro-application/">Swing RETRO application</a> article, I wrote about my personal MP3Tool. When the tool was developed, the ID3v2 Tag was not very important and the cover image was not relevant. Now, every modern mp3 file has a cover or front or band image. The problem is that the "original" MP3Tool does not support images.</p>
<p>Because it is important for me, to change files with covers too, I decided to implement a simple image support. And during my research I found other features that are often used: Lyrics Tag and APE Tag. I have never heard about them. So I decided to implement at least delete support, for those Tags.</p>
<p>After some hours, the implementation was done. I was positive surprised about the source code quality, because the code is really old. It was amazing good.</p>
<p>The update version is available <a href="http://blog.sibvisions.com/wp-content/uploads/2012/03/mp3tool_2_2.zip">here</a> and the version is now 2.2.</p>
<p><a href="http://blog.sibvisions.com/wp-content/uploads/2012/03/id3v2_cover.png" rel="lightbox[1371]"><img src="http://blog.sibvisions.com/wp-content/uploads/2012/03/id3v2_cover-300x100.png" alt="Cover images" title="Cover images" width="300" height="100" class="aligncenter size-medium wp-image-1372" /></a></p>
<p><em>The tool is not a SIB Visions Tool.</em></p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2012/03/16/swing-retro-application-mp3tool-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Swing RETRO application</title>
		<link>https://blog.sibvisions.com/2012/01/09/swing-retro-application/</link>
		<comments>https://blog.sibvisions.com/2012/01/09/swing-retro-application/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 19:59:54 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Retro]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=1250</guid>
		<description><![CDATA[During christmas break, I checked my (very) old personal Java applications. One of the first comments was from 2001. A long time ago. I had no UI framework, no testing framework and no automatic build process. All was hand-made   I was amazed that I could read and edit the source code without problems.
One [...]]]></description>
			<content:encoded><![CDATA[<p>During christmas break, I checked my (very) old personal Java applications. One of the first comments was from 2001. A long time ago. I had no UI framework, no testing framework and no automatic build process. All was hand-made <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  I was amazed that I could read and edit the source code without problems.</p>
<p>One of my biggest and first applications, that I wrote for my personal use, was "MP3Tool". It is a tool to manage (very) large MP3 inventories, it has cool automations, supports offline edit/merge via XML, supports database loading and has command line support. It has support for ID3v1 and ID3v2. I have implemented my own library to read and write ID3 TAG infos (not complete, but works still great).</p>
<p>The tool is a "developer" tool that is not very user-friendly, but it is 11 years old and has tons of features. It was developed from a developer for a developer <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  If someone needs a Java tool for mass editing of MP3 Files - <a href='http://blog.sibvisions.com/wp-content/uploads/2012/01/mp3tool_2_1_5.zip'>here it is</a>. It is not Open Source because it was not relevant in 2001. It is Free for everyone and if someone needs the source code it should not be a problem to upload it somewhere. <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>The tool has a German and English language file. I don't know if the auto detection works but you can change the language file in the settings, via Toolbar. I have not tried it on MacOS, but used it very often with Linux. If you search documentation - I have never used one!</p>
<p>I use the tool from time to time and still love it because it just works. After 11 years, I think it is ok to share it with you.</p>
<p>To be sure - The tool is not a SIB Visions Tool - It is a retro style swing application developed long time ago <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<table align="center">
<tr>
<td><div id="attachment_1255" class="wp-caption alignnone,nomargin" style="width: 160px"><a href="http://blog.sibvisions.com/wp-content/uploads/2012/01/mp3uebersicht_eingelesen.jpg" rel="lightbox[1250]"><img src="http://blog.sibvisions.com/wp-content/uploads/2012/01/mp3uebersicht_eingelesen-150x150.jpg" alt="mp3uebersicht_eingelesen" title="mp3uebersicht_eingelesen" width="150" height="150" class="alignnone size-thumbnail wp-image-1255" /></a><p class="wp-caption-text">File overview</p></div></td>
<td> </td>
<td><div id="attachment_1257" class="wp-caption alignnone,nomargin" style="width: 160px"><a href="http://blog.sibvisions.com/wp-content/uploads/2012/01/mp3optimierung_ergebnis_mehrfach.jpg" rel="lightbox[1250]"><img src="http://blog.sibvisions.com/wp-content/uploads/2012/01/mp3optimierung_ergebnis_mehrfach-150x150.jpg" alt="mp3optimierung_ergebnis_mehrfach" title="mp3optimierung_ergebnis_mehrfach" width="150" height="150" class="alignnone size-thumbnail wp-image-1257" /></a><p class="wp-caption-text">File optimization</p></div></td>
<td> </td>
<td><div id="attachment_1260" class="wp-caption alignnone,nomargin" style="width: 160px"><a href="http://blog.sibvisions.com/wp-content/uploads/2012/01/mp3konvertierung_konvert.jpg" rel="lightbox[1250]"><img src="http://blog.sibvisions.com/wp-content/uploads/2012/01/mp3konvertierung_konvert-150x150.jpg" alt="mp3konvertierung_konvert" title="mp3konvertierung_konvert" width="150" height="150" class="alignnone size-thumbnail wp-image-1260" /></a><p class="wp-caption-text">TAG conversion</p></div></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2012/01/09/swing-retro-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JVx Kommunikation im Vergleich</title>
		<link>https://blog.sibvisions.com/2010/05/10/jvx-kommunikation-im-vergleich/</link>
		<comments>https://blog.sibvisions.com/2010/05/10/jvx-kommunikation-im-vergleich/#comments</comments>
		<pubDate>Mon, 10 May 2010 10:40:07 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=190</guid>
		<description><![CDATA[Die in JVx integrierte Kommunikation hätte durchaus potential für ein eigenständiges Open Source Projekt. Wir sind jedoch bemüht die Entwicklung immer so einfach als möglich zu halten. Das bedeutet nicht, daß in JVx alle möglichen Frameworks zusammengeführt werden und somit ein nicht überschaubares "etwas" entsteht, sondern JVx enthält alles was nötig ist um Business Anwendungen [...]]]></description>
			<content:encoded><![CDATA[<p>Die in <strong>JVx integrierte Kommunikation</strong> hätte durchaus potential für ein <strong>eigenständiges Open Source Projekt</strong>. Wir sind jedoch bemüht die Entwicklung immer so einfach als möglich zu halten. Das bedeutet nicht, daß in JVx alle möglichen Frameworks zusammengeführt werden und somit ein nicht überschaubares "etwas" entsteht, sondern JVx enthält alles was nötig ist um <strong>Business Anwendungen in einer 3 Schichten Architektur</strong> zu erstellen. Und dazu gehört nun mal <strong>eine effiziente Client/Server Kommunikation</strong>.</p>
<p>Es gibt natürlich Frameworks für die Kommunikation zwischen Client und Server, wie z.B. <a href="http://www.jboss.org/netty.html">Netty</a>. Doch unabhängig von den vielen Möglichkeiten des Frameworks ist die Bibliothek mit knapp 700KB ein großer Brocken (<em>nur für die Kommunikation!</em>). Weiters ist ein Kommunikationsframework alleine noch nicht ausreichend, denn die Objekte müssen zwischen Client und Server auch noch serialisiert bzw. deserialisiert werden.</p>
<p>Für die Serialisierung könnten wiederum vorhandene Frameworks wie z.B.: <a href="http://code.google.com/p/protobuf/">Google Protocol Buffers</a> oder <a href="http://hessian.caucho.com/">Hessian</a> eingesetzt werden. Doch die <strong>Google Protocol Buffers</strong> erfordern die Definition der zu übertragenden Objekte und ist daher für ein generisches Framework wie JVx nicht geeignet. Und Hessian unterstützt leider nicht alle Objekttypen und ist nicht out-of-the-box mit z.B. Android einsatzfähig.</p>
<p>Der in JVx integrierte Kommunikationsmechanismus erlaubt ohne weiteres die Integration von den bisher genannten Frameworks, da weder das Transportprotokoll noch die Serialisierung ausschlaggebend sind für eine Business Anwendung. Außerdem definiert JVx mit Interfaces, was die Kommunikation bieten muss. Üblicherweise ist eine eigene Implementierung durch die Ableitung von <em>AbstractSerializedConnection</em> bzw. die Implementierung von <em>ISerializer</em> rasch durchgeführt.</p>
<p>Mit dem <em>UniversalSerializer</em> wird außerdem eine Lösung bereitgestellt mit der Objekte, zwischen unterschiedlichsten Technologien, ausgetauscht werden können. Und das ohne sich Gedanken über die Konfiguration zu machen bzw. Mappings zu erstellen. Der Einsatz des <em>UniversalSerializer</em> in Verbindung mit <a href="http://www.jboss.org/netty.html">Netty</a> ist ebenfalls ohne Probleme möglich, nur um hier auf den flexiblen Einsatz der JVx Kommunikation hinzuweisen!</p>
<p>Die Kommunikation wird im Moment mit <strong>Java und .NET</strong> erfolgreich eingesetzt. Weiters funktioniert die Kommunikation auch ohne jegliche Anpassung mit <a href="http://www.android.com/">Android</a>. </p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2010/05/10/jvx-kommunikation-im-vergleich/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JVx Web User Interface</title>
		<link>https://blog.sibvisions.com/2010/04/17/jvx-web-user-interface/</link>
		<comments>https://blog.sibvisions.com/2010/04/17/jvx-web-user-interface/#comments</comments>
		<pubDate>Sat, 17 Apr 2010 10:26:18 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=152</guid>
		<description><![CDATA[Wie bereits erwähnt können mit JVx, Technologie unabhängige User Interfaces erstellt werden. Der Desktop Bereich ist mit Swing und QT im Moment gut abgedeckt. Doch wie sieht es mit einer Implementierung für HTML/Ajax aus?
Wäre doch großartig, wenn eine Applikation nicht nur als RIA (Desktop, Applet) verwendet werden kann sondern auch als klassische Web Anwendung. Die [...]]]></description>
			<content:encoded><![CDATA[<p>Wie bereits erwähnt können mit JVx, Technologie unabhängige User Interfaces erstellt werden. Der Desktop Bereich ist mit Swing und QT im Moment gut abgedeckt. Doch wie sieht es mit einer Implementierung für HTML/Ajax aus?</p>
<p>Wäre doch großartig, wenn eine Applikation nicht nur als RIA (Desktop, Applet) verwendet werden kann sondern auch als klassische Web Anwendung. Die Installation von Plugins wäre dadurch nicht mehr notwendig.</p>
<p>Unsere Entwicklungsabteilung arbeitet gerade mit Hochdruck an der <strong>WebUI Implementierung</strong> für JVx. Dabei setzen wir vor allem auf <a href="http://gwt.google.com">GWT</a> und die Komponenten Bibliothek <a href="http://www.extjs.com/products/gwt/">extGWT</a>.</p>
<p>Die Implementierung wird ebenfalls unter der Apache License, Version 2.0, veröffentlicht. Die ersten Screenshots werden wir in einem unserer nächsten Postings veröffentlichen.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2010/04/17/jvx-web-user-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Technologie unabhängige User Interfaces mit JVx</title>
		<link>https://blog.sibvisions.com/2010/04/17/jvx-webui/</link>
		<comments>https://blog.sibvisions.com/2010/04/17/jvx-webui/#comments</comments>
		<pubDate>Sat, 17 Apr 2010 08:50:39 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=139</guid>
		<description><![CDATA[Mit JVx können Technologie unabhängige User Interfaces erstellt werden. Die Implementierung für Swing ist bereits umgesetzt und in der Bibliothek enthalten. Die Implementierung für QT Jambi ist nahezu fertig und steht bereits in den Startlöchern.
Die folgenden Screenshots zeigen die Kontakte Maske aus der Showcase Anwendung. Die Anwendung wurde einmalig mit JVx in Java implementiert und [...]]]></description>
			<content:encoded><![CDATA[<p>Mit JVx können Technologie unabhängige User Interfaces erstellt werden. Die Implementierung für Swing ist bereits umgesetzt und in der Bibliothek enthalten. Die Implementierung für QT Jambi ist nahezu fertig und steht bereits in den Startlöchern.</p>
<p>Die folgenden Screenshots zeigen die Kontakte Maske aus der Showcase Anwendung. Die Anwendung wurde einmalig <strong>mit JVx in Java</strong> implementiert und wird ohne Code Änderung als Swing Applikation und als QT Applikation gestartet:</p>
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td align="center">
<div id="attachment_141" class="wp-caption nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2010/04/swing_small.jpg" rel="lightbox[139]"><img class="size-medium wp-image-141" src="http://blog.sibvisions.com/wp-content/uploads/2010/04/swing_small-300x197.jpg" alt="Swing UI Implementation" width="300" height="197" /></a><p class="wp-caption-text">Swing UI Implementierung</p></div></td>
<td style="width:10px"></td>
<td><div id="attachment_142" class="wp-caption nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2010/04/qt_small.jpg" rel="lightbox[139]"><img class="size-medium wp-image-142" src="http://blog.sibvisions.com/wp-content/uploads/2010/04/qt_small-300x197.jpg" alt="QT UI Implementierung" width="300" height="197" /></a><p class="wp-caption-text">QT UI Implementierung</p></div>
</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
</table>
<p>Der Unterschied der beiden Technologien könnte größer nicht sein, ist in unserem Beispiel aber nur an Details zu erkennen:</p>
<ul>
<li>Mit <strong>Swing</strong> ist maximal eine ToolBar pro Bereich <em>(NORD, SÜD, WEST, OST)</em> möglich.<br />
<strong>QT</strong> ermöglicht beliebig viele ToolBars.</li>
<li>Ein <strong>Swing</strong> Button hat breitere Margins als ein <strong>QT</strong> Button</li>
<li>Die Window Buttons von Internal Frames werden von <strong>QT</strong> detaillierter dargestellt</li>
<li>Die Tabellen reagieren beim Scrollen unterschiedlich</li>
</ul>
<p>Durch die Swing Implementierung kann auf die Vielzahl an vorhandenen Swing Controls zurückgegriffen werden um die Applikation an spezielle Kundenwünsche anzupassen. Mit der QT Jambi Implementierung können QT Jambi Controls von anderen Anbietern eingebunden werden.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2010/04/17/jvx-webui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
