From 9f7db615c41afaac4d21661291ed28b33715090a Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Fri, 24 Jan 2014 15:12:57 +0100 Subject: [PATCH] Fix for Bug 351. Signed-off-by: Martin Vitez --- .../repo/FilesystemSchemaCachingProvider.java | 69 ++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/repo/FilesystemSchemaCachingProvider.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/repo/FilesystemSchemaCachingProvider.java index f1a6e80dd8..19fd10eb20 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/repo/FilesystemSchemaCachingProvider.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/repo/FilesystemSchemaCachingProvider.java @@ -11,16 +11,28 @@ 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.io.StringBufferInputStream; +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.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; public class FilesystemSchemaCachingProvider extends AbstractCachingSchemaSourceProvider { + private static final Logger LOG = LoggerFactory.getLogger(FilesystemSchemaCachingProvider.class); private final File storageDirectory; private final Function transformationFunction; @@ -78,7 +90,60 @@ public class FilesystemSchemaCachingProvider extends AbstractCachingSchemaSou } private File toFile(SourceIdentifier identifier) { - return new File(storageDirectory, identifier.toYangFilename()); + File file = null; + String rev = identifier.getRevision(); + if (rev == null || rev.isEmpty()) { + file = findFileWithNewestRev(identifier); + } else { + file = new File(storageDirectory, identifier.toYangFilename()); + } + return file; + } + + private File findFileWithNewestRev(final SourceIdentifier identifier) { + File[] files = storageDirectory.listFiles(new FilenameFilter() { + final String regex = identifier.getName() + "(\\.yang|@\\d\\d\\d\\d-\\d\\d-\\d\\d.yang)"; + @Override + public boolean accept(File dir, String name) { + if (name.matches(regex)) { + return true; + } else { + return false; + } + } + }); + + if (files.length == 0) { + return new File(storageDirectory, identifier.toYangFilename()); + } + if (files.length == 1) { + return files[0]; + } + + File file = null; + Pattern p = Pattern.compile("\\d\\d\\d\\d-\\d\\d-\\d\\d"); + TreeMap map = new TreeMap<>(); + for (File sorted : files) { + String fileName = sorted.getName(); + Matcher m = p.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; } private static final Function NOOP_TRANSFORMATION = new Function() { @@ -95,7 +160,7 @@ public class FilesystemSchemaCachingProvider extends AbstractCachingSchemaSou directory.mkdirs(); return new FilesystemSchemaCachingProvider( SchemaSourceProviders.toAdvancedSchemaSourceProvider(liveProvider),// - directory, // + directory, // NOOP_TRANSFORMATION); } } -- 2.36.6