001    /*
002    @license.text@
003     */
004    package biz.hammurapi.metrics.persistent;
005    
006    import java.sql.SQLException;
007    import java.util.ArrayList;
008    import java.util.Collection;
009    import java.util.Iterator;
010    import java.util.StringTokenizer;
011    
012    import biz.hammurapi.sql.SQLProcessor;
013    
014    /**
015     * Locates metric id by name (path)
016     * @author Pavel Vlasov
017     * @version $Revision$
018     */
019    public class MetricLocator {
020        private MetricsEngine engine;
021        
022        public MetricLocator(SQLProcessor processor) {
023            engine=new MetricsEngine(processor);
024        }
025        
026        MetricLocator(MetricsEngine engine) {
027            this.engine=engine;
028        }    
029        
030        public int[] findRoots() throws SQLException {
031            Collection roots=engine.getOrderedRootMetrics(new ArrayList());
032            int[] ret=new int[roots.size()];
033            Iterator it=roots.iterator();
034            for (int i=0; it.hasNext(); i++) {
035                    ret[i]=((Number) it.next()).intValue();
036            }
037                    return ret;
038        }
039           
040        
041        public Number find(String category) throws SQLException {
042                    Number ret=null; 
043            if (category!=null) {
044                    StringTokenizer st=new StringTokenizer(category, ".");
045                    while (st.hasMoreTokens()) {
046                        String nextToken = st.nextToken();
047                                    if (ret==null) {
048                            ret=engine.getRootMetricId(nextToken);
049                        } else {
050                            ret=engine.getMetricId(ret.intValue(),nextToken);
051                        }
052                            
053                            if (ret==null) {
054                            break;
055                        }                
056                    }
057            }
058                    return ret;
059        }
060        
061        public Number find(int root, String category) throws SQLException {
062                    Number ret=new Integer(root); 
063            if (category!=null) {
064                    StringTokenizer st=new StringTokenizer(category, ".");
065                    while (st.hasMoreTokens()) {
066                        String nextToken = st.nextToken();
067                                    if (ret==null) {
068                            ret=engine.getRootMetricId(nextToken);
069                        } else {
070                            ret=engine.getMetricId(ret.intValue(),nextToken);
071                        }
072                            
073                            if (ret==null) {
074                            break;
075                        }                
076                    }
077            }
078                    return ret;        
079        }
080    
081    }