[Mulgara-svn] r469 - in branches/mgr-58/src/jar: resolver/java/org/mulgara/resolver resolver-spi/java/org/mulgara/resolver/spi

andrae at mulgara.org andrae at mulgara.org
Thu Oct 11 06:13:26 UTC 2007


Author: andrae
Date: 2007-10-11 01:13:25 -0500 (Thu, 11 Oct 2007)
New Revision: 469

Modified:
   branches/mgr-58/src/jar/resolver-spi/java/org/mulgara/resolver/spi/DatabaseMetadata.java
   branches/mgr-58/src/jar/resolver-spi/java/org/mulgara/resolver/spi/SecurityAdapterInitializer.java
   branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/BootstrapOperation.java
   branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseMetadataImpl.java
   branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
   branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseSecurityAdapterInitializer.java
   branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java
Log:
Eliminating reliance on introspecting the ServerURI from DatabaseMetadata,
replacing calls to getServerURI with calls to the appropriate comparison/getter
method.



Modified: branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/BootstrapOperation.java
===================================================================
--- branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/BootstrapOperation.java	2007-10-10 21:04:14 UTC (rev 468)
+++ branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/BootstrapOperation.java	2007-10-11 06:13:25 UTC (rev 469)
@@ -100,8 +100,8 @@
     long serverURIType = systemResolver.localizePersistent(
         new URIReferenceImpl(databaseMetadata.getServerURIType()));
 
-    URI serverURI = retrieveOrCreateServerURI(systemResolver, bootstrapModel, rdfType, serverURIType, metadata);
-    databaseMetadata.setServerURI(serverURI); // Also sets the system-model-uri (appends a #)
+//    URI serverURI = retrieveOrCreateServerURI(systemResolver, bootstrapModel, rdfType, serverURIType, metadata);
+//    databaseMetadata.setServerURI(serverURI); // Also sets the system-model-uri (appends a #)
 
     long systemModel = systemResolver.localizePersistent(
         new URIReferenceImpl(databaseMetadata.getSystemModelURI()));

Modified: branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseMetadataImpl.java
===================================================================
--- branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseMetadataImpl.java	2007-10-10 21:04:14 UTC (rev 468)
+++ branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseMetadataImpl.java	2007-10-11 06:13:25 UTC (rev 469)
@@ -94,7 +94,9 @@
   private long systemModelNode = -1;
   private long systemModelTypeNode = -1;
   private long rdfTypeNode = -1;
+
   private String serverName;
+  private String orgId;
 
 
   /**
@@ -119,7 +121,15 @@
     this.securityDomainURI = securityDomainURI;
 
     // Set server name from the path part of the server URI.
-    serverName = getServerName(uri);
+    String[] names = extractNameAndOrgId(uri);
+    this.serverName = names[0];
+    this.orgId = names[1];
+    try {
+      serverURI = new URI("rdfdb", this.serverName + "~" + this.orgId, null, null, null);
+    } catch (URISyntaxException eu) {
+      throw new IllegalArgumentException("Unable to obtain serverURI from databaseURI: " + uri, eu);
+    }
+    systemModelURI = serverURI.resolve("/");
   }
 
 
@@ -161,29 +171,79 @@
     return hostnameAliases;
   }
 
-  private String getServerName(URI serverURI) {
+  /**
+   * @return String[2] := { serverName, orgId }
+   */
+  private String[] extractNameAndOrgId(URI serverURI) {
+    final String DEFAULT_SERVER_NAME = "no_server_name";
+    final String DEFAULT_ORG_ID = "no.organisation.id";
+
     if (serverURI.getPath() != null && !serverURI.getPath().equals("")) {
       logger.debug("serverURI.path not null/empty: " + serverURI.getPath());
-      return serverURI.getPath().replaceAll("/", "");
+      return new String[] {
+          serverURI.getPath().replaceAll("/", ""),
+          invertAuthority(serverURI.getAuthority())
+      };
     } else if (serverURI.getScheme().equals("local")) {
       logger.debug("serverURI.scheme not null/empty: " + serverURI.getScheme());
       if (serverURI.getAuthority() != null && !serverURI.getAuthority().equals("")) {
         logger.debug("serverURI.authority not null/empty: " + serverURI.getAuthority());
-        return serverURI.getAuthority();
+        return new String[] {
+          serverURI.getAuthority(),
+          DEFAULT_ORG_ID
+        };
       }
       if (serverURI.getSchemeSpecificPart() != null && !serverURI.getSchemeSpecificPart().equals("")) {
         logger.debug("serverURI.ssp not null/empty: " + serverURI.getSchemeSpecificPart());
-        return serverURI.getSchemeSpecificPart();
+        return new String[] {
+          serverURI.getSchemeSpecificPart(),
+          DEFAULT_ORG_ID
+        };
       }
     }
 
-    return "no_server_name_found";
+    return new String[] { DEFAULT_SERVER_NAME, DEFAULT_ORG_ID };
   }
 
+  /**
+   * The join of the reverse of the split. ie.
+   * 
+   * invertAuthority = (join ".") . reverse . (split ".")
+   */
+  private String invertAuthority(String auth) {
+    String[] components = auth.split("\\.");
+    StringBuilder result = new StringBuilder(auth.length());
+
+    result.append(components[components.length - 1]);
+    for (int i = components.length - 2; i >= 0; i--) {
+      result.append(".");
+      result.append(components[i]);
+    }
+
+    return result.toString();
+  }
+
   public String getServerName() {
     return serverName;
   }
 
+  public String getOrganisationId() {
+    return orgId;
+  }
+
+  public String getServerAuthority() {
+    return serverURI.getAuthority();
+  }
+
+  public URI modelNameToModelURI(String modelName, String def) throws URISyntaxException {
+    return new URI(
+        serverURI.getScheme(),
+        serverURI.getAuthority(),
+        "/" + modelName, // JDK barfs if path doesn't have leading '/'
+        def,
+        null).normalize(); // Removes any extra '/' if the path already had a leading '/'
+  }
+
   public long getSystemModelNode()
   {
     if (systemModelNode == -1) {
@@ -322,7 +382,7 @@
     this.preallocatedModelNode = preallocatedModelNode;
   }
 
-
+/*
   protected void setServerURI(URI serverURI) throws URISyntaxException {
     if (serverURI == null) {
       throw new IllegalArgumentException("Setting null serverURI in Database Metadata");
@@ -333,8 +393,8 @@
     this.serverURI = serverURI;
     this.systemModelURI = new URI(serverURI.getScheme(), serverURI.getAuthority(), serverURI.getPath(), "");
   }
-
-  public URI getServerURI() {
-    return serverURI;
-  }
+*/
+//  public URI getServerURI() {
+//    return serverURI;
+//  }
 }

Modified: branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
===================================================================
--- branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java	2007-10-10 21:04:14 UTC (rev 468)
+++ branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java	2007-10-11 06:13:25 UTC (rev 469)
@@ -801,24 +801,29 @@
       }
       return modelURL;
     } else {
-      URI serverURI = metadata.getServerURI();
       try {
-        URI modelURI = new URI(serverURI.getScheme(),
-            serverURI.getAuthority(),
-            serverURI.getPath(),
-            modelURL.getQuery(),
-            modelURL.getFragment());
+        URI modelURI = metadata.modelNameToModelURI(modelURL.getFragment(), modelURL.getQuery());
         if (logger.isDebugEnabled()) {
           logger.debug(modelURL + " determined to be Internal: " + modelURI);
         }
         return modelURI;
       } catch (URISyntaxException eu) {
-        throw new QueryException("Invalid model URI generated from serverURI: " +
-            serverURI + " and modelURL: " + modelURL, eu);
+        throw new QueryException("Invalid model URI generated from modelURL: " + modelURL, eu);
       }
     }
   }
 
+  /**
+   * FIXME: We need to replace this ad-hoc mess with scheme based acceptance
+   * functions registered by mulgara client-protocol handlers.
+   *
+   * For the moment the following URL's are recognised as local:
+   *  local://org-id/serverName#model
+   *  local:///org-id/serverName#model
+   *  ...://hostname/serverName#model
+   *  rdfdb://serverName~org-id/model
+   *
+   */
   private boolean isInternalModelURL(URI modelURL) throws QueryException {
     if (modelURL == null) {
       throw new IllegalArgumentException("Null 'modelURL' passed to isInternalModelURL");
@@ -833,7 +838,7 @@
     }
 
     if ("local".equals(modelURL.getScheme())) {
-      if ((modelURL.getAuthority() != null && metadata.getServerName().equals(modelURL.getAuthority())) ||
+      if ((modelURL.getAuthority() != null && metadata.getOrganisationId().equals(modelURL.getAuthority())) ||
           (modelURL.getPath() != null && ("/" + metadata.getServerName()).equals(modelURL.getPath()))) {
         return true;
       } else {
@@ -841,15 +846,13 @@
             " doesn't match server-name: " + metadata.getServerName());
       }
     }
-    if (modelURL.getPath() == null || !("/" + metadata.getServerName()).equals(modelURL.getPath())) {
-      return false;
-    }
-    if (modelURL.getScheme().equals("rdfdb")) {
-      if (modelURL.getAuthority().equals(metadata.getServerURI().getAuthority())) {
+
+    if (modelURL.getScheme() != null && modelURL.getScheme().equals("rdfdb")) {
+      if (modelURL.getAuthority().equals(metadata.getServerAuthority())) {
         return true;
       } else {
         throw new QueryException("rdfdb: scheme URL: " + modelURL +
-            " doesn't match server-name: " + metadata.getServerName());
+            " doesn't match server-name: " + metadata.getServerAuthority());
       }
     }
 
@@ -857,18 +860,23 @@
     if (host == null) {
       return false;
     }
-    if (metadata.getHostnameAliases().contains(host.toLowerCase())) {
-      return true;
+
+    if (modelURL.getPath() != null && ("/" + metadata.getServerName()).equals(modelURL.getPath())) {
+      if (metadata.getHostnameAliases().contains(host.toLowerCase())) {
+        return true;
+      } else {
+        // Check with a DNS server to see if this host is recognised
+        try {
+          InetAddress addr = InetAddress.getByName(host);
+          return metadata.getHostnameAliases().contains(addr.getHostName())
+              || metadata.getHostnameAliases().contains(addr.getCanonicalHostName())
+              || metadata.getHostnameAliases().contains(addr.getHostAddress());
+        } catch (UnknownHostException uhe) {
+          return false;
+        }
+      }
     }
 
-    // Check with a DNS server to see if this host is recognised
-    try {
-      InetAddress addr = InetAddress.getByName(host);
-      return metadata.getHostnameAliases().contains(addr.getHostName())
-          || metadata.getHostnameAliases().contains(addr.getCanonicalHostName())
-          || metadata.getHostnameAliases().contains(addr.getHostAddress());
-    } catch (UnknownHostException uhe) {
-      return false;
-    }
+    return false;
   }
 }

Modified: branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseSecurityAdapterInitializer.java
===================================================================
--- branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseSecurityAdapterInitializer.java	2007-10-10 21:04:14 UTC (rev 468)
+++ branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/DatabaseSecurityAdapterInitializer.java	2007-10-11 06:13:25 UTC (rev 469)
@@ -86,12 +86,14 @@
   // Methods implementing SecurityAdapterInitializer
   //
 
-  public URI getServerURI() throws InitializerException
+//  public URI getServerURI() throws InitializerException
+/*
   {
     checkState();
 
     return databaseMetadata.getServerURI();
   }
+*/
 
   public SessionFactory getUnsecuredSessionFactory() throws InitializerException
   {

Modified: branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java
===================================================================
--- branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java	2007-10-10 21:04:14 UTC (rev 468)
+++ branches/mgr-58/src/jar/resolver/java/org/mulgara/resolver/StringPoolSession.java	2007-10-11 06:13:25 UTC (rev 469)
@@ -112,8 +112,8 @@
   /** Extracts STORE_FLAG */
   static final int STORE_MASK = 2;
 
-  /** The unique {@link URI} naming this database. */
-  private final URI databaseURI;
+  /** Database Metadata */
+  private final DatabaseMetadata metadata;
 
   /** The set of alternative hostnames for the current host. */
   private final Set hostnameAliases;
@@ -150,7 +150,7 @@
       logger.debug("Constructing StringPoolSession " + System.identityHashCode(this), new Throwable());
     }
 
-    this.databaseURI = metadata.getServerURI();
+    this.metadata = metadata;
     this.hostnameAliases = metadata.getHostnameAliases();
     this.persistentStringPool = persistentStringPool;
     this.persistentNodePool = persistentNodePool;
@@ -608,34 +608,29 @@
   }
 
 
+  /**
+   * Map to/from Absolute values.
+   * Note: The encoding of the modelName as a fragment within the store is a
+   * historical artifact kept solely to remain backwards compatible with old
+   * stores - if this becomes a problem: sed -e 's/^#/\//' should migrate backups;
+   * unfortunately migrating stores is naturally harder.
+   */
   private SPObject mapAbsolute(SPObject spObject) {
-    if (
-        spObject != null &&
-        spObject.getTypeCategory() == SPObject.TypeCategory.URI
-    ) {
+    if (spObject != null && spObject.getTypeCategory() == SPObject.TypeCategory.URI) {
       URI uri = ((SPURI)spObject).getURI();
       if (!uri.isAbsolute()) {
         // Model URIs are stored as a relative URI containing only a fragment.
         // Relative URIs with both a query string and a fragment are also used
         // for views.
 
-        SPObjectFactory spObjectFactory =
-            persistentStringPool.getSPObjectFactory();
+        SPObjectFactory spObjectFactory = persistentStringPool.getSPObjectFactory();
 
         try {
-          // Construct an absolute URI based on the database URI.
-          String query = uri.getQuery();
-          String ssp = databaseURI.getSchemeSpecificPart();
-          if (query != null) ssp += '?' + query;
-          spObject = spObjectFactory.newSPURI(new URI(
-              databaseURI.getScheme(), ssp, uri.getFragment()
-          ));
+          spObject = spObjectFactory.newSPURI(
+              metadata.modelNameToModelURI(uri.getFragment(), uri.getQuery()));
         } catch (URISyntaxException ex) {
-          logger.warn(
-              "Cannot create absolute URI with base:\"" + databaseURI +
-              "\", query:\"" + uri.getQuery() + "\", fragment:\"" +
-              uri.getFragment() + "\"", ex
-          );
+          logger.warn("Cannot create absolute URI with query:\"" + uri.getQuery() +
+              "\", fragment:\"" + uri.getFragment() + "\"", ex);
         }
       }
     }
@@ -644,90 +639,22 @@
 
 
   private SPObject mapRelative(SPObject spObject) {
-    if (
-        spObject != null &&
-        spObject.getTypeCategory() == SPObject.TypeCategory.URI
-    ) {
+    if (spObject != null && spObject.getTypeCategory() == SPObject.TypeCategory.URI) {
       URI uri = ((SPURI)spObject).getURI();
 
-      // Check if the URI is relative to the database URI.
-      // The user info of the uri is ignored and is stripped from the URI if it
-      // ends up being relativized.
-      String scheme = uri.getScheme();
-      String fragment = uri.getFragment();
-
-      if (
-          scheme != null && scheme.equals(databaseURI.getScheme()) &&
-          fragment != null
-      ) {
-        if (databaseURI.isOpaque()) {
-          // databaseURI is opaque.
-          if (uri.isOpaque()) {
-            // Get the query string.
-            // We have to do it this way for opaque URIs.
-            String ssp = uri.getSchemeSpecificPart();
-            String query;
-            int qIndex = ssp.indexOf('?');
-            if (qIndex >= 0) {
-              query = ssp.substring(qIndex + 1);
-              ssp = ssp.substring(0, qIndex);
-            } else {
-              query = null;
-            }
-
-            if (ssp.equals(databaseURI.getSchemeSpecificPart())) {
-              // Construct a new relative uri with just the fragment and
-              // optional query string.
-              SPObjectFactory spObjectFactory =
-                  persistentStringPool.getSPObjectFactory();
-              try {
-                spObject = spObjectFactory.newSPURI(new URI(
-                    null, null, null, query, fragment
-                ));
-              } catch (URISyntaxException ex) {
-                logger.warn(
-                    "Cannot create relative URI with fragment:\"" + fragment +
-                    "\"", ex
-                );
-              }
-            }
-          }
-        } else {
-          // databaseURI is hierarchial.
-          String path;
-          String host;
-
-          if (
-              !uri.isOpaque() && (
-                  uri.getSchemeSpecificPart().equals(
-                      databaseURI.getSchemeSpecificPart()
-                  ) || (
-                      (host = uri.getHost()) != null &&
-                      uri.getPort() == databaseURI.getPort() &&
-                      (path = uri.getPath()) != null &&
-                      path.equals(databaseURI.getPath()) &&
-                      hostnameAliases.contains(host.toLowerCase())
-                  )
-              )
-          ) {
-            // Construct a new relative uri with just the fragment and
-            // optional query string.
-            SPObjectFactory spObjectFactory =
-                persistentStringPool.getSPObjectFactory();
-            try {
-              spObject = spObjectFactory.newSPURI(new URI(
-                  null, null, null, uri.getQuery(), fragment
-              ));
-            } catch (URISyntaxException ex) {
-              logger.warn(
-                  "Cannot create relative URI with fragment:\"" + fragment +
-                  "\"", ex
-              );
-            }
-          }
+      // Convert rdfdb://serverName~org.id/serverName?def into #serverName?def
+      // Note that the system model is defined to be rdfdb://serverName~org.id/
+      if (uri.toString().startsWith(metadata.getSystemModelURI().toString())) {
+        SPObjectFactory spObjectFactory = persistentStringPool.getSPObjectFactory();
+        try {
+          spObject = spObjectFactory.newSPURI(
+              new URI(null, null, null, uri.getQuery(), uri.getPath().substring(1)));
+        } catch (URISyntaxException ex) {
+          logger.warn("Cannot create relative URI with fragment:\"" + uri.getPath().substring(1) + "\"", ex);
         }
       }
     }
+
     return spObject;
   }
 

Modified: branches/mgr-58/src/jar/resolver-spi/java/org/mulgara/resolver/spi/DatabaseMetadata.java
===================================================================
--- branches/mgr-58/src/jar/resolver-spi/java/org/mulgara/resolver/spi/DatabaseMetadata.java	2007-10-10 21:04:14 UTC (rev 468)
+++ branches/mgr-58/src/jar/resolver-spi/java/org/mulgara/resolver/spi/DatabaseMetadata.java	2007-10-11 06:13:25 UTC (rev 469)
@@ -29,6 +29,7 @@
 
 // Java 2 standard packages
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Set;
 
 // Local packages
@@ -57,8 +58,11 @@
    * @return String the server name.
    */
   public String getServerName();
+  public String getOrganisationId();
+  public String getServerAuthority();
+  public URI modelNameToModelURI(String modelName, String def) throws URISyntaxException;
 
-  public URI getServerURI();
+//  public URI getServerURI();
 
   public URI getSecurityDomainURI();
   public URI getSystemModelURI();

Modified: branches/mgr-58/src/jar/resolver-spi/java/org/mulgara/resolver/spi/SecurityAdapterInitializer.java
===================================================================
--- branches/mgr-58/src/jar/resolver-spi/java/org/mulgara/resolver/spi/SecurityAdapterInitializer.java	2007-10-10 21:04:14 UTC (rev 468)
+++ branches/mgr-58/src/jar/resolver-spi/java/org/mulgara/resolver/spi/SecurityAdapterInitializer.java	2007-10-11 06:13:25 UTC (rev 469)
@@ -67,7 +67,7 @@
    * @return the URI of the server
    * @throws InitializerException if the URI can't be determined
    */
-  public URI getServerURI() throws InitializerException;
+//  public URI getServerURI() throws InitializerException;
 
   /**
    * @return a {@link SessionFactory} that produces {@link Session}s which




More information about the Mulgara-svn mailing list