Add JpaPdpStatistics entity 39/97939/9
authorshaoqiu <tim.huang@est.tech>
Fri, 8 Nov 2019 03:09:08 +0000 (11:09 +0800)
committershaoqiu <tim.huang@est.tech>
Mon, 9 Dec 2019 05:46:35 +0000 (13:46 +0800)
Add JpaPdpStatistics entity which will be used in provider.
Add Pdp Statistics entities

Issue-ID: POLICY-1628
Signed-off-by: shaoqiu <tim.huang@est.tech>
Change-Id: Iab12eb02e2e7f0e366aff64fa665b5d6674f2905
Signed-off-by: shaoqiu <tim.huang@est.tech>
models-base/src/main/java/org/onap/policy/models/base/PfTimestampKey.java [new file with mode: 0644]
models-base/src/test/java/org/onap/policy/models/base/PfTimestampKeyTest.java [new file with mode: 0644]
models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpEngineWorkerStatistics.java [new file with mode: 0644]
models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpStatistics.java
models-pdp/src/main/java/org/onap/policy/models/pdp/enums/PdpEngineWorkerState.java [new file with mode: 0644]
models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatistics.java [new file with mode: 0644]
models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatisticsTest.java [new file with mode: 0644]
models-pdp/src/test/java/org/onap/policy/models/pdp/testconcepts/DummyJpaPdpStatisticsChild.java [new file with mode: 0644]
models-pdp/src/test/resources/META-INF/persistence.xml
models-provider/src/test/resources/META-INF/persistence.xml

diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfTimestampKey.java b/models-base/src/main/java/org/onap/policy/models/base/PfTimestampKey.java
new file mode 100644 (file)
index 0000000..a2f1129
--- /dev/null
@@ -0,0 +1,156 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.base;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NonNull;
+import org.onap.policy.common.utils.validation.Assertions;
+
+@Embeddable
+@Getter
+@EqualsAndHashCode(callSuper = false)
+public class PfTimestampKey extends PfKeyImpl {
+    private static final long serialVersionUID = -8410208962541783805L;
+
+    private static final String TIMESTAMP_TOKEN = "timeStamp";
+
+    @Column(name = NAME_TOKEN, length = 120)
+    private String name;
+
+    @Column(name = VERSION_TOKEN, length = 20)
+    private String version;
+
+    @Column(name = TIMESTAMP_TOKEN)
+    private Date timeStamp;
+
+
+    /**
+     * The default constructor creates a null concept key.
+     */
+    public PfTimestampKey() {
+        this(NULL_KEY_NAME, NULL_KEY_VERSION, new Date(0));
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param copyConcept the concept to copy from
+     */
+    public PfTimestampKey(@NonNull final PfTimestampKey copyConcept) {
+        super(copyConcept);
+        this.timeStamp = new Date(copyConcept.getTimeStamp().getTime());
+    }
+
+    /**
+     * Constructor to create a key with the specified name and version.
+     *
+     * @param name the key name
+     * @param version the key version
+     * @param timeStamp the timestamp of key
+     */
+    public PfTimestampKey(@NonNull final String name, @NonNull final String version,
+            @NonNull final Date timeStamp) {
+        super(name, version);
+        this.timeStamp = new Date(timeStamp.getTime());
+    }
+
+    /**
+     * Constructor to create a key using the key and version from the specified key ID.
+     *
+     * @param id the key ID in a format that respects the KEY_ID_REGEXP
+     */
+    public PfTimestampKey(final String id) {
+        super(id.substring(0, id.lastIndexOf(':')));
+        this.timeStamp = new Date(Long.parseLong(id.substring(id.lastIndexOf(':') + 1)));
+    }
+
+    @Override
+    public String getId() {
+        return getName() + ':' + getVersion() + ':' + getTimeStamp().getTime();
+    }
+
+    /**
+     * Get a null key.
+     *
+     * @return a null key
+     */
+    public static final PfTimestampKey getNullKey() {
+        return new PfTimestampKey(PfKey.NULL_KEY_NAME, PfKey.NULL_KEY_VERSION, new Date(0));
+    }
+
+    @Override
+    public String toString() {
+        return "PfTimestampKey(name=" + getName() + ", version=" + getVersion() + ", timestamp="
+                + getTimeStamp().getTime() + ")";
+    }
+
+    @Override
+    public boolean isNewerThan(@NonNull PfKey otherKey) {
+        Assertions.instanceOf(otherKey, PfTimestampKey.class);
+
+        final PfTimestampKey otherConceptKey = (PfTimestampKey) otherKey;
+
+        if (this.equals(otherConceptKey)) {
+            return false;
+        }
+
+        if (!timeStamp.equals(otherConceptKey.timeStamp)) {
+            return timeStamp.after(otherConceptKey.timeStamp);
+        }
+
+        return super.isNewerThan(otherKey);
+    }
+
+    public void setTimeStamp(@NonNull final Date timeStamp) {
+        this.timeStamp = new Date(timeStamp.getTime());
+    }
+
+    @Override
+    public boolean isNullKey() {
+        return super.isNullKey() && getTimeStamp().getTime() == 0;
+    }
+
+    @Override
+    public int compareTo(@NonNull final PfConcept otherObj) {
+        int result = super.compareTo(otherObj);
+        if (0 == result) {
+            final PfTimestampKey other = (PfTimestampKey) otherObj;
+            return timeStamp.compareTo(other.timeStamp);
+        }
+        return result;
+    }
+
+    @Override
+    public void setName(@NonNull String name) {
+        this.name = Assertions.validateStringParameter(NAME_TOKEN, name, getNameRegEx());
+    }
+
+    @Override
+    public void setVersion(@NonNull String version) {
+        this.version = Assertions.validateStringParameter(VERSION_TOKEN, version, getVersionRegEx());
+    }
+}
diff --git a/models-base/src/test/java/org/onap/policy/models/base/PfTimestampKeyTest.java b/models-base/src/test/java/org/onap/policy/models/base/PfTimestampKeyTest.java
new file mode 100644 (file)
index 0000000..28b9fd9
--- /dev/null
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.base;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Date;
+import org.junit.Test;
+
+public class PfTimestampKeyTest {
+    private static final String VERSION001 = "0.0.1";
+    private static final String CONCEPT_IS_NULL = "copyConcept is marked @NonNull but is null";
+    private static final String NAME_IS_NULL = "name is marked @NonNull but is null";
+    private static final String VERSION_IS_NULL = "version is marked @NonNull but is null";
+    private static final String TIMESTAMP_IS_NULL = "timeStamp is marked @NonNull but is null";
+    private static final long timeStamp = 1574832537641L;
+
+    @Test
+    public void testTimestampKey() {
+        PfTimestampKey someKey0 = new PfTimestampKey();
+        assertEquals(PfTimestampKey.getNullKey(), someKey0);
+        assertTrue(someKey0.isNullKey());
+        assertEquals("PfTimestampKey(name=NULL, version=0.0.0, timestamp=0)", someKey0.toString());
+
+        PfTimestampKey someKey1 = new PfTimestampKey("my-name", VERSION001, new Date(timeStamp));
+        PfTimestampKey someKey2 = new PfTimestampKey(someKey1);
+        PfTimestampKey someKey3 = new PfTimestampKey(someKey1.getId());
+        assertEquals(someKey1, someKey2);
+        assertEquals(someKey1, someKey3);
+        assertFalse(someKey1.isNullVersion());
+        assertEquals("PfTimestampKey(name=my-name, version=0.0.1, timestamp=1574832537641)", someKey1.toString());
+
+        assertEquals("my-name", someKey1.getName());
+        assertEquals(VERSION001, someKey1.getVersion());
+
+        assertEquals(someKey2, someKey1.getKey());
+        assertEquals(1, someKey1.getKeys().size());
+
+        assertThatThrownBy(() -> new PfTimestampKey((PfTimestampKey) null)).isInstanceOf(NullPointerException.class)
+                .hasMessage(CONCEPT_IS_NULL);
+        assertThatThrownBy(() -> new PfTimestampKey(null, null, null)).isInstanceOf(NullPointerException.class)
+                .hasMessage(NAME_IS_NULL);
+        assertThatThrownBy(() -> new PfTimestampKey("my-name", null, null)).isInstanceOf(NullPointerException.class)
+                .hasMessage(VERSION_IS_NULL);
+        assertThatThrownBy(() -> new PfTimestampKey("my-name", VERSION001, null))
+                .isInstanceOf(NullPointerException.class).hasMessage(TIMESTAMP_IS_NULL);
+
+        assertThatThrownBy(() -> someKey0.setName(null)).isInstanceOf(NullPointerException.class)
+                .hasMessage(NAME_IS_NULL);
+        assertThatThrownBy(() -> someKey0.setVersion(null)).isInstanceOf(NullPointerException.class)
+                .hasMessage(VERSION_IS_NULL);
+        assertThatThrownBy(() -> someKey0.setTimeStamp(null)).isInstanceOf(NullPointerException.class)
+                .hasMessage(TIMESTAMP_IS_NULL);
+
+        assertFalse(someKey1.isNewerThan(someKey2));
+        assertThatThrownBy(() -> someKey1.isNewerThan((PfKey) null)).isInstanceOf(NullPointerException.class)
+                .hasMessage("otherKey is marked @NonNull but is null");
+        someKey2.setTimeStamp(new Date(timeStamp + 1));
+        assertTrue(someKey2.isNewerThan(someKey1));
+        someKey3.setName("my-name3");
+        assertTrue(someKey3.isNewerThan(someKey1));
+
+        assertEquals(-1, someKey1.compareTo(someKey2));
+        assertEquals(-1, someKey1.compareTo(someKey3));
+        assertThatThrownBy(() -> someKey1.compareTo((PfConcept) null)).isInstanceOf(NullPointerException.class)
+                .hasMessage("otherObj is marked @NonNull but is null");
+
+        PfTimestampKey someKey4 = new PfTimestampKey("NULL", "0.0.0", new Date(timeStamp));
+        assertFalse(someKey4.isNullKey());
+        assertFalse(someKey1.isNullKey());
+    }
+}
diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpEngineWorkerStatistics.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpEngineWorkerStatistics.java
new file mode 100644 (file)
index 0000000..43fa6c0
--- /dev/null
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.pdp.concepts;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.models.pdp.enums.PdpEngineWorkerState;
+
+@Embeddable
+@Getter
+@Setter
+@ToString
+@NoArgsConstructor
+public class PdpEngineWorkerStatistics implements Serializable {
+    private static final long serialVersionUID = 8262176849743624013L;
+
+    private String engineId;
+    private PdpEngineWorkerState engineWorkerState;
+    private long engineTimeStamp;
+    private long eventCount;
+    private long lastExecutionTime;
+    private double averageExecutionTime;
+    private long upTime;
+    private long lastEnterTime;
+    private long lastStart;
+
+    /**
+     * Constructs the object, making a deep copy.
+     *
+     * @param source source from which to copy
+     */
+    public PdpEngineWorkerStatistics(PdpEngineWorkerStatistics source) {
+        this.engineId = source.engineId;
+        this.engineWorkerState = source.engineWorkerState;
+        this.engineTimeStamp = source.engineTimeStamp;
+        this.eventCount = source.eventCount;
+        this.lastExecutionTime = source.lastExecutionTime;
+        this.averageExecutionTime = source.averageExecutionTime;
+        this.upTime = source.upTime;
+        this.lastEnterTime = source.lastEnterTime;
+        this.lastStart = source.lastStart;
+    }
+
+    /**
+     * Tidy up any superfluous information such as leading and trailing white space.
+     */
+    public void clean() {
+        if (engineId != null) {
+            engineId = engineId.trim();
+        }
+    }
+}
index 1847eed..ad5547e 100644 (file)
 
 package org.onap.policy.models.pdp.concepts;
 
+import java.util.Date;
+import java.util.List;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
 import lombok.ToString;
+import org.onap.policy.models.base.PfUtils;
 
 /**
  * Class to represent statistics of a running PDP.
@@ -38,12 +41,16 @@ import lombok.ToString;
 public class PdpStatistics {
 
     private String pdpInstanceId;
+    private Date timeStamp;
+    private String pdpGroupName;
+    private String pdpSubGroupName;
     private long policyDeployCount;
     private long policyDeploySuccessCount;
     private long policyDeployFailCount;
     private long policyExecutedCount;
     private long policyExecutedSuccessCount;
     private long policyExecutedFailCount;
+    private List<PdpEngineWorkerStatistics> engineStats;
 
     /**
      * Constructs the object, making a deep copy.
@@ -52,11 +59,16 @@ public class PdpStatistics {
      */
     public PdpStatistics(PdpStatistics source) {
         this.pdpInstanceId = source.pdpInstanceId;
+        this.timeStamp = source.timeStamp == null ? null : new Date(source.timeStamp.getTime());
+        this.pdpGroupName = source.pdpGroupName;
+        this.pdpSubGroupName = source.pdpSubGroupName;
         this.policyDeployCount = source.policyDeployCount;
         this.policyDeployFailCount = source.policyDeployFailCount;
         this.policyDeploySuccessCount = source.policyDeploySuccessCount;
         this.policyExecutedCount = source.policyExecutedCount;
         this.policyExecutedFailCount = source.policyExecutedFailCount;
         this.policyExecutedSuccessCount = source.policyExecutedSuccessCount;
+        this.engineStats = PfUtils.mapList(source.engineStats, PdpEngineWorkerStatistics::new, null);
     }
+
 }
diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/enums/PdpEngineWorkerState.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/enums/PdpEngineWorkerState.java
new file mode 100644 (file)
index 0000000..95b1947
--- /dev/null
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.pdp.enums;
+
+public enum PdpEngineWorkerState {
+    /** The state of the engine is not known. */
+    UNDEFINED,
+    /** The engine is stopped. */
+    STOPPED,
+    /** The engine is running and is waiting to execute a policy. */
+    READY,
+    /** The engine is running and is executing a policy. */
+    EXECUTING,
+    /** The engine has been ordered to stop and is stoping. */
+    STOPPING;
+}
diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatistics.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatistics.java
new file mode 100644 (file)
index 0000000..d08a19a
--- /dev/null
@@ -0,0 +1,230 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.pdp.persistence.concepts;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import javax.persistence.Column;
+import javax.persistence.ElementCollection;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.builder.CompareToBuilder;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfTimestampKey;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.base.PfValidationMessage;
+import org.onap.policy.models.base.PfValidationResult;
+import org.onap.policy.models.base.PfValidationResult.ValidationResult;
+import org.onap.policy.models.pdp.concepts.PdpEngineWorkerStatistics;
+import org.onap.policy.models.pdp.concepts.PdpStatistics;
+
+
+/**
+ * Class to represent a PDP statistics in the database.
+ *
+ */
+@Entity
+@Table(name = "PdpStatistics")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class JpaPdpStatistics extends PfConcept implements PfAuthorative<PdpStatistics>, Serializable {
+    private static final long serialVersionUID = -7312974966820980659L;
+    private static final String NULL_NAME = "NULL";
+
+    @EmbeddedId
+    private PfTimestampKey key;
+
+    @Column(length = 120)
+    private String pdpGroupName;
+
+    @Column(length = 120)
+    private String pdpSubGroupName;
+
+    @Column
+    private long policyDeployCount;
+
+    @Column
+    private long policyDeploySuccessCount;
+
+    @Column
+    private long policyDeployFailCount;
+
+    @Column
+    private long policyExecutedCount;
+
+    @Column
+    private long policyExecutedSuccessCount;
+
+    @Column
+    private long policyExecutedFailCount;
+
+    @ElementCollection
+    private List<PdpEngineWorkerStatistics> engineStats;
+
+    /**
+     * The Default Constructor creates a {@link JpaPdpStatistics} object with a null key.
+     */
+    public JpaPdpStatistics() {
+        this(new PfTimestampKey());
+    }
+
+    /**
+     * The Key Constructor creates a {@link JpaPdpStatistics} object with the given concept key.
+     *
+     * @param key the key
+     */
+    public JpaPdpStatistics(@NonNull final PfTimestampKey key) {
+        this(key, NULL_NAME, NULL_NAME, 0L, 0L, 0L, 0L, 0L, 0L, null);
+    }
+
+
+    /**
+     * Copy constructor.
+     *
+     * @param copyConcept the concept to copy from
+     */
+    public JpaPdpStatistics(@NonNull final JpaPdpStatistics copyConcept) {
+        super(copyConcept);
+        this.key = new PfTimestampKey(copyConcept.key);
+        this.pdpGroupName = copyConcept.pdpGroupName;
+        this.pdpSubGroupName = copyConcept.pdpSubGroupName;
+        this.policyDeployCount = copyConcept.policyDeployCount;
+        this.policyDeploySuccessCount = copyConcept.policyDeploySuccessCount;
+        this.policyDeployFailCount = copyConcept.policyDeployFailCount;
+        this.policyExecutedCount = copyConcept.policyExecutedCount;
+        this.policyExecutedSuccessCount = copyConcept.policyExecutedSuccessCount;
+        this.policyExecutedFailCount = copyConcept.policyExecutedFailCount;
+        this.engineStats = PfUtils.mapList(copyConcept.engineStats, PdpEngineWorkerStatistics::new, null);
+    }
+
+    /**
+     * Authorative constructor.
+     *
+     * @param authorativeConcept the authorative concept to copy from
+     */
+    public JpaPdpStatistics(@NonNull final PdpStatistics authorativeConcept) {
+        this.fromAuthorative(authorativeConcept);
+    }
+
+    @Override
+    public int compareTo(PfConcept otherConcept) {
+        if (otherConcept == null) {
+            return -1;
+        }
+        if (this == otherConcept) {
+            return 0;
+        }
+        if (getClass() != otherConcept.getClass()) {
+            return getClass().getName().compareTo(otherConcept.getClass().getName());
+        }
+
+        final JpaPdpStatistics other = (JpaPdpStatistics) otherConcept;
+        return new CompareToBuilder().append(this.key, other.key).append(this.pdpGroupName, other.pdpGroupName)
+                .append(this.pdpSubGroupName, other.pdpSubGroupName)
+                .append(this.policyDeployCount, other.policyDeployCount)
+                .append(this.policyDeployFailCount, other.policyDeployFailCount)
+                .append(this.policyDeploySuccessCount, other.policyDeploySuccessCount)
+                .append(this.policyExecutedCount, other.policyExecutedCount)
+                .append(this.policyExecutedFailCount, other.policyExecutedFailCount)
+                .append(this.policyExecutedSuccessCount, other.policyExecutedSuccessCount).toComparison();
+    }
+
+    @Override
+    public PdpStatistics toAuthorative() {
+        PdpStatistics pdpStatistics = new PdpStatistics();
+        pdpStatistics.setPdpInstanceId(key.getName());
+        pdpStatistics.setTimeStamp(new Date(key.getTimeStamp().getTime()));
+        pdpStatistics.setPdpGroupName(pdpGroupName);
+        pdpStatistics.setPdpSubGroupName(pdpSubGroupName);
+        pdpStatistics.setPolicyDeployCount(policyDeployCount);
+        pdpStatistics.setPolicyDeployFailCount(policyDeployFailCount);
+        pdpStatistics.setPolicyDeploySuccessCount(policyDeploySuccessCount);
+        pdpStatistics.setPolicyExecutedCount(policyExecutedCount);
+        pdpStatistics.setPolicyExecutedFailCount(policyExecutedFailCount);
+        pdpStatistics.setPolicyExecutedSuccessCount(policyExecutedSuccessCount);
+        pdpStatistics.setEngineStats(PfUtils.mapList(engineStats, PdpEngineWorkerStatistics::new, null));
+
+        return pdpStatistics;
+    }
+
+    @Override
+    public void fromAuthorative(@NonNull final PdpStatistics pdpStatistics) {
+        if (this.key == null || this.getKey().isNullKey()) {
+            this.setKey(new PfTimestampKey(pdpStatistics.getPdpInstanceId(), PfKey.NULL_KEY_VERSION,
+                    new Date(pdpStatistics.getTimeStamp() == null ? 0 : pdpStatistics.getTimeStamp().getTime())));
+        }
+        this.setPdpGroupName(pdpStatistics.getPdpGroupName());
+        this.setPdpSubGroupName(pdpStatistics.getPdpSubGroupName());
+        this.setPolicyDeployCount(pdpStatistics.getPolicyDeployCount());
+        this.setPolicyDeployFailCount(pdpStatistics.getPolicyDeployFailCount());
+        this.setPolicyDeploySuccessCount(pdpStatistics.getPolicyDeploySuccessCount());
+        this.setPolicyExecutedCount(pdpStatistics.getPolicyExecutedCount());
+        this.setPolicyExecutedFailCount(pdpStatistics.getPolicyExecutedFailCount());
+        this.setPolicyExecutedSuccessCount(pdpStatistics.getPolicyExecutedSuccessCount());
+        this.setEngineStats(
+                PfUtils.mapList(pdpStatistics.getEngineStats(), PdpEngineWorkerStatistics::new, null));
+    }
+
+    @Override
+    public List<PfKey> getKeys() {
+        return getKey().getKeys();
+    }
+
+    @Override
+    public PfValidationResult validate(@NonNull PfValidationResult resultIn) {
+        PfValidationResult result = resultIn;
+
+        if (key.isNullKey()) {
+            result.addValidationMessage(
+                    new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, "key is a null key"));
+        }
+
+        result = key.validate(result);
+
+        return result;
+    }
+
+    @Override
+    public void clean() {
+        key.clean();
+        pdpGroupName = pdpGroupName.trim();
+        pdpSubGroupName = pdpSubGroupName.trim();
+        if (engineStats != null) {
+            for (PdpEngineWorkerStatistics engineStat : engineStats) {
+                engineStat.clean();
+            }
+        }
+    }
+}
diff --git a/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatisticsTest.java b/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatisticsTest.java
new file mode 100644 (file)
index 0000000..62f0c5b
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.pdp.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.junit.Test;
+
+/**
+ * Test the {@link JpaPdpStatistics} class.
+ *
+ */
+public class JpaPdpStatisticsTest {
+    private static final String NULL_KEY_ERROR = "key is marked @NonNull but is null";
+    private static final String PDP1 = "ThePDP";
+
+    // TODO More unit test cases will be added later.
+    @Test
+    public void testJpaPdpStatistics() {
+        assertThatThrownBy(() -> {
+            new JpaPdpStatistics((JpaPdpStatistics) null);
+        }).hasMessage("copyConcept is marked @NonNull but is null");
+    }
+}
diff --git a/models-pdp/src/test/java/org/onap/policy/models/pdp/testconcepts/DummyJpaPdpStatisticsChild.java b/models-pdp/src/test/java/org/onap/policy/models/pdp/testconcepts/DummyJpaPdpStatisticsChild.java
new file mode 100644 (file)
index 0000000..b428fc6
--- /dev/null
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.pdp.testconcepts;
+
+import org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics;
+
+/**
+ * Test class for JpaPdpStatistics comparisons.
+ *
+ */
+
+public class DummyJpaPdpStatisticsChild extends JpaPdpStatistics {
+
+    private static final long serialVersionUID = -5911806849612508805L;
+
+}
index 9d78e3a..b1a1795 100644 (file)
@@ -31,6 +31,7 @@
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
 
         <properties>
             <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
index 7b5bc14..48f1b10 100644 (file)
@@ -31,6 +31,7 @@
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
 
         <properties>
             <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />