aboutsummaryrefslogtreecommitdiffstats
path: root/openecomp-be/api/openecomp-sdc-rest-webapp/item-rest/item-rest-services/src/main/java/org/openecomp/sdcrests/item/rest/services/catalog/notification/http/HttpNotificationTask.java
blob: 1904bb5072408c9937998ab4473079880553869d (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
/*
 * Copyright © 2016-2018 European Support Limited
 *
 * 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.
 */
package org.openecomp.sdcrests.item.rest.services.catalog.notification.http;

import static org.openecomp.sdcrests.item.rest.services.catalog.notification.AsyncNotifier.NextAction.DONE;
import static org.openecomp.sdcrests.item.rest.services.catalog.notification.AsyncNotifier.NextAction.RETRY;

import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.concurrent.Callable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.openecomp.core.utilities.json.JsonUtil;
import org.openecomp.sdc.logging.api.Logger;
import org.openecomp.sdc.logging.api.LoggerFactory;
import org.openecomp.sdcrests.item.rest.services.catalog.notification.AsyncNotifier;

/**
 * HTTP client for notifying the Catalog of an action on items. The items are referenced by their IDs. The client can run multiple times, in which
 * case only failed IDs will be re-attempted.
 *
 * @author evitaliy
 * @since 21 Nov 2018
 */
@ToString
class HttpNotificationTask implements Callable<AsyncNotifier.NextAction> {

    private static final Logger LOGGER = LoggerFactory.getLogger(HttpNotificationTask.class);
    private static final String APPLICATION_JSON = ContentType.APPLICATION_JSON.getMimeType();
    private static final String USER_ID_HEADER_PARAM = "USER_ID";
    private final String endpoint;
    private final String userId;
    private volatile Collection<String> itemIds;

    HttpNotificationTask(String endpoint, String userId, Collection<String> itemIds) {
        this.endpoint = endpoint;
        this.userId = userId;
        this.itemIds = itemIds;
    }

    @Override
    public synchronized AsyncNotifier.NextAction call() {
        try (CloseableHttpClient client = HttpClients.createDefault()) {
            HttpPost request = createPostRequest(endpoint, itemIds, userId);
            try (CloseableHttpResponse response = client.execute(request)) {
                StatusLine status = response.getStatusLine();
                LOGGER.debug("Catalog notification on VSP IDs: {}, endpoint: {}, response: {}", itemIds, endpoint, status);
                itemIds = getFailedIds(itemIds, response.getEntity());
                if ((status.getStatusCode() == HttpStatus.SC_INTERNAL_SERVER_ERROR) && (itemIds != null) && !itemIds.isEmpty()) {
                    LOGGER.debug("Catalog notification on VSP IDs {} failed. Endpoint: {}. Retry", itemIds, endpoint);
                    return RETRY;
                }
                return DONE;
            }
        } catch (Exception e) {
            LOGGER.error("Catalog notification on VSP IDs {} failed. Endpoint: {}", itemIds, endpoint, e);
            return DONE;
        }
    }

    private HttpPost createPostRequest(String postUrl, Collection<String> itemIds, String userId) throws UnsupportedEncodingException {
        HttpPost request = new HttpPost(postUrl);
        request.addHeader(HttpHeaders.ACCEPT, APPLICATION_JSON);
        request.addHeader(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON);
        request.addHeader(USER_ID_HEADER_PARAM, userId);
        HttpEntity entity = new StringEntity(JsonUtil.object2Json(itemIds));
        request.setEntity(entity);
        return request;
    }

    private Collection<String> getFailedIds(Collection<String> itemIds, HttpEntity responseBody) {
        try {
            NotificationResponse response = JsonUtil.json2Object(responseBody.getContent(), NotificationResponse.class);
            return response != null ? response.failedIds : null;
        } catch (Exception e) {
            LOGGER.error("Error getting failed IDs from response", e);
        }
        return itemIds;
    }

    @Setter
    @Getter
    @ToString
    @NoArgsConstructor
    private static class NotificationResponse {

        private Collection<String> failedIds;
    }
}