<?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>Mischiefblog &#187; Java</title>
	<atom:link href="http://www.mischiefblog.com/?feed=rss2&#038;cat=10" rel="self" type="application/rss+xml" />
	<link>http://www.mischiefblog.com</link>
	<description>I WATN 2 MAEK GAEM!</description>
	<lastBuildDate>Fri, 03 Sep 2010 19:17:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Plug-in architectures in Java</title>
		<link>http://www.mischiefblog.com/?p=886</link>
		<comments>http://www.mischiefblog.com/?p=886#comments</comments>
		<pubDate>Mon, 15 Mar 2010 00:56:29 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=886</guid>
		<description><![CDATA[An off-hand discussion at work (&#8220;This application is being used by more groups now . . . wouldn&#8217;t it be cool to make it so they can develop independently?&#8221;) led to me looking into Java classloaders this weekend. Here&#8217;s the core for an application that&#8217;s treated like a bus in that it looks to see [...]]]></description>
			<content:encoded><![CDATA[<p>An off-hand discussion at work (&#8220;This application is being used by more groups now . . . wouldn&#8217;t it be cool to make it so they can develop independently?&#8221;) led to me looking into Java classloaders this weekend.  Here&#8217;s the core for an application that&#8217;s treated like a bus in that it looks to see what&#8217;s plugged into it and provides communications (context) to each plug-in.<br />
<span id="more-886"></span><br />
<code><br />
<!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = -->
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">audit</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;get&nbsp;the&nbsp;plugin&nbsp;JARs</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">File&nbsp;basedir&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">File</font><font color="#000000">(</font><font color="#000000">System.getProperty</font><font color="#000000">(</font><font color="#2a00ff">&#34;user.dir&#34;</font><font color="#000000">)&nbsp;</font><font color="#000000">+&nbsp;File.separator&nbsp;+&nbsp;</font><font color="#2a00ff">&#34;dynamic&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.err.println</font><font color="#000000">(</font><font color="#2a00ff">&#34;Searching&nbsp;&#34;&nbsp;</font><font color="#000000">+&nbsp;basedir&nbsp;+&nbsp;</font><font color="#2a00ff">&#34;&nbsp;for&nbsp;pluggable&nbsp;JARs&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">basedir.isDirectory</font><font color="#000000">()&nbsp;</font><font color="#000000">&amp;&amp;&nbsp;basedir.canRead</font><font color="#000000">())&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;get&nbsp;a&nbsp;list&nbsp;of&nbsp;jar&nbsp;files</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">String&nbsp;</font><font color="#000000">[]&nbsp;</font><font color="#000000">jars&nbsp;=&nbsp;basedir.list</font><font color="#000000">(</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">FilenameFilter</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>boolean&nbsp;</b></font><font color="#000000">accept</font><font color="#000000">(</font><font color="#000000">File&nbsp;file,&nbsp;String&nbsp;s</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>return&nbsp;</b></font><font color="#000000">s.endsWith</font><font color="#000000">(</font><font color="#2a00ff">&#34;.jar&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">})</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">URL&nbsp;</font><font color="#000000">[]&nbsp;</font><font color="#000000">urlJars&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">URL</font><font color="#000000">[</font><font color="#000000">jars.length</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">List&lt;String&gt;&nbsp;initializers&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">ArrayList&lt;String&gt;</font><font color="#000000">(</font><font color="#000000">jars.length</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for&nbsp;</b></font><font color="#000000">(</font><font color="#000000">String&nbsp;jar&nbsp;:&nbsp;jars</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">String&nbsp;jarpath&nbsp;=&nbsp;basedir.getAbsolutePath</font><font color="#000000">()&nbsp;</font><font color="#000000">+&nbsp;File.separator&nbsp;+&nbsp;jar;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;get&nbsp;the&nbsp;plug-in&nbsp;entry&nbsp;point&nbsp;from&nbsp;the&nbsp;jar</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">File&nbsp;jarfile&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">File</font><font color="#000000">(</font><font color="#000000">jarpath</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">jarfile.canRead</font><font color="#000000">())&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;read&nbsp;the&nbsp;pluggable&nbsp;manifest</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">JarFile&nbsp;jf&nbsp;=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">jf&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">JarFile</font><font color="#000000">(</font><font color="#000000">jarpath</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">JarEntry&nbsp;entry&nbsp;=&nbsp;jf.getJarEntry</font><font color="#000000">(</font><font color="#2a00ff">&#34;pluggable.txt&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">entry&nbsp;!=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;</font><font color="#3f7f5f">//&nbsp;manifest&nbsp;file&nbsp;found</font><br />
<font color="#ffffff">&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;</font><font color="#000000">BufferedInputStream&nbsp;bis&nbsp;=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br />
<font color="#ffffff">&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;</font><font color="#000000">String&nbsp;plugin&nbsp;=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&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;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">bis&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">BufferedInputStream</font><font color="#000000">(</font><font color="#000000">jf.getInputStream</font><font color="#000000">(</font><font color="#000000">jf.getEntry</font><font color="#000000">(</font><font color="#2a00ff">&#34;pluggable.txt&#34;</font><font color="#000000">)))</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;todo&nbsp;should&nbsp;make&nbsp;sure&nbsp;bytes&nbsp;are&nbsp;available...</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>byte&nbsp;</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">inBuf&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#990000">1024</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;should&nbsp;be&nbsp;short:&nbsp;&nbsp;one&nbsp;line,&nbsp;pointing&nbsp;to&nbsp;a&nbsp;single&nbsp;class</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">bis.read</font><font color="#000000">(</font><font color="#000000">inBuf</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;todo&nbsp;validate&nbsp;plug-in&nbsp;class</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">plugin&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">String</font><font color="#000000">(</font><font color="#000000">inBuf</font><font color="#000000">)</font><font color="#000000">.trim</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">plugin.length</font><font color="#000000">()&nbsp;</font><font color="#000000">&lt;&nbsp;</font><font color="#990000">1</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.err.println</font><font color="#000000">(</font><font color="#2a00ff">&#34;Plug-in&nbsp;class&nbsp;name&nbsp;not&nbsp;found&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">plugin&nbsp;=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>else&nbsp;if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">initializers.contains</font><font color="#000000">(</font><font color="#000000">plugin</font><font color="#000000">))&nbsp;{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.err.println</font><font color="#000000">(</font><font color="#2a00ff">&#34;Duplicate&nbsp;plug-in&nbsp;class&nbsp;name&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">plugin&nbsp;=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&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;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">IOException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;couldn't&nbsp;open&nbsp;plug-in&nbsp;manifest</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>finally&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">bis&nbsp;!=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">bis.close</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">IOException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;do&nbsp;nothing</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&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;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&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;</font><font color="#3f7f5f">//&nbsp;only&nbsp;use&nbsp;the&nbsp;jar&nbsp;if&nbsp;the&nbsp;plug-in&nbsp;has&nbsp;a&nbsp;manifest&nbsp;class</font><br />
<font color="#ffffff">&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;</font><font color="#7f0055"><b>if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">plugin&nbsp;!=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">urlJars</font><font color="#000000">[</font><font color="#000000">i++</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">URL</font><font color="#000000">(</font><font color="#2a00ff">&#34;file:///&#34;&nbsp;</font><font color="#000000">+&nbsp;jarpath</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">initializers.add</font><font color="#000000">(</font><font color="#000000">plugin</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">MalformedURLException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&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;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">IOException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;couldn't&nbsp;open&nbsp;jar&nbsp;file</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>finally&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if&nbsp;</b></font><font color="#000000">(</font><font color="#000000">jf&nbsp;!=&nbsp;</font><font color="#7f0055"><b>null</b></font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">jf.close</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&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;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">IOException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&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;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;do&nbsp;nothing</font><br />
<font color="#ffffff">&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;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;load&nbsp;the&nbsp;pluggables</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ClassLoader&nbsp;loader&nbsp;=&nbsp;URLClassLoader.newInstance</font><font color="#000000">(</font><font color="#000000">urlJars</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;load&nbsp;each&nbsp;pluggable&nbsp;initializer</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for&nbsp;</b></font><font color="#000000">(</font><font color="#000000">String&nbsp;pluggableClass&nbsp;:&nbsp;initializers</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;load&nbsp;the&nbsp;pluggable&nbsp;class</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Class&nbsp;clz&nbsp;=&nbsp;loader.loadClass</font><font color="#000000">(</font><font color="#000000">pluggableClass</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Pluggable&nbsp;pluggable&nbsp;=&nbsp;</font><font color="#000000">(</font><font color="#000000">Pluggable</font><font color="#000000">)</font><font color="#000000">clz.newInstance</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;initialize&nbsp;the&nbsp;plug-in</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Method&nbsp;method&nbsp;=&nbsp;clz.getMethod</font><font color="#000000">(</font><font color="#2a00ff">&#34;initializePlugin&#34;</font><font color="#000000">,&nbsp;PluggableContext.</font><font color="#7f0055"><b>class</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">method.invoke</font><font color="#000000">(</font><font color="#000000">pluggable,&nbsp;context</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">ClassNotFoundException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">NoSuchMethodException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">InstantiationException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">IllegalAccessException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><b>catch&nbsp;</b></font><font color="#000000">(</font><font color="#000000">InvocationTargetException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
<p>  <!-- start Java2Html link --></p>
<tr>
<td align="right">
<small><br />
<a href="http://www.java2html.de" target="_blank">Java2html</a><br />
</small>
    </td>
</tr>
<p>  <!-- end Java2Html link --><br />
</table>
</div>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=886</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Signature of a Java service</title>
		<link>http://www.mischiefblog.com/?p=861</link>
		<comments>http://www.mischiefblog.com/?p=861#comments</comments>
		<pubDate>Wed, 28 Oct 2009 15:37:52 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=861</guid>
		<description><![CDATA[I&#8217;ve dealt with Java services at Amazon too long when I can spot one by the CPU/memory signature. This is pretty typical of a long-running service garbage collecting with old generation objects. Note the CPU utilization as the VM removes old generation objects and subsequent drop in memory utilization.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve dealt with Java services at Amazon too long when I can spot one by the CPU/memory signature.<br />
<div id="attachment_862" class="wp-caption aligncenter" style="width: 446px"><img src="http://www.mischiefblog.com/uploads/2009/10/java_service.png" alt="The classic signature of a long-running Java service" title="Java service CPU/memory signature" width="436" height="233" class="size-full wp-image-862" /><p class="wp-caption-text">The classic signature of a long-running Java service</p></div><br />
This is pretty typical of a long-running service garbage collecting with old generation objects.  Note the CPU utilization as the VM removes old generation objects and subsequent drop in memory utilization.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=861</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cache eviction</title>
		<link>http://www.mischiefblog.com/?p=737</link>
		<comments>http://www.mischiefblog.com/?p=737#comments</comments>
		<pubDate>Sat, 26 Jul 2008 00:09:52 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=737</guid>
		<description><![CDATA[B: size of the buffer K: number of items having distinct access probabilities LRU eviction: O(KB) FIFO eviction: O(K) Unless it costs a lot more to load an object into the cache, FIFO eviction may make the most sense. In most LRU implementations I&#8217;ve written, the cost to maintain the &#8220;use&#8221; status of the cached [...]]]></description>
			<content:encoded><![CDATA[<p>B: size of the buffer<br />
K: number of items having distinct access probabilities</p>
<p>LRU eviction:  O(KB)<br />
FIFO eviction:  O(K)</p>
<p>Unless it costs a lot more to load an object into the cache, FIFO eviction may make the most sense.  In most LRU implementations I&#8217;ve written, the cost to maintain the &#8220;use&#8221; status of the cached object was more expensive than a cache miss because of the object had been evicted.  Consider the cost of loading the object versus the SLA for the service.  Also, if the cache objects retrieved tend to be clustered very strongly with few if any changes, the cached objects won&#8217;t be evicted from the cache very often.  A FIFO strategy only loses in the case of a full cache where rarely used objects are occasionally inserted and frequently used objects are evicted and reloaded.</p>
<hr />
<p>The JVM garbage collector is generally less efficient with larger heap sizes.  Heaps over 1 GB with efficient garbage collection is possible if the JVM is properly tuned.  Concurrent Mark and Sweep collector may be buggy in very large heaps&#8211;tiny JDK 6+ JVMs in federation worked okay.  Cache growth should be limited (especially with hashmap caches).  The number of long living objects is a problem moreso than the size of those objects, so consider serializing/deserializing the objects to byte arrays (the JVM is optimized around short-lived object garbage collection and the cost of young generation garbage collection is proportionally lower than older generation garbage collection).</p>
<p><a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html" target="_blank">Tuning JVM Garbage Collection JDK 5.0</a></p>
<p><a href="http://jakarta.apache.org/jcs/JCSvsEHCache.html" target="_blank">JCS vs Ehcache metrics</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=737</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CombatSim-0.3.0</title>
		<link>http://www.mischiefblog.com/?p=662</link>
		<comments>http://www.mischiefblog.com/?p=662#comments</comments>
		<pubDate>Fri, 22 Jun 2007 22:41:20 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Design Journal]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=662</guid>
		<description><![CDATA[CombatSim version 0.3.0 is now available. This is still considered alpha quality, although it has undergone some testing. Download CombatSim-0.3.0.zip now! Changes: Various logic fixes Actors are now internally stored as a dynamic data structure, so future versions will allow the user to specify complex arrangements, including friends or allies Actors have a very basic [...]]]></description>
			<content:encoded><![CDATA[<p>CombatSim version 0.3.0 is now available.  This is still considered alpha quality, although it has undergone some testing.</p>
<p><a href="http://www.mischiefblog.com/uploads/CombatSim-0.3.0.zip" alt="Download now!">Download CombatSim-0.3.0.zip now!</a></p>
<p><b>Changes:</b>
<ul>
<li>Various logic fixes</li>
<li>Actors are now internally stored as a dynamic data structure, so future versions will allow the user to specify complex arrangements, including friends or allies</li>
<li>Actors have a very basic aggro mechanism for determining who to attach and when</li>
<li>The combat core is now invoked externally and does not require a separate thread or real time clock; callers specify what time the core is invoked, so attacks in the past or using an accelerated clock can be run</li>
<li>A basic metrics system (including sums and histogram data) is integrated to the combat core and simulator for reporting</li>
<li>Reporting is dynamic for the number of actors, including graphical, table, and CSV reports</li>
<li>Problems with excessively long combat rounds in random actor testing have mostly been resolved:  actors could have unrealistic or out of balance stats which caused cases of exceptionally high hit points coupled with very low damage or change to hit</li>
<li>Random combat order for actors can&#8217;t be overridden at this time</li>
<li>Combat rounds may not exceed 5000; the metrics take up too much room in the Java heap and can cause an out of memory error (I didn&#8217;t increase heap size in the launcher script)</li>
</ul>
<p><b>Instructions for use:</b>
<ol>
<li>If you&#8217;ve been using an old version of CombatSim, remove your combatsim.settings file</li>
<li><a href="http://www.mischiefblog.com/uploads/CombatSim-0.3.0.zip" alt="Download now!">Download CombatSim-0.3.0.zip</a></li>
<li>Unzip CombatSim-0.3.0.zip</li>
<li>On a Windows box, double-click CS.bat; on a Linux or OS X box, execute ./CombatSim-0.3.0/CS.sh; on an OS X box, double-click CS.sh</li>
<li>Press the &#8220;Fight!&#8221; button to simulate combat</li>
</ol>
<p>I think I&#8217;ve spent around 40 or 50 hours on the iterations of this simulator.  The end is in sight:
<ul>
<li>Change the UI to allow the user to edit arbitrary numbers of actors</li>
<li>Change the UI and default actor load to include more than one skill</li>
<li>Implement the method on the actor to choose the appropriate skill in combat</li>
<li>Add Focus as an attribute to the actor to guide skill use</li>
<li>Consider how to allow new combat rules to be plugged-in without recompiling the program</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=662</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CombatSim-0.1.0</title>
		<link>http://www.mischiefblog.com/?p=652</link>
		<comments>http://www.mischiefblog.com/?p=652#comments</comments>
		<pubDate>Thu, 07 Jun 2007 16:39:30 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Design Journal]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=652</guid>
		<description><![CDATA[CombatSim-0.1.0 is a bug-fixed re-release of 0.0.3. Elapsed combat time calculations are correct, as is effective DPS calculation. The code has been refactored (since 0.0.2) to facilitate reuse in a real game, albeit a trivial one given the state of the combat core, and the overall sim is ready for the next set of enhancements, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mischiefblog.com/uploads/CombatSim-0.1.0.zip">CombatSim-0.1.0</a> is a bug-fixed re-release of 0.0.3.  Elapsed combat time calculations are correct, as is effective DPS calculation.  The code has been refactored (since 0.0.2) to facilitate reuse in a real game, albeit a trivial one given the state of the combat core, and the overall sim is ready for the next set of enhancements, including <i>n</i>-attackers and multiple combat skill use.  Later, I&#8217;d like to add the capability to define your own combat rules (within the data structures the sim provides).</p>
<p>Between 0.0.2 and 0.0.3, the format of the combatsim.settings file changed slightly and the old version is no longer completely compatible (two fields were added).  As this is not an alpha quality application, I didn&#8217;t see the need to back-down to the prior version of the settings file and transparently upgrade it.</p>
<p>Overall, I believe that with the recent reexamination of the code, the new metrics classes, and iterative development, this is the most accurate and useful version of CombatSim yet.  You&#8217;ll need the Java 5 or Java 6 runtime (JRE or JDK) and this version has been tested against Win32 and Linux.<br />
<a href='http://www.mischiefblog.com/uploads/2007/06/snapshot2.png' target="_blank"'><img src='http://www.mischiefblog.com/uploads/2007/06/snapshot2.thumbnail.png' alt='CombatSim-0.1.0 on Linux' /></a><br />
One last word:  this combat engine is the most primitive version of the engine I plan on using in my next development project.</p>
<div style="margin-left: 75px;"><a href="http://www.mischiefblog.com/uploads/CombatSim-0.1.0.zip">Download CombatSim-0.1.0.zip</a></div>
<div style="margin-left: 75px;"><a href="http://www.mischiefblog.com/uploads/CombatSim-0.1.0.tar.gz">Download CombatSim-0.1.0.tar.gz</a><span></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=652</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CombatSim 0.0.3</title>
		<link>http://www.mischiefblog.com/?p=650</link>
		<comments>http://www.mischiefblog.com/?p=650#comments</comments>
		<pubDate>Wed, 06 Jun 2007 01:19:39 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Design Journal]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=650</guid>
		<description><![CDATA[A new (buggy) version of CombatSim. This one has some combat tuning problems (specifically when actors are very imbalanced in stats) and doesn&#8217;t as strongly check for bad rounds (combats that take too many rounds). Consider this an intermediate version with heavy refactoring (all for the best in the end) and many improvements in the [...]]]></description>
			<content:encoded><![CDATA[<p>A new (buggy) version of CombatSim.  This one has some combat tuning problems (specifically when actors are very imbalanced in stats) and doesn&#8217;t as strongly check for bad rounds (combats that take too many rounds).</p>
<p>Consider this an intermediate version with heavy refactoring (all for the best in the end) and many improvements in the API and code quality.  It&#8217;s still very buggy, though.</p>
<p><a href="http://www.mischiefblog.com/uploads/CombatSim-0.0.3.zip">CombatSim-0.0.3.zip</a></p>
<p>As before, this is a Win32 only release (I didn&#8217;t update the shell script).  Install a recent version of Java 5 or Java 6 (JDK or JRE 1.5 or 1.6) and double click on CS.bat to start CombatSim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=650</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CombatSim 0.0.2</title>
		<link>http://www.mischiefblog.com/?p=637</link>
		<comments>http://www.mischiefblog.com/?p=637#comments</comments>
		<pubDate>Fri, 25 May 2007 06:26:34 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Design Journal]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=637</guid>
		<description><![CDATA[Written on buses and during the occasional evening, CombatSim 0.0.2 is ready for your use. It requires Java JRE 5.0 or higher and must be uncompressed into a folder before it can be used. CombatSim can be started by either double-clicking the batch file, or from the command line with (roughly): [Win32]&#160;&#160;&#160;&#160;C:\CombatSim-0.0.2> CS This version [...]]]></description>
			<content:encoded><![CDATA[<p>Written on buses and during the occasional evening, CombatSim 0.0.2 is ready for your use.  It requires Java JRE 5.0 or higher and must be uncompressed into a folder before it can be used.  CombatSim can be started by either double-clicking the batch file, or from the command line with (roughly):<br />
<code><br />
<b>[Win32]</b>&nbsp;&nbsp;&nbsp;&nbsp;C:\CombatSim-0.0.2> CS<br />
</code><br />
This version adds histogram support, writing CSV files of the results, and saving settings between runs.  It is in no way completely tested, so consider it of alpha release quality.</p>
<p><a href="http://www.mischiefblog.com/uploads/CombatSim-0.0.2.zip">Download CombatSim-0.0.2.zip here</a> (3.4 MB).</p>
<p>This is a much bigger download than version 0.0.1 because of the chart library used.  It&#8217;s late and the shell interpreter on OS X is pwning my startup script, so don&#8217;t count on CS.sh working.  It tested fine on Cygwin but is very unhappy on my PowerBook.</p>
<p>Feel free to post any questions as comments or contact me via email.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=637</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CombatSim update:  CSV files</title>
		<link>http://www.mischiefblog.com/?p=633</link>
		<comments>http://www.mischiefblog.com/?p=633#comments</comments>
		<pubDate>Fri, 18 May 2007 22:41:44 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Design Journal]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=633</guid>
		<description><![CDATA[The development version of CombatSim writes CSV files. It&#8217;s not terribly particular about where it puts them, but it tries not to clobber data. At this time, it generates: a summary CSV using the data from the table many histogram CSV files, one per combatant per histogram type (all of Arnold&#8217;s hits, for instance, are [...]]]></description>
			<content:encoded><![CDATA[<p>The development version of CombatSim writes CSV files.  It&#8217;s not terribly particular about where it puts them, but it tries not to clobber data.  At this time, it generates:
<ul>
<li>a summary CSV using the data from the table</li>
<li>many histogram CSV files, one per combatant per histogram type (all of Arnold&#8217;s hits, for instance, are in one CSV file)</li>
</ul>
<p>The CSV output files append new rows to the end by default.  To merge multiple histograms into one spreadsheet or CSV file will require scripting (aka, I&#8217;m too lazy to do the work for you) as each histogram has a separate set of buckets and is spread across two rows.  Hence, when writing histogram data of a particular actor, I need to record two rows, one for the buckets and one for the values in the buckets.  I use IDs (common to each execution of CombatSim and unique to that run) so that rows can be pasted back together if you want to perform additional analysis.</p>
<p>At this time, all combat sim data is written to the working directory.  I&#8217;ll change that before the next release so that the user can specify the base file name and path.</p>
<p>Coming up next, storing configuration settings and default values.  Once that&#8217;s complete, I&#8217;ll release a new version of the sim to the world and start work on arbitrary numbers of combatants and multiple attack skills or types.  (Did you ever want to model a raid against a dragon or another boss mob?  You should be able to with an upcoming version.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=633</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Log4J lesson learned:  working around a greedy logger</title>
		<link>http://www.mischiefblog.com/?p=614</link>
		<comments>http://www.mischiefblog.com/?p=614#comments</comments>
		<pubDate>Mon, 14 May 2007 23:13:58 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=614</guid>
		<description><![CDATA[Use Case: divert specific log messages while capturing all other log messages. Errors that happen because of a bad RSS feed or connection problem should go to a specific log, while program errors should continue to go to the existing log files. Simple Solution: create a new logger and write feed errors to that logger. [...]]]></description>
			<content:encoded><![CDATA[<p><b>Use Case:</b>  divert specific log messages while capturing all other log messages.  Errors that happen because of a bad RSS feed or connection problem should go to a specific log, while program errors should continue to go to the existing log files.</p>
<p><b>Simple Solution:</b>  create a new logger and write feed errors to that logger.</p>
<p><b>Other Solution:</b>  when you can&#8217;t create a new logger, create a wrapper around Log4J to log messages to a specific log file, with changes to the log4j.properties file.</p>
<p><b>Notes:</b><br />
In the hierarchy of <code>com.company.reader.feed</code>, a logger is defined as <code>com.company.reader.feed.FeedLog</code> which lightly wraps Log4J logging methods.  This FeedLog will need to be excluded from the parent logger(s) that already log its hierarchy, and will need to point to a different logging destination (file or database table).<br />
<span id="more-614"></span><br />
<b>log4j.properties</b><br />
<code><br />
# assuming the rootCategory logger is already configured...<br />
# everything RSS related we want to see in the logs<br />
log4j.logger.com.company.reader.feed=(DEBUG)<br />
&nbsp;<br />
# set up FeedLog logging to capture parser errors<br />
log4j.logger.com.company.reader.feed.FeedLog=(DEBUG, parserFile)<br />
log4j.additivity.com.company.reader.feed.FeedLog=false<br />
log4j.appender.parserFile=org.apache.log4j.FileAppender<br />
log4j.appender.File=feed_parser.log<br />
log4j.appender.parserFile.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.parser.layout.ConversionPattern=%d [%-5p] %c - %m%n<br />
</code></p>
<p><code>additivity</code> indicates if messages from this category (package and class) will be forwarded to parent loggers.</p>
<p><b>FeedLog.java</b>  <i>(partial implementation)</i><br />
<code><br />
public class FeedLog {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private static Logger logger = LogManager.getLogger(FeedLog.class);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void debug(String message, Throwable t) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (message != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(via() + message, t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug(t);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private static String via() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// this is an expensive operation--it stops the VM momentarily<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// to handle the exception and get the stack trace<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StackTraceElement [] ste = e.getStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ste != null &#038;&#038; ste.length >= 3 &#038;&#038;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!ste[2].isNativeMethod()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "(From " + ste[2].getClassName() + "." +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ste[2].getMethodName() + ":" +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ste[2].getLineNumber() + ") ";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "(From native code) ";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=614</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CombatSim todo</title>
		<link>http://www.mischiefblog.com/?p=613</link>
		<comments>http://www.mischiefblog.com/?p=613#comments</comments>
		<pubDate>Mon, 14 May 2007 05:02:14 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Design Journal]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.mischiefblog.com/?p=613</guid>
		<description><![CDATA[If you haven&#8217;t tried out my CombatSim statistics generating program alpha release, feel free to download it an give it a try. All the source is inside the JAR. Todo: Allow each divisor for a stat/attribute or skill to be stated as a linear function (as it is today), geometric, exponential, or logarithmic value. Collect [...]]]></description>
			<content:encoded><![CDATA[<p>If you haven&#8217;t tried out my <a href="http://www.mischiefblog.com/?p=608" target="_blank">CombatSim statistics generating program</a> alpha release, feel free to download it an give it a try.  All the source is inside the JAR.</p>
<p>Todo:
<ul>
<li>Allow each divisor for a stat/attribute or skill to be stated as a linear function (as it is today), geometric, exponential, or logarithmic value.</li>
<li>Collect histogram data for each weapon swing, damage done, etc.  Do this by allocating an array (or list backed by an array) where each integer value amount is in the index into the count.  Graph those values.</li>
<li>Allow entry of a seed value in the random number generator so combat results can be regnerated.  Include the seed in the combat results.</li>
<li>Use a Mersenne Twister instead of java.math.Random generator to guarantee equivalent results given the same seed between versions and platforms of the API.</li>
<li>Write log entries to disk.</li>
<li>Allow the users to tag and save runtime configurations.</li>
<li>Allow the user to add or remove parts of the combat (such as disabling dodge).</li>
<li>Add new combat defenses (such as parry and block).</li>
<li>Support more than one attack type.</li>
<li>Assign attack types to each attacker.</li>
<li>Give each attacker attack type selection logic.</li>
<li>Support more than two attackers and support target selection logic (and designation).</li>
<li>Refactor the combat logic to include genericized metrics collection (rather than specific to the Combat Sim class).</li>
</ul>
<p>It&#8217;s a hell of a lot to go through for a combat simulator, but in the end I should be able to calculate combat results that would be similar to what could be expected in a completed multiplayer game.  Additionally, the creation of target and attack selection logic, much like the core of the combat simulator, should be portable to the real game and will result in a savings in development and testing time later.  It would be nice to essentially be able to drop combat logic into the game and know that it will generate the results I expect.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mischiefblog.com/?feed=rss2&amp;p=613</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
