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
*/
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;
*/
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;
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;
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;
private static final Pattern CACHED_FILE_PATTERN =
Pattern.compile(
"(?<moduleName>[^@]+)" +
- "(@(?<revision>" + FilesystemSchemaCachingProvider.REVISION_PATTERN + "))?");
+ "(@(?<revision>" + SourceIdentifier.REVISION_PATTERN + "))?");
/**
* Restore cache state
@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);
}
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> {
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;
}
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(