Author: fchrist
Date: Tue Jun 28 13:15:21 2011
New Revision: 1140586

URL: http://svn.apache.org/viewvc?rev=1140586&view=rev
Log:
STANBOL-243 Initial implementation of 'Publish New Facts'

Added:
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java
    
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java
Modified:
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java
    
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/FactsResource.java
    
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java
    
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/FactsResourceTest.java

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java?rev=1140586&r1=1140585&r2=1140586&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/api/FactStore.java
 Tue Jun 28 13:15:21 2011
@@ -1,5 +1,8 @@
 package org.apache.stanbol.factstore.api;
 
+import java.util.Set;
+
+import org.apache.stanbol.factstore.model.Fact;
 import org.apache.stanbol.factstore.model.FactSchema;
 
 public interface FactStore {
@@ -12,4 +15,7 @@ public interface FactStore {
 
     public void createFactSchema(FactSchema factSchema) throws Exception;
     
+    public void addFact(Fact fact) throws Exception;
+    
+    public void addFacts(Set<Fact> factSet) throws Exception;
 }

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java?rev=1140586&r1=1140585&r2=1140586&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/derby/DerbyFactStore.java
 Tue Jun 28 13:15:21 2011
@@ -8,13 +8,17 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.stanbol.factstore.api.FactStore;
+import org.apache.stanbol.factstore.model.Fact;
 import org.apache.stanbol.factstore.model.FactSchema;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
@@ -132,67 +136,73 @@ public class DerbyFactStore implements F
 
         return exists;
     }
-    
+
     @Override
     public FactSchema getFactSchema(String factSchemaURN) {
         FactSchema factSchema = null;
-        
+
         Connection con = null;
         try {
             con = DriverManager.getConnection(DB_URL);
-            PreparedStatement ps = null;
-            ResultSet rs = null;
-            try {
-                String selectFactSchema = "SELECT factschemata.name AS 
schemaURN, factroles.name AS role, factroles.type AS type FROM factroles JOIN 
factschemata ON ( factschemata.id = factroles.factschema_id ) WHERE 
factschemata.name = ?";
-                ps = con.prepareStatement(selectFactSchema);
-                ps.setString(1, factSchemaURN);
-                rs = ps.executeQuery();
-                
-                boolean first = true;
-                while (rs.next()) {
-                    if (first) {
-                        factSchema = new FactSchema();
-                        factSchema.setFactSchemaURN(rs.getString("schemaURN"));
-                        first = false;
-                    }
-                    String typeFromDB = rs.getString("type");
-                    String [] types = typeFromDB.split(",");
-                    if (types.length > 0) {
-                        for (String type : types) {
-                            factSchema.addRole(rs.getString("role"), type);
-                        }
-                    }
-                    else {
-                        factSchema.addRole(rs.getString("role"), typeFromDB);
-                    }
-                }
-            } catch (SQLException e) {
-                throw new Exception("Error while selecting fact schema meta 
data", e);
-            } finally {
-                if (rs != null) {
-                    try {
-                        rs.close();
-                    } catch (SQLException e) {
-                        /* ignore */
-                    }
-                }
-                if (ps != null) {
-                    try {
-                        ps.close();
-                    } catch (SQLException e) {
-                        /* ignore */
-                    }
-                }
-            }
+            factSchema = loadFactSchema(factSchemaURN, con);
         } catch (Exception e) {
-            logger.error("Error while creating fact schema", e);
+            logger.error("Error while loading fact schema", e);
             factSchema = null;
         } finally {
             try {
                 con.close();
             } catch (Throwable t) { /* ignore */}
         }
-        
+
+        return factSchema;
+    }
+
+    private FactSchema loadFactSchema(String factSchemaURN, Connection con) 
throws Exception {
+        FactSchema factSchema = null;
+        PreparedStatement ps = null;
+        ResultSet rs = null;
+        try {
+            String selectFactSchema = "SELECT factschemata.name AS schemaURN, 
factroles.name AS role, factroles.type AS type FROM factroles JOIN factschemata 
ON ( factschemata.id = factroles.factschema_id ) WHERE factschemata.name = ?";
+            ps = con.prepareStatement(selectFactSchema);
+            ps.setString(1, factSchemaURN);
+            rs = ps.executeQuery();
+
+            boolean first = true;
+            while (rs.next()) {
+                if (first) {
+                    factSchema = new FactSchema();
+                    factSchema.setFactSchemaURN(rs.getString("schemaURN"));
+                    first = false;
+                }
+                String typeFromDB = rs.getString("type");
+                String[] types = typeFromDB.split(",");
+                if (types.length > 0) {
+                    for (String type : types) {
+                        factSchema.addRole(rs.getString("role"), type);
+                    }
+                } else {
+                    factSchema.addRole(rs.getString("role"), typeFromDB);
+                }
+            }
+        } catch (SQLException e) {
+            throw new Exception("Error while selecting fact schema meta data", 
e);
+        } finally {
+            if (rs != null) {
+                try {
+                    rs.close();
+                } catch (SQLException e) {
+                    /* ignore */
+                }
+            }
+            if (ps != null) {
+                try {
+                    ps.close();
+                } catch (SQLException e) {
+                    /* ignore */
+                }
+            }
+        }
+
         return factSchema;
     }
 
@@ -246,7 +256,7 @@ public class DerbyFactStore implements F
             for (String role : factSchema.getRoles()) {
                 ps.setInt(1, factSchemaId);
                 ps.setString(2, role);
-                
+
                 StringBuilder typeList = new StringBuilder();
                 boolean first = true;
                 for (String type : factSchema.getTypesOfRole(role)) {
@@ -318,4 +328,106 @@ public class DerbyFactStore implements F
         }
     }
 
+    @Override
+    public void addFact(Fact fact) throws Exception {
+        Connection con = null;
+        try {
+            con = DriverManager.getConnection(DB_URL);
+            this.addFact(fact, con);
+        } catch (Exception e) {
+            throw new Exception("Error while inserting new fact", e);
+        } finally {
+            try {
+                con.close();
+            } catch (Throwable t) { /* ignore */}
+        }
+
+        logger.info("Fact created for {}", fact.getFactSchemaURN());
+    }
+
+    private void addFact(Fact fact, Connection con) throws Exception {
+        FactSchema factSchema = this.loadFactSchema(fact.getFactSchemaURN(), 
con);
+        if (factSchema != null) {
+            String factSchemaB64 = 
Base64.encodeBase64URLSafeString(fact.getFactSchemaURN().getBytes());
+
+            StringBuilder insertSB = new StringBuilder("INSERT INTO 
").append(factSchemaB64).append('(');
+            StringBuilder valueSB = new StringBuilder(" VALUES (");
+            Map<String,Integer> roleIndexMap = new HashMap<String,Integer>();
+            boolean firstRole = true;
+            int roleIndex = 0;
+            for (String role : factSchema.getRoles()) {
+                if (!firstRole) {
+                    insertSB.append(',');
+                    valueSB.append(',');
+                }
+                insertSB.append(role);
+                valueSB.append('?');
+                firstRole = false;
+
+                roleIndex++;
+                roleIndexMap.put(role, roleIndex);
+            }
+            insertSB.append(')').append(valueSB).append(')');
+
+            PreparedStatement ps = null;
+            try {
+                ps = con.prepareStatement(insertSB.toString(), 
PreparedStatement.RETURN_GENERATED_KEYS);
+                for (String role : fact.getRoles()) {
+                    Integer roleIdx = roleIndexMap.get(role);
+                    if (roleIdx == null) {
+                        throw new Exception("Unknown role '" + role + "' for 
fact schema "
+                                            + fact.getFactSchemaURN());
+                    } else {
+                        ps.setString(roleIdx, role);
+                    }
+                }
+                ps.executeUpdate();
+                ResultSet rs = ps.getGeneratedKeys();
+                int factId = -1;
+                if (rs.next()) {
+                    factId = rs.getInt(1);
+                }
+                if (factId < 0) {
+                    throw new Exception("Could not obtain fact ID after 
insert");
+                }
+
+                logger.info("Inserted new fact with ID {} into fact schema 
table {}", factId, factSchemaB64);
+            } catch (SQLException e) {
+                throw new Exception("Error while writing fact into database", 
e);
+            } finally {
+                if (ps != null) {
+                    try {
+                        ps.close();
+                    } catch (SQLException e) {
+                        /* ignore */
+                    }
+                }
+            }
+
+        } else {
+            throw new Exception("Unknown fact schema " + 
fact.getFactSchemaURN());
+        }
+    }
+
+    @Override
+    public void addFacts(Set<Fact> factSet) throws Exception {
+        
+        // TODO Improve roll back behavior if single fact of set could not be 
committed
+
+        Connection con = null;
+        try {
+            con = DriverManager.getConnection(DB_URL);
+            for (Fact fact : factSet) {
+                this.addFact(fact, con);
+                logger.info("Fact created for {}", fact.getFactSchemaURN());
+            }
+        } catch (Exception e) {
+            throw new Exception("Error while inserting new facts", e);
+        } finally {
+            try {
+                con.close();
+            } catch (Throwable t) { /* ignore */}
+        }
+    }
+
 }

Added: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java?rev=1140586&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/model/Fact.java
 Tue Jun 28 13:15:21 2011
@@ -0,0 +1,97 @@
+package org.apache.stanbol.factstore.model;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.stanbol.commons.jsonld.JsonLd;
+import org.apache.stanbol.commons.jsonld.JsonLdIRI;
+import org.apache.stanbol.commons.jsonld.JsonLdResource;
+
+public class Fact {
+
+    private String factSchemaURN;
+    
+    private Map<String, List<String>> roleMap = new 
HashMap<String,List<String>>();
+    
+    public String getFactSchemaURN() {
+        return factSchemaURN;
+    }
+
+    public void setFactSchemaURN(String factSchemaURN) {
+        this.factSchemaURN = factSchemaURN;
+    }
+
+    public void addRole(String role, String type) {
+        if (this.roleMap.get(role) == null) {
+            this.roleMap.put(role, new ArrayList<String>());
+        }
+        List<String> types = this.roleMap.get(role);
+        types.add(type);
+    }
+    
+    public Set<String> getRoles() {
+        return this.roleMap.keySet();
+    }
+
+    public List<String> getTypesOfRole(String role) {
+        return this.roleMap.get(role);
+    }
+
+    public static Fact factFromJsonLd(JsonLd jsonLd) {
+        Fact fact = null;
+        
+        if (jsonLd.getResourceSubjects().size() == 1) {
+            String subject = jsonLd.getResourceSubjects().iterator().next();
+            fact = resourceToFact(jsonLd, jsonLd.getResource(subject));
+        }
+        
+        return fact;
+    }
+    
+    public static Set<Fact> factsFromJsonLd(JsonLd jsonLd) {
+        Set<Fact> facts = new HashSet<Fact>();
+        
+        if (jsonLd.getResourceSubjects().size() > 1) {
+            for (String subject : jsonLd.getResourceSubjects()) {
+                Fact fact = resourceToFact(jsonLd, 
jsonLd.getResource(subject));
+                if (fact != null) {
+                    facts.add(fact);
+                }
+            }
+        }
+        
+        return facts;
+    }
+    
+    private static Fact resourceToFact(JsonLd jsonLd, JsonLdResource resource) 
{
+        Fact fact = null;
+        String schemaURN = jsonLd.unCURIE(resource.getProfile());
+        
+        if (schemaURN != null && !schemaURN.isEmpty()) {
+            Map<String, Object> propMap = resource.getPropertyMap();
+            if (propMap.size() > 1) {
+                fact = new Fact();
+                fact.setFactSchemaURN(schemaURN);
+                for (String role : propMap.keySet()) {
+                    if (propMap.get(role) instanceof String) {
+                        String strType = (String) propMap.get(role);
+                        fact.addRole(role, strType);
+                    }
+                    else if (propMap.get(role) instanceof JsonLdIRI) {
+                        JsonLdIRI iriType = (JsonLdIRI) propMap.get(role);
+                        fact.addRole(role, jsonLd.unCURIE(iriType.getIRI()));
+                    }
+                    else {
+                        fact.addRole(role, propMap.get(role).toString());
+                    }
+                }
+            }
+        }
+        
+        return fact;
+    }
+}

Modified: 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/FactsResource.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/FactsResource.java?rev=1140586&r1=1140585&r2=1140586&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/FactsResource.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/main/java/org/apache/stanbol/factstore/web/resource/FactsResource.java
 Tue Jun 28 13:15:21 2011
@@ -2,9 +2,12 @@ package org.apache.stanbol.factstore.web
 
 import static javax.ws.rs.core.MediaType.TEXT_HTML;
 
+import java.util.Set;
+
 import javax.servlet.ServletContext;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
@@ -14,11 +17,14 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
+import org.apache.stanbol.commons.jsonld.JsonLd;
+import org.apache.stanbol.commons.jsonld.JsonLdParser;
 import org.apache.stanbol.commons.jsonld.JsonLdProfile;
 import org.apache.stanbol.commons.jsonld.JsonLdProfileParser;
 import org.apache.stanbol.commons.web.base.ContextHelper;
 import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
 import org.apache.stanbol.factstore.api.FactStore;
+import org.apache.stanbol.factstore.model.Fact;
 import org.apache.stanbol.factstore.model.FactSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,7 +56,7 @@ public class FactsResource extends BaseS
         if (validationResponse != null) {
             return validationResponse;
         }
-        
+
         logger.info("Request for getting existing fact schema {}", 
factSchemaURN);
 
         FactSchema factSchema = this.factStore.getFactSchema(factSchemaURN);
@@ -73,7 +79,7 @@ public class FactsResource extends BaseS
         }
 
         logger.info("Request for putting new fact schema {}", factSchemaURN);
-        
+
         JsonLdProfile profile = null;
         try {
             profile = JsonLdProfileParser.parseProfile(jsonLdProfileString);
@@ -105,6 +111,59 @@ public class FactsResource extends BaseS
         return Response.status(Status.CREATED).build();
     }
 
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response postFacts(String jsonLdFacts) {
+        JsonLd jsonLd = null;
+        try {
+            jsonLd = JsonLdParser.parse(jsonLdFacts);
+        } catch (Exception e) {
+            /* ignore here */
+        }
+
+        if (jsonLd == null) {
+            return Response.status(Status.BAD_REQUEST).entity("Could not parse 
provided JSON-LD structure.")
+                    .build();
+        }
+
+        if (jsonLd.getResourceSubjects().size() < 2) {
+            // post a single fact
+            Fact fact = Fact.factFromJsonLd(jsonLd);
+            if (fact != null) {
+                logger.info("Request for posting new fact for {}", 
fact.getFactSchemaURN());
+                try {
+                    this.factStore.addFact(fact);
+                } catch (Exception e) {
+                    logger.error("Error adding new fact", e);
+                    return 
Response.status(Status.INTERNAL_SERVER_ERROR).entity(
+                        "Error while adding new fact to the 
database.").build();
+                }
+            } else {
+                return Response.status(Status.BAD_REQUEST).entity(
+                    "Could not extract fact from JSON-LD input.").build();
+            }
+        } else {
+            // post multiple facts
+            Set<Fact> facts = Fact.factsFromJsonLd(jsonLd);
+            if (facts != null) {
+                logger.info("Request for posting a set of new facts");
+                try {
+                    this.factStore.addFacts(facts);
+                } catch (Exception e) {
+                    logger.error("Error adding new facts", e);
+                    return 
Response.status(Status.INTERNAL_SERVER_ERROR).entity(
+                        "Error while adding new facts to the 
database.").build();
+                }
+            } else {
+                return Response.status(Status.BAD_REQUEST).entity(
+                    "Could not extract facts from JSON-LD input.").build();
+            }
+        }
+
+        return Response.status(Status.OK).build();
+    }
+
     private Response standardValidation(String factSchemaURN) {
         if (this.factStore == null) {
             return Response.status(Status.INTERNAL_SERVER_ERROR).entity(

Modified: 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java?rev=1140586&r1=1140585&r2=1140586&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/FactStoreMock.java
 Tue Jun 28 13:15:21 2011
@@ -1,7 +1,10 @@
 package org.apache.stanbol.factstore;
 
+import java.util.Set;
+
 import org.apache.stanbol.commons.jsonld.JsonLdCommon;
 import org.apache.stanbol.factstore.api.FactStore;
+import org.apache.stanbol.factstore.model.Fact;
 import org.apache.stanbol.factstore.model.FactSchema;
 
 public class FactStoreMock implements FactStore {
@@ -29,4 +32,16 @@ public class FactStoreMock implements Fa
         return null;
     }
 
+    @Override
+    public void addFact(Fact fact) throws Exception {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void addFacts(Set<Fact> factSet) throws Exception {
+        // TODO Auto-generated method stub
+        
+    }
+
 }

Added: 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java?rev=1140586&view=auto
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java
 (added)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/model/FactTest.java
 Tue Jun 28 13:15:21 2011
@@ -0,0 +1,193 @@
+package org.apache.stanbol.factstore.model;
+
+import static org.junit.Assert.*;
+
+import java.util.Set;
+
+import org.apache.stanbol.commons.jsonld.JsonLd;
+import org.apache.stanbol.commons.jsonld.JsonLdIRI;
+import org.apache.stanbol.commons.jsonld.JsonLdResource;
+import org.junit.Test;
+
+public class FactTest {
+
+    @Test
+    public void testFactFromJsonLd() {
+        JsonLd jsonLd = new JsonLd();
+        jsonLd.addNamespacePrefix("http://iks-project.eu/ont/";, "iks");
+        jsonLd.addNamespacePrefix("http://upb.de/persons/";, "upb");
+        
+        JsonLdResource factResource = new JsonLdResource();
+        factResource.setProfile("iks:employeeOf");
+        factResource.putProperty("person", new JsonLdIRI("upb:bnagel"));
+        factResource.putProperty("organization", new 
JsonLdIRI("http://uni-paderborn.de";));
+        jsonLd.put(factResource);
+        
+        Fact fact = Fact.factFromJsonLd(jsonLd);
+        assertEquals("http://iks-project.eu/ont/employeeOf";, 
fact.getFactSchemaURN());
+        assertEquals(2, fact.getRoles().size());
+        
+        boolean rolePersonOK = false;
+        boolean roleOrgaOK = false;
+        for (String role : fact.getRoles()) {
+            if (role.equals("person")) {
+                assertEquals(1, fact.getTypesOfRole(role).size());
+                assertEquals("http://upb.de/persons/bnagel";, 
fact.getTypesOfRole(role).get(0));
+                rolePersonOK = true;
+            }
+            if (role.equals("organization")) {
+                assertEquals(1, fact.getTypesOfRole(role).size());
+                assertEquals("http://uni-paderborn.de";, 
fact.getTypesOfRole(role).get(0));
+                roleOrgaOK = true;
+            }
+        }
+        assertTrue(rolePersonOK);
+        assertTrue(roleOrgaOK);
+    }
+
+    @Test
+    public void testFactFromJsonLdMultiFacts() {
+        JsonLd jsonLd = new JsonLd();
+        jsonLd.addNamespacePrefix("http://iks-project.eu/ont/";, "iks");
+        jsonLd.addNamespacePrefix("http://upb.de/persons/";, "upb");
+        
+        JsonLdResource fact1Resource = new JsonLdResource();
+        fact1Resource.setSubject("fact1");
+        fact1Resource.setProfile("iks:employeeOf");
+        fact1Resource.putProperty("person", new JsonLdIRI("upb:bnagel"));
+        fact1Resource.putProperty("organization", new 
JsonLdIRI("http://uni-paderborn.de";));
+        jsonLd.put(fact1Resource);
+
+        JsonLdResource fact2Resource = new JsonLdResource();
+        fact2Resource.setSubject("fact2");
+        fact2Resource.setProfile("iks:employeeOf");
+        fact2Resource.putProperty("person", new JsonLdIRI("upb:fchrist"));
+        fact2Resource.putProperty("organization", new 
JsonLdIRI("http://uni-paderborn.de";));
+        jsonLd.put(fact2Resource);
+        
+        Fact fact = Fact.factFromJsonLd(jsonLd);
+        assertNull(fact);
+    }
+    
+    @Test
+    public void testFactsFromJsonLdMultiFacts() {
+        JsonLd jsonLd = new JsonLd();
+        jsonLd.addNamespacePrefix("http://iks-project.eu/ont/";, "iks");
+        jsonLd.addNamespacePrefix("http://upb.de/persons/";, "upb");
+        
+        JsonLdResource fact1Resource = new JsonLdResource();
+        fact1Resource.setSubject("fact1");
+        fact1Resource.setProfile("iks:employeeOf");
+        fact1Resource.putProperty("person", new JsonLdIRI("upb:bnagel"));
+        fact1Resource.putProperty("organization", new 
JsonLdIRI("http://uni-paderborn.de";));
+        jsonLd.put(fact1Resource);
+
+        JsonLdResource fact2Resource = new JsonLdResource();
+        fact2Resource.setSubject("fact2");
+        fact2Resource.setProfile("iks:employeeOf");
+        fact2Resource.putProperty("person", new JsonLdIRI("upb:fchrist"));
+        fact2Resource.putProperty("organization", new 
JsonLdIRI("http://uni-paderborn.de";));
+        jsonLd.put(fact2Resource);
+        
+        Set<Fact> facts = Fact.factsFromJsonLd(jsonLd);
+        assertNotNull(facts);
+        assertEquals(2, facts.size());
+        for (Fact fact : facts) {
+            assertEquals("http://iks-project.eu/ont/employeeOf";, 
fact.getFactSchemaURN());
+            assertEquals(2, fact.getRoles().size());
+            
+            boolean rolePersonOK = false;
+            boolean roleOrgaOK = false;
+            for (String role : fact.getRoles()) {
+                if (role.equals("person")) {
+                    assertEquals(1, fact.getTypesOfRole(role).size());
+                    
assertTrue(fact.getTypesOfRole(role).get(0).startsWith("http://upb.de/persons/";));
+                    rolePersonOK = true;
+                }
+                if (role.equals("organization")) {
+                    assertEquals(1, fact.getTypesOfRole(role).size());
+                    assertEquals("http://uni-paderborn.de";, 
fact.getTypesOfRole(role).get(0));
+                    roleOrgaOK = true;
+                }
+            }
+            assertTrue(rolePersonOK);
+            assertTrue(roleOrgaOK);
+        }
+    }
+    
+    @Test
+    public void testFactsFromJsonLdMultiFactsMultiSchema() {
+        JsonLd jsonLd = new JsonLd();
+        jsonLd.addNamespacePrefix("http://iks-project.eu/ont/";, "iks");
+        jsonLd.addNamespacePrefix("http://upb.de/persons/";, "upb");
+        
+        JsonLdResource fact1Resource = new JsonLdResource();
+        fact1Resource.setSubject("fact1");
+        fact1Resource.setProfile("iks:employeeOf");
+        fact1Resource.putProperty("person", new JsonLdIRI("upb:bnagel"));
+        fact1Resource.putProperty("organization", new 
JsonLdIRI("http://uni-paderborn.de";));
+        jsonLd.put(fact1Resource);
+
+        JsonLdResource fact2Resource = new JsonLdResource();
+        fact2Resource.setSubject("fact2");
+        fact2Resource.setProfile("iks:friendOf");
+        fact2Resource.putProperty("person", new JsonLdIRI("upb:bnagel"));
+        fact2Resource.putProperty("friend", new JsonLdIRI("upb:fchrist"));
+        jsonLd.put(fact2Resource);
+        
+        Set<Fact> facts = Fact.factsFromJsonLd(jsonLd);
+        assertNotNull(facts);
+        assertEquals(2, facts.size());
+        boolean fact1OK = false;
+        boolean fact2OK = false;
+        for (Fact fact : facts) {
+            if 
(fact.getFactSchemaURN().equals("http://iks-project.eu/ont/employeeOf";)) {
+                assertEquals("http://iks-project.eu/ont/employeeOf";, 
fact.getFactSchemaURN());
+                assertEquals(2, fact.getRoles().size());
+                
+                boolean rolePersonOK = false;
+                boolean roleOrgaOK = false;
+                for (String role : fact.getRoles()) {
+                    if (role.equals("person")) {
+                        assertEquals(1, fact.getTypesOfRole(role).size());
+                        assertEquals("http://upb.de/persons/bnagel";, 
fact.getTypesOfRole(role).get(0));
+                        rolePersonOK = true;
+                    }
+                    if (role.equals("organization")) {
+                        assertEquals(1, fact.getTypesOfRole(role).size());
+                        assertEquals("http://uni-paderborn.de";, 
fact.getTypesOfRole(role).get(0));
+                        roleOrgaOK = true;
+                    }
+                }
+                assertTrue(rolePersonOK);
+                assertTrue(roleOrgaOK);
+                fact1OK = true;
+            }
+            if 
(fact.getFactSchemaURN().equals("http://iks-project.eu/ont/friendOf";)) {
+                assertEquals("http://iks-project.eu/ont/friendOf";, 
fact.getFactSchemaURN());
+                assertEquals(2, fact.getRoles().size());
+                
+                boolean rolePersonOK = false;
+                boolean roleFriendOK = false;
+                for (String role : fact.getRoles()) {
+                    if (role.equals("person")) {
+                        assertEquals(1, fact.getTypesOfRole(role).size());
+                        assertEquals("http://upb.de/persons/bnagel";, 
fact.getTypesOfRole(role).get(0));
+                        rolePersonOK = true;
+                    }
+                    if (role.equals("friend")) {
+                        assertEquals(1, fact.getTypesOfRole(role).size());
+                        assertEquals("http://upb.de/persons/fchrist";, 
fact.getTypesOfRole(role).get(0));
+                        roleFriendOK = true;
+                    }
+                }
+                assertTrue(rolePersonOK);
+                assertTrue(roleFriendOK);
+                fact2OK = true;
+            }
+
+        }
+        assertTrue(fact1OK);
+        assertTrue(fact2OK);
+    }
+}

Modified: 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/FactsResourceTest.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/FactsResourceTest.java?rev=1140586&r1=1140585&r2=1140586&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/FactsResourceTest.java
 (original)
+++ 
incubator/stanbol/trunk/factstore/src/test/java/org/apache/stanbol/factstore/web/resource/FactsResourceTest.java
 Tue Jun 28 13:15:21 2011
@@ -78,4 +78,34 @@ public class FactsResourceTest {
                     "test2");
         assertTrue(response.getStatus() == Status.CREATED.getStatusCode());
     }
+
+    @Test
+    public void testPostSingleFact() {
+        FactsResource fr = new FactsResource(this.servletContext);
+
+        Response response = fr
+                
.postFacts("{\"@context\":{\"iks\":\"http://iks-project.eu/ont/\",\"upb\":\"http://upb.de/persons/\"},\"@profile\":\"iks:employeeOf\",\"person\":{\"@iri\":\"upb:bnagel\"},\"organization\":{\"@iri\":\"http://uni-paderborn.de\"}}";);
+
+        assertTrue(response.getStatus() == Status.OK.getStatusCode());
+    }
+
+    @Test
+    public void testPostMultiFacts() {
+        FactsResource fr = new FactsResource(this.servletContext);
+
+        Response response = fr
+                
.postFacts("{\"@context\":{\"iks\":\"http://iks-project.eu/ont/\",\"upb\":\"http://upb.de/persons/\"},\"@profile\":\"iks:employeeOf\",\"@\":[{\"person\":{\"@iri\":\"upb:bnagel\"},\"organization\":{\"@iri\":\"http://uni-paderborn.de\"}},{\"person\":{\"@iri\":\"upb:fchrist\"},\"organization\":{\"@iri\":\"http://uni-paderborn.de\"}}]}";);
+
+        assertTrue(response.getStatus() == Status.OK.getStatusCode());
+    }
+
+    @Test
+    public void testPostMultiFactsDifferentTypes() {
+        FactsResource fr = new FactsResource(this.servletContext);
+
+        Response response = fr
+                
.postFacts("{\"@context\":{\"iks\":\"http://iks-project.eu/ont/\",\"upb\":\"http://upb.de/persons/\"},\"@\":[{\"@profile\":\"iks:employeeOf\",\"person\":{\"@iri\":\"upb:bnagel\"},\"organization\":{\"@iri\":\"http://uni-paderborn.de\"}},{\"@profile\":\"iks:friendOf\",\"person\":{\"@iri\":\"upb:bnagel\"},\"friend\":{\"@iri\":\"upb:fchrist\"}}]}";);
+
+        assertTrue(response.getStatus() == Status.OK.getStatusCode());
+    }
 }


Reply via email to