001 /* 002 @license.text@ 003 */ 004 package biz.hammurapi.util; 005 006 import org.w3c.dom.Element; 007 import org.w3c.dom.Node; 008 009 import biz.hammurapi.config.Component; 010 import biz.hammurapi.config.ConfigurationException; 011 import biz.hammurapi.config.Context; 012 import biz.hammurapi.config.DomConfigurable; 013 import biz.hammurapi.config.Wrapper; 014 015 public class ThreadPoolComponentWrapper implements Wrapper, Component, DomConfigurable { 016 private ThreadPool master; 017 private int numberOfThreads=20; 018 private int priority=Thread.NORM_PRIORITY; 019 private int maxQueue=1000; 020 private String exceptionSinkName; 021 private Object owner; 022 private String name; 023 024 public Object getMaster() { 025 return master; 026 } 027 028 public void start() throws ConfigurationException { 029 ExceptionSink exceptionSink=null; 030 if (exceptionSinkName!=null) { 031 if (!(owner instanceof Context)) { 032 throw new ConfigurationException("Cannot lookup exception sink - owner doesn't implement Context"); 033 } 034 035 exceptionSink=(ExceptionSink) ((Context) owner).get(exceptionSinkName); 036 037 if (exceptionSink==null) { 038 throw new ConfigurationException("Lookup failed for exception sink '"+exceptionSinkName+"'"); 039 } 040 } 041 042 master=new ThreadPool(numberOfThreads, priority, maxQueue, exceptionSink, name); 043 master.start(); 044 } 045 046 public void stop() throws ConfigurationException { 047 if (master!=null) { 048 master.stop(); 049 } 050 } 051 052 public void setOwner(Object owner) { 053 this.owner=owner; 054 } 055 056 public void configure(Node configNode, Context context) throws ConfigurationException { 057 Element e=(Element) configNode; 058 if (e.hasAttribute("threads")) { 059 numberOfThreads=Integer.parseInt(e.getAttribute("threads")); 060 if (numberOfThreads<1) { 061 throw new ConfigurationException("Number of threads shall be >=1"); 062 } 063 } 064 065 if (e.hasAttribute("max-queue")) { 066 maxQueue=Integer.parseInt(e.getAttribute("max-queue")); 067 } 068 069 if (e.hasAttribute("exception-sink")) { 070 exceptionSinkName=e.getAttribute("exception-sink"); 071 } 072 073 if (e.hasAttribute("pool-name")) { 074 name=e.getAttribute("pool-name"); 075 } 076 077 if (e.hasAttribute("priority")) { 078 String pStr=e.getAttribute("priority"); 079 if ("min".equalsIgnoreCase(pStr)) { 080 priority=Thread.MIN_PRIORITY; 081 } else if ("max".equalsIgnoreCase(pStr)) { 082 priority=Thread.MAX_PRIORITY; 083 } else if ("normal".equalsIgnoreCase(pStr)) { 084 priority=Thread.NORM_PRIORITY; 085 } else { 086 throw new ConfigurationException("Invalid priority value: "+pStr); 087 } 088 } 089 } 090 091 }