001    /*
002    @license.text@
003     */
004    package biz.hammurapi.jms;
005    
006    import java.io.IOException;
007    import java.util.ArrayList;
008    import java.util.Collection;
009    import java.util.HashMap;
010    import java.util.Map;
011    import java.util.Timer;
012    
013    import javax.xml.parsers.ParserConfigurationException;
014    import javax.xml.transform.TransformerException;
015    
016    import biz.hammurapi.config.Component;
017    import biz.hammurapi.config.ConfigurationException;
018    import biz.hammurapi.metrics.Slice;
019    import biz.hammurapi.metrics.SliceConsumer;
020    import biz.hammurapi.xml.dom.DOMUtils;
021    
022    
023    /**
024     * Collects slices for a period of time and send them
025     * as JMS text message with XML payload.
026     * @author Pavel Vlasov
027     * @revision $Revision$
028     */
029    public abstract class JmsSliceConsumer implements SliceConsumer, Component {
030            protected Timer timer;
031            private boolean isOwnTimer;
032            protected long interval;
033    
034            /**
035             * @param timer Timer to use for scheduling. If null than internal timer
036             * is created.
037             * @param interval Send interval.
038             */
039            public JmsSliceConsumer(Timer timer, long interval) {
040                    super();
041                    this.timer=timer;
042                    this.interval=interval;
043            }
044            
045            private Map slices=new HashMap();
046    
047            public boolean consumeSlice(String category, Slice slice) {
048                    synchronized (slices) {
049                            Collection bucket=(Collection) slices.get(category);
050                            if (bucket==null) {
051                                    bucket=new ArrayList();
052                                    slices.put(category, bucket);
053                            }
054                            bucket.add(slice);
055                            return true;
056                    }
057            }
058            
059            /**
060             * Converts accumulated slices to XML. Clears internal slices map.
061             * @throws ParserConfigurationException 
062             * @throws TransformerException 
063             * @throws IOException 
064             * @return Slices in XML format.
065             */
066            protected String getSlicesXml() throws IOException, TransformerException, ParserConfigurationException {
067                    synchronized (slices) {
068                            try {
069                                    return DOMUtils.toXmlString(slices, "slices");
070                            } finally {
071                                    slices.clear();
072                            }
073                    }
074            }                       
075    
076            public void start() throws ConfigurationException {
077                    if (timer==null) {
078                            timer=new Timer();
079                            isOwnTimer=true;
080                    }
081                    
082            }
083    
084            public void stop() throws ConfigurationException {
085                    if (isOwnTimer) {
086                            timer.cancel();
087                    }               
088            }
089    
090            public void setOwner(Object owner) {
091                    // Nothing              
092            }
093    
094    }