tag:blogger.com,1999:blog-6145369415343964342024-03-14T00:08:58.549-07:00Andy's Java notesandyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.comBlogger26125tag:blogger.com,1999:blog-614536941534396434.post-46439368861279620372011-08-23T14:20:00.000-07:002011-08-23T14:23:09.844-07:00Reading Files cross jarsTo my somewhat annoyance I discovered that reading files from the current package is done with a normal FileReader but if you want to read the same file from a different jar you have to use the getResourceAsStream() method.
<br />
<br /><code>
<br />public class Read {
<br /> public static void main(String[] args) {
<br /> System.out.println(doRead());
<br /> }
<br />
<br /> public static String doRead() {
<br /> String result = "";
<br /> try {
<br /> BufferedReader fr;
<br />
<br /> InputStream inputStream = Read.class.getResourceAsStream("/data.txt");
<br /> if (inputStream != null) {
<br /> fr = new BufferedReader(new InputStreamReader(inputStream));
<br /> } else {
<br /> fr = new BufferedReader(new FileReader(new File("resources/data.txt")));
<br /> }
<br />
<br /> result = fr.readLine();
<br /> fr.close();
<br /> } catch (IOException e) {
<br /> e.printStackTrace();
<br /> }
<br /> return result;
<br /> }
<br />
<br />}
<br /></code>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-81959873105401039872011-03-15T04:48:00.001-07:002011-03-15T05:10:44.076-07:00Active MQ topics & QueuesTopics - go to all<br />Queues - go to one (usually round robin)<br /><br /><a href="http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html">Active MQ topics VS Queue</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-38012576014626699702011-02-02T06:45:00.000-08:002011-02-02T07:00:12.251-08:00SVN revert!<span style="font-weight:bold;">Tortoise:</span><br /><br /><span style="font-style:italic;">Undo changes:</span><br />Tortoise SVN -> update to revision -> select revision -> RIGHT click -> revert to this revision.<br /><br /><span style="font-style:italic;">Undo 1 change</span><br />Tortoise SVN -> Merge -> Reverse Merge (tick) -> select revision to remove<br /><br /><span style="font-weight:bold;">Command line:</span><br /><br /><a href="http://sub-subversion.blogspot.com/2009/04/rollback-change-with-reverse-merge-ii.html">Reverse Merge</a><br /><br />Situation: Trunk was good upto 497 and now its all gone wrong. To revert everything and set the HEAD back to 497 do:<br /><a href="http://stackoverflow.com/questions/1930725/svn-reverse-merge">svn merge -r HEAD:497 .</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-64848898486809013402010-12-22T06:51:00.000-08:002011-01-04T08:41:27.228-08:00Debug - Heap and memory allocationSo Java comes with these tools now:<br /><code><br />jconsole<br />jvisualvm<br /></code><br /><br />But there is also this neat little tool allowing you to look inside the heap and see how the memory is allocated<br /><code><br />jmap -heap <process id><br /></code><br /><br /><a href="http://sourceforge.net/projects/jiprof/">Free simple profiler - JIP</a><br /><br /><a href="http://stackoverflow.com/questions/163722/which-java-profiler-is-better-jprofiler-or-yourkit">'Heavy' profiling</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-65065750412503129732010-11-26T01:30:00.000-08:002010-11-26T01:34:40.804-08:00Collections and ConcurrentModificationExceptions<a href="http://www.javalobby.org/java/forums/t66529.html">Unmodifiable collections can STILL throw ConcurrentModificationExceptions</a><br /><br />Please remember this and use CopyOnWriteArrayList instead.andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-88236448676568037972010-11-23T07:32:00.000-08:002010-11-23T07:33:54.209-08:00Log4j to different filesHow to log to <span style="font-weight:bold;">different files</span> based on packages.<br /><br />Sample log4j.properties file:<br /><br /><pre><br />log4j.rootLogger=WARN,<br /><br />#Overriding log levels in certain packages:<br />log4j.logger = INFO, all<br />log4j.logger.com.drkw.swaptradesubscriber=INFO, tradeReadingFile<br />log4j.logger.com.drkw.tibco=INFO, tibcoMessages<br /><br /># For stdout use this one:<br />#log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br /><br />log4j.appender.tibcoMessages=org.apache.log4j.FileAppender<br />log4j.appender.tibcoMessages.File=C:/temp/tradeSubscriber-tibco.log<br />log4j.appender.tibcoMessages.layout=org.apache.log4j.PatternLayout<br />log4j.appender.tibcoMessages.layout.ConversionPattern=%d{ISO8601} %p %t %c - %m%n<br />log4j.appender.tibcoMessages.Append=false<br />log4j.appender.tibcoMessages.Threshold=DEBUG<br /><br />log4j.appender.tradeReadingFile=org.apache.log4j.FileAppender<br />log4j.appender.tradeReadingFile.File=C:/temp/tradeSubscriber-load.log<br />log4j.appender.tradeReadingFile.layout=org.apache.log4j.PatternLayout<br />log4j.appender.tradeReadingFile.layout.ConversionPattern=%d{ISO8601} %p %t %c - %m%n<br />log4j.appender.tradeReadingFile.Append=false<br /><br />log4j.appender.all=org.apache.log4j.FileAppender<br />log4j.appender.all.File=C:/temp/tradeSubscriber-all.log<br />log4j.appender.all.layout=org.apache.log4j.PatternLayout<br />log4j.appender.all.layout.ConversionPattern=%d{ISO8601} %p %t %c - %m%n<br />log4j.appender.all.Append=false<br /></pre>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-61311226198764197112010-10-13T06:36:00.000-07:002010-10-13T07:20:01.489-07:00Multi-threading with JMockA way to make jmock 'pause' when running a test:<br /><br /><a href="http://www.jmock.org/threading-scheduler.html">http://www.jmock.org/threading-scheduler.html</a><br /><br /><code><br /> DeterministicScheduler scheduler = new DeterministicScheduler();<br /> scheduler.tick(500, TimeUnit.MILLISECONDS);<br /></code>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-48751152072372484352010-10-07T08:07:00.000-07:002010-10-07T08:22:28.049-07:00Ant conditional on OS + Ant calling mavenHow to get the OS dependent command so we can lauch scripts.<br /><br />(windows needs to launch its scripts with a /c as the first parameter<br /><code><br />  <condition property="command" value="cmd"><br />    <os family="windows" /><br />  </condition><br />  <condition property="command" value="sh"><br />    <os family="unix" /><br />  </condition><br />  <condition property="commandParam" value="/c"><br />    <os family="windows" /><br />  </condition><br />  <condition property="commandParam" value=""><br />    <os family="unix" /><br />  </condition><br /></code><br /><br />Now you can run a maven file like this<br /><br /><code><br />  <exec executable="${command}"><br />   <arg value="mvn" /><br />   <arg value="${commandParam}" /><br />   <arg value="-f../integration/pom.xml" /><br />  </exec><br /></code>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-80011883291259820452010-10-01T07:35:00.000-07:002010-10-07T01:37:58.226-07:00Ant Conditional PropertyDefining a new Ant task with a conditional property:<br /><br />This is a way of doing 'ifs' with Ant. <br /><br /><code><br /><macrodef name="copy-and-filter"> <br />    <attribute name="sys"/> <br />    <attribute name="target"/> <br />    <attribute name="source"/> <br />    <sequential> <br />      <condition property="myProp" value="JUST1"> <br />        <equals arg1="@{sys}" arg2="MySystem"/> <br />      </condition> <br />      <condition property="myProp" value="NOT1"> <br />        <equals arg1="@{sys}" arg2="SomeOtherSystem"/> <br />      </condition> <br />      <copy tofile="@{target}" file="@{source}"> <br />        <filterset onmissingfiltersfile="ignore" recurse="true"> <br />          <filter token="replaceThis" value="${myProp}"/> <br />          <filtersfile file="myfilters/filterFile@{sys}.properties"/><br />        </filterset> <br />      </copy> <br />    </sequential> <br />  </macrodef><br /></code><br /><br />The conditional property myProp will be set depending on the values of the @sys@ attribute passed in. <br /><br />All filters in the file: filtersFile@sys@ so you can specify a different file for each sys property.andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-44874591251168663882010-09-06T05:20:00.000-07:002010-09-06T05:21:39.716-07:00Coherence<a href="http://coherence.oracle.com/display/COH35UG/Types+of+Caches+in+Coherence">Types of Coherence cache</a><br /><br />- you know you'll get that at an interview one day.andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-66052541637864860762010-08-25T03:07:00.000-07:002010-08-25T03:13:27.740-07:00SCPing multiple files with AntFirstly SCP and SSH aren't included with Ant by default. We need to get the jsch.jar and <a href="http://ant.apache.org/manual/install.html#librarydependencies">include it</a><br /><br />Please remember that wildcards dont work in Ant. We should use a fileset instead:<br /><br />Example Ant code:<br /><code><br /><scp todir="user:password@somehost:/home/somewhere"><br />  <fileset dir="src_dir"><br />    <include name="**/*.java"/><br />  </fileset><br /></scp><br /></code><br /><br />... and finally a <a href="http://ant.apache.org/manual/">lovely list of Ant Tasks</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-48985015249859101562010-08-20T02:35:00.000-07:002010-08-20T02:43:07.240-07:00Log4j reloading a properties fileHeads up for a funky log4j story:<br /><br /><a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html">PropertyConfigurator</a> has a lovely method ' configureAndWatch()' which will reload the properties file if it changes. <br /><br />However it doesn't completely reload it as <a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html#doConfigure%28java.lang.String,%20org.apache.log4j.spi.LoggerRepository%29">the existing configuration is not cleared nor reset</a>. Hence you can only change the level of existing logs and not comment out or add new package level logs.<br /><br />To fix the above and completely reload the log4j file you must add <span style="font-weight:bold;">log4j.reset=true</span> to your properties file. This will cause the old properties data to be wiped before the file is loaded. <br /><br />Sourced from the <a href="http://old.nabble.com/Changing-log4j-configuration-runtime-...-td24132540.html#a24132696">log4j mailing list</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-16910257973346005492010-07-26T02:22:00.000-07:002010-07-26T03:01:20.008-07:00How 2 read a textfile the easy wayReading in a text file should be so easy. However Java's designers went a bit nuts with the decorator pattern. Fortunately commons.IO makes life easier:<br /><br /><a href="http://commons.apache.org/io/api-release/index.html">http://commons.apache.org/io/api-release/index.html</a><br /><br />Has this lovely method:<br /><code><br />public static String readFileToString(File file)<br /></code><br /><br />also of note:<br /><code><br />public static byte[] readFileToByteArray(File file)<br />public static String readFileToString(File file, String encoding)<br /></code>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-15440763806769173512010-05-28T01:15:00.000-07:002010-05-28T01:17:47.831-07:00Screen capture sent over networkA really interesting piece of code that allows scaled snapshots of a user's screen to be sent over the network to a host pc:<br /><br /><a href="http://www.javaspecialists.eu/archive/Issue182.html">http://www.javaspecialists.eu/archive/Issue182.html</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-63875236459310418912010-04-30T10:11:00.001-07:002010-04-30T10:11:50.086-07:00Google collectionsGoogle collections overview:<br /><a href="http://blog.jayway.com/2009/10/22/google-collections/">http://blog.jayway.com/2009/10/22/google-collections/</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-27378965641411461542010-04-30T02:32:00.001-07:002010-04-30T02:37:40.159-07:00ConcurrentSetAssumping you dont want to use CopyOnWriteArraySet,<br /><br />Create a ConcurrentHashMap (faster than the above because of its striped locking) and create a set from it.<br /><br /><a href="http://java.sun.com/javase/6/docs/api/java/util/Collections.html#newSetFromMap%28java.util.Map%29">http://java.sun.com/javase/6/docs/api/java/util/Collections.html#newSetFromMap%28java.util.Map%29</a><br /><br /><code><br />public static <E> Set<E> newSetFromMap(Map<E,Boolean> map)<br /></code>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-14800962601205455322010-04-22T02:07:00.000-07:002010-04-22T02:10:36.420-07:00spring with a list in the constructorHow to pass a list into a Spring bean constructor<br />SnapshotTheWorld class expects a List as its only constructor parameter<br /><br />Sample:<br /><code><br /><bean id="snaptheWorld" class="mypackage.SnapshotTheWorld"><br /><br /> <constructor-arg><br /><br />    <list><br /><br />     <ref bean="myBean" /><br /><br />     <ref bean="myOtherBean" /><br /><br />   </list><br /><br /> </constructor-arg><br /><br /></bean><br /></code>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-20324745803573092722010-04-21T10:09:00.000-07:002010-04-21T10:12:02.002-07:00Using Spring with a static methodHere an instance of MyClass has the result of the static method 'getPlatformMBeanServer()' passed in to it's constructor.<br /><br />Sample code: <br /><br /><code><br /><bean id="registry" class="com.mypackage.MyClass"><br /><br />  <constructor-arg><br /><br />    <bean factory-method="getPlatformMBeanServer" class="java.lang.management.ManagementFactory" /><br /><br />  </constructor-arg><br /><br /></bean><br /></code>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-28600617221139684722010-02-01T07:30:00.000-08:002010-02-01T08:05:39.065-08:00Using spring to launch jettySpring can launch a webserver:<br /><a href="http://roopindersingh.com/2008/12/10/spring-and-jetty-integration/">http://roopindersingh.com/2008/12/10/spring-and-jetty-integration/</a><br /><br />edit this line and point at your own servlet:<br /><bean class="org.mortbay.jetty.servlet.DefaultServlet"/>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-14148815930532908802010-01-15T02:17:00.000-08:002010-01-15T02:21:56.260-08:00Volatile vs AtomicVolatile can gaurantee execution order and solve double checked logging problem. <br /><br />You can not use Volatile as a counter shared by multiple threads. For that you must use Atomic<br /><br />see:<br /><br /><a href="http://jeremymanson.blogspot.com/2007/08/volatile-does-not-mean-atomic.html">http://jeremymanson.blogspot.com/2007/08/volatile-does-not-mean-atomic.html</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-40434239946144625162009-12-03T10:53:00.000-08:002011-03-01T09:53:18.832-08:00Maven POMMAVEN How2:<br /><br />If you are starting a new maven project<br /><b> DO NOT COPY AN EXISTING MAVEN POM TO A NEW DIRECTORY </b><br /><br />... instead do this:<br />Go to your app directory and run:<br /><code><br />mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false<br /></code><br /><a href="http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html">maven getting started guide</a><br /><br /><hr/><br /><br />Then fix the annoying <a href="http://maven.40175.n5.nabble.com/JUnit-test-compilation-problems-td99342.html">'maven assumes you use JDK 1.3 issue' </a><br /><br /><code><br /><build><br /><br />    <plugins><br /><br />      <plugin><br /><br />        <groupId>org.apache.maven.plugins</groupId> <br /><br />        <artifactId>maven-compiler-plugin</artifactId><br /><br />        <configuration><br /><br />          <source>1.6</source><br /><br />          <target>1.6</target><br /><br />        </configuration><br /><br />      </plugin><br /><br />    </plugins><br /><br />  </build><br /></code><br /><br />..... and thanks to Stack Overflow for showing how to <a href="http://stackoverflow.com/questions/1399240/how-do-i-get-my-maven-integration-tests-to-run">split your unit tests </a>from your integration tests.andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-48740493858738834732009-08-20T09:34:00.001-07:002009-12-03T11:09:16.595-08:00A sample ant build file<code><br /><project name="experiment" default="full-build"><br />    <br />    <property name="junit.dir" location=""/><br />    <property name="src.dir" value="src" /><br />    <property name="lib.dir" value="lib"/><br />    <property name="build.dir" location="build"/><br />    <br />    <property name="build.test.classes.dir" location="${build.dir}/test/classes"/><br />    <property name="build.test.output.dir" location="${build.dir}/test/output"/><br />    <property name="src.unit-test.dir" location="test.src"/><br />    <br />    <path id="build-classpath"><br />        <fileset dir="${lib.dir}" includes="*.jar" /><br />    </path><br />    <br />    <path id="test-classpath"><br />        <fileset dir="${lib.dir}" includes="*.jar" /><br />        <path location="${build.dir}"/><br />        <path location="${build.test.classes.dir}"/><br />    </path><br />    <br />    <target name="full-build" depends="clean, init, compile-main, test" /><br />    <br />    <target name="clean"><br />        <delete dir="${build.dir}"/><br />    </target><br />    <br />    <target name="init"><br />        <mkdir dir="${build.dir}"/><br />        <mkdir dir="${build.test.classes.dir}"/><br />        <mkdir dir="${build.test.output.dir}"/><br />    </target><br />    <br />    <target name="compile-main" depends="init"><br />        <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="build-classpath" /><br />    <br />    <mkdir dir="${project.build.outputDirectory}/..datastore" /><br />    <copy todir="${project.build.outputDirectory}/../config"><br />        <fileset dir="config" /><br />    </copy><br /></target><br />    <br />    <target name="test" depends="compile-test"><br />        <junit printsummary="yes" failureproperty="test.fail" fork="true"  haltonfailure="yes" dir="${junit.dir}"><br />            <classpath refid="test-classpath"/><br />            <formatter type="xml"/><br />            <batchtest fork="yes" todir="${build.test.output.dir}"><br />                <fileset dir="${src.unit-test.dir}"><br />                    <include name="**/*Test.java"/><br />                </fileset><br />            </batchtest><br />        </junit><br />    </target><br />    <br />    <target name="compile-test" depends="compile-main"><br />        <javac srcdir="${src.unit-test.dir}" destdir="${build.test.classes.dir}" classpathref="test-classpath" /><br />    </target><br /><br /></project><br /><br /></code>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com1tag:blogger.com,1999:blog-614536941534396434.post-35844403619224338942009-08-12T03:08:00.000-07:002009-08-12T03:10:26.321-07:00Escaping Strings:Escaping Strings:<br /><a href="http://commons.apache.org/lang/apidocs/org/apache/commons/lang/StringEscapeUtils.html">http://commons.apache.org/lang/apidocs/org/apache/commons/lang/StringEscapeUtils.html</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-75241730372250974542009-07-24T06:31:00.000-07:002010-02-05T10:36:52.433-08:00Exception StackTrace to StringHow many times have I forgotten this:<br /><pre><br /> StringWriter sw = new StringWriter();<br /> PrintWriter pw = new PrintWriter(sw);<br /> e.printStackTrace(pw);<br /> String result = sw.toString();<br /></pre><br /><br />While we are at it: InputStream to String:<br /><pre><br /> final StringWriter writer = new StringWriter();<br /> IOUtils.copy(urlConnection.getInputStream(), writer);<br /> result = writer.toString();<br /></pre><br /><a href="http://stackoverflow.com/questions/309424/in-java-how-do-a-read-an-input-stream-in-to-a-string">http://stackoverflow.com/questions/309424/in-java-how-do-a-read-an-input-stream-in-to-a-string</a>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0tag:blogger.com,1999:blog-614536941534396434.post-51513557808437314922009-07-16T09:21:00.000-07:002009-07-16T09:24:49.845-07:00Creating a Document Object from XMLReading first from a String containing xml <br />Reading secondly from a file containing xml <br /><br /><pre><br />public Document loadXmlFromString(final String xml) throws Exception {<br /> DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();<br /> factory.setNamespaceAware(true);<br /> DocumentBuilder builder = factory.newDocumentBuilder();<br /> return builder.parse(new ByteArrayInputStream(xml.getBytes()));<br />}<br /><br />private Document loadXmlFromFile(final String fileLocation) throws Exception {<br /> Document doc = null;<br /> DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();<br /> factory.setNamespaceAware(true); // never forget this!<br /> DocumentBuilder builder = factory.newDocumentBuilder();<br /> doc = builder.parse(fileLocation);<br />}<br /></pre>andyhttp://www.blogger.com/profile/08921286377175955589noreply@blogger.com0