blob: 9b2e548a94cbb205f8de8c27f5e53ba3a541a858 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package macromedia.qa.metrics;
import java.io.File;
import java.sql.SQLException;
import java.util.Calendar;
public class MetricsManager {
private Project project;
private Build build;
private MetricsDatabase database;
private Run currentRun;
private Metric currentMetric;
public MetricsManager(String projectName, String buildNumber, File props) throws SQLException {
validate(projectName, buildNumber, props);
try {
this.database = new MetricsDatabase(props);
initProject(projectName);
initBuild(buildNumber);
} catch (SQLException ex) {
try {
database.dispose();
} catch (Throwable t) {
}
throw ex;
}
}
private void initProject(String projectName) throws SQLException {
project = new Project(projectName);
if (!project.exists(database)) {
project.save(database);
}
}
private void initBuild(String buildNumber) throws SQLException {
build = new Build(project, buildNumber);
if (!build.exists(database)) {
build.save(database);
}
}
public Run newRun() throws SQLException {
currentRun = new Run(build);
currentRun.time = Calendar.getInstance().getTime().getTime();
if (currentRun.id >= 0)
currentRun.save(database);
else
currentRun.insert(database);
return getCurrentRun();
}
public Run getCurrentRun() {
return currentRun;
}
public Metric newMetric(String name, String units) throws SQLException {
currentMetric = new Metric(name);
currentMetric.units = units;
if (!currentMetric.exists(database)) {
if (currentMetric.id >= 0)
currentMetric.save(database);
else
currentMetric.insert(database);
}
return getCurrentMetric();
}
public Metric getCurrentMetric() {
return currentMetric;
}
public Value createValue(double val) {
Value v = new Value(currentRun, currentMetric);
v.numberValue = new Double(val);
return v;
}
public Value createValue(String val) {
Value v = new Value(currentRun, currentMetric);
v.textValue = val;
return v;
}
public void saveValue(Value val) throws SQLException {
if (val != null) {
if (val.id >= 0)
val.save(database); //Attempt an update as we have an id
else
val.insert(database); //Force insert
}
}
private void validate(String project, String buildNumber, File props) {
if (!validProjectName(project))
throw new IllegalStateException("Invalid project " + project);
if (!validBuildNumber(buildNumber))
throw new IllegalStateException("Invalid buildNumber " + buildNumber);
if (!validProps(props))
throw new IllegalStateException("Invalid database properties " + props);
}
private static boolean validProjectName(String project) {
return project != null && project.trim().length() > 0;
}
private static boolean validBuildNumber(String buildNumber) {
return buildNumber != null && buildNumber.trim().length() > 0;
}
private static boolean validProps(File props) {
return props != null && props.exists() && props.canRead();
}
}