X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-common%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fcommon%2FQNameModule.java;h=628af0c4ebfe964116ae6130ed4b0dcc57bff75e;hb=1a82a083eee3d050fea52250e88ccf4b38b21811;hp=22428e36d4b1afbef8e76ef22c090ca8a5d44f9b;hpb=f9cca8e6d90812f6fe7fc7914699daca77bab846;p=yangtools.git diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QNameModule.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QNameModule.java index 22428e36d4..628af0c4eb 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QNameModule.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QNameModule.java @@ -7,18 +7,22 @@ */ package org.opendaylight.yangtools.yang.common; +import com.google.common.base.Objects; import java.io.Serializable; import java.net.URI; import java.net.URISyntaxException; import java.util.Date; - import org.opendaylight.yangtools.concepts.Immutable; +import org.opendaylight.yangtools.objcache.ObjectCache; +import org.opendaylight.yangtools.objcache.ObjectCacheFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class QNameModule implements Immutable, Serializable { - private static final Logger LOG = LoggerFactory.getLogger(QNameModule.class); - private static final long serialVersionUID = 1L; +public final class QNameModule implements Immutable, Serializable { + private static final ObjectCache CACHE = ObjectCacheFactory.getObjectCache(QNameModule.class); + private static final Logger LOG = LoggerFactory.getLogger(QNameModule.class); + private static final QNameModule NULL_INSTANCE = new QNameModule(null, null); + private static final long serialVersionUID = 1L; //Nullable private final URI namespace; @@ -27,39 +31,77 @@ final class QNameModule implements Immutable, Serializable { private final Date revision; //Nullable - private final String formattedRevision; + private volatile String formattedRevision; private QNameModule(final URI namespace, final Date revision) { this.namespace = namespace; this.revision = revision; - if(revision != null) { - this.formattedRevision = SimpleDateFormatUtil.getRevisionFormat().format(revision); - } else { - this.formattedRevision = null; + } + + /** + * Look up specified module in the global cache and return a shared reference. + * + * @param module Module instance + * @return Cached instance, according to {@link ObjectCache} policy. + */ + public static QNameModule cachedReference(final QNameModule module) { + return CACHE.getReference(module); + } + + /** + * Create a new QName module instance with specified namespace/revision. + * + * @param namespace Module namespace + * @param revision Module revision + * @return A new, potentially shared, QNameModule instance + */ + public static QNameModule create(final URI namespace, final Date revision) { + if (namespace == null && revision == null) { + return NULL_INSTANCE; } + + return new QNameModule(namespace, revision); } - public static QNameModule create(final URI namespace, final Date revision) { - return new QNameModule(namespace, revision); - } + public String getFormattedRevision() { + if (revision == null) { + return null; + } - public String getFormattedRevision() { - return formattedRevision; - } + String ret = formattedRevision; + if (ret == null) { + ret = SimpleDateFormatUtil.getRevisionFormat().format(revision); + formattedRevision = ret; + } + + return ret; + } - public URI getNamespace() { - return namespace; - } + /** + * Returns the namespace of the module which is specified as argument of + * YANG Module namespace keyword. + * + * @return URI format of the namespace of the module + */ + public URI getNamespace() { + return namespace; + } - public Date getRevision() { - return revision; - } + /** + * Returns the revision date for the module. + * + * @return date of the module revision which is specified as argument of + * YANG Module revison keyword + */ + public Date getRevision() { + return revision; + } @Override public int hashCode() { final int prime = 31; int result = (namespace == null) ? 0 : namespace.hashCode(); - result = prime * result + ((formattedRevision == null) ? 0 : formattedRevision.hashCode()); + result = prime * result + ((revision == null) ? 0 : revision.hashCode()); return result; } @@ -72,18 +114,18 @@ final class QNameModule implements Immutable, Serializable { return false; } final QNameModule other = (QNameModule) obj; - if (namespace == null) { - if (other.namespace != null) { + if (revision == null) { + if (other.revision != null) { return false; } - } else if (!namespace.equals(other.namespace)) { + } else if (!revision.equals(other.revision)) { return false; } - if (formattedRevision == null) { - if (other.formattedRevision != null) { + if (namespace == null) { + if (other.namespace != null) { return false; } - } else if (!revision.equals(other.revision)) { + } else if (!namespace.equals(other.namespace)) { return false; } return true; @@ -108,7 +150,7 @@ final class QNameModule implements Immutable, Serializable { String query = ""; if (revision != null) { - query = "revision=" + formattedRevision; + query = "revision=" + getFormattedRevision(); } URI compositeURI = null; @@ -120,4 +162,9 @@ final class QNameModule implements Immutable, Serializable { } return compositeURI; } + + @Override + public String toString() { + return Objects.toStringHelper(this).omitNullValues().add("ns", getNamespace()).add("rev", getFormattedRevision()).toString(); + } }