001    /*
002    @license.text@  
003     */
004    package biz.hammurapi.metrics.j2ee;
005    
006    import java.rmi.RemoteException;
007    import java.util.Properties;
008    
009    import javax.naming.InitialContext;
010    import javax.rmi.PortableRemoteObject;
011    
012    import org.w3c.dom.Element;
013    import org.w3c.dom.Node;
014    import org.w3c.dom.NodeList;
015    
016    import biz.hammurapi.config.Component;
017    import biz.hammurapi.config.ConfigurationException;
018    import biz.hammurapi.config.Context;
019    import biz.hammurapi.config.DomConfigurable;
020    import biz.hammurapi.metrics.RemoteSliceConsumer;
021    import biz.hammurapi.metrics.Slice;
022    import biz.hammurapi.metrics.SliceConsumer;
023    import biz.hammurapi.xml.dom.AbstractDomObject;
024    import biz.hammurapi.xml.dom.DOMUtils;
025    
026    
027    /**
028     * @author Pavel Vlasov
029     */
030    public class JndiSliceConsumer implements SliceConsumer, DomConfigurable, Component {    
031        
032        private RemoteSliceConsumer remoteConsumer;
033            private String root;
034    
035            public void start() throws ConfigurationException {
036            try {      
037                    Properties ctxProps=new Properties();
038                    NodeList nl = DOMUtils.selectNodeList(configElement, "environment-property");
039                    for (int i=0, l=nl.getLength(); i<l; ++i) {
040                            Element e = (Element) nl.item(i);
041                            ctxProps.setProperty(e.getAttribute("name"), DOMUtils.getNonBlankElementText(e));
042                    }
043                    
044                InitialContext jndiContext = new InitialContext(ctxProps);
045                
046                remoteConsumer=(RemoteSliceConsumer) PortableRemoteObject.narrow(jndiContext.lookup(AbstractDomObject.getElementText(configElement, "slice-consumer")), RemoteSliceConsumer.class);            
047                root=AbstractDomObject.getElementText(configElement, "root-category");
048            } catch (Exception e) {
049                throw new ConfigurationException(e);
050                    }
051        }
052    
053            public void stop() throws ConfigurationException {
054        }
055        
056            private Element configElement;
057        
058            public void configure(Node configNode, Context context) throws ConfigurationException {
059                    configElement=(Element) configNode;
060            }
061    
062            public boolean consumeSlice(String category, Slice slice) {
063                    try {
064                            return remoteConsumer.consumeSlice(root+"."+category, slice);
065                    } catch (RemoteException e) {
066                            return false;
067                    }
068            }
069    
070            public void setOwner(Object owner) {
071                    // Ignore               
072            }       
073    }