Bug 865: Moved filesystem model cache related functionality 31/14431/2
authorTony Tkacik <ttkacik@cisco.com>
Thu, 22 Jan 2015 13:27:31 +0000 (14:27 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Mon, 26 Jan 2015 10:42:46 +0000 (11:42 +0100)
Moved static utilities from deprecated implementation of file-system
cache to non-deprecated Helium implementation in order
to ease removal of deprecation classes.

Change-Id: Iecf71444c3532c7fdadea9a5cd34a91837165007
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/SourceIdentifier.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/FilesystemSchemaSourceCache.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/repo/FilesystemSchemaCachingProvider.java

index ce3b7dd8c9af2d9181691ab2148db594889f4894..2a688b3ff8347ede6894e73093dcd51e65f28010 100644 (file)
@@ -10,11 +10,12 @@ package org.opendaylight.yangtools.yang.model.repo.api;
 import com.google.common.annotations.Beta;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
-
+import java.util.regex.Pattern;
 import org.opendaylight.yangtools.concepts.Identifier;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.objcache.ObjectCache;
 import org.opendaylight.yangtools.objcache.ObjectCacheFactory;
+import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
 
 /**
  * YANG Schema source identifier
@@ -44,6 +45,18 @@ public final class SourceIdentifier implements Identifier, Immutable {
      */
     public static final String NOT_PRESENT_FORMATTED_REVISION = "0000-00-00";
 
+    /**
+     *
+     * Simplified compiled revision pattern in format YYYY-mm-dd, which checks
+     * only distribution of number elements.
+     * <p>
+     * For checking if supplied string is real date, use {@link SimpleDateFormatUtil}
+     * instead.
+     *
+     */
+    public static final Pattern REVISION_PATTERN = Pattern.compile("\\d\\d\\d\\d-\\d\\d-\\d\\d");
+
+
     private static final ObjectCache CACHE = ObjectCacheFactory.getObjectCache(SourceIdentifier.class);
     private static final long serialVersionUID = 1L;
     private final String revision;
index 3478953a0607b7e02e2eb6b4646fbda0557ee1e9..e0d8e6cbb96731f3f80e1c673a16caf3d9ae0326 100644 (file)
@@ -7,14 +7,17 @@
  */
 package org.opendaylight.yangtools.yang.model.repo.util;
 
+import com.google.common.annotations.Beta;
 import com.google.common.base.Objects;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.Futures;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.FileVisitResult;
@@ -23,9 +26,14 @@ import java.nio.file.Path;
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.StandardCopyOption;
 import java.nio.file.attribute.BasicFileAttributes;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
@@ -35,7 +43,6 @@ import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource.Costs;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
-import org.opendaylight.yangtools.yang.model.util.repo.FilesystemSchemaCachingProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,7 +94,7 @@ public final class FilesystemSchemaSourceCache<T extends SchemaSourceRepresentat
     private static final Pattern CACHED_FILE_PATTERN =
             Pattern.compile(
                     "(?<moduleName>[^@]+)" +
-                    "(@(?<revision>" + FilesystemSchemaCachingProvider.REVISION_PATTERN + "))?");
+                    "(@(?<revision>" + SourceIdentifier.REVISION_PATTERN + "))?");
 
     /**
      * Restore cache state
@@ -109,7 +116,7 @@ public final class FilesystemSchemaSourceCache<T extends SchemaSourceRepresentat
 
     @Override
     public synchronized CheckedFuture<? extends T, SchemaSourceException> getSource(final SourceIdentifier sourceIdentifier) {
-        final File file = FilesystemSchemaCachingProvider.sourceIdToFile(toLegacy(sourceIdentifier), storageDirectory);
+        final File file = sourceIdToFile(sourceIdentifier, storageDirectory);
         if(file.exists() && file.canRead()) {
             LOG.trace("Source {} found in cache as {}", sourceIdentifier, file);
             final SchemaSourceRepresentation restored = storageAdapters.get(representation).restore(sourceIdentifier, file);
@@ -135,15 +142,74 @@ public final class FilesystemSchemaSourceCache<T extends SchemaSourceRepresentat
     }
 
     private File sourceIdToFile(final T source) {
-        return FilesystemSchemaCachingProvider.sourceIdToFile(toLegacy(source.getIdentifier()), storageDirectory);
+        return sourceIdToFile(source.getIdentifier(), storageDirectory);
+    }
+    /*
+     *  FIXME: Move of code from deprecated FilesystemSchemaCachingProvider
+     *  to reduce cycle. Decrease visibility once FilesystemSchemaCachingProvider
+     *  is removed.
+     */
+    @Beta
+    public static File sourceIdToFile(final SourceIdentifier identifier, final File storageDirectory) {
+        final String rev = identifier.getRevision();
+        final File file;
+        if (Strings.isNullOrEmpty(rev)) {
+            file = findFileWithNewestRev(identifier, storageDirectory);
+        } else {
+            file = new File(storageDirectory, identifier.toYangFilename());
+        }
+        return file;
     }
 
-    private void storeSource(final File file, final T schemaRepresentation) {
-        storageAdapters.get(representation).store(file, schemaRepresentation);
+    private static File findFileWithNewestRev(final SourceIdentifier identifier, final File storageDirectory) {
+        File[] files = storageDirectory.listFiles(new FilenameFilter() {
+            final Pattern p = Pattern.compile(Pattern.quote(identifier.getName()) + "(\\.yang|@\\d\\d\\d\\d-\\d\\d-\\d\\d.yang)");
+
+            @Override
+            public boolean accept(final File dir, final String name) {
+                return p.matcher(name).matches();
+            }
+        });
+
+        if (files.length == 0) {
+            return new File(storageDirectory, identifier.toYangFilename());
+        }
+        if (files.length == 1) {
+            return files[0];
+        }
+
+        File file = null;
+        TreeMap<Date, File> map = new TreeMap<>();
+        for (File sorted : files) {
+            String fileName = sorted.getName();
+            Matcher m = SourceIdentifier.REVISION_PATTERN.matcher(fileName);
+            if (m.find()) {
+                String revStr = m.group();
+                /*
+                 * FIXME: Consider using string for comparison.
+                 * String is comparable, pattern check tested format
+                 * so comparing as ASCII string should be sufficient
+                 */
+                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+                try {
+                    Date d = df.parse(revStr);
+                    map.put(d, sorted);
+                } catch (ParseException e) {
+                    LOG.info("Unable to parse date from yang file name");
+                    map.put(new Date(0L), sorted);
+                }
+
+            } else {
+                map.put(new Date(0L), sorted);
+            }
+        }
+        file = map.lastEntry().getValue();
+
+        return file;
     }
 
-    private static org.opendaylight.yangtools.yang.model.util.repo.SourceIdentifier toLegacy(final SourceIdentifier identifier) {
-        return new org.opendaylight.yangtools.yang.model.util.repo.SourceIdentifier(identifier.getName(), Optional.fromNullable(identifier.getRevision()));
+    private void storeSource(final File file, final T schemaRepresentation) {
+        storageAdapters.get(representation).store(file, schemaRepresentation);
     }
 
     private static abstract class StorageAdapter<T extends SchemaSourceRepresentation> {
index 2c243b2e2458d3e21123ee3f53deb27e7cbdadc3..deb4fe038cd91e67594cd428020f8bcfdd93de4f 100644 (file)
@@ -16,17 +16,11 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStreamWriter;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.opendaylight.yangtools.yang.model.repo.util.FilesystemSchemaSourceCache;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -159,56 +153,9 @@ public final class FilesystemSchemaCachingProvider<I> extends AbstractCachingSch
     }
 
     public static File sourceIdToFile(final SourceIdentifier identifier, final File storageDirectory) {
-        File file = null;
-        String rev = identifier.getRevision();
-        if (rev == null || rev.isEmpty()) {
-            file = findFileWithNewestRev(identifier, storageDirectory);
-        } else {
-            file = new File(storageDirectory, identifier.toYangFilename());
-        }
-        return file;
-    }
-
-    private static File findFileWithNewestRev(final SourceIdentifier identifier, final File storageDirectory) {
-        File[] files = storageDirectory.listFiles(new FilenameFilter() {
-            final Pattern p = Pattern.compile(Pattern.quote(identifier.getName()) + "(\\.yang|@\\d\\d\\d\\d-\\d\\d-\\d\\d.yang)");
-
-            @Override
-            public boolean accept(final File dir, final String name) {
-                return p.matcher(name).matches();
-            }
-        });
-
-        if (files.length == 0) {
-            return new File(storageDirectory, identifier.toYangFilename());
-        }
-        if (files.length == 1) {
-            return files[0];
-        }
-
-        File file = null;
-        TreeMap<Date, File> map = new TreeMap<>();
-        for (File sorted : files) {
-            String fileName = sorted.getName();
-            Matcher m = REVISION_PATTERN.matcher(fileName);
-            if (m.find()) {
-                String revStr = m.group();
-                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
-                try {
-                    Date d = df.parse(revStr);
-                    map.put(d, sorted);
-                } catch (ParseException e) {
-                    LOG.info("Unable to parse date from yang file name");
-                    map.put(new Date(0L), sorted);
-                }
-
-            } else {
-                map.put(new Date(0L), sorted);
-            }
-        }
-        file = map.lastEntry().getValue();
-
-        return file;
+        org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier newIdentifier =
+                org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier.create(identifier.getName(), Optional.fromNullable(identifier.getRevision()));
+        return FilesystemSchemaSourceCache.sourceIdToFile(newIdentifier, storageDirectory);
     }
 
     public static FilesystemSchemaCachingProvider<String> createFromStringSourceProvider(