aboutsummaryrefslogtreecommitdiffstats
path: root/context/context-management/src/main/java/org/onap/policy/apex/context/impl/schema/AbstractSchemaHelper.java
blob: d94a59d38169ebbe1955a6aeb5da6b37ac9db9a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*-
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
 *  Modifications Copyright (C) 2019-2020 Nordix Foundation.
 *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * 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.apex.context.impl.schema;

import java.lang.reflect.Constructor;
import lombok.Getter;
import org.apache.commons.lang3.NotImplementedException;
import org.onap.policy.apex.context.ContextRuntimeException;
import org.onap.policy.apex.context.SchemaHelper;
import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
import org.onap.policy.apex.model.basicmodel.concepts.AxKey;
import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema;
import org.onap.policy.common.utils.validation.Assertions;
import org.slf4j.ext.XLogger;
import org.slf4j.ext.XLoggerFactory;

/**
 * This class implements the {@link SchemaHelper} functionality that is common across all implementations. Schema
 * helpers for specific schema mechanisms specialize this class.
 *
 * @author Liam Fallon (liam.fallon@ericsson.com)
 */
@Getter
public abstract class AbstractSchemaHelper implements SchemaHelper {
    // Get a reference to the logger
    private static final XLogger LOGGER = XLoggerFactory.getXLogger(AbstractSchemaHelper.class);

    // The key of the user of this schema helper
    private AxKey userKey = AxArtifactKey.getNullKey();

    // The schema of this schema helper
    private AxContextSchema schema = null;

    // The class of objects for this schema
    private Class<?> schemaClass;

    /**
     * Sets the schema class for the schema, designed jots to be called by sub classes.
     *
     * @param schemaClass the Java class that is used to hold items of this schema
     */
    protected void setSchemaClass(final Class<?> schemaClass) {
        this.schemaClass = schemaClass;
    }

    /**
     * {@inheritDoc}.
     */
    @Override
    public void init(final AxKey incomingUserKey, final AxContextSchema incomingSchema) {
        Assertions.argumentOfClassNotNull(incomingUserKey, ContextRuntimeException.class,
                "incomingUserKey may not be null");
        Assertions.argumentOfClassNotNull(incomingSchema, ContextRuntimeException.class,
                "incomingSchema may not be null");

        this.userKey = incomingUserKey;
        this.schema = incomingSchema;
    }

    /**
     * {@inheritDoc}.
     */
    @Override
    public Object getSchemaObject() {
        return null;
    }

    /**
     * {@inheritDoc}.
     */
    @Override
    public Object createNewInstance() {
        if (schemaClass == null) {
            final String returnString =
                    userKey.getId() + ": could not create an instance, schema class for the schema is null";
            LOGGER.warn(returnString);
            throw new ContextRuntimeException(returnString);
        }

        try {
            return schemaClass.getDeclaredConstructor().newInstance();
        } catch (final Exception e) {
            final String returnString =
                    userKey.getId() + ": could not create an instance of class \"" + schemaClass.getName()
                            + "\" using the default constructor \"" + schemaClass.getSimpleName() + "()\"";
            LOGGER.warn(returnString, e);
            throw new ContextRuntimeException(returnString, e);
        }
    }

    /**
     * {@inheritDoc}.
     */
    @Override
    public Object createNewInstance(final String stringValue) {
        if (schemaClass == null) {
            final String returnString =
                    userKey.getId() + ": could not create an instance, schema class for the schema is null";
            LOGGER.warn(returnString);
            throw new ContextRuntimeException(returnString);
        }

        try {
            // Find a string constructor
            final Constructor<?> stringConstructor = schemaClass.getConstructor(String.class);

            // Invoke the constructor
            return stringConstructor.newInstance(stringValue);
        } catch (final Exception e) {
            final String returnString =
                    userKey.getId() + ": could not create an instance of class \"" + schemaClass.getName()
                            + "\" using the string constructor \"" + schemaClass.getSimpleName() + "(String)\"";
            LOGGER.warn(returnString, e);
            throw new ContextRuntimeException(returnString);
        }
    }

    /**
     * {@inheritDoc}.
     */
    @Override
    public Object createNewSubInstance(String subType) {
        throw new NotImplementedException("sub types are not supported on this schema helper");
    }
}