diff options
Diffstat (limited to 'models-base')
9 files changed, 389 insertions, 57 deletions
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfAuthorative.java b/models-base/src/main/java/org/onap/policy/models/base/PfAuthorative.java index fd35d20d0..b0610e4ea 100644 --- a/models-base/src/main/java/org/onap/policy/models/base/PfAuthorative.java +++ b/models-base/src/main/java/org/onap/policy/models/base/PfAuthorative.java @@ -37,7 +37,8 @@ public interface PfAuthorative<T> { /** * Set an instance of the persist concept to the equivalent values as the other concept. + * + * @param authorativeConcept the authorative concept */ - public void fromAuthorative(final T authorativeClass); - + public void fromAuthorative(final T authorativeConcept); } diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java b/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java index 46094610a..e197e13a4 100644 --- a/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java +++ b/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java @@ -20,6 +20,9 @@ package org.onap.policy.models.base; +import java.lang.reflect.ParameterizedType; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -41,25 +44,26 @@ import lombok.NonNull; import org.onap.policy.common.utils.validation.Assertions; import org.onap.policy.models.base.PfValidationResult.ValidationResult; +// @formatter:off /** - * This class is a concept container and holds a map of concepts. The {@link PfConceptContainer} - * class implements the helper methods of the {@link PfConceptGetter} interface to allow - * {@link PfConceptContainer} instances to be retrieved by calling methods directly on this class - * without referencing the contained map. + * This class is a concept container and holds a map of concepts. The {@link PfConceptContainer} class implements the + * helper methods of the {@link PfConceptGetter} interface to allow {@link PfConceptContainer} instances to be retrieved + * by calling methods directly on this class without referencing the contained map. * - * <p>Validation checks that the container key is not null. An error is issued if no concepts are - * defined in the container. Each concept entry is checked to ensure that its key and value are not - * null and that the key matches the key in the map value. Each concept entry is then validated - * individually. + * <p>Validation checks that a container key is not null. An error is issued if no concepts are defined in a container. + * Each concept entry is checked to ensure that its key and value are not null and that the key matches the key in the + * map value. Each concept entry is then validated individually. * * @param C the concept being contained */ +//@formatter:on @Entity @Table(name = "PfConceptContainer") @Data @EqualsAndHashCode(callSuper = false) -public class PfConceptContainer<C extends PfConcept> extends PfConcept implements PfConceptGetter<C> { +public class PfConceptContainer<C extends PfConcept, A extends PfNameVersion> extends PfConcept + implements PfConceptGetter<C>, PfAuthorative<List<Map<String, A>>> { private static final long serialVersionUID = -324211738823208318L; @EmbeddedId @@ -69,16 +73,16 @@ public class PfConceptContainer<C extends PfConcept> extends PfConcept implement private Map<PfConceptKey, C> conceptMap; /** - * The Default Constructor creates a {@link PfConceptContainer} object with a null artifact key - * and creates an empty concept map. + * The Default Constructor creates a {@link PfConceptContainer} object with a null artifact key and creates an empty + * concept map. */ public PfConceptContainer() { this(new PfConceptKey()); } /** - * The Key Constructor creates a {@link PfConceptContainer} object with the given artifact key - * and creates an empty concept map. + * The Key Constructor creates a {@link PfConceptContainer} object with the given artifact key and creates an empty + * concept map. * * @param key the concept key */ @@ -104,7 +108,7 @@ public class PfConceptContainer<C extends PfConcept> extends PfConcept implement * * @param copyConcept the concept to copy from */ - public PfConceptContainer(@NonNull final PfConceptContainer<C> copyConcept) { + public PfConceptContainer(@NonNull final PfConceptContainer<C, A> copyConcept) { super(copyConcept); } @@ -120,6 +124,65 @@ public class PfConceptContainer<C extends PfConcept> extends PfConcept implement } @Override + public List<Map<String, A>> toAuthorative() { + Map<String, A> toscaPolicyMap = new LinkedHashMap<>(); + + for (Entry<PfConceptKey, C> conceptEntry : getConceptMap().entrySet()) { + @SuppressWarnings("unchecked") + PfAuthorative<A> authoritiveImpl = (PfAuthorative<A>) conceptEntry.getValue(); + toscaPolicyMap.put(conceptEntry.getKey().getName(), authoritiveImpl.toAuthorative()); + } + + List<Map<String, A>> toscaPolicyMapList = new ArrayList<>(); + toscaPolicyMapList.add(toscaPolicyMap); + + return toscaPolicyMapList; + } + + @Override + public void fromAuthorative(List<Map<String, A>> authorativeList) { + // Clear any existing map entries + conceptMap.clear(); + + // Concepts are in lists of maps + for (Map<String, A> incomingConceptMap : authorativeList) { + // Add the map entries one by one + for (Entry<String, A> incomingConceptEntry : incomingConceptMap.entrySet()) { + C jpaConcept = getConceptNewInstance(); + + // This cast allows us to call the fromAuthorative method + @SuppressWarnings("unchecked") + PfAuthorative<A> authoritiveImpl = (PfAuthorative<A>) jpaConcept; + + if (incomingConceptEntry.getValue().getName() == null) { + incomingConceptEntry.getValue().setName(incomingConceptEntry.getKey()); + } + + // Set the key name and the rest of the values on the concept + authoritiveImpl.fromAuthorative(incomingConceptEntry.getValue()); + + // This cast gets the key of the concept + PfConceptKey conceptKey = (PfConceptKey) jpaConcept.getKey(); + + // Set the concept key of the concept + conceptKey.setName(incomingConceptEntry.getValue().getName()); + + if (incomingConceptEntry.getValue().getVersion() != null) { + conceptKey.setVersion(incomingConceptEntry.getValue().getVersion()); + } + + // After all that, save the map entry + conceptMap.put(conceptKey, jpaConcept); + } + } + + if (conceptMap.isEmpty()) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, + "An incoming list of concepts must have at least one entry"); + } + } + + @Override public void clean() { key.clean(); for (final Entry<PfConceptKey, C> conceptEntry : conceptMap.entrySet()) { @@ -162,17 +225,19 @@ public class PfConceptContainer<C extends PfConcept> extends PfConcept implement if (conceptEntry.getKey().equals(PfConceptKey.getNullKey())) { result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, "key on concept entry " + conceptEntry.getKey() + " may not be the null key")); - } else if (conceptEntry.getValue() == null) { - result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, - "value on concept entry " + conceptEntry.getKey() + " may not be null")); - } else if (!conceptEntry.getKey().equals(conceptEntry.getValue().getKey())) { - result.addValidationMessage(new PfValidationMessage(key, this.getClass(), - ValidationResult.INVALID, "key on concept entry key " + conceptEntry.getKey() - + " does not equal concept value key " + conceptEntry.getValue().getKey())); - result = conceptEntry.getValue().validate(result); - } else { - result = conceptEntry.getValue().validate(result); - } + } else + if (conceptEntry.getValue() == null) { + result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, + "value on concept entry " + conceptEntry.getKey() + " may not be null")); + } else + if (!conceptEntry.getKey().equals(conceptEntry.getValue().getKey())) { + result.addValidationMessage(new PfValidationMessage(key, this.getClass(), + ValidationResult.INVALID, "key on concept entry key " + conceptEntry.getKey() + + " does not equal concept value key " + conceptEntry.getValue().getKey())); + result = conceptEntry.getValue().validate(result); + } else { + result = conceptEntry.getValue().validate(result); + } } return result; } @@ -190,7 +255,7 @@ public class PfConceptContainer<C extends PfConcept> extends PfConcept implement } @SuppressWarnings("unchecked") - final PfConceptContainer<C> other = (PfConceptContainer<C>) otherConcept; + final PfConceptContainer<C, A> other = (PfConceptContainer<C, A>) otherConcept; int retVal = key.compareTo(other.key); if (retVal != 0) { return retVal; @@ -208,12 +273,13 @@ public class PfConceptContainer<C extends PfConcept> extends PfConcept implement Assertions.instanceOf(target, PfConceptContainer.class); @SuppressWarnings("unchecked") - final PfConceptContainer<C> copy = (PfConceptContainer<C>) target; + final PfConceptContainer<C, A> copy = (PfConceptContainer<C, A>) target; copy.setKey(new PfConceptKey(key)); final Map<PfConceptKey, C> newConceptMap = new TreeMap<>(); for (final Entry<PfConceptKey, C> conceptMapEntry : conceptMap.entrySet()) { - newConceptMap.put(new PfConceptKey(conceptMapEntry.getKey()), - new ConceptCloner().cloneConcept(conceptMapEntry.getValue())); + C newC = getConceptNewInstance(); + conceptMapEntry.getValue().copyTo(newC); + newConceptMap.put(new PfConceptKey(conceptMapEntry.getKey()), newC); } copy.setConceptMap(newConceptMap); @@ -248,21 +314,19 @@ public class PfConceptContainer<C extends PfConcept> extends PfConcept implement } /** - * Private inner class that returns a clone of a concept by calling the copy constructor on the - * original class. + * Get a new empty instance of a concept for this concept map. + * + * @return the new instance */ - private class ConceptCloner { - @SuppressWarnings("unchecked") - public C cloneConcept(final C originalConcept) { - try { - C clonedConcept = (C) originalConcept.getClass().newInstance(); - originalConcept.copyTo(clonedConcept); - return clonedConcept; - } catch (Exception ex) { - throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, - "Failed to create a clone of class \"" + originalConcept.getClass().getCanonicalName() + "\"", - ex); - } + @SuppressWarnings("unchecked") + private C getConceptNewInstance() { + try { + String conceptClassName = + ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0].getTypeName(); + return (C) Class.forName(conceptClassName).newInstance(); + } catch (Exception ex) { + throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, + "failed to instantiate instance of container concept class", ex); } } } diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfNameVersion.java b/models-base/src/main/java/org/onap/policy/models/base/PfNameVersion.java new file mode 100644 index 000000000..47238fc40 --- /dev/null +++ b/models-base/src/main/java/org/onap/policy/models/base/PfNameVersion.java @@ -0,0 +1,36 @@ +/*- + * ============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.base; + +/** + * An interface that forces a POJO to have getName() and getVersion() methods. + * + * @author Liam Fallon (liam.fallon@est.tech) + */ +public interface PfNameVersion { + public String getName(); + + public void setName(final String name); + + public String getVersion(); + + public void setVersion(final String version); +} diff --git a/models-base/src/test/java/org/onap/policy/models/base/PfConceptContainerTest.java b/models-base/src/test/java/org/onap/policy/models/base/PfConceptContainerTest.java index 0ed04c4e6..3ae7c4c9d 100644 --- a/models-base/src/test/java/org/onap/policy/models/base/PfConceptContainerTest.java +++ b/models-base/src/test/java/org/onap/policy/models/base/PfConceptContainerTest.java @@ -20,18 +20,23 @@ 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.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.junit.Test; +import org.onap.policy.models.base.testconcepts.DummyAuthorativeConcept; +import org.onap.policy.models.base.testconcepts.DummyBadPfConceptContainer; import org.onap.policy.models.base.testconcepts.DummyPfConcept; import org.onap.policy.models.base.testconcepts.DummyPfConceptContainer; import org.onap.policy.models.base.testconcepts.DummyPfConceptSub; @@ -44,7 +49,7 @@ import org.onap.policy.models.base.testconcepts.DummyPfConceptSub; public class PfConceptContainerTest { @Test - public void test() { + public void testConceptContainer() { DummyPfConceptContainer container = new DummyPfConceptContainer(); assertNotNull(container); @@ -179,16 +184,38 @@ public class PfConceptContainerTest { assertEquals(conceptKey, returnSet.iterator().next().getKey()); container.getConceptMap().put(conceptKey, new DummyPfConceptSub(conceptKey)); + } - DummyPfConceptContainer exceptionOnCopyContainer = new DummyPfConceptContainer(); - try { - container.copyTo(exceptionOnCopyContainer); - fail("test should throw an exception here"); - } catch (Exception exc) { - assertEquals( - "Failed to create a clone of class \"org.onap.policy.models.base.testconcepts.DummyPfConceptSub\"", - exc.getMessage()); - } + @Test + public void testAuthorative() { + Map<String, DummyAuthorativeConcept> dacMap = new LinkedHashMap<>(); + dacMap.put("name0", new DummyAuthorativeConcept("name0", "1.2.3", "Hello")); + dacMap.put("name1", new DummyAuthorativeConcept("name1", "1.2.3", "Hi")); + dacMap.put("name2", new DummyAuthorativeConcept("name2", "1.2.3", "Howdy")); + + List<Map<String, DummyAuthorativeConcept>> authorativeList = new ArrayList<>(); + authorativeList.add(dacMap); + + DummyPfConceptContainer container = new DummyPfConceptContainer(); + container.fromAuthorative(authorativeList); + + assertEquals("Hello", container.getConceptMap().get(new PfConceptKey("name0:1.2.3")).getDescription()); + assertEquals("Hi", container.getConceptMap().get(new PfConceptKey("name1:1.2.3")).getDescription()); + assertEquals("Howdy", container.getConceptMap().get(new PfConceptKey("name2:1.2.3")).getDescription()); + + List<Map<String, DummyAuthorativeConcept>> outMapList = container.toAuthorative(); + + assertEquals(dacMap, outMapList.get(0)); + + DummyBadPfConceptContainer badContainer = new DummyBadPfConceptContainer(); + assertThatThrownBy(() -> { + badContainer.fromAuthorative(authorativeList); + }).hasMessage("failed to instantiate instance of container concept class"); + + authorativeList.clear(); + assertThatThrownBy(() -> { + container.fromAuthorative(authorativeList); + }).hasMessage("An incoming list of concepts must have at least one entry"); } @Test(expected = NullPointerException.class) diff --git a/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyAuthorativeConcept.java b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyAuthorativeConcept.java new file mode 100644 index 000000000..02ff75061 --- /dev/null +++ b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyAuthorativeConcept.java @@ -0,0 +1,52 @@ +/*- + * ============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.base.testconcepts; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import org.onap.policy.models.base.PfNameVersion; + +/** + * Dummy authorative concept. + * + * @author Liam Fallon (liam.fallon@est.tech) + */ +@Data +@NoArgsConstructor +public class DummyAuthorativeConcept implements PfNameVersion { + private String name; + private String version; + private String description; + + /** + * Constructor. + * + * @param name the name + * @param version the version + * @param description the description + */ + public DummyAuthorativeConcept(final String name, final String version, final String description) { + this.name = name; + this.version = version; + this.description = description; + } +} diff --git a/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyBadPfConcept.java b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyBadPfConcept.java new file mode 100644 index 000000000..05fd5992b --- /dev/null +++ b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyBadPfConcept.java @@ -0,0 +1,56 @@ +/*- + * ============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.base.testconcepts; + +import lombok.NonNull; + +import org.onap.policy.models.base.PfConceptKey; + +/** + * Bad dummy concept throws exception on default constructor. + * + * @author Liam Fallon (liam.fallon@est.tech) + */ +public class DummyBadPfConcept extends DummyPfConcept { + private static final long serialVersionUID = 1L; + + public DummyBadPfConcept() { + throw new NumberFormatException(); + } + + /** + * The Key Constructor creates a {@link DummyPfConcept} object with the given concept key. + * + * @param key the key + */ + public DummyBadPfConcept(@NonNull final PfConceptKey key) { + throw new NumberFormatException(); + } + + /** + * Copy constructor. + * + * @param copyConcept the concept to copy from + */ + public DummyBadPfConcept(final DummyBadPfConcept copyConcept) { + throw new NumberFormatException(); + } +} diff --git a/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyBadPfConceptContainer.java b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyBadPfConceptContainer.java new file mode 100644 index 000000000..c328a01aa --- /dev/null +++ b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyBadPfConceptContainer.java @@ -0,0 +1,77 @@ +/*- + * ============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.base.testconcepts; + +import java.util.Map; + +import lombok.NonNull; + +import org.onap.policy.models.base.PfConceptContainer; +import org.onap.policy.models.base.PfConceptKey; + +/** + * Dummy container for PF concepts. + * + * @author Liam Fallon (liam.fallon@est.tech) + */ +public class DummyBadPfConceptContainer extends PfConceptContainer<DummyBadPfConcept, DummyAuthorativeConcept> { + private static final long serialVersionUID = -3018432331484294280L; + + + /** + * The Default Constructor creates a {@link DummyBadPfConceptContainer} object with a null artifact key + * and creates an empty concept map. + */ + public DummyBadPfConceptContainer() { + super(); + } + + /** + * The Key Constructor creates a {@link DummyBadPfConceptContainer} object with the given artifact key and + * creates an empty concept map. + * + * @param key the concept key + */ + public DummyBadPfConceptContainer(@NonNull final PfConceptKey key) { + super(key); + } + + /** + * This Constructor creates an concept container with all of its fields defined. + * + * @param key the concept container key + * @param conceptMap the concepts to be stored in the concept container + */ + public DummyBadPfConceptContainer(@NonNull final PfConceptKey key, + @NonNull final Map<PfConceptKey, DummyBadPfConcept> conceptMap) { + super(key, conceptMap); + } + + /** + * Copy constructor. + * + * @param copyConcept the concept to copy from + */ + public DummyBadPfConceptContainer(@NonNull final DummyBadPfConceptContainer copyConcept) { + super(copyConcept); + } + +} diff --git a/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyPfConcept.java b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyPfConcept.java index 9fb6b5793..5e74fb2f9 100644 --- a/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyPfConcept.java +++ b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyPfConcept.java @@ -30,6 +30,7 @@ import lombok.NonNull; import org.apache.commons.lang3.ObjectUtils; import org.onap.policy.common.utils.validation.Assertions; +import org.onap.policy.models.base.PfAuthorative; import org.onap.policy.models.base.PfConcept; import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfKey; @@ -39,13 +40,31 @@ import org.onap.policy.models.base.PfValidationResult.ValidationResult; @Data @EqualsAndHashCode(callSuper = false) -public class DummyPfConcept extends PfConcept { +public class DummyPfConcept extends PfConcept implements PfAuthorative<DummyAuthorativeConcept> { private static final long serialVersionUID = 1L; @EmbeddedId private PfConceptKey key; private String description; + + @Override + public DummyAuthorativeConcept toAuthorative() { + DummyAuthorativeConcept dac = new DummyAuthorativeConcept(); + dac.setName(key.getName()); + dac.setVersion(key.getVersion()); + dac.setDescription(description); + + return dac; + } + + @Override + public void fromAuthorative(DummyAuthorativeConcept dac) { + key.setName(dac.getName()); + key.setVersion(dac.getVersion()); + description = dac.getDescription(); + } + /** * The Default Constructor creates a {@link DummyPfConcept} object with a null key. */ diff --git a/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyPfConceptContainer.java b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyPfConceptContainer.java index ac72ef8f6..45de69e68 100644 --- a/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyPfConceptContainer.java +++ b/models-base/src/test/java/org/onap/policy/models/base/testconcepts/DummyPfConceptContainer.java @@ -32,7 +32,7 @@ import org.onap.policy.models.base.PfConceptKey; * * @author Liam Fallon (liam.fallon@est.tech) */ -public class DummyPfConceptContainer extends PfConceptContainer<DummyPfConcept> { +public class DummyPfConceptContainer extends PfConceptContainer<DummyPfConcept, DummyAuthorativeConcept> { private static final long serialVersionUID = -3018432331484294280L; |