<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7016298996370927058</id><updated>2011-04-21T12:17:53.058-07:00</updated><title type='text'>Condensed Java</title><subtitle type='html'>Simple, concise Java examples that do useful things.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://condensedjava.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://condensedjava.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Taylor</name><uri>http://www.blogger.com/profile/12814369929329235023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7016298996370927058.post-9154235949554078105</id><published>2006-11-23T07:19:00.000-08:00</published><updated>2006-11-23T07:26:53.661-08:00</updated><title type='text'>Starting a worker thread in a Servlet Engine</title><content type='html'>Today's example shows how to create a background thread when your servlet context starts up, and how to end the thread's activities gracefully when the servlet context is destroyed. Take this example and add it as a "listener" in your web application, then using the Tomcat (or equivalent) &lt;a href="http://localhost:8080/manager/html"&gt;manager&lt;/a&gt; start and stop the context and watch the stdout messages.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;import javax.servlet.ServletContextEvent;&lt;br /&gt;import javax.servlet.ServletContextListener;&lt;br /&gt;public class Deamon implements ServletContextListener, Runnable {&lt;br /&gt;&lt;br /&gt;   private Thread t;&lt;br /&gt;&lt;br /&gt;   public void contextDestroyed(ServletContextEvent arg0) {&lt;br /&gt;      t.interrupt();}&lt;br /&gt;&lt;br /&gt;   public void contextInitialized(ServletContextEvent context) {&lt;br /&gt;      t = new Thread(this);&lt;br /&gt;      t.start();&lt;br /&gt;      System.out.println("deamon started");}&lt;br /&gt;&lt;br /&gt;   public void run() {&lt;br /&gt;      try {&lt;br /&gt;         while (true) {&lt;br /&gt;            System.out.println("deamon working...");&lt;br /&gt;            Thread.sleep(1000);&lt;br /&gt;         }&lt;br /&gt;      } catch (InterruptedException e) {&lt;br /&gt;         System.out.println("deamon stopped");}&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;/code&gt;&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016298996370927058-9154235949554078105?l=condensedjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://condensedjava.blogspot.com/feeds/9154235949554078105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016298996370927058&amp;postID=9154235949554078105' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/9154235949554078105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/9154235949554078105'/><link rel='alternate' type='text/html' href='http://condensedjava.blogspot.com/2006/11/starting-worker-thread-in-servlet.html' title='Starting a worker thread in a Servlet Engine'/><author><name>Taylor</name><uri>http://www.blogger.com/profile/12814369929329235023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016298996370927058.post-2413710002016155845</id><published>2006-09-16T13:35:00.000-07:00</published><updated>2006-09-16T13:36:28.508-07:00</updated><title type='text'>All purpose String trimmer</title><content type='html'>The java string class supports a trim() operation that trims ' '.  You may find that you want to trim another character.  This terse example will trim any character from the beginning and end of a String.  It is based on the JDK's trim() method with a few more attempts at brevity.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   public static String trim(String source, char c) {&lt;br /&gt;      int len = source.length();&lt;br /&gt;      int st = 0;&lt;br /&gt;      char[] val = source.toCharArray();&lt;br /&gt;      for (;(st &lt; len) &amp;&amp; (val[st] &lt;= c);st++){}&lt;br /&gt;      for (;(st &lt; len) &amp;&amp; (val[len-1]&lt;=c);len--){}&lt;br /&gt;      return ((st &gt; 0) || (len &lt; source.length())) ? &lt;br /&gt;         source.substring(st, len) : source;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016298996370927058-2413710002016155845?l=condensedjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://condensedjava.blogspot.com/feeds/2413710002016155845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016298996370927058&amp;postID=2413710002016155845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/2413710002016155845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/2413710002016155845'/><link rel='alternate' type='text/html' href='http://condensedjava.blogspot.com/2006/09/all-purpose-string-trimmer.html' title='All purpose String trimmer'/><author><name>Taylor</name><uri>http://www.blogger.com/profile/12814369929329235023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016298996370927058.post-5097350867196910820</id><published>2006-09-02T21:12:00.000-07:00</published><updated>2006-09-02T21:13:52.442-07:00</updated><title type='text'>XMP Dumper reduced</title><content type='html'>I was able to trim this one down a bit more.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class XMPDumper {&lt;br /&gt;  &lt;br /&gt;   public String getXMP(File f) throws IOException {&lt;br /&gt;      return getXMP(new FileInputStream(f));&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   public String getXMP(InputStream is)&lt;br /&gt;      throws IOException {&lt;br /&gt;     for (int i=0;(i=is.read())!=-1;)&lt;br /&gt;       if (i==0xFF &amp;&amp;amp; is.read()==0xE1) {&lt;br /&gt;         String result = getXMPSegment(is);&lt;br /&gt;         if (result.startsWith("http://ns.adobe.com/xap/1.0/"))&lt;br /&gt;            return result.substring(29);&lt;br /&gt;       }&lt;br /&gt;     return null;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private String getXMPSegment(InputStream is)&lt;br /&gt;      throws IOException {&lt;br /&gt;      DataInputStream dis = new DataInputStream(is);&lt;br /&gt;      byte[] buffer = new byte[dis.readShort()-2];&lt;br /&gt;      dis.read(buffer);&lt;br /&gt;      return new String(buffer);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016298996370927058-5097350867196910820?l=condensedjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://condensedjava.blogspot.com/feeds/5097350867196910820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016298996370927058&amp;postID=5097350867196910820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/5097350867196910820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/5097350867196910820'/><link rel='alternate' type='text/html' href='http://condensedjava.blogspot.com/2006/09/xmp-dumper-reduced.html' title='XMP Dumper reduced'/><author><name>Taylor</name><uri>http://www.blogger.com/profile/12814369929329235023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016298996370927058.post-8764609401480856646</id><published>2006-08-26T09:09:00.000-07:00</published><updated>2006-08-26T09:10:10.793-07:00</updated><title type='text'></title><content type='html'>&lt;a href="http://www.technorati.com/claim/naeg2k5m3d" rel="me"&gt;Technorati Profile&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016298996370927058-8764609401480856646?l=condensedjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://condensedjava.blogspot.com/feeds/8764609401480856646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016298996370927058&amp;postID=8764609401480856646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/8764609401480856646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/8764609401480856646'/><link rel='alternate' type='text/html' href='http://condensedjava.blogspot.com/2006/08/technorati-profile.html' title=''/><author><name>Taylor</name><uri>http://www.blogger.com/profile/12814369929329235023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016298996370927058.post-3337877658198126942</id><published>2006-08-25T21:22:00.000-07:00</published><updated>2006-08-25T21:23:55.442-07:00</updated><title type='text'>XMP metadata dumper</title><content type='html'>XMP is a metatdata format from Adobe.  One way to add and edit XMP is with &lt;a href="http://www.pixvue.com/"&gt;PixVue&lt;/a&gt;.  This is a minimalist XMP extractor/dumper for the jpeg format.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:90%;"&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class XMPDumper {&lt;br /&gt;  &lt;br /&gt;   public static void main(String[] args) throws IOException {&lt;br /&gt;      File f = new File("myimage.jpg");&lt;br /&gt;      String xmp = new XMPDumper().getXMP(f);&lt;br /&gt;      System.out.println(xmp);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public String getXMP(File f) &lt;br /&gt;      throws IOException {&lt;br /&gt;     FileInputStream is = new FileInputStream(f);&lt;br /&gt;     int i=0; String result=null;&lt;br /&gt;     while ((i=is.read()) != -1)&lt;br /&gt;       if (i==0xFF &amp;&amp; is.read()==0xE1) {&lt;br /&gt;         result = checkNamespace(is);&lt;br /&gt;         if (result!=null) break;&lt;br /&gt;       }&lt;br /&gt;     return result;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static final String namespace = &lt;br /&gt;     "http://ns.adobe.com/xap/1.0/";&lt;br /&gt;   &lt;br /&gt;   private String checkNamespace(FileInputStream is) &lt;br /&gt;      throws IOException {&lt;br /&gt;     String s = getSegment(is);&lt;br /&gt;     return (s.startsWith(namespace)) ? s.substring(29) : null;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   private String getSegment(InputStream is) &lt;br /&gt;      throws IOException {&lt;br /&gt;     DataInputStream dis = new DataInputStream(is);&lt;br /&gt;     byte[] buffer = new byte[dis.readShort()-2];&lt;br /&gt;     dis.read(buffer);&lt;br /&gt;     return new String(buffer);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016298996370927058-3337877658198126942?l=condensedjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://condensedjava.blogspot.com/feeds/3337877658198126942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016298996370927058&amp;postID=3337877658198126942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/3337877658198126942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/3337877658198126942'/><link rel='alternate' type='text/html' href='http://condensedjava.blogspot.com/2006/08/public-class-xmpdumper-public-static.html' title='XMP metadata dumper'/><author><name>Taylor</name><uri>http://www.blogger.com/profile/12814369929329235023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016298996370927058.post-2880153533792441478</id><published>2006-08-25T19:51:00.000-07:00</published><updated>2006-08-25T20:01:29.055-07:00</updated><title type='text'>Resource Consumption Management API</title><content type='html'>&lt;a href="http://today.java.net/pub/n/ResourceConsumptionManagementAPIJSR"&gt;Resource Consumption Management API JSR&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This sounds like JINI or JMX to me...the JCP is becomming an echo chamber.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016298996370927058-2880153533792441478?l=condensedjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://condensedjava.blogspot.com/feeds/2880153533792441478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016298996370927058&amp;postID=2880153533792441478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/2880153533792441478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/2880153533792441478'/><link rel='alternate' type='text/html' href='http://condensedjava.blogspot.com/2006/08/resource-consumption-management-api-jsr.html' title='Resource Consumption Management API'/><author><name>Taylor</name><uri>http://www.blogger.com/profile/12814369929329235023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7016298996370927058.post-7253986365667306401</id><published>2006-08-24T05:28:00.000-07:00</published><updated>2006-08-24T05:29:34.157-07:00</updated><title type='text'>Simple template replacer</title><content type='html'>Often I find I need a simple template engine to replace named regions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;public abstract class Replace {&lt;br /&gt;&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;      Replace r = new Replace() {&lt;br /&gt;         public String lookup(String key) {&lt;br /&gt;            return "*newvalue*";&lt;br /&gt;         }&lt;br /&gt;      };&lt;br /&gt;      String s =&lt;br /&gt;    "Welcome ${name}, you have just won a new ${prize}.";&lt;br /&gt;      System.out.println(r.replace(s));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public String replace(String s) {&lt;br /&gt;      return replace(s, 0, new StringBuilder()).toString();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private StringBuilder replace(String s, int offset, StringBuilder b) {&lt;br /&gt;      int startKey = s.indexOf("${", offset);&lt;br /&gt;      if (startKey == -1)&lt;br /&gt;         return b.append(s.substring(offset));&lt;br /&gt;      else {&lt;br /&gt;         b.append(s.substring(offset, startKey));&lt;br /&gt;         int keyEnd = s.indexOf('}', startKey);&lt;br /&gt;         String key = s.substring(startKey + 2, keyEnd);&lt;br /&gt;         b.append(lookup(key));&lt;br /&gt;         return replace(s, keyEnd + 1, b);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   abstract public String lookup(String key);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7016298996370927058-7253986365667306401?l=condensedjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://condensedjava.blogspot.com/feeds/7253986365667306401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7016298996370927058&amp;postID=7253986365667306401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/7253986365667306401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7016298996370927058/posts/default/7253986365667306401'/><link rel='alternate' type='text/html' href='http://condensedjava.blogspot.com/2006/08/simple-class-that-matches.html' title='Simple template replacer'/><author><name>Taylor</name><uri>http://www.blogger.com/profile/12814369929329235023</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
