*/
package org.opendaylight.yangtools.yang.model.repo.api;
+import static org.opendaylight.yangtools.yang.common.YangConstants.RFC6020_YANG_FILE_EXTENSION;
+
import com.google.common.annotations.Beta;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import java.text.ParseException;
+import java.util.AbstractMap.SimpleImmutableEntry;
+import java.util.Map.Entry;
import java.util.Objects;
+import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
/**
* YANG Schema revision source identifier
/**
*
* Creates new YANG Schema revision source identifier for sources without
- * revision. {@link SourceIdentifier#NOT_PRESENT_FORMATTED_REVISION} as
- * default revision.
+ * a revision.
*
* @param name
* Name of schema
*/
RevisionSourceIdentifier(final String name) {
- this(name, NOT_PRESENT_FORMATTED_REVISION);
+ super(name);
}
/**
* default value will be used.
*/
RevisionSourceIdentifier(final String name, final Optional<String> formattedRevision) {
- this(name, formattedRevision.or(NOT_PRESENT_FORMATTED_REVISION));
+ super(name, formattedRevision);
}
/**
}
/**
- *
* Creates new YANG Schema revision source identifier for sources without
- * revision. {@link SourceIdentifier#NOT_PRESENT_FORMATTED_REVISION} as
- * default revision.
+ * a revision.
*
* @param moduleName
* Name of schema
return new RevisionSourceIdentifier(moduleName);
}
+ /**
+ * Creates a new RevisionSourceIdentifier based on the provided file name.
+ *
+ * @param fileName file name
+ * @throws IllegalArgumentException when fileName does not have correct format
+ * @throws NullPointerException when fileName is null
+ * @throws ParseException if the revision part has invalid format
+ */
+ public static RevisionSourceIdentifier fromFileName(final String fileName) throws ParseException {
+ final Entry<String, String> split = splitFileName(fileName);
+ if (split.getValue() != null) {
+ SimpleDateFormatUtil.getRevisionFormat().parse(split.getValue());
+ }
+
+ return new RevisionSourceIdentifier(split.getKey(), Optional.fromNullable(split.getValue()));
+ }
+
+ /**
+ * Creates a new RevisionSourceIdentifier based on the provided file name. This variant ignores any revision
+ * part.
+ *
+ * @param fileName file name
+ * @throws IllegalArgumentException when fileName does not have correct format
+ * @throws NullPointerException when fileName is null
+ */
+ public static RevisionSourceIdentifier fromFileNameLenientRevision(final String fileName) {
+ final Entry<String, String> split = splitFileName(fileName);
+ return new RevisionSourceIdentifier(split.getKey(), Optional.fromNullable(split.getValue()));
+ }
+
+ private static Entry<String, String> splitFileName(final String fileName) {
+ Preconditions.checkArgument(fileName.endsWith(RFC6020_YANG_FILE_EXTENSION),
+ "File name '%s' does not end with %s", fileName, RFC6020_YANG_FILE_EXTENSION);
+
+ final String noExt = fileName.substring(0, fileName.length() - RFC6020_YANG_FILE_EXTENSION.length());
+ final int atIndex = noExt.indexOf('@');
+ return atIndex == -1 ? new SimpleImmutableEntry<>(noExt, null)
+ : new SimpleImmutableEntry<>(noExt.substring(0, atIndex), noExt.substring(atIndex + 1));
+ }
+
@Override
public int hashCode() {
final int prime = 31;
@Override
public String toString() {
- return "RevisionSourceIdentifier [name=" + getName() + "@" + getRevision() + "]";
+ final StringBuilder sb = new StringBuilder("RevisionSourceIdentifier [name=");
+ sb.append(getName());
+
+ final String rev = getRevision();
+ if (rev != null) {
+ sb.append('@').append(rev);
+ }
+ return sb.append(']').toString();
}
}