From bc54871dac7ef10102edecf91a747d6595a4640f Mon Sep 17 00:00:00 2001
From: Trygve Laugstøl <trygvis@inamo.no>
Date: Wed, 9 Jan 2013 17:04:10 +0100
Subject: o Adding basic build list in the front page application.

---
 src/main/java/io/trygvis/esper/testing/Uuid.java   | 88 ++++++++++++----------
 .../esper/testing/web/resource/CoreResource.java   | 78 +++++++++++++------
 2 files changed, 105 insertions(+), 61 deletions(-)

(limited to 'src/main/java')

diff --git a/src/main/java/io/trygvis/esper/testing/Uuid.java b/src/main/java/io/trygvis/esper/testing/Uuid.java
index 64fd6e5..a884959 100755
--- a/src/main/java/io/trygvis/esper/testing/Uuid.java
+++ b/src/main/java/io/trygvis/esper/testing/Uuid.java
@@ -17,6 +17,10 @@ public class Uuid {
         return uuid.toString();
     }
 
+    public UUID toUUID() {
+        return uuid;
+    }
+
     public String toString() {
         return toStringBase64();
     }
@@ -89,67 +93,71 @@ public class Uuid {
         }
 
         if (s.length() == 22) {
-            long most = 0;
-            int i = 0;
-            int shift = 64;
-            for(; i < 10; i++) {
-                char c = s.charAt(i);
-                long b = alphabetR[c];
-
-                if(b == 0) {
-                    throw new IllegalArgumentException(s);
-                }
-
-                b--;
+            return parseBase64(s);
+        }
 
-                shift -= 6;
+        throw new IllegalArgumentException("Illegal: " + s);
+    }
 
-                long l = b << shift;
+    public static Uuid parseBase64(String s) {
+        long most = 0;
+        int i = 0;
+        int shift = 64;
+        for(; i < 10; i++) {
+            char c = s.charAt(i);
+            long b = alphabetR[c];
 
-                most |= l;
+            if(b == 0) {
+                throw new IllegalArgumentException(s);
             }
 
-            long least;
-
-            {
-                char c = s.charAt(i++);
-                long b = alphabetR[c];
+            b--;
 
-                if (b == 0) {
-                    throw new IllegalArgumentException(s);
-                }
+            shift -= 6;
 
-                b--;
+            long l = b << shift;
 
-                long l = b >> 2;
+            most |= l;
+        }
 
-                most |= l;
+        long least;
 
-                shift = 64 - 2;
+        {
+            char c = s.charAt(i++);
+            long b = alphabetR[c];
 
-                least = (b & 0x03) << shift;
+            if (b == 0) {
+                throw new IllegalArgumentException(s);
             }
 
-            for(; i < 22; i++) {
-                char c = s.charAt(i);
-                long b = alphabetR[c];
+            b--;
+
+            long l = b >> 2;
+
+            most |= l;
 
-                if(b == 0) {
-                    throw new IllegalArgumentException(s);
-                }
+            shift = 64 - 2;
 
-                b--;
+            least = (b & 0x03) << shift;
+        }
 
-                shift -= 6;
+        for(; i < 22; i++) {
+            char c = s.charAt(i);
+            long b = alphabetR[c];
 
-                long l = b << shift;
-                least |= l;
+            if(b == 0) {
+                throw new IllegalArgumentException(s);
             }
 
-            return new Uuid(new UUID(most, least));
+            b--;
+
+            shift -= 6;
+
+            long l = b << Math.max(shift, 0);
+            least |= l;
         }
 
-        throw new IllegalArgumentException("Illegal: " + s);
+        return new Uuid(new UUID(most, least));
     }
 
     // http://en.wikipedia.org/wiki/Base64
diff --git a/src/main/java/io/trygvis/esper/testing/web/resource/CoreResource.java b/src/main/java/io/trygvis/esper/testing/web/resource/CoreResource.java
index 22290d9..bd61855 100755
--- a/src/main/java/io/trygvis/esper/testing/web/resource/CoreResource.java
+++ b/src/main/java/io/trygvis/esper/testing/web/resource/CoreResource.java
@@ -8,7 +8,6 @@ import io.trygvis.esper.testing.util.sql.*;
 import io.trygvis.esper.testing.web.*;
 import org.joda.time.*;
 
-import javax.servlet.http.*;
 import javax.ws.rs.*;
 import javax.ws.rs.core.*;
 import java.sql.*;
@@ -16,7 +15,6 @@ import java.util.*;
 import java.util.List;
 
 import static fj.data.Option.fromNull;
-import static io.trygvis.esper.testing.util.sql.PageRequest.*;
 
 @Path("/resource/core")
 @Produces(MediaType.APPLICATION_JSON)
@@ -49,7 +47,7 @@ public class CoreResource extends AbstractResource {
 
     @GET
     @Path("/person/{uuid}")
-    public PersonDetailJson getPerson(@PathParam("uuid") final Uuid uuid) throws Exception {
+    public PersonDetailJson getPerson(@MagicParam final Uuid uuid) throws Exception {
         return sql(new CoreDaosCallback<SqlOption<PersonDetailJson>>() {
             protected SqlOption<PersonDetailJson> run() throws SQLException {
                 return daos.personDao.selectPerson(uuid).map(super.getPersonDetailJson);
@@ -63,20 +61,27 @@ public class CoreResource extends AbstractResource {
 
     @GET
     @Path("/build")
-    public List<BuildJson> getBuilds(@MagicParam final PageRequest page, @MagicParam(query = "person") final Uuid person) throws Exception {
-        return da.inTransaction(new DatabaseAccess.DaosCallback<List<BuildJson>>() {
-            public List<BuildJson> run(Daos daos) throws SQLException {
+    public List<Object> getBuilds(@MagicParam final PageRequest page,
+                                  @MagicParam(query = "person") final Uuid person,
+                                  @QueryParam("fields") final List<String> fields) throws Exception {
+        return da.inTransaction(new CoreDaosCallback<List<Object>>() {
+            public List<Object> run() throws SQLException {
                 List<BuildDto> buildDtos;
 
+                boolean detailed = fields.contains("detailed");
+
                 if (person != null) {
                     buildDtos = daos.buildDao.selectBuildsByPerson(person, page);
                 } else {
                     buildDtos = daos.buildDao.selectBuilds(page);
                 }
 
-                List<BuildJson> list = new ArrayList<>();
+                List<Object> list = new ArrayList<>();
+
+                SqlF<BuildDto, ?> buildDtoSqlF = detailed ? getBuildDetailJson : getBuildJson;
+
                 for (BuildDto build : buildDtos) {
-                    list.add(getBuildJson(build));
+                    list.add(buildDtoSqlF.apply(build));
                 }
                 return list;
             }
@@ -99,23 +104,14 @@ public class CoreResource extends AbstractResource {
 
     @GET
     @Path("/build/{uuid}")
-    public BuildJson getBuild(@MagicParam final UUID uuid) throws Exception {
-        return get(new DatabaseAccess.DaosCallback<Option<BuildJson>>() {
-            public Option<BuildJson> run(Daos daos) throws SQLException {
-                SqlOption<BuildDto> o = daos.buildDao.selectBuild(uuid);
-                if (o.isNone()) {
-                    return Option.none();
-                }
-
-                return Option.some(getBuildJson(o.get()));
+    public BuildDetailJson getBuild(@MagicParam final UUID uuid) throws Exception {
+        return sql(new CoreDaosCallback<SqlOption<BuildDetailJson>>() {
+            public SqlOption<BuildDetailJson> run() throws SQLException {
+                return daos.buildDao.selectBuild(uuid).map(getBuildDetailJson);
             }
         });
     }
 
-    private BuildJson getBuildJson(BuildDto build) {
-        return new BuildJson(build.uuid, build.timestamp, build.success);
-    }
-
     // -----------------------------------------------------------------------
     // Badge
     // -----------------------------------------------------------------------
@@ -146,6 +142,10 @@ public class CoreResource extends AbstractResource {
             return run();
         }
 
+        // -----------------------------------------------------------------------
+        // Person
+        // -----------------------------------------------------------------------
+
         protected final SqlF<PersonDto, PersonJson> getPersonJson = new SqlF<PersonDto, PersonJson>() {
             public PersonJson apply(PersonDto person) throws SQLException {
                 return new PersonJson(person.uuid, person.name, person.mail);
@@ -173,6 +173,32 @@ public class CoreResource extends AbstractResource {
             }
         };
 
+        // -----------------------------------------------------------------------
+        // Build
+        // -----------------------------------------------------------------------
+
+        protected final SqlF<BuildDto, BuildJson> getBuildJson = new SqlF<BuildDto, BuildJson>() {
+            public BuildJson apply(BuildDto dto) throws SQLException {
+                return new BuildJson(dto.uuid, dto.timestamp, dto.success);
+            }
+        };
+
+        protected final SqlF<BuildDto, BuildDetailJson> getBuildDetailJson = new SqlF<BuildDto, BuildDetailJson>() {
+            public BuildDetailJson apply(BuildDto build) throws SQLException {
+                List<PersonJson> list = new ArrayList<>();
+                for (PersonDto person : daos.buildDao.selectPersonsFromBuildParticipant(build.uuid)) {
+                    list.add(getPersonJson.apply(person));
+                }
+
+                return new BuildDetailJson(getBuildJson.apply(build),
+                        list);
+            }
+        };
+
+        // -----------------------------------------------------------------------
+        // Badge
+        // -----------------------------------------------------------------------
+
         protected SqlF<PersonalBadgeDto, BadgeJson> getBadgeJson = new SqlF<PersonalBadgeDto, BadgeJson>() {
             public BadgeJson apply(PersonalBadgeDto badge) throws SQLException {
                 return new BadgeJson(badge.createdDate, badge.type.name(), badge.level);
@@ -203,3 +229,13 @@ class BuildJson {
         this.success = success;
     }
 }
+
+class BuildDetailJson {
+    public final BuildJson build;
+    public final List<PersonJson> participants;
+
+    BuildDetailJson(BuildJson build, List<PersonJson> participants) {
+        this.build = build;
+        this.participants = participants;
+    }
+}
-- 
cgit v1.2.3