Author: jsorel
Date: Mon Feb 19 10:45:28 2018
New Revision: 1824731

URL: http://svn.apache.org/viewvc?rev=1824731&view=rev
Log:
DataStore : add FileSystemProvider interface to declare format suffix,signature 
and factorize probContent implementations

Added:
    
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FileSystemProvider.java
Modified:
    
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java

Added: 
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FileSystemProvider.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FileSystemProvider.java?rev=1824731&view=auto
==============================================================================
--- 
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FileSystemProvider.java
 (added)
+++ 
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/FileSystemProvider.java
 Mon Feb 19 10:45:28 2018
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.internal.storage;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import org.apache.sis.storage.DataStoreException;
+import org.apache.sis.storage.DataStoreProvider;
+import org.apache.sis.storage.ProbeResult;
+import org.apache.sis.storage.StorageConnector;
+
+/**
+ * Files-related {@linkplain org.apache.sis.storage.DataStoreProvider 
provider}.
+ * This interface provides additional descriptive informations on the supported
+ * file types.
+ *
+ * @author Johann Sorel (Geomatys)
+ * @since 1.0
+ * @module
+ */
+public interface FileSystemProvider {
+
+    /**
+     * Get the list of this format mainly used file suffixes.
+     * If the provider uses multiple files, this method should return
+     * only the entry file suffixes.
+     * <p>
+     * For example : the shapefile format uses the files shp,shx,dbf,qix,...
+     * but this collection only return the shp suffix.
+     * </p>
+     *
+     * @return list of suffix, case insensitive, never null, can be empty.
+     */
+    Collection<String> getSuffix();
+
+    /**
+     * Binary and sometimes text formats often have a special header at the 
beginning
+     * of the file.
+     * This part of the file is call Signature or Magic number and is used by
+     * file explorers and applications to identify the file type.
+     *
+     * <p>Some format may declare multiple different signatures. Such case can
+     * happen for various reasons like historical evolution and changes on 
version updates.</p>
+     *
+     * <p>Default implementation returns an empty collection.</p>
+     *
+     * @return collection of signatures, never null, can be empty.
+     */
+    default Collection<byte[]> getSignature() {
+        return Collections.EMPTY_LIST;
+    }
+
+    /**
+     * Specialized implementation of {@linkplain 
DataStoreProvider#probeContent(org.apache.sis.storage.StorageConnector) 
probeContent}.
+     * This implementation checks the input signature.
+     *
+     * @param  connector information about the storage (URL, stream, JDBC 
connection, <i>etc</i>).
+     * @return {@link ProbeResult#SUPPORTED} if the given storage seems to be 
readable by the {@code DataStore}
+     *         instances created by this provider.
+     * @throws DataStoreException if an I/O or SQL error occurred. The error 
shall be unrelated to the logical
+     *         structure of the storage.
+     */
+    default ProbeResult probeContent(StorageConnector connector) throws 
DataStoreException {
+
+        final Collection<byte[]> signatures = getSignature();
+        if (signatures.isEmpty()) return ProbeResult.UNSUPPORTED_STORAGE;
+
+        final ByteBuffer buffer = connector.getStorageAs(ByteBuffer.class);
+        if (buffer != null) {
+            for (byte[] signature : signatures) {
+                try {
+                    if (buffer.remaining() < signature.length) {
+                        continue;
+                    }
+                    final byte[] candidate = new byte[signature.length];
+                    buffer.get(candidate);
+
+                    //compare signatures
+                    if (Arrays.equals(signature, candidate)) {
+                        return ProbeResult.SUPPORTED;
+                    }
+                } finally {
+                    buffer.reset();
+                }
+            }
+        }
+        return ProbeResult.UNSUPPORTED_STORAGE;
+    }
+
+}

Modified: 
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java?rev=1824731&r1=1824730&r2=1824731&view=diff
==============================================================================
--- 
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
 [UTF-8] Mon Feb 19 10:45:28 2018
@@ -102,7 +102,7 @@ public abstract class URIDataStore exten
      * @since   0.8
      * @module
      */
-    public abstract static class Provider extends DataStoreProvider {
+    public abstract static class Provider extends DataStoreProvider implements 
FileSystemProvider {
         /**
          * Description of the location parameter.
          */


Reply via email to