aboutsummaryrefslogtreecommitdiffstats
path: root/appc-client/client-simulator/src/main/java/org/onap/appc/simulator/client/impl/JsonResponseHandler.java
blob: 075f09ac7ea19bf38e2bf2647b3a6cc0442bb60d (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=======================================================
 * ONAP : APPC
 * ================================================================================
 * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Copyright (C) 2017 Amdocs
 * =============================================================================
 * 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.appc.simulator.client.impl;

import org.onap.appc.client.lcm.api.ResponseHandler;
import org.onap.appc.client.lcm.exceptions.AppcClientException;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.FileWriter;
import java.util.concurrent.atomic.AtomicInteger;

public class JsonResponseHandler implements ResponseHandler<Object> {

    public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    private final EELFLogger LOG = EELFManager.getInstance().getLogger(JsonResponseHandler.class);

    private String fileName = "default";
    private static final int ACCEPT_FAMILY = 1;
    private static final int SUCCESS_FAMILY = 4;
    private static final int INTERMEDIATE_MESSAGES =5;

    private AtomicInteger messageCount =new AtomicInteger(1);

    public void setFile(String name) {
        fileName = name;
    }

    @Override
    public void onResponse(Object response) {

        String output = null;
        try {
            output = OBJECT_MAPPER.writeValueAsString(response);
        } catch (JsonProcessingException e) {
            LOG.error(e.getMessage());
        }
        LOG.debug("Received response : " + output);

        int errorCode = 0;
        boolean isFinal = true;
        try {
            JsonNode code= OBJECT_MAPPER.readTree(output).findValue("status").findValue("code");
            if (code == null)
            {
                LOG.error("Status code doesn't exist. Malformed response : " + output);
                flushToErrorFile(output, isFinal);
                return;
            }
            errorCode = code.asInt();
            errorCode = errorCode / 100;
            switch (errorCode) {
                case ACCEPT_FAMILY:
                    isFinal = false; // for ACCEPT that it is not a final response
                    break;
                case INTERMEDIATE_MESSAGES:
                    isFinal = false; // for 5xx series messages are not a final response
                    break;
                default:
                    break;
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        switch (errorCode) {
            case ACCEPT_FAMILY: {
                try {
                    System.out.println("== THR#" + Thread.currentThread().getId() + " Got ACCEPT on ReqID <" +
                            OBJECT_MAPPER.readTree(output).findValue("common-header").findValue("request-id").asText() + ">");
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
                // no need to report ACCEPT into output file
                break;
            }
            case SUCCESS_FAMILY:
                flushToOutputFile(output, isFinal);
                break;
            case INTERMEDIATE_MESSAGES:
                flushToMessageFile(output, isFinal);
                break;
            default:
                flushToErrorFile(output, isFinal);
        }
    }

    @Override
    public void onException(AppcClientException exception) {
        flushToErrorFile("exception: " + exception, true);
    }

    private void flushToOutputFile(String output, boolean isFinal) {
        this.flushToFile(output, ".output", isFinal);
    }
    private void flushToMessageFile(String output, boolean isFinal) {
        this.flushToFile(output, ".message" + messageCount.getAndIncrement(), isFinal);

    }

    private void flushToErrorFile(String output, boolean isFinal) {
        this.flushToFile(output, ".error", isFinal);
    }

    private   void flushToFile(String output, String suffix, boolean isFinal) {
        try (FileWriter fileWriter = new FileWriter(fileName + suffix);){
            LOG.info("Output file : " + fileName + suffix);

            fileWriter.write(output);
            fileWriter.flush();
            if (isFinal){
                fileWriter.close();
            }
        } catch (Exception e) {
            LOG.error(e.getMessage());
        }
        System.out.println("== THR#" +Thread.currentThread().getId()+ " Output file : " + fileName + suffix);
    }
}