summaryrefslogtreecommitdiffstats
path: root/model/basic-model/src/main/java/org/onap/apex/model/basicmodel/handling/ApexModelStringWriter.java
blob: 882092c05b127735bb1840859086b27d85a2d3c0 (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
146
147
148
149
/*
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2016-2018 Ericsson. 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.apex.model.basicmodel.handling;

import java.io.ByteArrayOutputStream;

import org.onap.apex.model.basicmodel.concepts.ApexException;
import org.onap.apex.model.basicmodel.concepts.AxConcept;
import org.onap.policy.apex.model.utilities.Assertions;
import org.slf4j.ext.XLogger;
import org.slf4j.ext.XLoggerFactory;

/**
 * This class writes an Apex concept to a string.
 *
 * @author Liam Fallon (liam.fallon@ericsson.com)
 * @param <C> the type of Apex concept to write to a string, must be a sub class of {@link AxConcept}
 */
public class ApexModelStringWriter<C extends AxConcept> {
    private static final XLogger LOGGER = XLoggerFactory.getXLogger(ApexModelStringWriter.class);

    // Should concepts being written to files be valid
    private boolean validateFlag;

    /**
     * Constructor, set the validation flag.
     *
     * @param validateFlag Should validation be performed prior to output
     */
    public ApexModelStringWriter(final boolean validateFlag) {
        this.validateFlag = validateFlag;
    }

    /**
     * Write a concept to a string.
     *
     * @param concept The concept to write
     * @param rootConceptClass The concept class
     * @param jsonFlag writes JSON if true, and a generic string if false
     * @return The string with the concept
     * @throws ApexException thrown on errors
     */
    public String writeString(final C concept, final Class<C> rootConceptClass, final boolean jsonFlag) throws ApexException {
        Assertions.argumentNotNull(concept, "concept may not be null");
        
        if (jsonFlag) {
            return writeJSONString(concept, rootConceptClass);
        }
        else {
            return concept.toString();
        }
    }

    /**
     * Write a concept to an XML string.
     *
     * @param concept The concept to write
     * @param rootConceptClass The concept class
     * @return The string with the concept
     * @throws ApexException thrown on errors
     */
    public String writeXMLString(final C concept, final Class<C> rootConceptClass) throws ApexException {
        LOGGER.debug("running writeXMLString . . .");

        final ApexModelWriter<C> conceptWriter = new ApexModelWriter<>(rootConceptClass);
        conceptWriter.setValidateFlag(validateFlag);
        conceptWriter.getCDataFieldSet().add("description");
        conceptWriter.getCDataFieldSet().add("logic");
        conceptWriter.getCDataFieldSet().add("uiLogic");

        final ByteArrayOutputStream baOutputStream = new ByteArrayOutputStream();
        try {
            conceptWriter.write(concept, baOutputStream);
            baOutputStream.close();
        }
        catch (final Exception e) {
            LOGGER.warn("error writing XML string", e);
            throw new ApexException("error writing XML string", e);
        }

        LOGGER.debug("ran writeXMLString");
        return baOutputStream.toString();
    }

    /**
     * Write a concept to a JSON string.
     *
     * @param concept The concept to write
     * @param rootConceptClass The concept class
     * @return The string with the concept
     * @throws ApexException thrown on errors
     */
    public String writeJSONString(final C concept, final Class<C> rootConceptClass) throws ApexException {
        LOGGER.debug("running writeJSONString . . .");

        final ApexModelWriter<C> conceptWriter = new ApexModelWriter<>(rootConceptClass);
        conceptWriter.setJsonOutput(true);
        conceptWriter.setValidateFlag(validateFlag);

        final ByteArrayOutputStream baOutputStream = new ByteArrayOutputStream();
        try {
            conceptWriter.write(concept, baOutputStream);
            baOutputStream.close();
        }
        catch (final Exception e) {
            LOGGER.warn("error writing JSON string", e);
            throw new ApexException("error writing JSON string", e);
        }

        LOGGER.debug("ran writeJSONString");
        return baOutputStream.toString();
    }

    /**
     * Checks if is validate flag.
     *
     * @return true, if checks if is validate flag
     */
    public boolean isValidateFlag() {
        return validateFlag;
    }

    /**
     * Sets the validate flag.
     *
     * @param validateFlag the validate flag
     */
    public void setValidateFlag(final boolean validateFlag) {
        this.validateFlag = validateFlag;
    }
}