/** * Copyright (C) 2015 Orion Health (Orchestral Development Ltd) * * Licensed 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 xbdd.webapp.resource.feature; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.inject.Inject; import javax.ws.rs.BeanParam; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import xbdd.webapp.factory.MongoDBAccessor; import xbdd.webapp.util.Coordinates; import xbdd.webapp.util.Field; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; @Path("/rest/stats") public class Stats { private final MongoDBAccessor client; @Inject public Stats(final MongoDBAccessor client) { this.client = client; } private Integer getNumberOfState(final DBCollection collection, final DBObject query, final String state) { query.put("calculatedStatus", state); return collection.find(query).count(); } private DBObject getNumberOfAllStates(final DBCollection collection, final DBObject query) { final List<String> states = Arrays.asList("passed", "failed", "skipped", "undefined"); final BasicDBObject ret = new BasicDBObject(); for (final String state : states) { ret.put(state.substring(0, 1), getNumberOfState(collection, query, state)); } return ret; } @GET @Path("/build/{product}/{major}.{minor}.{servicePack}/{build}") @Produces("application/json") public BasicDBObject getBuildStats(@BeanParam final Coordinates coordinates) { final DB db = this.client.getDB("bdd"); final DBCollection collection = db.getCollection("features"); final String manualTag = "undefined"; final BasicDBObject query = coordinates.getQueryObject(); final BasicDBList manual = new BasicDBList(); manual.add(new BasicDBObject("originalAutomatedStatus", manualTag)); manual.add(new BasicDBObject("calculatedStatus", manualTag)); query.put("$or", manual); final DBObject m = getNumberOfAllStates(collection, query); query.remove("$or"); query.put("$nor", manual); final DBObject a = getNumberOfAllStates(collection, query); final BasicDBObject ret = new BasicDBObject(); ret.put("automated", a); ret.put("manual", m); return ret; } @SuppressWarnings("unchecked") @GET @Path("/product/{product}/{major}.{minor}.{servicePack}/{build}") @Produces("application/json") public List<BasicDBObject> getProductHistory(@BeanParam final Coordinates coordinates) { List<String> buildList = new ArrayList<String>(); final DB db = this.client.getDB("bdd"); final DBCollection collection = db.getCollection("summary"); final DBObject productQuery = coordinates.getQueryObject(Field.PRODUCT, Field.MAJOR, Field.MINOR, Field.SERVICEPACK); final DBCursor results = collection.find(productQuery); while (results.hasNext()) { buildList = (List<String>) results.next().get("builds"); } final DBCollection featureCollection = db.getCollection("features"); final List<BasicDBObject> buildDBObjectList = new ArrayList<BasicDBObject>(); for (final String build : buildList) { coordinates.setBuild(build); final DBObject buildQuery = coordinates.getQueryObject(); final BasicDBObject buildObj = new BasicDBObject(); buildObj.put("passed", getNumberOfState(featureCollection, buildQuery, "passed")); buildObj.put("failed", getNumberOfState(featureCollection, buildQuery, "failed")); buildObj.put("skipped", getNumberOfState(featureCollection, buildQuery, "skipped")); buildObj.put("undefined", getNumberOfState(featureCollection, buildQuery, "undefined")); buildObj.put("name", build); buildDBObjectList.add(buildObj); } return buildDBObjectList; } }