Strabon
changeset 203:69aca279a848
logging most System.out/err messages. If one would like to do it so in a class package.path.here.ClassNameHere, then she has to write the following line at the beginning of the class
private static Logger logger = LoggerFactory.getLogger(package.path.here.ClassNameHere.class);
and then use one of the following methods
logger.info("msg");
logger.warn("msg");
logger.debug("msg");
and so on. If one would like to print a stacktrace, then she has to do it as follows:
logger.error("msg", e.getStackTrace());
private static Logger logger = LoggerFactory.getLogger(package.path.here.ClassNameHere.class);
and then use one of the following methods
logger.info("msg");
logger.warn("msg");
logger.debug("msg");
and so on. If one would like to print a stacktrace, then she has to do it as follows:
logger.error("msg", e.getStackTrace());
author | Babis Nikolaou <charnik@di.uoa.gr> |
---|---|
date | Wed May 30 15:13:08 2012 +0300 (2012-05-30) |
parents | 365ab173a655 |
children | 52a5a4007d33 |
files | postgis/src/main/java/org/openrdf/sail/postgis/evaluation/PostGISEvaluation.java runtime/src/main/java/eu/earthobservatory/runtime/generaldb/Strabon.java runtime/src/main/java/eu/earthobservatory/runtime/postgis/QueryOp.java runtime/src/main/java/eu/earthobservatory/runtime/postgis/Strabon.java |
line diff
1.1 --- a/postgis/src/main/java/org/openrdf/sail/postgis/evaluation/PostGISEvaluation.java Wed May 30 13:03:56 2012 +0300 1.2 +++ b/postgis/src/main/java/org/openrdf/sail/postgis/evaluation/PostGISEvaluation.java Wed May 30 15:13:08 2012 +0300 1.3 @@ -74,8 +74,7 @@ 1.4 result.setConstructIndexesAndNames(this.constructIndexesAndNames); 1.5 // 1.6 1.7 - System.out.println("In PostGIS Evaluation, query is: "); 1.8 - System.out.println(query); 1.9 + logger.debug("In PostGIS Evaluation, query is: \n" + query); 1.10 return result; 1.11 } 1.12 catch (SQLException e) {
2.1 --- a/runtime/src/main/java/eu/earthobservatory/runtime/generaldb/Strabon.java Wed May 30 13:03:56 2012 +0300 2.2 +++ b/runtime/src/main/java/eu/earthobservatory/runtime/generaldb/Strabon.java Wed May 30 15:13:08 2012 +0300 2.3 @@ -2,16 +2,15 @@ 2.4 2.5 import java.io.DataOutputStream; 2.6 import java.io.File; 2.7 -import java.io.FileInputStream; 2.8 import java.io.FileNotFoundException; 2.9 import java.io.FileOutputStream; 2.10 +import java.io.FileReader; 2.11 import java.io.IOException; 2.12 import java.io.InputStream; 2.13 +import java.io.InputStreamReader; 2.14 import java.io.OutputStream; 2.15 import java.io.OutputStreamWriter; 2.16 import java.io.StringReader; 2.17 - 2.18 -import java.io.*; 2.19 import java.net.URL; 2.20 import java.nio.charset.Charset; 2.21 import java.sql.SQLException; 2.22 @@ -19,12 +18,9 @@ 2.23 import java.util.Set; 2.24 import java.util.zip.ZipEntry; 2.25 import java.util.zip.ZipOutputStream; 2.26 -import java.io.*; 2.27 -import java.util.zip.*; 2.28 2.29 import javax.xml.namespace.QName; 2.30 2.31 -import org.apache.commons.io.FileUtils; 2.32 import org.apache.commons.io.output.ByteArrayOutputStream; 2.33 import org.geotools.data.simple.SimpleFeatureCollection; 2.34 import org.geotools.feature.FeatureCollections; 2.35 @@ -40,7 +36,6 @@ 2.36 import org.opengis.referencing.FactoryException; 2.37 import org.opengis.referencing.NoSuchAuthorityCodeException; 2.38 import org.opengis.referencing.crs.CoordinateReferenceSystem; 2.39 -import org.opengis.referencing.operation.MathTransform; 2.40 import org.openrdf.model.URI; 2.41 import org.openrdf.model.Value; 2.42 import org.openrdf.model.ValueFactory; 2.43 @@ -70,6 +65,8 @@ 2.44 import org.openrdf.sail.generaldb.model.GeneralDBPolyhedron; 2.45 import org.openrdf.sail.helpers.SailBase; 2.46 import org.openrdf.sail.rdbms.model.RdbmsLiteral; 2.47 +import org.slf4j.Logger; 2.48 +import org.slf4j.LoggerFactory; 2.49 2.50 import com.vividsolutions.jts.geom.Geometry; 2.51 import com.vividsolutions.jts.geom.GeometryCollection; 2.52 @@ -84,12 +81,9 @@ 2.53 import com.vividsolutions.jts.io.ParseException; 2.54 import com.vividsolutions.jts.io.WKTReader; 2.55 2.56 - 2.57 public abstract class Strabon { 2.58 2.59 - /** 2.60 - * @param args 2.61 - */ 2.62 + private static Logger logger = LoggerFactory.getLogger(eu.earthobservatory.runtime.generaldb.Strabon.class); 2.63 2.64 protected SailBase db_store; 2.65 SailRepository repo1; 2.66 @@ -126,17 +120,15 @@ 2.67 try { 2.68 repo1.initialize(); 2.69 } catch (RepositoryException e) { 2.70 - 2.71 - e.printStackTrace(); 2.72 + logger.error("[Strabon.init] initialize", e.getStackTrace()); 2.73 } 2.74 2.75 - System.out.println("Clearing Successful"); 2.76 + logger.info("[Strabon.init] Clearing Successful."); 2.77 2.78 try { 2.79 con1 = repo1.getConnection(); 2.80 } catch (RepositoryException e) { 2.81 - // TODO Auto-generated catch block 2.82 - e.printStackTrace(); 2.83 + logger.error("[Strabon.init] getConnection", e.getStackTrace()); 2.84 } 2.85 } 2.86 2.87 @@ -148,26 +140,23 @@ 2.88 return con1; 2.89 } 2.90 2.91 - 2.92 - 2.93 public void setCon1(SailRepositoryConnection con1) { 2.94 this.con1 = con1; 2.95 } 2.96 2.97 public void close() { 2.98 - 2.99 - System.out.println("Closing..."); 2.100 - 2.101 - 2.102 + logger.info("[Strabon.close] Closing connection..."); 2.103 2.104 try { 2.105 con1.commit(); 2.106 con1.close(); 2.107 repo1.shutDown(); 2.108 + 2.109 } catch (RepositoryException e) { 2.110 - 2.111 - e.printStackTrace(); 2.112 + logger.error("[Strabon.close]", e.getStackTrace()); 2.113 } 2.114 + 2.115 + logger.info("[Strabon.close] Connection closed."); 2.116 } 2.117 2.118 public Object query(String queryString) 2.119 @@ -179,7 +168,7 @@ 2.120 public Object query(String queryString, String resultsFormat) 2.121 throws MalformedQueryException , QueryEvaluationException, IOException, TupleQueryResultHandlerException 2.122 { 2.123 - return query (queryString, resultsFormat, this.getSailRepoConnection()); 2.124 + return query(queryString, resultsFormat, this.getSailRepoConnection()); 2.125 } 2.126 2.127 public Object query(String queryString, SailRepositoryConnection con) 2.128 @@ -190,7 +179,6 @@ 2.129 2.130 public Object query(String queryString, String resultsFormat, SailRepositoryConnection con) 2.131 throws MalformedQueryException, QueryEvaluationException, IOException, TupleQueryResultHandlerException 2.132 - 2.133 { 2.134 TupleQuery tupleQuery = null; 2.135 try { 2.136 @@ -373,10 +361,8 @@ 2.137 } 2.138 2.139 } 2.140 - catch (ParseException e) 2.141 - { 2.142 - System.out.println("Faults detected in spatial literal representation"); 2.143 - e.printStackTrace(); 2.144 + catch (ParseException e) { 2.145 + logger.error("[Strabon.query] Faults detected in spatial literal representation.", e.getStackTrace()); 2.146 } 2.147 } 2.148 2.149 @@ -384,10 +370,9 @@ 2.150 try { 2.151 geomCRS = CRS.decode("EPSG:"+SRID); 2.152 } catch (NoSuchAuthorityCodeException e) { 2.153 - System.out.println("Error decoding returned geometry's SRID"); 2.154 - e.printStackTrace(); 2.155 + logger.error("[Strabon.query] Error decoding returned geometry's SRID", e.getStackTrace()); 2.156 } catch (FactoryException e) { 2.157 - e.printStackTrace(); 2.158 + logger.error("[Strabon.query]", e.getStackTrace()); 2.159 } 2.160 2.161 tb[i].setCRS(geomCRS); 2.162 @@ -588,14 +573,12 @@ 2.163 // out.writeChars(bindingSet.toString()); 2.164 } 2.165 } catch (QueryEvaluationException e) { 2.166 - // TODO Auto-generated catch block 2.167 - e.printStackTrace(); 2.168 + logger.error("[Strabon.query]", e.getStackTrace()); 2.169 } 2.170 try { 2.171 dos.close(); 2.172 } catch (IOException e) { 2.173 - // TODO Auto-generated catch block 2.174 - e.printStackTrace(); 2.175 + logger.error("[Strabon.query]", e.getStackTrace()); 2.176 } 2.177 2.178 //Finishing the structure of the kml document 2.179 @@ -697,8 +680,7 @@ 2.180 } 2.181 2.182 } catch (IOException e) { 2.183 - // TODO Auto-generated catch block 2.184 - e.printStackTrace(); 2.185 + logger.error("[Strabon.query]", e.getStackTrace()); 2.186 } 2.187 } 2.188 else if(resultsFormat.equalsIgnoreCase("HTML")) { 2.189 @@ -758,7 +740,7 @@ 2.190 } 2.191 else { 2.192 // System.exit(-1);// throw new InvalidDatasetFormatFault(); // TODO 2.193 - System.out.println("No Such Format Available!!"); 2.194 + logger.warn("[Strabon.query] No such format available \"" + resultsFormat + "\"."); 2.195 return null; 2.196 } 2.197 2.198 @@ -767,8 +749,7 @@ 2.199 writeOut.flush(); 2.200 retStream.flush(); 2.201 } catch (IOException e) { 2.202 - // TODO Auto-generated catch block 2.203 - e.printStackTrace(); 2.204 + logger.error("[Strabon.query]", e.getStackTrace()); 2.205 } 2.206 2.207 // Print results. 2.208 @@ -779,28 +760,28 @@ 2.209 } 2.210 2.211 public void update(String updateString, SailRepositoryConnection con) throws MalformedQueryException 2.212 - 2.213 { 2.214 Update update = null; 2.215 2.216 try { 2.217 update = con.prepareUpdate(QueryLanguage.SPARQL, updateString); 2.218 } catch (RepositoryException e) { 2.219 - e.printStackTrace(); 2.220 + logger.error("[Strabon.update]", e.getStackTrace()); 2.221 } 2.222 2.223 - System.out.println("Placemark0"); 2.224 - System.out.println("\n\n\nGot query: " + updateString + "\n\n\n"); 2.225 + //System.out.println("Placemark0"); 2.226 + //System.out.println("\n\n\nGot query: " + updateString + "\n\n\n"); 2.227 + logger.info("[Strabon.update] executing update query: " + updateString); 2.228 2.229 try { 2.230 update.execute(); 2.231 } catch (UpdateExecutionException e) { 2.232 - e.printStackTrace(); 2.233 + logger.error("[Strabon.update]", e.getStackTrace()); 2.234 } 2.235 2.236 - System.out.println("-------------------------------------------"); 2.237 - System.out.println("- UPDATE EXECUTED -"); 2.238 - System.out.println("-------------------------------------------"); 2.239 +// System.out.println("-------------------------------------------"); 2.240 +// System.out.println("- UPDATE EXECUTED -"); 2.241 +// System.out.println("-------------------------------------------"); 2.242 } 2.243 2.244 @SuppressWarnings("unused") 2.245 @@ -810,7 +791,6 @@ 2.246 2.247 public void storeInRepo(Object src, String format) throws RDFParseException, RepositoryException, IOException,InvalidDatasetFormatFault, RDFHandlerException 2.248 { 2.249 - System.out.println("generaldb.Strabon.store in repo"); 2.250 storeInRepo(src, null, null, format); 2.251 } 2.252 2.253 @@ -867,18 +847,17 @@ 2.254 storeString((String)src, baseURI, uriContext, realFormat); 2.255 } 2.256 } 2.257 - catch(NullPointerException e) 2.258 - { 2.259 - e.printStackTrace(); 2.260 + catch(NullPointerException e) { 2.261 + logger.error("[Strabon.storeInRepo]", e.getStackTrace()); 2.262 } 2.263 } 2.264 2.265 private void storeFile(File file, String baseURI, URI context, RDFFormat format) throws RDFParseException, RepositoryException, IOException, RDFHandlerException 2.266 { 2.267 - System.out.println("File : " + file.getName()); 2.268 - System.out.println("Base URI : " + ((baseURI == null) ? "null" : baseURI)); 2.269 - System.out.println("Context : " + ((context == null) ? "null" : context)); 2.270 - System.out.println("Format : " + ((format == null) ? "null" : format.toString())); 2.271 + logger.info("[Strabon.storeFile] File : " + file.getName()); 2.272 + logger.info("[Strabon.storeFile] Base URI : " + ((baseURI == null) ? "null" : baseURI)); 2.273 + logger.info("[Strabon.storeFile] Context : " + ((context == null) ? "null" : context)); 2.274 + logger.info("[Strabon.storeFile] Format : " + ((format == null) ? "null" : format.toString())); 2.275 2.276 RDFParser parser = Rio.createParser(format); 2.277 GeosparqlRDFHandlerBase handler = new GeosparqlRDFHandlerBase(); 2.278 @@ -886,14 +865,14 @@ 2.279 handler.startRDF(); 2.280 parser.setRDFHandler(handler); 2.281 parser.parse(reader, ""); 2.282 - System.out.println("Triples inferred:"+ handler.getTriples().toString()); 2.283 + logger.info("[Strabon.storeFile] Triples inferred:"+ handler.getTriples().toString()); 2.284 StringReader georeader= new StringReader(handler.getTriples().toString()); 2.285 handler.endRDF(); 2.286 if (context == null) { 2.287 - System.out.println("[1]"); 2.288 + logger.info("[Strabon.storeFile] [1]"); 2.289 con1.add(file, baseURI, format); 2.290 } else { 2.291 - System.out.println("[2]"); 2.292 + logger.info("[Strabon.storeFile] [2]"); 2.293 con1.add(file, baseURI, format, context); 2.294 } 2.295 con1.add(georeader, "", RDFFormat.NTRIPLES); 2.296 @@ -902,10 +881,10 @@ 2.297 2.298 private void storeURL(URL url, String baseURI, URI context, RDFFormat format) throws RDFParseException, RepositoryException, IOException, RDFHandlerException 2.299 { 2.300 - System.out.println("URL : " + url.toString()); 2.301 - System.out.println("Base URI : " + ((baseURI == null) ? "null" : baseURI)); 2.302 - System.out.println("Context : " + ((context == null) ? "null" : context)); 2.303 - System.out.println("Format : " + ((format == null) ? "null" : format.toString())); 2.304 + logger.info("[Strabon.storeURL] URL : " + url.toString()); 2.305 + logger.info("[Strabon.storeURL] Base URI : " + ((baseURI == null) ? "null" : baseURI)); 2.306 + logger.info("[Strabon.storeURL] Context : " + ((context == null) ? "null" : context)); 2.307 + logger.info("[Strabon.storeURL] Format : " + ((format == null) ? "null" : format.toString())); 2.308 2.309 InputStream in = (InputStream) url.openStream(); 2.310 InputStreamReader reader = new InputStreamReader(in); 2.311 @@ -914,15 +893,15 @@ 2.312 handler.startRDF(); 2.313 parser.setRDFHandler(handler); 2.314 parser.parse(reader, ""); 2.315 - System.out.println("These are the extra triples:"+ handler.getTriples().toString()); 2.316 + logger.info("[Strabon.storeURL] These are the extra triples:"+ handler.getTriples().toString()); 2.317 StringReader georeader= new StringReader(handler.getTriples().toString()); 2.318 handler.endRDF(); 2.319 2.320 if (context == null) { 2.321 - System.out.println("[3]"); 2.322 + logger.info("[Strabon.storeURL] [3]"); 2.323 con1.add(url, baseURI, format); 2.324 } else { 2.325 - System.out.println("[4]"); 2.326 + logger.info("[Strabon.storeURL] [4]"); 2.327 con1.add(url, baseURI, format, context); 2.328 } 2.329 con1.add(georeader, "", RDFFormat.NTRIPLES); 2.330 @@ -933,10 +912,10 @@ 2.331 if (baseURI == null) 2.332 baseURI = ""; 2.333 2.334 - System.out.println("Text : " + text); 2.335 - System.out.println("Base URI : " + ((baseURI == null) ? "null" : baseURI)); 2.336 - System.out.println("Context : " + ((context == null) ? "null" : context)); 2.337 - System.out.println("Format : " + ((format == null) ? "null" : format.toString())); 2.338 + logger.info("[Strabon.storeString] Text : " + text); 2.339 + logger.info("[Strabon.storeString] Base URI : " + ((baseURI == null) ? "null" : baseURI)); 2.340 + logger.info("[Strabon.storeString] Context : " + ((context == null) ? "null" : context)); 2.341 + logger.info("[Strabon.storeString] Format : " + ((format == null) ? "null" : format.toString())); 2.342 2.343 StringReader reader = new StringReader(text); 2.344 RDFParser parser = Rio.createParser(format); 2.345 @@ -945,17 +924,17 @@ 2.346 handler.startRDF(); 2.347 parser.setRDFHandler(handler); 2.348 parser.parse(reader, ""); 2.349 - System.out.println("These are the extra triples:"+ handler.getTriples().toString()); 2.350 + logger.info("[Strabon.storeString] These are the extra triples:"+ handler.getTriples().toString()); 2.351 StringReader georeader= new StringReader(handler.getTriples().toString()); 2.352 handler.endRDF(); 2.353 2.354 2.355 if (context == null) { 2.356 - System.out.println("[5]"); 2.357 + logger.info("[Strabon.storeString] [5]"); 2.358 con1.add(reader, baseURI, format); 2.359 reader.close(); 2.360 } else { 2.361 - System.out.println("[6]"); 2.362 + logger.info("[Strabon.storeString] [6]"); 2.363 con1.add(reader, baseURI, format, context); 2.364 reader.close(); 2.365 } 2.366 @@ -970,34 +949,32 @@ 2.367 try { 2.368 graphQuery = con.prepareGraphQuery(QueryLanguage.SPARQL, describeString); 2.369 } catch (RepositoryException e) { 2.370 - e.printStackTrace(); 2.371 + logger.error("[Strabon.describe]", e.getStackTrace()); 2.372 } 2.373 2.374 - System.out.println("Placemark0"); 2.375 - System.out.println("\n\n\nGot query: " + describeString + "\n\n\n"); 2.376 - 2.377 +// System.out.println("Placemark0"); 2.378 +// System.out.println("\n\n\nGot query: " + describeString + "\n\n\n"); 2.379 + logger.info("[Strabon.describe] Executing describe query:" + describeString); 2.380 + 2.381 try { 2.382 OutputStream out = new FileOutputStream(outFile); 2.383 RDFHandler rdfHandler = new NTriplesWriter(out); 2.384 graphQuery.evaluate(rdfHandler); 2.385 out.close(); 2.386 + 2.387 } catch (FileNotFoundException e) { 2.388 - // TODO Auto-generated catch block 2.389 - e.printStackTrace(); 2.390 + logger.error("[Strabon.describe]", e.getStackTrace()); 2.391 } catch (QueryEvaluationException e) { 2.392 - // TODO Auto-generated catch block 2.393 - e.printStackTrace(); 2.394 + logger.error("[Strabon.describe]", e.getStackTrace()); 2.395 } catch (RDFHandlerException e) { 2.396 - // TODO Auto-generated catch block 2.397 - e.printStackTrace(); 2.398 + logger.error("[Strabon.describe]", e.getStackTrace()); 2.399 } catch (IOException e) { 2.400 - // TODO Auto-generated catch block 2.401 - e.printStackTrace(); 2.402 + logger.error("[Strabon.describe]", e.getStackTrace()); 2.403 } 2.404 2.405 - System.out.println("Output: "+outFile); 2.406 - System.out.println("---------------------------------------------"); 2.407 - System.out.println("- DESCRIBE EXECUTED -"); 2.408 - System.out.println("---------------------------------------------"); 2.409 + logger.info("[Strabon.describe] Output: "+outFile); 2.410 +// System.out.println("---------------------------------------------"); 2.411 +// System.out.println("- DESCRIBE EXECUTED -"); 2.412 +// System.out.println("---------------------------------------------"); 2.413 } 2.414 }
3.1 --- a/runtime/src/main/java/eu/earthobservatory/runtime/postgis/QueryOp.java Wed May 30 13:03:56 2012 +0300 3.2 +++ b/runtime/src/main/java/eu/earthobservatory/runtime/postgis/QueryOp.java Wed May 30 15:13:08 2012 +0300 3.3 @@ -1,8 +1,13 @@ 3.4 package eu.earthobservatory.runtime.postgis; 3.5 3.6 +import org.slf4j.Logger; 3.7 +import org.slf4j.LoggerFactory; 3.8 + 3.9 3.10 public class QueryOp { 3.11 3.12 + private static Logger logger = LoggerFactory.getLogger(eu.earthobservatory.runtime.postgis.QueryOp.class); 3.13 + 3.14 /** 3.15 * @param args 3.16 * @throws Exception 3.17 @@ -32,13 +37,10 @@ 3.18 resultsFormat = args[6]; 3.19 } 3.20 3.21 - 3.22 - 3.23 - 3.24 Strabon strabon = new Strabon(db, user, passwd, port, host, true); 3.25 3.26 + logger.info("[QueryOp] Executing query: " + queryString); 3.27 strabon.query(queryString, resultsFormat, strabon.getSailRepoConnection()); 3.28 - 3.29 strabon.close(); 3.30 } 3.31 /*
4.1 --- a/runtime/src/main/java/eu/earthobservatory/runtime/postgis/Strabon.java Wed May 30 13:03:56 2012 +0300 4.2 +++ b/runtime/src/main/java/eu/earthobservatory/runtime/postgis/Strabon.java Wed May 30 15:13:08 2012 +0300 4.3 @@ -5,10 +5,13 @@ 4.4 import java.sql.SQLException; 4.5 4.6 import org.openrdf.sail.postgis.PostGISSqlStore; 4.7 - 4.8 +import org.slf4j.Logger; 4.9 +import org.slf4j.LoggerFactory; 4.10 4.11 public class Strabon extends eu.earthobservatory.runtime.generaldb.Strabon { 4.12 4.13 + private static Logger logger = LoggerFactory.getLogger(eu.earthobservatory.runtime.postgis.Strabon.class); 4.14 + 4.15 public Strabon(String databaseName, String user, String password, int port, String serverName, boolean checkForLockTable) throws SQLException, ClassNotFoundException { 4.16 super(databaseName, user, password, port, serverName, checkForLockTable); 4.17 } 4.18 @@ -26,14 +29,14 @@ 4.19 postGIS_store.setServerName(serverName); 4.20 postGIS_store.setMaxNumberOfTripleTables(2048); 4.21 init(); 4.22 - System.out.println("[Strabon] Initiatation completed."); 4.23 + logger.info("[Strabon] Initialization completed."); 4.24 } 4.25 4.26 protected void checkAndDeleteLock(String databaseName, String user, String password, int port, String serverName) 4.27 throws SQLException, ClassNotFoundException { 4.28 String url = ""; 4.29 try { 4.30 - System.out.println("[Strabon] Cleaning..."); 4.31 + logger.info("[Strabon] Cleaning..."); 4.32 Class.forName("org.postgresql.Driver"); 4.33 url = "jdbc:postgresql://" + serverName + ":" + port + "/" 4.34 + databaseName + "?user=" + user + "&password=" + password; 4.35 @@ -43,13 +46,10 @@ 4.36 st.close(); 4.37 conn.close(); 4.38 } catch (SQLException e) { 4.39 - System.err.println("SQL Exception occured."); 4.40 - System.err.println("Connection url: " + url); 4.41 - e.printStackTrace(); 4.42 + logger.error("SQL Exception occured. Connection URL is <"+url+">.", e.getStackTrace()); 4.43 throw e; 4.44 } catch (ClassNotFoundException e) { 4.45 - System.err.println("Could not load postgres jdbc driver..."); 4.46 - e.printStackTrace(); 4.47 + logger.error("Could not load postgres jdbc driver.", e.getStackTrace()); 4.48 throw e; 4.49 } 4.50 }