/** * ============LICENSE_START========================================== * org.onap.aai * =================================================================== * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. * Copyright © 2017-2018 Amdocs * Copyright © 2019 IBM * =================================================================== * 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============================================ */ package org.onap.aai.champcore.model; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; 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 objectConstraints; private final Map 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 getObjectConstraint(String type) { if (!getObjectConstraints().containsKey(type)) return Optional.empty(); return Optional.of(getObjectConstraints().get(type)); } public Optional getRelationshipConstraint(String type) { if (!getRelationshipConstraints().containsKey(type)) return Optional.empty(); return Optional.of(getRelationshipConstraints().get(type)); } public Map getObjectConstraints() { return objectConstraints; } public Map getRelationshipConstraints() { return relationshipConstraints; } @JsonPOJOBuilder(buildMethodName = "build", withPrefix = "") public static class Builder { private Map objectConstraints = new HashMap (); private Map relationshipConstraints = new HashMap (); public Builder() {} public Builder(ChampSchema schema) { objectConstraints.putAll(schema.getObjectConstraints()); relationshipConstraints.putAll(schema.getRelationshipConstraints()); } public Builder objectConstraints(Map objectConstraints) { this.objectConstraints.putAll(objectConstraints); return this; } public Builder relationshipConstraints(Map 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 objConstraint : getObjectConstraints().entrySet()) { final Optional champObjConstraint = ((ChampSchema) schema).getObjectConstraint(objConstraint.getKey()); if (!champObjConstraint.isPresent() || !champObjConstraint.get().equals(objConstraint.getValue())) return false; } for (Entry relConstraint : getRelationshipConstraints().entrySet()) { final Optional champRelConstraint = ((ChampSchema) schema).getRelationshipConstraint(relConstraint.getKey()); if (!champRelConstraint.isPresent() || !champRelConstraint.get().equals(relConstraint.getValue())) return false; } return true; } return false; } @Override public int hashCode() { return Objects.hash(objectConstraints, relationshipConstraints); } @Override public String toString() { return "{objectConstraints: " + getObjectConstraints() + ", relationshipConstraints: " + getRelationshipConstraints() + "}"; } public static ChampSchema emptySchema() { return new ChampSchema.Builder().build(); } }