Port champ-microservice project restructure
[aai/champ.git] / champ-lib / champ-core / src / main / java / org / onap / aai / champcore / model / ChampSchema.java
diff --git a/champ-lib/champ-core/src/main/java/org/onap/aai/champcore/model/ChampSchema.java b/champ-lib/champ-core/src/main/java/org/onap/aai/champcore/model/ChampSchema.java
new file mode 100644 (file)
index 0000000..81b97bd
--- /dev/null
@@ -0,0 +1,148 @@
+/**
+ * ============LICENSE_START==========================================
+ * org.onap.aai
+ * ===================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017 Amdocs
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.champcore.model;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+
+import org.onap.aai.champcore.model.fluent.schema.CreateChampSchemable;
+import org.onap.aai.champcore.model.fluent.schema.impl.CreateChampSchemableImpl;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+
+@JsonDeserialize(builder = ChampSchema.Builder.class)
+public final class ChampSchema {
+
+       private final Map<String, ChampObjectConstraint> objectConstraints;
+       private final Map<String, ChampRelationshipConstraint> relationshipConstraints;
+
+       private ChampSchema() {
+               throw new RuntimeException("Cannot call ChampSchema() constructor");
+       }
+       
+       private ChampSchema(Builder builder) {
+               this.objectConstraints = builder.objectConstraints;
+               this.relationshipConstraints = builder.relationshipConstraints;
+       }
+
+       public static CreateChampSchemable create() {
+               return new CreateChampSchemableImpl();
+       }
+
+       public Optional<ChampObjectConstraint> getObjectConstraint(String type) {
+               if (!getObjectConstraints().containsKey(type)) return Optional.empty();
+               
+               return Optional.of(getObjectConstraints().get(type));
+       }
+       
+       public Optional<ChampRelationshipConstraint> getRelationshipConstraint(String type) {
+               if (!getRelationshipConstraints().containsKey(type)) return Optional.empty();
+               
+               return Optional.of(getRelationshipConstraints().get(type));
+       }
+
+       public Map<String, ChampObjectConstraint> getObjectConstraints() {
+               return objectConstraints;
+       }
+
+       public Map<String, ChampRelationshipConstraint> getRelationshipConstraints() {
+               return relationshipConstraints;
+       }
+
+       @JsonPOJOBuilder(buildMethodName = "build", withPrefix = "")
+       public static class Builder {
+               private Map<String, ChampObjectConstraint> objectConstraints = new HashMap<String, ChampObjectConstraint> ();
+               private Map<String, ChampRelationshipConstraint> relationshipConstraints = new HashMap<String, ChampRelationshipConstraint> ();
+       
+               public Builder() {}
+
+               public Builder(ChampSchema schema) {
+                       objectConstraints.putAll(schema.getObjectConstraints());
+                       relationshipConstraints.putAll(schema.getRelationshipConstraints());
+               }
+
+               public Builder objectConstraints(Map<String, ChampObjectConstraint> objectConstraints) {
+                       this.objectConstraints.putAll(objectConstraints);
+                       return this;
+               }
+
+               public Builder relationshipConstraints(Map<String, ChampRelationshipConstraint> relationshipConstraints) {
+                       this.relationshipConstraints.putAll(relationshipConstraints);
+                       return this;
+               }
+
+               @JsonIgnore
+               public Builder constraint(ChampObjectConstraint objConstraint) {
+                       objectConstraints.put(objConstraint.getType(), objConstraint);
+                       return this;
+               }
+
+               @JsonIgnore
+               public Builder constraint(ChampRelationshipConstraint relConstraint) {
+                       relationshipConstraints.put(relConstraint.getType(), relConstraint);
+                       return this;
+               }
+
+               public ChampSchema build() {
+                       return new ChampSchema(this);
+               }
+       }
+
+       @Override
+       public boolean equals(Object schema) {
+               if (schema instanceof ChampSchema) {
+
+                       for (Entry<String, ChampObjectConstraint> objConstraint : getObjectConstraints().entrySet()) {
+                               final Optional<ChampObjectConstraint> champObjConstraint = ((ChampSchema) schema).getObjectConstraint(objConstraint.getKey());
+                               
+                               if (!champObjConstraint.isPresent() ||
+                                       !champObjConstraint.get().equals(objConstraint.getValue())) return false;
+                       }
+                       
+                       for (Entry<String, ChampRelationshipConstraint> relConstraint : getRelationshipConstraints().entrySet()) {
+                               final Optional<ChampRelationshipConstraint> champRelConstraint = ((ChampSchema) schema).getRelationshipConstraint(relConstraint.getKey());
+                               
+                               if (!champRelConstraint.isPresent() ||
+                                       !champRelConstraint.get().equals(relConstraint.getValue())) return false;
+                       }
+                       
+                       return true;
+               }
+               
+               return false;
+       }
+
+       @Override
+       public String toString() {
+               return "{objectConstraints: " + getObjectConstraints() +
+                               ", relationshipConstraints: " + getRelationshipConstraints() +
+                               "}";
+       }
+
+       public static ChampSchema emptySchema() {
+               return new ChampSchema.Builder().build();
+       }
+}