001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    package org.apache.geronimo.monitoring.console;
018    
019    import java.sql.Connection;
020    import java.sql.PreparedStatement;
021    import java.sql.ResultSet;
022    import java.sql.Statement;
023    import java.text.DecimalFormat;
024    import java.text.Format;
025    import java.text.SimpleDateFormat;
026    import java.util.ArrayList;
027    import java.util.Date;
028    import java.util.HashMap;
029    import java.util.Iterator;
030    import java.util.TreeMap;
031    
032    import org.apache.geronimo.monitoring.console.util.DBManager;
033    
034    public class GraphsBuilder {
035        private String ip = new String();
036        private int timeFrame;
037        private int snapCount;
038        private MRCConnector mrc = new MRCConnector();
039        private Connection con;
040    
041        // constructor
042        public GraphsBuilder(Connection con) {
043            // TODO: Database pull stuff may go here... based on server ID...\
044            this.con = con;
045        }
046    
047        public StatsGraph buildOneDB(int graph_id) throws Exception {
048            con = (new DBManager()).getConnection();
049            StatsGraph graph = null;
050            PreparedStatement pStmt = null;
051            ResultSet rsServer = null;
052            pStmt = con
053                    .prepareStatement("SELECT * from graphs WHERE enabled=1 AND graph_id="
054                            + graph_id);
055            ResultSet rs = pStmt.executeQuery();
056            if (rs.next()) {
057                String mBeanName = rs.getString("mbean");
058                String dataName1 = rs.getString("dataname1");
059                String dataName2 = rs.getString("dataname2");
060                String graphName1 = rs.getString("dataname1");
061                String graphName2 = rs.getString("dataname2");
062                timeFrame = rs.getInt("timeframe");
063                String server_id = rs.getString("server_id");
064                String xlabel = rs.getString("xlabel");
065                String ylabel = rs.getString("ylabel");
066                String data1operation = rs.getString("data1operation");
067                String data2operation = rs.getString("data2operation");
068                String operation = rs.getString("operation");
069                String color = rs.getString("color");
070                float warninglevel1 = rs.getFloat("warninglevel1");
071                String description = rs.getString("description");
072                boolean showArchive = rs.getInt("archive") == 1 ? true : false;
073    
074                pStmt = con
075                        .prepareStatement("SELECT * from servers WHERE enabled=1 AND server_id="
076                                + server_id);
077                rsServer = pStmt.executeQuery();
078                if (rsServer.next()) {
079                    ip = rsServer.getString("ip");
080                    String username = rsServer.getString("username");
081                    String password = rsServer.getString("password");
082                    int port = rsServer.getInt("port");
083                    int protocol = rsServer.getInt("protocol");
084                    // close the connection before calling the MRCConnector because
085                    // it opens another
086                    // connection to the db to update the SERVERS.last_seen
087                    // attribute
088                    try {
089                        con.close();
090                    } catch (Exception e) {
091                        throw e;
092                    }
093                    mrc = new MRCConnector(ip, username, password, port, protocol);
094                    HashMap<String, ArrayList<Object>> DataList = new HashMap<String, ArrayList<Object>>();
095    
096                    DataList.put(graphName1, new ArrayList<Object>());
097                    if ((dataName2 != null) && !dataName2.equals("time")
098                            && !dataName2.equals("null") && !dataName2.equals("")) {
099                        DataList.put(graphName2, new ArrayList<Object>());
100                    }
101                    if ((timeFrame / 1440 >= 30))
102                        snapCount = 17;
103                    else {
104                        if ((timeFrame / 1440) == 7) {
105                            snapCount = 16;
106                        } else if ((int) ((timeFrame / (mrc.getSnapshotDuration() / 60000))) <= 12)
107                            snapCount = (int) ((timeFrame / (mrc
108                                    .getSnapshotDuration() / 60000)));
109                        else
110                            snapCount = 12;
111                    }
112    
113                    ArrayList<Object> snapshot_time = new ArrayList<Object>();
114    
115                    ArrayList<Object> PrettyTime = new ArrayList<Object>();
116    
117                    String prettyTimeFrame = new String();
118                    DecimalFormat fmt = new DecimalFormat("0.##");
119                    if (timeFrame / 60 > 24) {
120                        prettyTimeFrame = fmt.format((float) (timeFrame / 1440))
121                                + " day";
122                    } else {
123                        if (timeFrame > 60) {
124                            prettyTimeFrame = fmt.format((float) timeFrame / 60)
125                                    + " hour";
126                        } else {
127                            prettyTimeFrame = fmt.format(timeFrame) + " minute";
128                        }
129                    }
130    
131                    int skipCount = (int) ((timeFrame / (mrc.getSnapshotDuration() / 60000)))
132                            / (snapCount);
133    
134                    snapCount = snapCount + 2;
135                    TreeMap<Long, Long> snapshotList1 = mrc
136                            .getSpecificStatistics(mBeanName, dataName1, snapCount,
137                                    skipCount, showArchive);
138                    TreeMap<Long, Long> snapshotList2 = new TreeMap<Long, Long>();
139                    if ((dataName2 != null) && !dataName2.equals("time")
140                            && !dataName2.equals("null") && !dataName2.equals("")) {
141                        snapshotList2 = mrc.getSpecificStatistics(mBeanName,
142                                dataName2, snapCount, skipCount, showArchive);
143                    }
144                    // Check if snapshotList is empty
145                    if (snapshotList1.size() == 0) {
146                        snapshotList1.put(System.currentTimeMillis(), new Long(0));
147                        /*
148                         * If there are not enough snapshots available to fill the
149                         * requested number, insert some with values of 0 and the
150                         * proper times.
151                         */
152                        while (snapshotList1.size() < snapCount) {
153                            // Temporary, always is first element (oldest)
154                            Long timeFix = snapshotList1.firstKey();
155                            // Calculate appropriate time, add it to the submap,
156                            // then
157                            // add
158                            // that to the tempMap
159                            snapshotList1
160                                    .put(
161                                            (timeFix - (mrc.getSnapshotDuration() * skipCount)),
162                                            new Long(0));
163                        }
164                    }
165                    if (snapshotList2.size() == 0) {
166                        snapshotList2.put(System.currentTimeMillis(), new Long(0));
167                        while (snapshotList2.size() < snapCount) {
168                            // Temporary, always is first element (oldest)
169                            Long timeFix = snapshotList2.firstKey();
170                            snapshotList2
171                                    .put(
172                                            (timeFix - (mrc.getSnapshotDuration() * skipCount)),
173                                            new Long(0));
174                        }
175                    }
176    
177                    for (Iterator<Long> it = snapshotList1.keySet().iterator(); it
178                            .hasNext();) {
179                        Long current = it.next();
180                        snapshot_time.add(current);
181                        ArrayList<Object> ArrayListTemp = DataList.get(graphName1);
182                        ArrayListTemp.add(snapshotList1.get(current));
183                        DataList.put(graphName1, ArrayListTemp);
184                        if ((dataName2 != null) && !dataName2.equals("time")
185                                && !dataName2.equals("null")
186                                && !dataName2.equals("")) {
187                            ArrayList<Object> ArrayListTemp2 = DataList
188                                    .get(graphName2);
189                            ArrayListTemp2.add(snapshotList2.get(current));
190                            DataList.put(graphName2, ArrayListTemp2);
191                        }
192                        PrettyTime.add((Long) current / 1000);
193                    }
194    
195                    if (dataName2.equals("time")) {
196                        graph = (new StatsGraph(graph_id, ip + " - " + xlabel
197                                + " - " + prettyTimeFrame, description, xlabel,
198                                ylabel, data1operation.charAt(0), DataList
199                                        .get(graphName1), operation, data2operation
200                                        .charAt(0), PrettyTime, snapshot_time,
201                                (int) (mrc.getSnapshotDuration() / 1000),
202                                timeFrame, color, warninglevel1, warninglevel1));
203                    } else if (!dataName2.equals("time") && (dataName2 != null)
204                            && !dataName2.equals("null") && !dataName2.equals("")) {
205                        graph = (new StatsGraph(graph_id, ip + " - " + xlabel
206                                + " - " + prettyTimeFrame, description, xlabel,
207                                ylabel, data1operation.charAt(0), DataList
208                                        .get(graphName1), operation, data2operation
209                                        .charAt(0), DataList.get(graphName2),
210                                snapshot_time,
211                                (int) (mrc.getSnapshotDuration() / 1000),
212                                timeFrame, color, warninglevel1, warninglevel1));
213                    } else if (dataName2 == null || dataName2.equals("null")
214                            || dataName2.equals("")) {
215                        graph = (new StatsGraph(graph_id, ip + " - " + xlabel
216                                + " - " + prettyTimeFrame, description, xlabel,
217                                ylabel, data1operation.charAt(0), DataList
218                                        .get(graphName1), operation, snapshot_time,
219                                (int) (mrc.getSnapshotDuration() / 1000),
220                                timeFrame, color, warninglevel1, warninglevel1));
221                    } else {
222                        System.out.println("Using Null call.");
223                        graph = (new StatsGraph());
224                    }
225                }
226            }
227    
228            // check to see if graph was successfully populated
229            if (graph != null) {
230                // get the current date
231                Format formatter = null;
232                formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
233                Date date = new Date(System.currentTimeMillis());
234                String currentTime = formatter.format(date);
235                // the graph was successfully operated on,
236                // so update the last_seen attribute
237                DBManager dbManager = new DBManager();
238                Connection conn = dbManager.getConnection();
239                Statement stmt = conn.createStatement();
240                stmt.executeUpdate("UPDATE GRAPHS SET LAST_SEEN='" + currentTime
241                        + "' WHERE GRAPH_ID=" + graph_id);
242                conn.close();
243            }
244            return graph;
245        }
246    }