/*-
 * ============LICENSE_START=======================================================
 * OSAM
 * ================================================================================
 * Copyright (C) 2018 AT&T
 * ================================================================================
 * 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.osam.aai.model;


import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
public class ModelVer {

    @JsonProperty("model-version-id")
    private String modelVersionId;
    @JsonProperty("model-name")
    private String modelName;
    @JsonProperty("model-version")
    private String modelVersion;
    @JsonProperty("distribution-status")
    private String distributionStatus;
    @JsonProperty("resource-version")
    private String resourceVersion;
    @JsonProperty("model-description")
    private String modelDescription;



    @JsonProperty("model-version-id")
    public String getModelVersionId() {
        return modelVersionId;
    }

    @JsonProperty("model-version-id")
    public void setModelVersionId(String modelVersionId) {
        this.modelVersionId = modelVersionId;
    }

    @JsonProperty("model-name")
    public String getModelName() {
        return modelName;
    }

    @JsonProperty("model-name")
    public void setModelName(String modelName) {
        this.modelName = modelName;
    }

    @JsonProperty("model-version")
    public String getModelVersion() {
        return modelVersion;
    }

    @JsonProperty("model-version")
    public void setModelVersion(String modelVersion) {
        this.modelVersion = modelVersion;
    }

    @JsonProperty("distribution-status")
    public String getDistributionStatus() {
        return distributionStatus;
    }

    @JsonProperty("distribution-status")
    public void setDistributionStatus(String distributionStatus) {
        this.distributionStatus = distributionStatus;
    }

    @JsonProperty("resource-version")
    public String getResourceVersion() {
        return resourceVersion;
    }

    @JsonProperty("resource-version")
    public void setResourceVersion(String resourceVersion) {
        this.resourceVersion = resourceVersion;
    }

    @JsonProperty("model-description")
    public String getModelDescription() {
        return modelDescription;
    }

    @JsonProperty("model-description")
    public void setModelDescription(String modelDescription) {
        this.modelDescription = modelDescription;
    }

}
