1 /* ============================================================ 2 * JRobin : Pure java implementation of RRDTool's functionality 3 * ============================================================ 4 * 5 * Project Info: http://www.jrobin.org 6 * Project Lead: Sasa Markovic (saxon@jrobin.org); 7 * 8 * (C) Copyright 2003-2005, by Sasa Markovic. 9 * 10 * Developers: Sasa Markovic (saxon@jrobin.org) 11 * 12 * 13 * This library is free software; you can redistribute it and/or modify it under the terms 14 * of the GNU Lesser General Public License as published by the Free Software Foundation; 15 * either version 2.1 of the License, or (at your option) any later version. 16 * 17 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 18 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 19 * See the GNU Lesser General Public License for more details. 20 * 21 * You should have received a copy of the GNU Lesser General Public License along with this 22 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, 23 * Boston, MA 02111-1307, USA. 24 */ 25 26 package org.jrobin.core; 27 28 import java.io.IOException; 29 import java.util.Set; 30 31 /** 32 * Class to represent fetch request. For the complete explanation of all 33 * fetch parameters consult RRDTool's 34 * <a href="../../../../man/rrdfetch.html" target="man">rrdfetch man page</a>. 35 * <p/> 36 * You cannot create <code>FetchRequest</code> directly (no public constructor 37 * is provided). Use {@link RrdDb#createFetchRequest(String, long, long, long) 38 * createFetchRequest()} method of your {@link RrdDb RrdDb} object. 39 * 40 * @author <a href="mailto:saxon@jrobin.org">Sasa Markovic</a> 41 */ 42 public class FetchRequest { 43 private RrdDb parentDb; 44 private String consolFun; 45 private long fetchStart; 46 private long fetchEnd; 47 private long resolution; 48 private String[] filter; 49 50 FetchRequest(RrdDb parentDb, String consolFun, long fetchStart, long fetchEnd, 51 long resolution) throws RrdException { 52 this.parentDb = parentDb; 53 this.consolFun = consolFun; 54 this.fetchStart = fetchStart; 55 this.fetchEnd = fetchEnd; 56 this.resolution = resolution; 57 validate(); 58 } 59 60 /** 61 * Sets request filter in order to fetch data only for 62 * the specified array of datasources (datasource names). 63 * If not set (or set to null), fetched data will 64 * containt values of all datasources defined in the corresponding RRD. 65 * To fetch data only from selected 66 * datasources, specify an array of datasource names as method argument. 67 * 68 * @param filter Array of datsources (datsource names) to fetch data from. 69 */ 70 public void setFilter(String[] filter) { 71 this.filter = filter; 72 } 73 74 /** 75 * Sets request filter in order to fetch data only for 76 * the specified set of datasources (datasource names). 77 * If the filter is not set (or set to null), fetched data will 78 * containt values of all datasources defined in the corresponding RRD. 79 * To fetch data only from selected 80 * datasources, specify a set of datasource names as method argument. 81 * 82 * @param filter Set of datsource names to fetch data for. 83 */ 84 public void setFilter(Set<String> filter) { 85 this.filter = filter.toArray(new String[0]); 86 } 87 88 /** 89 * Sets request filter in order to fetch data only for 90 * a single datasource (datasource name). 91 * If not set (or set to null), fetched data will 92 * containt values of all datasources defined in the corresponding RRD. 93 * To fetch data for a single datasource only, 94 * specify an array of datasource names as method argument. 95 * 96 * @param filter Array of datsources (datsource names) to fetch data from. 97 */ 98 public void setFilter(String filter) { 99 this.filter = (filter == null) ? null : (new String[] {filter}); 100 } 101 102 /** 103 * Returns request filter. See {@link #setFilter(String[]) setFilter()} for 104 * complete explanation. 105 * 106 * @return Request filter (array of datasource names), null if not set. 107 */ 108 public String[] getFilter() { 109 return filter; 110 } 111 112 /** 113 * Returns consolitation function to be used during the fetch process. 114 * 115 * @return Consolidation function. 116 */ 117 public String getConsolFun() { 118 return consolFun; 119 } 120 121 /** 122 * Returns starting timestamp to be used for the fetch request. 123 * 124 * @return Starting timstamp in seconds. 125 */ 126 public long getFetchStart() { 127 return fetchStart; 128 } 129 130 /** 131 * Returns ending timestamp to be used for the fetch request. 132 * 133 * @return Ending timestamp in seconds. 134 */ 135 public long getFetchEnd() { 136 return fetchEnd; 137 } 138 139 /** 140 * Returns fetch resolution to be used for the fetch request. 141 * 142 * @return Fetch resolution in seconds. 143 */ 144 public long getResolution() { 145 return resolution; 146 } 147 148 private void validate() throws RrdException { 149 if (!ArcDef.isValidConsolFun(consolFun)) { 150 throw new RrdException("Invalid consolidation function in fetch request: " + consolFun); 151 } 152 if (fetchStart < 0) { 153 throw new RrdException("Invalid start time in fetch request: " + fetchStart); 154 } 155 if (fetchEnd < 0) { 156 throw new RrdException("Invalid end time in fetch request: " + fetchEnd); 157 } 158 if (fetchStart > fetchEnd) { 159 throw new RrdException("Invalid start/end time in fetch request: " + fetchStart + 160 " > " + fetchEnd); 161 } 162 if (resolution <= 0) { 163 throw new RrdException("Invalid resolution in fetch request: " + resolution); 164 } 165 } 166 167 /** 168 * Dumps the content of fetch request using the syntax of RRDTool's fetch command. 169 * 170 * @return Fetch request dump. 171 */ 172 public String dump() { 173 return "fetch \"" + parentDb.getRrdBackend().getPath() + 174 "\" " + consolFun + " --start " + fetchStart + " --end " + fetchEnd + 175 (resolution > 1 ? " --resolution " + resolution : ""); 176 } 177 178 String getRrdToolCommand() { 179 return dump(); 180 } 181 182 /** 183 * Returns data from the underlying RRD and puts it in a single 184 * {@link FetchData FetchData} object. 185 * 186 * @return FetchData object filled with timestamps and datasource values. 187 * @throws RrdException Thrown in case of JRobin specific error. 188 * @throws IOException Thrown in case of I/O error. 189 */ 190 public FetchData fetchData() throws RrdException, IOException { 191 return parentDb.fetchData(this); 192 } 193 194 /** 195 * Returns the underlying RrdDb object. 196 * 197 * @return RrdDb object used to create this FetchRequest object. 198 */ 199 public RrdDb getParentDb() { 200 return parentDb; 201 } 202 203 }