Split out yang-data-tree-{api,spi}
[yangtools.git] / data / yang-data-tree-api / src / main / java / org / opendaylight / yangtools / yang / data / tree / api / DataTreeConfiguration.java
diff --git a/data/yang-data-tree-api/src/main/java/org/opendaylight/yangtools/yang/data/tree/api/DataTreeConfiguration.java b/data/yang-data-tree-api/src/main/java/org/opendaylight/yangtools/yang/data/tree/api/DataTreeConfiguration.java
new file mode 100644 (file)
index 0000000..21d2bc8
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.tree.api;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+
+/**
+ * DataTree configuration class.
+ *
+ * <p>
+ * TreeConfig supports currently the following options:
+ * <ul>
+ * <li>treeType</li>
+ * <li>enable/disable unique indexes and unique constraint validation</li>
+ * <li>enable/disable mandatory nodes validation</li>
+ * </ul>
+ *
+ * <p>
+ * TreeConfig can be easily extended in order to support further data tree configuration options, like following:
+ * <ul>
+ * <li>enable/disable case exclusion validation</li>
+ * <li>enable/disable other indexes</li>
+ * <li>other schema aware validation options</li>
+ * </ul>
+ *
+ * <p>
+ * This can be useful when strict validation is not required or useful for some reasons.
+ */
+@Beta
+public class DataTreeConfiguration implements Immutable {
+    public static final DataTreeConfiguration DEFAULT_CONFIGURATION = new Builder(TreeType.CONFIGURATION)
+            .setMandatoryNodesValidation(true).build();
+    public static final DataTreeConfiguration DEFAULT_OPERATIONAL = new Builder(TreeType.OPERATIONAL)
+            .setMandatoryNodesValidation(true).build();
+
+    private final @NonNull TreeType treeType;
+    private final @NonNull YangInstanceIdentifier rootPath;
+    private final boolean uniqueIndexes;
+    private final boolean mandatoryNodesValidation;
+
+    DataTreeConfiguration(final TreeType treeType, final YangInstanceIdentifier rootPath, final boolean uniqueIndexes,
+            final boolean mandatoryNodesValidation) {
+        this.treeType = requireNonNull(treeType);
+        this.rootPath = requireNonNull(rootPath);
+        this.uniqueIndexes = uniqueIndexes;
+        this.mandatoryNodesValidation = mandatoryNodesValidation;
+    }
+
+    public @NonNull YangInstanceIdentifier getRootPath() {
+        return rootPath;
+    }
+
+    public @NonNull TreeType getTreeType() {
+        return treeType;
+    }
+
+    public boolean isUniqueIndexEnabled() {
+        return uniqueIndexes;
+    }
+
+    public boolean isMandatoryNodesValidationEnabled() {
+        return mandatoryNodesValidation;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this).add("type", treeType).add("root", rootPath)
+                .add("mandatory", mandatoryNodesValidation)
+                .add("unique", uniqueIndexes).toString();
+    }
+
+    public static DataTreeConfiguration getDefault(final TreeType treeType) {
+        switch (requireNonNull(treeType)) {
+            case CONFIGURATION:
+                return DEFAULT_CONFIGURATION;
+            case OPERATIONAL:
+                return DEFAULT_OPERATIONAL;
+            default:
+                return new DataTreeConfiguration(treeType, YangInstanceIdentifier.empty(), false, true);
+        }
+    }
+
+    public static Builder builder(final TreeType treeType) {
+        return new Builder(treeType);
+    }
+
+    public Builder copyBuilder() {
+        return new Builder(treeType)
+                .setMandatoryNodesValidation(isMandatoryNodesValidationEnabled())
+                .setUniqueIndexes(isUniqueIndexEnabled())
+                .setRootPath(getRootPath());
+    }
+
+    public static class Builder implements org.opendaylight.yangtools.concepts.Builder<DataTreeConfiguration> {
+        private final TreeType treeType;
+        private YangInstanceIdentifier rootPath;
+        private boolean uniqueIndexes;
+        private boolean mandatoryNodesValidation;
+
+        public Builder(final TreeType treeType) {
+            this.treeType = requireNonNull(treeType);
+            rootPath = YangInstanceIdentifier.empty();
+        }
+
+        public Builder setUniqueIndexes(final boolean uniqueIndexes) {
+            this.uniqueIndexes = uniqueIndexes;
+            return this;
+        }
+
+        public Builder setMandatoryNodesValidation(final boolean mandatoryNodesValidation) {
+            this.mandatoryNodesValidation = mandatoryNodesValidation;
+            return this;
+        }
+
+        public Builder setRootPath(final YangInstanceIdentifier rootPath) {
+            this.rootPath = rootPath.toOptimized();
+            return this;
+        }
+
+        @Override
+        public DataTreeConfiguration build() {
+            return new DataTreeConfiguration(treeType, rootPath, uniqueIndexes, mandatoryNodesValidation);
+        }
+    }
+}