Author: alexdma
Date: Mon Jul 23 13:18:29 2012
New Revision: 1364623

URL: http://svn.apache.org/viewvc?rev=1364623&view=rev
Log:
* Fixed: Some ontology export methods were still using the graph storage key to 
rewrite import statements. This wasn't working well with ontologies created 
with a GraphContentInputSource. This fix finally solves STANBOL-649
* Change in the Session REST API: Multiple values for form param "scope" are 
now accepted. These values denote all and only the scopes to be appended to the 
session. Any other scope will be detached if it was appended earlier. This 
change is reflected in the Session HTML client by replacing the combo box with 
checkboxes in the scopes table and an "Update" button. Also added hidden form 
field and extra RESTful service to make sure that a POST with no parameters 
works and causes all scopes to be detached (STANBOL-700).
* Reinstated multiple parse attempts in the RESTful Scope and Session resources 
when POSTing the ontology content. Doing it from the GraphContentInputSource 
wouldn't work because, although it could reset the BufferedInputStream in order 
to retry, it could not to the same with the wrapped stream (STANBOL-422).

Modified:
    
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphContentInputSource.java
    
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java
    
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
    
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java
    
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java
    
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java
    
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/ScopeResource/index.ftl
    
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionResource/index.ftl

Modified: 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphContentInputSource.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphContentInputSource.java?rev=1364623&r1=1364622&r2=1364623&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphContentInputSource.java
 (original)
+++ 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/api/io/GraphContentInputSource.java
 Mon Jul 23 13:18:29 2012
@@ -127,7 +127,9 @@ public class GraphContentInputSource ext
         else formats = Collections.singleton(formatIdentifier);
 
         // TODO guess/lookahead the ontology ID and use it in the graph name.
-        UriRef name = new UriRef("ontonet" + "::" + 
getClass().getCanonicalName() + "-"
+        UriRef name = new UriRef(
+         //   "ontonet" + "::" + 
+        getClass().getCanonicalName() + "-"
                                  + System.currentTimeMillis());
 
         TripleCollection graph = null;

Modified: 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java?rev=1364623&r1=1364622&r2=1364623&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java
 (original)
+++ 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/AbstractOntologyCollectorImpl.java
 Mon Jul 23 13:18:29 2012
@@ -623,7 +623,8 @@ public abstract class AbstractOntologyCo
             for (OWLImportsDeclaration oldImp : o.getImportsDeclarations()) {
                 changes.add(new RemoveImport(o, oldImp));
                 String s = oldImp.getIRI().toString();
-                s = s.substring(s.indexOf("::") + 2, s.length());
+                // FIXME Ugly way to check, but we'll get through with it
+                if (s.contains("::")) s = s.substring(s.indexOf("::") + 2, 
s.length());
                 boolean managed = managedOntologies.contains(oldImp.getIRI());
                 // For space, always go up at least one
 

Modified: 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java?rev=1364623&r1=1364622&r2=1364623&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
 (original)
+++ 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/clerezza/ClerezzaOntologyProvider.java
 Mon Jul 23 13:18:29 2012
@@ -521,25 +521,34 @@ public class ClerezzaOntologyProvider im
      *            a second list that will store the level 1 import target 
keys, and is not passed to recursive
      *            calls. Will be ignored if null.
      */
-    private void fillImportsReverse(UriRef importing, List<UriRef> 
reverseImports, List<UriRef> level1Imports) {
+    private void fillImportsReverse(OWLOntologyID importing,
+                                    List<OWLOntologyID> reverseImports,
+                                    List<OWLOntologyID> level1Imports) {
         log.debug("Filling reverse imports for {}", importing);
+
         // Add the importing ontology first
         reverseImports.add(importing);
         if (level1Imports != null) level1Imports.add(importing);
+
         // Get the graph and explore its imports
-        TripleCollection graph = store.getTriples(importing);
+        TripleCollection graph // store.getTriples(importing);
+        = getStoredOntology(getPublicKey(importing), MGraph.class, false);
         Iterator<Triple> it = graph.filter(null, RDF.type, OWL.Ontology);
         if (!it.hasNext()) return;
         Iterator<Triple> it2 = graph.filter(it.next().getSubject(), 
OWL.imports, null);
         while (it2.hasNext()) {
+            // obj is the *original* import target
             Resource obj = it2.next().getObject();
             if (obj instanceof UriRef) {
-                UriRef key = new UriRef(getKey(IRI.create(((UriRef) 
obj).getUnicodeString())));
+                // Right now getKey() is returning the "private" storage ID
+                String key = getKey(IRI.create(((UriRef) 
obj).getUnicodeString()));
+                // TODO this will not be needed when getKey() and 
getPublicKey() return the proper public key.
+                OWLOntologyID oid = keymap.getReverseMapping(new UriRef(key));
                 // Check used for breaking cycles in the import graph.
                 // (Unoptimized, should not use contains() for stacks.)
-                if (!reverseImports.contains(key)) {
-                    if (level1Imports != null) level1Imports.add(key);
-                    fillImportsReverse(key, reverseImports, null);
+                if (!reverseImports.contains(oid)) {
+                    if (level1Imports != null) level1Imports.add(oid);
+                    fillImportsReverse(oid, reverseImports, null);
                 }
             }
         }
@@ -1290,7 +1299,7 @@ public class ClerezzaOntologyProvider im
         // Never try to import
         mgr.addIRIMapper(new PhonyIRIMapper(Collections.<IRI> emptySet()));
 
-        Set<UriRef> loaded = new HashSet<UriRef>();
+        Set<OWLOntologyID> loaded = new HashSet<OWLOntologyID>();
 
         TripleCollection graph = store.getTriples(graphName);
 
@@ -1302,9 +1311,9 @@ public class ClerezzaOntologyProvider im
             NonLiteral nl = itt.next().getSubject();
             if (nl instanceof UriRef) ontologyId = (UriRef) nl;
         }
-        List<UriRef> revImps = new Stack<UriRef>();
-        List<UriRef> lvl1 = new Stack<UriRef>();
-        fillImportsReverse(graphName, revImps, lvl1);
+        List<OWLOntologyID> revImps = new Stack<OWLOntologyID>();
+        List<OWLOntologyID> lvl1 = new Stack<OWLOntologyID>();
+        fillImportsReverse(keymap.getReverseMapping(graphName), revImps, lvl1);
 
         // If not set to merge (either by policy of by force), adopt the set 
import policy.
         if (!forceMerge && 
!ImportManagementPolicy.MERGE.equals(getImportManagementPolicy())) {
@@ -1314,7 +1323,7 @@ public class ClerezzaOntologyProvider im
             List<OWLOntologyChange> changes = new 
ArrayList<OWLOntologyChange>();
             OWLDataFactory df = OWLManager.getOWLDataFactory();
 
-            List<UriRef> listToUse;
+            List<OWLOntologyID> listToUse;
             switch (getImportManagementPolicy()) {
                 case FLATTEN:
                     listToUse = revImps;
@@ -1327,10 +1336,9 @@ public class ClerezzaOntologyProvider im
                     break;
             }
 
-            for (UriRef ref : listToUse)
-                if (!loaded.contains(ref) && !ref.equals(graphName)) {
-                    changes.add(new AddImport(o, 
df.getOWLImportsDeclaration(IRI.create(ref
-                            .getUnicodeString()))));
+            for (OWLOntologyID ref : listToUse)
+                if (!loaded.contains(ref) && 
!ref.equals(keymap.getReverseMapping(graphName))) {
+                    changes.add(new AddImport(o, 
df.getOWLImportsDeclaration(ref.getOntologyIRI())));
                     loaded.add(ref);
                 }
             o.getOWLOntologyManager().applyChanges(changes);
@@ -1349,10 +1357,12 @@ public class ClerezzaOntologyProvider im
             // The set of triples that will be excluded from the merge
             Set<Triple> exclusions = new HashSet<Triple>();
             // Examine all reverse imports
-            for (UriRef ref : revImps)
+            for (OWLOntologyID ref : revImps)
                 if (!loaded.contains(ref)) {
                     // Get the triples
-                    TripleCollection imported = store.getTriples(ref);
+                    TripleCollection imported =
+                    // store.getTriples(ref);
+                    getStoredOntology(getKey(ref), MGraph.class, false);
                     // For each owl:Ontology
                     Iterator<Triple> remove = imported.filter(null, RDF.type, 
OWL.Ontology);
                     while (remove.hasNext()) {

Modified: 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java?rev=1364623&r1=1364622&r2=1364623&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java
 (original)
+++ 
incubator/stanbol/trunk/ontologymanager/ontonet/src/main/java/org/apache/stanbol/ontologymanager/ontonet/impl/util/OntologyUtils.java
 Mon Jul 23 13:18:29 2012
@@ -302,6 +302,13 @@ public class OntologyUtils {
         return result;
     }
 
+    public static List<String> getPreferredFormats() {
+        List<String> result = new ArrayList<String>();
+        for (String f : preferredFormats)
+            result.add(f);
+        return result;
+    }
+
     public static void printOntology(OWLOntology o, PrintStream printer) {
 
         OWLOntologyManager mgr = OWLManager.createOWLOntologyManager();

Modified: 
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java?rev=1364623&r1=1364622&r2=1364623&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java
 (original)
+++ 
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/ScopeResource.java
 Mon Jul 23 13:18:29 2012
@@ -50,6 +50,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.SortedSet;
@@ -96,6 +98,7 @@ import org.apache.stanbol.ontologymanage
 import 
org.apache.stanbol.ontologymanager.ontonet.api.ontology.OntologyProvider;
 import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologyScope;
 import org.apache.stanbol.ontologymanager.ontonet.api.scope.OntologySpace;
+import org.apache.stanbol.ontologymanager.ontonet.impl.util.OntologyUtils;
 import org.apache.stanbol.ontologymanager.registry.api.RegistryManager;
 import org.apache.stanbol.ontologymanager.registry.api.model.Library;
 import org.apache.stanbol.ontologymanager.registry.io.LibrarySource;
@@ -224,11 +227,26 @@ public class ScopeResource extends BaseS
 
     @GET
     @Path("/core")
+    @Produces(value = {APPLICATION_JSON, N3, N_TRIPLE, RDF_JSON})
+    public Response getCoreSpaceGraph(@PathParam("scopeid") String scopeid,
+                                      @DefaultValue("false") 
@QueryParam("merge") boolean merge,
+                                      @Context UriInfo uriInfo,
+                                      @Context HttpHeaders headers) {
+        OntologySpace space = scope.getCoreSpace();
+        IRI prefix = IRI.create(getPublicBaseUri() + "ontonet/ontology/");
+        Graph o = space.export(Graph.class, merge, prefix);
+        ResponseBuilder rb = Response.ok(o);
+        addCORSOrigin(servletContext, rb, headers);
+        return rb.build();
+    }
+
+    @GET
+    @Path("/core")
     @Produces(value = {RDF_XML, TURTLE, X_TURTLE, MANCHESTER_OWL, 
FUNCTIONAL_OWL, OWL_XML, TEXT_PLAIN})
-    public Response getCoreSpace(@PathParam("scopeid") String scopeid,
-                                 @DefaultValue("false") @QueryParam("merge") 
boolean merge,
-                                 @Context UriInfo uriInfo,
-                                 @Context HttpHeaders headers) {
+    public Response getCoreSpaceOWL(@PathParam("scopeid") String scopeid,
+                                    @DefaultValue("false") 
@QueryParam("merge") boolean merge,
+                                    @Context UriInfo uriInfo,
+                                    @Context HttpHeaders headers) {
         OntologySpace space = scope.getCoreSpace();
         IRI prefix = IRI.create(getPublicBaseUri() + "ontonet/ontology/");
         OWLOntology o = space.export(OWLOntology.class, merge, prefix);
@@ -250,11 +268,26 @@ public class ScopeResource extends BaseS
 
     @GET
     @Path("/custom")
+    @Produces(value = {APPLICATION_JSON, N3, N_TRIPLE, RDF_JSON})
+    public Response getCustomSpaceGraph(@PathParam("scopeid") String scopeid,
+                                        @DefaultValue("false") 
@QueryParam("merge") boolean merge,
+                                        @Context UriInfo uriInfo,
+                                        @Context HttpHeaders headers) {
+        OntologySpace space = scope.getCustomSpace();
+        IRI prefix = IRI.create(getPublicBaseUri() + "ontonet/ontology/");
+        Graph o = space.export(Graph.class, merge, prefix);
+        ResponseBuilder rb = Response.ok(o);
+        addCORSOrigin(servletContext, rb, headers);
+        return rb.build();
+    }
+
+    @GET
+    @Path("/custom")
     @Produces(value = {RDF_XML, TURTLE, X_TURTLE, MANCHESTER_OWL, 
FUNCTIONAL_OWL, OWL_XML, TEXT_PLAIN})
-    public Response getCustomSpace(@PathParam("scopeid") String scopeid,
-                                   @DefaultValue("false") @QueryParam("merge") 
boolean merge,
-                                   @Context UriInfo uriInfo,
-                                   @Context HttpHeaders headers) {
+    public Response getCustomSpaceOWL(@PathParam("scopeid") String scopeid,
+                                      @DefaultValue("false") 
@QueryParam("merge") boolean merge,
+                                      @Context UriInfo uriInfo,
+                                      @Context HttpHeaders headers) {
         OntologySpace space = scope.getCustomSpace();
         IRI prefix = IRI.create(getPublicBaseUri() + "ontonet/ontology/");
         OWLOntology o = space.export(OWLOntology.class, merge, prefix);
@@ -588,15 +621,22 @@ public class ScopeResource extends BaseS
             // Then add the file
             OntologyInputSource<?> src = null;
             if (fileOk) {
-                try {
-                    // Use a buffered stream that can be reset for multiple 
attempts.
-                    InputStream content = new BufferedInputStream(new 
FileInputStream(file));
-                    src = new GraphContentInputSource(content, format, 
provider.getStore());
-                } catch (OntologyLoadingException e) {
-                    throw new WebApplicationException(e, BAD_REQUEST);
-                } catch (IOException e) {
-                    throw new WebApplicationException(e, BAD_REQUEST);
-                }
+                Collection<String> formats;
+                if (format == null || "".equals(format.trim())) formats = 
OntologyUtils.getPreferredFormats();
+                else formats = Collections.singleton(format);
+
+                for (String f : formats)
+                    try {
+                        // Use a buffered stream that can be reset for 
multiple attempts.
+                        InputStream content = new BufferedInputStream(new 
FileInputStream(file));
+                        src = new GraphContentInputSource(content, format, 
provider.getStore());
+                    } catch (OntologyLoadingException e) {
+                        // throw new WebApplicationException(e, BAD_REQUEST);
+                        continue;
+                    } catch (IOException e) {
+                        // throw new WebApplicationException(e, BAD_REQUEST);
+                        continue;
+                    }
             } else if (location != null) {
                 try {
                     src = new RootOntologyIRISource(location);
@@ -623,7 +663,11 @@ public class ScopeResource extends BaseS
                 // FIXME ugly but will have to do for the time being
                 String uri = key.split("::")[1];
                 if (uri != null && !uri.isEmpty()) {
-                    rb = Response.created(getCreatedResource(uri));
+                    rb = Response.seeOther(URI.create("/ontonet/ontology/" + 
scope.getID() + "/" + uri)/*
+                                                                               
                         * getCreatedResource
+                                                                               
                         * (
+                                                                               
                         * uri)
+                                                                               
                         */);
                 } else rb = Response.ok();
             } else rb = Response.status(INTERNAL_SERVER_ERROR);
         } else throw new WebApplicationException(BAD_REQUEST);

Modified: 
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java?rev=1364623&r1=1364622&r2=1364623&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java
 (original)
+++ 
incubator/stanbol/trunk/ontologymanager/web/src/main/java/org/apache/stanbol/ontologymanager/web/resources/SessionResource.java
 Mon Jul 23 13:18:29 2012
@@ -25,6 +25,7 @@ import static javax.ws.rs.core.MediaType
 import static javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA;
 import static javax.ws.rs.core.MediaType.TEXT_HTML;
 import static javax.ws.rs.core.MediaType.TEXT_PLAIN;
+import static javax.ws.rs.core.MediaType.WILDCARD;
 import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
 import static javax.ws.rs.core.Response.Status.CONFLICT;
 import static javax.ws.rs.core.Response.Status.FORBIDDEN;
@@ -49,6 +50,8 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.SortedSet;
@@ -94,6 +97,7 @@ import org.apache.stanbol.ontologymanage
 import org.apache.stanbol.ontologymanager.ontonet.api.session.Session;
 import 
org.apache.stanbol.ontologymanager.ontonet.api.session.SessionLimitException;
 import org.apache.stanbol.ontologymanager.ontonet.api.session.SessionManager;
+import org.apache.stanbol.ontologymanager.ontonet.impl.util.OntologyUtils;
 import org.apache.stanbol.ontologymanager.web.util.OntologyPrettyPrintResource;
 import org.coode.owlapi.manchesterowlsyntax.ManchesterOWLSyntaxOntologyFormat;
 import org.semanticweb.owlapi.model.IRI;
@@ -232,6 +236,13 @@ public class SessionResource extends Bas
     /*
      * Needed for freemarker
      */
+    public Set<OntologyScope> getAllScopes() {
+        return onMgr.getRegisteredScopes();
+    }
+
+    /*
+     * Needed for freemarker
+     */
     public Set<OntologyScope> getAppendableScopes() {
         Set<OntologyScope> notAppended = new HashSet<OntologyScope>();
         for (OntologyScope sc : onMgr.getRegisteredScopes())
@@ -242,10 +253,10 @@ public class SessionResource extends Bas
     /*
      * Needed for freemarker
      */
-    public Set<OntologyScope> getAppendedScopes() {
-        Set<OntologyScope> appended = new HashSet<OntologyScope>();
+    public Set<String> getAppendedScopes() {
+        Set<String> appended = new HashSet<String>();
         for (OntologyScope sc : onMgr.getRegisteredScopes())
-            if (session.getAttachedScopes().contains(sc.getID())) 
appended.add(sc);
+            if (session.getAttachedScopes().contains(sc.getID())) 
appended.add(sc.getID());
         return appended;
     }
 
@@ -536,10 +547,25 @@ public class SessionResource extends Bas
         return rb.build();
     }
 
-    @SuppressWarnings("unused")
+    @POST
+    @Produces({WILDCARD})
+    public Response emptyPost(@Context HttpHeaders headers) {
+        log.debug(" post(no data)");
+        for (OntologyScope sc : getAllScopes()) { // First remove appended 
scopes not in the list
+            String scid = sc.getID();
+            if (getAppendedScopes().contains(scid)) {
+                session.detachScope(scid);
+                log.info("Removed scope \"{]\".", scid);
+            }
+        }
+        ResponseBuilder rb = Response.ok();
+        addCORSOrigin(servletContext, rb, headers);
+        return rb.build();
+    }
+
     @POST
     @Consumes({MULTIPART_FORM_DATA})
-    @Produces({TEXT_HTML, TEXT_PLAIN, RDF_XML, TURTLE, X_TURTLE, N3})
+    @Produces({WILDCARD})
     public Response postOntology(FormDataMultiPart data, @Context HttpHeaders 
headers) {
         log.debug(" post(FormDataMultiPart data)");
         long before = System.currentTimeMillis();
@@ -548,7 +574,7 @@ public class SessionResource extends Bas
         IRI location = null;
         File file = null; // If found, it takes precedence over location.
         String format = null;
-        OntologyScope scope = null;
+        Set<String> toAppend = new HashSet<String>();
 
         for (BodyPart bpart : data.getBodyParts()) {
             log.debug("Found body part of type {}", bpart.getClass());
@@ -566,7 +592,8 @@ public class SessionResource extends Bas
                     throw new WebApplicationException(ex, BAD_REQUEST);
                 }
                 if (name.equals("scope")) {
-                    scope = onMgr.getScope(dbp.getValue());
+                    log.info("Request to append scope \"{}\".", 
dbp.getValue());
+                    toAppend.add(dbp.getValue());
                 }
             }
         }
@@ -575,24 +602,30 @@ public class SessionResource extends Bas
             // Then add the file
             OntologyInputSource<?> src = null;
             if (fileOk) { // File first
-                try {
-                    // Use a buffered stream that can be reset for multiple 
attempts.
-                    long b4buf = System.currentTimeMillis();
-                    InputStream content = new BufferedInputStream(new 
FileInputStream(file));
-                    // new FileInputStream(file);
-                    log.debug("Streams created in {} ms", 
System.currentTimeMillis() - b4buf);
-                    log.debug("Creating ontology input source...");
-                    b4buf = System.currentTimeMillis();
-                    src = new GraphContentInputSource(content, format, 
provider.getStore());
-                    log.debug("Done in {} ms", System.currentTimeMillis() - 
b4buf);
-                    log.debug("SUCCESS parse with format {}.", format);
-                } catch (OntologyLoadingException e) {
-                    log.error("FAILURE parse with format {}.", format);
-                    throw new WebApplicationException(e, BAD_REQUEST);
-                } catch (IOException e) {
-                    log.error("FAILURE parse with format {}.", format);
-                    throw new WebApplicationException(e, BAD_REQUEST);
-                }
+                Collection<String> formats;
+                if (format == null || "".equals(format.trim())) formats = 
OntologyUtils.getPreferredFormats();
+                else formats = Collections.singleton(format);
+
+                for (String f : formats)
+                    try {
+                        log.debug("Trying format {}.", f);
+                        long b4buf = System.currentTimeMillis();
+                        // Recreate the stream on each attempt
+                        InputStream content = new BufferedInputStream(new 
FileInputStream(file));
+                        log.debug("Streams created in {} ms", 
System.currentTimeMillis() - b4buf);
+                        log.debug("Creating ontology input source...");
+                        b4buf = System.currentTimeMillis();
+                        src = new GraphContentInputSource(content, f, 
provider.getStore());
+                        log.debug("Done in {} ms", System.currentTimeMillis() 
- b4buf);
+                        log.info("SUCCESS parse with format {}.", f);
+                    } catch (OntologyLoadingException e) {
+                        log.debug("FAILURE parse with format {}.", f);
+                        continue;
+                    } catch (IOException e) {
+                        log.debug("FAILURE parse with format {} (I/O error).", 
f);
+                        continue;
+                    }
+                log.debug("No more formats to try.");
             } else if (location != null) {
                 try {
                     src = new RootOntologyIRISource(location);
@@ -615,15 +648,30 @@ public class SessionResource extends Bas
                 log.debug("Addition done in {} ms.", 
System.currentTimeMillis() - b4add);
                 log.debug("Storage key : {}", key);
                 String uri = key.split("::")[1];
-                if (uri != null && !uri.isEmpty()) rb = 
Response.created(URI.create("/" + uri));
-                else rb = Response.ok();
+                if (uri != null && !uri.isEmpty()) rb = 
Response.seeOther(URI.create("/ontonet/session/"
+                                                                               
      + session.getID() + "/"
+                                                                               
      + uri));
+                else rb = Response.seeOther(URI.create("/ontonet/session/" + 
session.getID()));
             } else rb = Response.status(INTERNAL_SERVER_ERROR);
-        } else if (scope != null) { // Scope comes next
-            log.info("Attaching scope \"{}\" to session \"{}\".", 
scope.getID(), session.getID());
-            session.attachScope(scope.getID());
+        } else // Now check scopes
+        if (!toAppend.isEmpty() || (toAppend.isEmpty() && 
!getAppendedScopes().isEmpty())) {
+            for (OntologyScope sc : getAllScopes()) { // First remove appended 
scopes not in the list
+                String scid = sc.getID();
+                if (!toAppend.contains(scid) && 
getAppendedScopes().contains(scid)) {
+                    session.detachScope(scid);
+                    log.info("Removed scope \"{}\".", scid);
+                }
+            }
+            for (String scid : toAppend) { // Then add all the scopes in the 
list
+                if (!getAppendedScopes().contains(scid)) {
+                    log.info("Appending scope \"{}\" to session \"{}\".", 
scid, session.getID());
+                    session.attachScope(scid);
+                    log.info("Appended scope \"{}\".", scid);
+                }
+            }
             rb = Response.seeOther(URI.create("/ontonet/session/" + 
session.getID()));
         } else {
-            log.error("Nothing to add to session {}.", session.getID());
+            log.error("Nothing to do with session {}.", session.getID());
             throw new WebApplicationException(BAD_REQUEST);
         }
         // rb.header(HttpHeaders.CONTENT_TYPE, TEXT_HTML + "; charset=utf-8");

Modified: 
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/ScopeResource/index.ftl
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/ScopeResource/index.ftl?rev=1364623&r1=1364622&r2=1364623&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/ScopeResource/index.ftl
 (original)
+++ 
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/ScopeResource/index.ftl
 Mon Jul 23 13:18:29 2012
@@ -23,6 +23,7 @@
        
     <div class="panel" id="webview">
   
+  <br/>
   <!-- FIXME class names should be generic, and not bound to a specific 
functionality (here engines->reasoning services)-->
   <div class="enginelisting">
     <div class="collapsed">
@@ -85,7 +86,7 @@
   </div>
 
   <script>
-    $(".enginelisting p").click(function () {
+    $(".collapseheader").click(function () {
       $(this).parents("div").toggleClass("collapsed");
     });    
   </script>
@@ -101,7 +102,7 @@
         </tr>
         <#list ontologies as ontology>
           <tr>
-            <td><a 
href="/ontonet/ontology/${it.scope.ID}/${ontology}">${ontology}</a></td>
+            <td><a 
href="${it.publicBaseUri}ontonet/ontology/${it.scope.ID}/${ontology}">${ontology}</a></td>
           </tr>
         </#list>
       </div>

Modified: 
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionResource/index.ftl
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionResource/index.ftl?rev=1364623&r1=1364622&r2=1364623&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionResource/index.ftl
 (original)
+++ 
incubator/stanbol/trunk/ontologymanager/web/src/main/resources/org/apache/stanbol/ontologymanager/web/templates/org/apache/stanbol/ontologymanager/web/resources/SessionResource/index.ftl
 Mon Jul 23 13:18:29 2012
@@ -23,8 +23,15 @@
        
     <div class="panel" id="webview">
   
-    <h3>Load an ontology</h3>
-    <form method="POST" enctype="multipart/form-data" accept-charset="utf-8">
+  <br/>
+  <!-- FIXME class names should be generic, and not bound to a specific 
functionality (here engines->reasoning services)-->
+  <div class="enginelisting">
+    <div class="collapsed">
+      <p class="collapseheader"><b>Load an ontology</b></p>
+      <div class="collapsable">
+      <br/>
+      
+    <form id="loadfromfile" method="POST" enctype="multipart/form-data" 
accept-charset="utf-8">
     <fieldset>
       <legend>From a local file</legend>
       <p><b>File:</b> <input type="file" name="file"/> 
@@ -56,24 +63,19 @@
       </p>
     </fieldset>
     </form>
-    
-    <form method="POST" enctype="multipart/form-data" accept-charset="utf-8">
-    <fieldset>
-      <legend>Append a scope</legend>
-      <p><b>Scope ID:</b> 
-        <select name="scope">  
-        <option value="null">&lt;please select a scope&gt;</option>
-        <#list it.appendableScopes as scope>
-        <option value="${scope.ID}">${scope.ID}</option>
-        </#list>
-        </select>
-        <input type="submit" value="Append"/>
-      </p>
-    </fieldset>
-    </form>
   
   Note: OWL import targets will be included. Ontology loading is set to fail 
on missing imports.
 
+     </div>
+    </div> 
+  </div>
+
+  <script>
+    $(".collapseheader").click(function () {
+      $(this).parents("div").toggleClass("collapsed");
+    });    
+  </script>
+  
   <h3>Stored ontologies</h3>
   <#assign ontologies = it.ontologies>
   <div class="storeContents">
@@ -84,28 +86,34 @@
         </tr>
         <#list ontologies as ontology>
           <tr>
-            <td><a 
href="/ontonet/session/${it.session.ID}/${ontology}">${ontology}</a></td>
+            <td><a 
href="${it.publicBaseUri}ontonet/session/${it.session.ID}/${ontology}">${ontology}</a></td>
           </tr>
         </#list>
       </div>
     </table> <!-- allOntologies -->
   </div>
   
-  <h3>Appended Scopes</h3>
+  <form method="POST" enctype="multipart/form-data" accept-charset="utf-8">
+  <input type="hidden" name="sessionid" value="${it.session.ID}"/>
+  <h3>Appendable Scopes</h3>
   <div class="storeContents">
     <table id="appSc">
       <div>
         <tr>
-          <th>Name</th>
+          <th width="1%">Appended</th><th>Name</th>
         </tr>
-        <#list it.appendedScopes as appended>
+        <#assign scs = it.appendedScopes>
+        <#list it.allScopes as sc>
           <tr>
-            <td><a 
href="/ontonet/ontology/${appended.ID}">${appended.ID}</a></td>
+            <td><input type="checkbox" name="scope" 
value="${sc.ID}"${scs?seq_contains(sc.ID)?string(" checked", "")}/></td>
+            <td><a href="/ontonet/ontology/${sc.ID}">${sc.ID}</a></td>
           </tr>
         </#list>
       </div>
     </table> <!-- appSc -->
+    <input type="submit" value="Update"/>
   </div>
+  </form>
   
   </div> <!-- web view -->
 


Reply via email to