diff options
author | 2019-03-14 15:06:40 +0530 | |
---|---|---|
committer | 2019-03-18 15:25:23 +0530 | |
commit | be11dee889f5a740d584458b62804e5fd4296e53 (patch) | |
tree | 2cc5e14c29df1a40f8e7bbe3bb08fffa38e023b8 /src/main/java/org/onap/dcae/collectors | |
parent | d76c2d0f61bfb4373b13fcdb6fc3317467dd19b4 (diff) |
Issue-ID: DCAEGEN2-1055 Generic RestConfCollector
Change-Id: I1800affa2b34cbb7487c0d8411e078adec5a0c48
Signed-off-by: s00370346 <swarup.nayak1@huawei.com>
Diffstat (limited to 'src/main/java/org/onap/dcae/collectors')
28 files changed, 0 insertions, 3184 deletions
diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/AdditionalHeaderWebTarget.java b/src/main/java/org/onap/dcae/collectors/restconf/common/AdditionalHeaderWebTarget.java deleted file mode 100644 index e814778..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/AdditionalHeaderWebTarget.java +++ /dev/null @@ -1,159 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Configuration; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriBuilder; -import java.net.URI; -import java.util.Map; - -class AdditionalHeaderWebTarget implements WebTarget { - private WebTarget base; - private String token; - private String headerName; - - public AdditionalHeaderWebTarget(WebTarget target, String token, String headerName) { - base = target; - this.token = token; - this.headerName = headerName; - } - - @Override - public Invocation.Builder request() { - return base.request().header(headerName, token); - } - - @Override - public Invocation.Builder request(String... acceptedResponseTypes) { - return base.request().header(headerName, token); - } - - @Override - public Invocation.Builder request(MediaType... acceptedResponseTypes) { - return base.request().header(headerName, token); - } - - @Override - public Configuration getConfiguration() { - return base.getConfiguration(); - } - - @Override - public URI getUri() { - return base.getUri(); - } - - @Override - public UriBuilder getUriBuilder() { - return base.getUriBuilder(); - } - - @Override - public WebTarget path(String path) { - return base.path(path); - } - - @Override - public WebTarget resolveTemplate(String name, Object value) { - return base.resolveTemplate(name, value); - } - - @Override - public WebTarget resolveTemplate(String name, Object value, boolean encodeSlashInPath) { - return base.resolveTemplate(name, value, encodeSlashInPath); - } - - @Override - public WebTarget resolveTemplateFromEncoded(String name, Object value) { - return base.resolveTemplateFromEncoded(name, value); - } - - @Override - public WebTarget resolveTemplates(Map<String, Object> templateValues) { - return base.resolveTemplates(templateValues); - } - - @Override - public WebTarget resolveTemplates(Map<String, Object> templateValues, boolean encodeSlashInPath) { - return base.resolveTemplates(templateValues, encodeSlashInPath); - } - - @Override - public WebTarget resolveTemplatesFromEncoded(Map<String, Object> templateValues) { - return base.resolveTemplatesFromEncoded(templateValues); - } - - @Override - public WebTarget matrixParam(String name, Object... values) { - return base.matrixParam(name, values); - } - - @Override - public WebTarget queryParam(String name, Object... values) { - return base.queryParam(name, values); - } - - @Override - public WebTarget property(String name, Object value) { - return base.property(name, value); - } - - @Override - public WebTarget register(Class<?> componentClass) { - return base.register(componentClass); - } - - @Override - public WebTarget register(Class<?> componentClass, int priority) { - return base.register(componentClass, priority); - } - - @Override - public WebTarget register(Class<?> componentClass, Class<?>... contracts) { - return base.register(componentClass, contracts); - } - - @Override - public WebTarget register(Class<?> componentClass, Map<Class<?>, Integer> contracts) { - return base.register(componentClass, contracts); - } - - @Override - public WebTarget register(Object component) { - return base.register(component); - } - - @Override - public WebTarget register(Object component, int priority) { - return base.register(component, priority); - } - - @Override - public WebTarget register(Object component, Class<?>... contracts) { - return base.register(component, contracts); - } - - @Override - public WebTarget register(Object component, Map<Class<?>, Integer> contracts) { - return base.register(component, contracts); - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/AnyNode.java b/src/main/java/org/onap/dcae/collectors/restconf/common/AnyNode.java deleted file mode 100755 index 860fecc..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/AnyNode.java +++ /dev/null @@ -1,132 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import io.vavr.collection.List; -import io.vavr.collection.Set; -import io.vavr.control.Option; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.stream.StreamSupport; - -import static io.vavr.API.Set; - -public class AnyNode { - private static final Logger log = LoggerFactory.getLogger(AnyNode.class); - - private Object obj; - - private AnyNode(Object object) { - this.obj = object; - } - - public static AnyNode fromString(String content) { - return new AnyNode(new JSONObject(content)); - } - - /** - * Returns key set of underlying object. It is assumed that underlying object is of type org.json.JSONObject. - * - * @return key set of underlying objects - */ - public Set<String> keys() { - return Set(asJsonObject().keySet().toArray(new String[]{})); - } - - /** - * Returns value associated with specified key wrapped with AnyValue object. It is assumed that this is of type - * org.json.JSONObject. - * - * @param key for querying value from jsonobject - * @return value associated with specified key - */ - public AnyNode get(String key) { - return new AnyNode(asJsonObject().get(key)); - } - - /** - * Returns string representation of this. If it happens to have null, the value is treated as - * org.json.JSONObject.NULL and "null" string is returned then. - * - * @return string representation of this - */ - public String toString() { - return this.obj.toString(); - } - - /** - * Returns optional of object under specified key, wrapped with AnyNode object. - * If underlying object is not of type org.json.JSONObject - * or underlying object has no given key - * or given key is null - * then Optional.empty will be returned. - * - * @param key for querying value from AnyNode object - * @return optional of object under specified key - */ - public Option<AnyNode> getAsOption(String key) { - try { - AnyNode value = get(key); - if ("null".equals(value.toString())) { - return Option.none(); - } - return Option.some(value); - } catch (JSONException ex) { - log.error(ex.getMessage(), ex); - return Option.none(); - } - } - - /** - * Converts underlying object to map representation with map values wrapped with AnyNode object. It is assumed that - * underlying object is of type org.json.JSONObject. - * - * @return converts underlying object to map representation - */ - public List<AnyNode> toList() { - return List.ofAll(StreamSupport.stream(((JSONArray) this.obj).spliterator(), false).map(AnyNode::new)); - } - - /** - * Checks if specified key is present in this. It is assumed that this is of type JSONObject. - * - * @param key is used to check presence in anynode object - * @return true if specified key is present in this - */ - public boolean has(String key) { - return !getAsOption(key).isEmpty(); - } - - /** - * Returns as JSONObject. - * - * @return jsonobject - */ - private JSONObject asJsonObject() { - return (JSONObject) this.obj; - } - - -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/AuthType.java b/src/main/java/org/onap/dcae/collectors/restconf/common/AuthType.java deleted file mode 100755 index 2072631..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/AuthType.java +++ /dev/null @@ -1,43 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ -package org.onap.dcae.collectors.restconf.common; - -public enum AuthType { - NONE, BASIC, DIGEST, OAUTH, Unspecified; - - public static AuthType fromString(String s) { - if ("basic".equalsIgnoreCase(s)) { - return BASIC; - } - if ("digest".equalsIgnoreCase(s)) { - return DIGEST; - } - if ("oauth".equalsIgnoreCase(s)) { - return OAUTH; - } - if ("none".equalsIgnoreCase(s)) { - return NONE; - } - if ("unspecified".equalsIgnoreCase(s)) { - return Unspecified; - } - throw new IllegalArgumentException("Invalid value for format: " + s); - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/Constants.java b/src/main/java/org/onap/dcae/collectors/restconf/common/Constants.java deleted file mode 100755 index 5f8925d..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/Constants.java +++ /dev/null @@ -1,44 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -public class Constants { - public static final String KDEFAULT_TEMP_FILENAME = "templateFileName"; - public static final String KSETTING_REST_API_URL = "restapiUrl"; - public static final String KSETTING_HTTP_METHOD = "httpMethod"; - public static final String KSETTING_RESP_PREFIX = "responsePrefix"; - public static final String KSETTING_SKIP_SENDING = "skipSending"; - public static final String KSETTING_FORMAT = "format"; - public static final String KSETTING_DMAAPCONFIGS = "collector.dmaapfile"; - public static final String[] KDEFAULT_DMAAPCONFIGS = new String[]{"./etc/DmaapConfig.json"}; - public static final String KSETTING_SSE_CONNECT_URL = "sseConnectURL"; - public static final int KDEFAULT_MAXQUEUEDEVENTS = 1024 * 4; - public static final String RESPONSE_CODE = "restapi-result.response-code"; - public static final String OUTPUT_IDENTIFIER = "restapi-result.ietf-subscribed-notifications:output.identifier"; - public static final String RESPONSE_CODE_200 = "200"; - public static final String KCONFIG = "c"; - public static final String KSETTING_UNAME = "restapiUser"; - public static final String KSETTING_PASSWORD = "restapiPassword"; - public static final String KSETTING_TRUST_STORE_FILENAME = "trustStoreFileName"; - public static final String KSETTING_TRUST_STORE_PASSWORD = "trustStorePassword"; - public static final String KSETTING_KEY_STORE_FILENAME = "keyStoreFileName"; - public static final String KSETTING_KEY_STORE_PASSWORD = "keyStorePassword"; -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/DataChangeEventListener.java b/src/main/java/org/onap/dcae/collectors/restconf/common/DataChangeEventListener.java deleted file mode 100755 index 98bb74a..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/DataChangeEventListener.java +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import org.glassfish.jersey.media.sse.EventListener; -import org.glassfish.jersey.media.sse.InboundEvent; -import org.json.JSONArray; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DataChangeEventListener implements EventListener { - private static final Logger log = LoggerFactory.getLogger(DataChangeEventListener.class); - private RestConfContext ctx; - - public DataChangeEventListener(RestConfContext ctx) { - this.ctx = ctx; - } - - @Override - public void onEvent(InboundEvent event) { - JSONArray jsonArrayMod; - log.info("On SSE Event is received"); - String s = event.readData(); - JSONObject jsonObj = new JSONObject(s); - jsonArrayMod = new JSONArray().put(jsonObj); - try { - RestConfProc.handleEvents(jsonArrayMod); - } catch (Exception e) { - log.error("Error in DataChangeEventListener ", e.getMessage()); - } - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/EventProcessor.java b/src/main/java/org/onap/dcae/collectors/restconf/common/EventProcessor.java deleted file mode 100755 index 763cece..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/EventProcessor.java +++ /dev/null @@ -1,88 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - - -import org.json.JSONObject; -import org.onap.dcae.collectors.restconf.common.event.publishing.EventPublisher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -public class EventProcessor implements Runnable { - private static final Logger log = LoggerFactory.getLogger(EventProcessor.class); - - static Map<String, String[]> streamidHash = new HashMap<>(); - public JSONObject event; - private EventPublisher eventPublisher; - - public EventProcessor(EventPublisher eventPublisher) { - this.eventPublisher = eventPublisher; - streamidHash = parseStreamIdToStreamHashMapping(new RestConfProc().streamID); - } - - private Map<String, String[]> parseStreamIdToStreamHashMapping(String streamId) { - Map<String, String[]> streamidHash = new HashMap<>(); - String[] list = streamId.split("\\|"); - for (String aList : list) { - String domain = aList.split("=")[0]; - String[] streamIdList = aList.substring(aList.indexOf('=') + 1).split(","); - streamidHash.put(domain, streamIdList); - } - return streamidHash; - } - - @Override - public void run() { - try { - - while (true) { - event = RestConfProc.fProcessingInputQueue.take(); - // As long as the producer is running we remove elements from - // the queue. - log.info("QueueSize:" + RestConfProc.fProcessingInputQueue.size() + "\tEventProcessor\tRemoving element: " + - event); - String[] streamIdList = streamidHash.get("route"); - log.debug("streamIdList:" + Arrays.toString(streamIdList)); - - if (streamIdList.length == 0) { - log.error("No StreamID defined for publish - Message dropped" + event); - } else { - sendEventsToStreams(streamIdList); - } - log.debug("Event published" + event); - } - } catch (Exception e) { - log.error("EventProcessor InterruptedException" + e.getMessage()); - Thread.currentThread().interrupt(); - } - } - - private void sendEventsToStreams(String[] streamIdList) { - for (String aStreamIdList : streamIdList) { - log.info("Invoking publisher for streamId:" + aStreamIdList); - eventPublisher.sendEvent(event, aStreamIdList); - } - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/Format.java b/src/main/java/org/onap/dcae/collectors/restconf/common/Format.java deleted file mode 100755 index 710a576..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/Format.java +++ /dev/null @@ -1,38 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -public enum Format { - JSON, XML, NONE; - - public static Format fromString(String s) { - if ("json".equalsIgnoreCase(s)) { - return JSON; - } - if ("xml".equalsIgnoreCase(s)) { - return XML; - } - if ("none".equalsIgnoreCase(s)) { - return NONE; - } - throw new IllegalArgumentException("Invalid value for format: " + s); - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/HttpMethod.java b/src/main/java/org/onap/dcae/collectors/restconf/common/HttpMethod.java deleted file mode 100755 index b5c8e71..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/HttpMethod.java +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -public enum HttpMethod { - GET, POST, PUT, DELETE, PATCH; - - public static HttpMethod fromString(String s) { - if (s == null) { - return null; - } - if ("get".equalsIgnoreCase(s)) { - return GET; - } - if ("post".equalsIgnoreCase(s)) { - return POST; - } - if ("put".equalsIgnoreCase(s)) { - return PUT; - } - if ("delete".equalsIgnoreCase(s)) { - return DELETE; - } - if ("patch".equalsIgnoreCase(s)) { - return PATCH; - } - throw new IllegalArgumentException("Invalid value for HTTP Method: " + s); - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/HttpResponse.java b/src/main/java/org/onap/dcae/collectors/restconf/common/HttpResponse.java deleted file mode 100755 index 01505c3..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/HttpResponse.java +++ /dev/null @@ -1,30 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import javax.ws.rs.core.MultivaluedMap; - -public class HttpResponse { - public int code; - public String message; - public String body; - public MultivaluedMap<String, String> headers; -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/JsonParser.java b/src/main/java/org/onap/dcae/collectors/restconf/common/JsonParser.java deleted file mode 100755 index 16a5b7d..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/JsonParser.java +++ /dev/null @@ -1,92 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import org.codehaus.jettison.json.JSONArray; -import org.codehaus.jettison.json.JSONException; -import org.codehaus.jettison.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; - -public class JsonParser { - - private static final Logger log = LoggerFactory.getLogger(JsonParser.class); - - private JsonParser() { - // Preventing instantiation of the same. - } - - @SuppressWarnings("unchecked") - public static Map<String, String> convertToProperties(String s) - throws Exception { - - checkNotNull(s, "Input should not be null."); - - try { - JSONObject json = new JSONObject(s); - Map<String, Object> wm = new HashMap<>(); - Iterator<String> ii = json.keys(); - while (ii.hasNext()) { - String key1 = ii.next(); - wm.put(key1, json.get(key1)); - } - - Map<String, String> mm = new HashMap<>(); - - while (!wm.isEmpty()) - for (String key : new ArrayList<>(wm.keySet())) { - Object o = wm.get(key); - wm.remove(key); - - if (o instanceof Boolean || o instanceof Number || o instanceof String) { - mm.put(key, o.toString()); - - log.info("Added property: {} : {}", key, o.toString()); - } else if (o instanceof JSONObject) { - JSONObject jo = (JSONObject) o; - Iterator<String> i = jo.keys(); - while (i.hasNext()) { - String key1 = i.next(); - wm.put(key + "." + key1, jo.get(key1)); - } - } else if (o instanceof JSONArray) { - JSONArray ja = (JSONArray) o; - mm.put(key + "_length", String.valueOf(ja.length())); - - log.info("Added property: {}_length: {}", key, String.valueOf(ja.length())); - - for (int i = 0; i < ja.length(); i++) - wm.put(key + '[' + i + ']', ja.get(i)); - } - } - return mm; - } catch (JSONException e) { - throw new Exception("Unable to convert JSON to properties" + e.getLocalizedMessage(), e); - } - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/Parameters.java b/src/main/java/org/onap/dcae/collectors/restconf/common/Parameters.java deleted file mode 100755 index b0f7dfc..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/Parameters.java +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import java.util.Set; - -public class Parameters { - public String templateFileName; - public String restapiUrl; - public String restapiUser; - public String restapiPassword; - public Format format; - public String contentType; - public HttpMethod httpMethod; - public String responsePrefix; - public Set<String> listNameList; - public boolean skipSending; - public boolean convertResponse; - public String keyStoreFileName; - public String keyStorePassword; - public String trustStoreFileName; - public String trustStorePassword; - public boolean ssl; - public String customHttpHeaders; - public String partner; - public Boolean dumpHeaders; - public String requestBody; - public String oAuthConsumerKey; - public String oAuthConsumerSecret; - public String oAuthSignatureMethod; - public String oAuthVersion; - public AuthType authtype; - public Boolean returnRequestPayload; -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfCollector.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfCollector.java deleted file mode 100755 index 508cf66..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfCollector.java +++ /dev/null @@ -1,72 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import com.att.nsa.cmdLine.NsaCommandLineUtil; -import com.att.nsa.drumlin.service.framework.DrumlinServlet; -import com.att.nsa.drumlin.till.nv.impl.nvPropertiesFile; -import com.att.nsa.drumlin.till.nv.impl.nvReadableStack; -import com.att.nsa.drumlin.till.nv.impl.nvReadableTable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.net.URL; -import java.util.Map; - -public class RestConfCollector { - - public static final Logger eplog = LoggerFactory.getLogger("org.onap.restconf.common.error"); - - public static void main(String[] args) { - try { - final Map<String, String> argMap = NsaCommandLineUtil.processCmdLine(args, true); - final String config = NsaCommandLineUtil.getSetting(argMap, Constants.KCONFIG, "collector.properties"); - final URL settingStream = DrumlinServlet.findStream(config, RestConfCollector.class); - - final nvReadableStack settings = new nvReadableStack(); - settings.push(new nvPropertiesFile(settingStream)); - settings.push(new nvReadableTable(argMap)); - - RestConfProc restConfProc = new RestConfProc(settings); - Map<String, String> paraMap = restConfProc.getParaMap(); - String restApiURL = paraMap.get(Constants.KSETTING_REST_API_URL); - String sseEventsURL = paraMap.get(Constants.KSETTING_SSE_CONNECT_URL); - String trustStoreFileName = paraMap.get(Constants.KSETTING_TRUST_STORE_FILENAME); - String keyStoreFileName = paraMap.get(Constants.KSETTING_KEY_STORE_FILENAME); - String[] listRestApiURL = restApiURL.split(";"); - String[] listSseEventsURL = sseEventsURL.split(";"); - String[] listTrustStoreFileName = trustStoreFileName.split(";"); - String[] listKeyStoreFileName = keyStoreFileName.split(";"); - for (int i = 0; i < listRestApiURL.length; i++) { - paraMap.put(Constants.KSETTING_REST_API_URL, "https://" + listRestApiURL[i] + - "/restconf/operations/ietf-subscribed-notifications:establish-subscription"); - paraMap.put(Constants.KSETTING_SSE_CONNECT_URL, listSseEventsURL[i]); - paraMap.put(Constants.KSETTING_TRUST_STORE_FILENAME, listTrustStoreFileName[i]); - paraMap.put(Constants.KSETTING_KEY_STORE_FILENAME, listKeyStoreFileName[i]); - restConfProc.establishSubscription(paraMap, restConfProc.getCtx(), listRestApiURL[i]); - } - - } catch (Exception e) { - RestConfCollector.eplog.error("Fatal error during application startup", e); - throw new RuntimeException(e); - } - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfContext.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfContext.java deleted file mode 100755 index e1ea001..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfContext.java +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import java.util.HashMap; -import java.util.Set; - -public class RestConfContext { - private HashMap<String, String> attributes; - - public RestConfContext() { - attributes = new HashMap<>(); - } - - public String getAttribute(String name) { - return attributes.getOrDefault(name, null); - } - - public void setAttribute(String name, String value) { - if (value == null) { - if (attributes.containsKey(name)) { - attributes.remove(name); - } - } else { - attributes.put(name, value); - } - } - - public Set<String> getAttributeKeySet() { - return attributes.keySet(); - } - -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfProc.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfProc.java deleted file mode 100755 index cfebe3b..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestConfProc.java +++ /dev/null @@ -1,336 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import com.att.nsa.drumlin.till.nv.rrNvReadable; -import org.glassfish.jersey.media.sse.EventSource; -import org.glassfish.jersey.media.sse.SseFeature; -import org.json.JSONArray; -import org.json.JSONObject; -import org.onap.dcae.collectors.restconf.common.event.publishing.DMaaPConfigurationParser; -import org.onap.dcae.collectors.restconf.common.event.publishing.EventPublisher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.HttpHeaders; -import java.nio.file.Paths; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.Base64; - -import static org.onap.dcae.collectors.restconf.common.RestapiCallNodeUtil.getParameters; -import static org.onap.dcae.collectors.restconf.common.RestapiCallNodeUtil.addAuthType; - -public class RestConfProc { - - private static final Logger log = LoggerFactory.getLogger(RestConfProc.class); - - public static String format; - - private static RestConfContext ctx = new RestConfContext(); - - private static final Logger oplog = LoggerFactory.getLogger("org.onap.restconf.common.output"); - - private Map<String, PersistentConnection> runnableInfo = new ConcurrentHashMap<>(); - - private final Map<String, String> paraMap = new HashMap<>(); - private static String cambriaConfigFile; - - public static LinkedBlockingQueue<JSONObject> fProcessingInputQueue; - - public static String streamID; - private ExecutorService executor = Executors.newCachedThreadPool(); - - public RestConfProc() { - } - - private void parseInputParameters(rrNvReadable settings) { - String tempFileName; - String restApiUrl; - String httpMetthod; - String respPrefix; - String skipSending; - String sseConnectUrl; - String restapiUser; - String restapiPassword; - String trustStoreFileName; - String trustStorePassword; - String keyStoreFileName; - String keyStorePassword; - String[] currentConfigFile; - - currentConfigFile = settings.getStrings(Constants.KSETTING_DMAAPCONFIGS, Constants.KDEFAULT_DMAAPCONFIGS); - cambriaConfigFile = currentConfigFile[0]; - - tempFileName = settings.getString(Constants.KDEFAULT_TEMP_FILENAME, null); - restApiUrl = settings.getString(Constants.KSETTING_REST_API_URL, null); - httpMetthod = settings.getString(Constants.KSETTING_HTTP_METHOD, null); - respPrefix = settings.getString(Constants.KSETTING_RESP_PREFIX, null); - skipSending = settings.getString(Constants.KSETTING_SKIP_SENDING, null); - sseConnectUrl = settings.getString(Constants.KSETTING_SSE_CONNECT_URL, null); - restapiUser = settings.getString(Constants.KSETTING_UNAME, null); - restapiPassword = settings.getString(Constants.KSETTING_PASSWORD, null); - trustStoreFileName = settings.getString(Constants.KSETTING_TRUST_STORE_FILENAME, null); - trustStorePassword = settings.getString(Constants.KSETTING_TRUST_STORE_PASSWORD, null); - keyStoreFileName = settings.getString(Constants.KSETTING_KEY_STORE_FILENAME, null); - keyStorePassword = settings.getString(Constants.KSETTING_KEY_STORE_PASSWORD, null); - format = settings.getString(Constants.KSETTING_FORMAT, null); - streamID = "route=route_failure"; - - paraMap.put(Constants.KDEFAULT_TEMP_FILENAME, tempFileName); - paraMap.put(Constants.KSETTING_REST_API_URL, restApiUrl); - paraMap.put(Constants.KSETTING_HTTP_METHOD, httpMetthod); - paraMap.put(Constants.KSETTING_RESP_PREFIX, respPrefix); - paraMap.put(Constants.KSETTING_SKIP_SENDING, skipSending); - paraMap.put(Constants.KSETTING_SSE_CONNECT_URL, sseConnectUrl); - paraMap.put(Constants.KSETTING_FORMAT, format); - paraMap.put(Constants.KSETTING_UNAME, restapiUser); - paraMap.put(Constants.KSETTING_PASSWORD, restapiPassword); - paraMap.put(Constants.KSETTING_TRUST_STORE_FILENAME, trustStoreFileName); - paraMap.put(Constants.KSETTING_TRUST_STORE_PASSWORD, trustStorePassword); - paraMap.put(Constants.KSETTING_KEY_STORE_FILENAME, keyStoreFileName); - paraMap.put(Constants.KSETTING_KEY_STORE_PASSWORD, keyStorePassword); - - ctx.setAttribute("prop.encoding-json", "encoding-json"); - ctx.setAttribute("restapi-result.response-code", "200"); - ctx.setAttribute("restapi-result.ietf-subscribed-notifications:output.identifier", "100"); - } - - public RestConfProc(rrNvReadable settings) { - - parseInputParameters(settings); - - fProcessingInputQueue = new LinkedBlockingQueue<>(Constants.KDEFAULT_MAXQUEUEDEVENTS); - - EventProcessor ep = new EventProcessor(EventPublisher.createPublisher(oplog, - DMaaPConfigurationParser - .parseToDomainMapping(Paths.get(cambriaConfigFile)) - .get())); - ExecutorService executor = Executors.newFixedThreadPool(20); - for (int i = 0; i < 20; ++i) { - executor.execute(ep); - } - } - - /** - * To establish a subscription with controller by sending HTTP request - * - * @param paramMap holds the input configuration - * @param ctx restconf context - * @param url url to send subscription request - * @throws Exception exception - */ - public void establishSubscription(Map<String, String> paramMap, - RestConfContext ctx, - String url) throws Exception { - - RestapiCallNode restApiCallNode = new RestapiCallNode(); - - Map<String, String> params = new HashMap<>(); - params.put("restapiUrl", "https://" + url + "/controller/v2/tokens"); - params.put("httpMethod", "post"); - params.put("templateFileName", "./etc/access-token.json"); - params.put("skipSending", "false"); - params.put("format", "json"); - params.put("restapiUser", "test123"); - params.put("restapiPassword", "Changeme_123"); - params.put(Constants.KSETTING_TRUST_STORE_FILENAME, - paramMap.get(Constants.KSETTING_TRUST_STORE_FILENAME)); - params.put(Constants.KSETTING_TRUST_STORE_PASSWORD, "adminadmin"); - params.put(Constants.KSETTING_KEY_STORE_FILENAME, - paramMap.get(Constants.KSETTING_KEY_STORE_FILENAME)); - params.put(Constants.KSETTING_KEY_STORE_PASSWORD, "adminadmin"); - - String httpResponse = null; - try { - restApiCallNode.sendRequest(params, ctx, null); - httpResponse = ctx.getAttribute("httpResponse"); - JSONObject jsonObj = new JSONObject(httpResponse); - JSONObject data = jsonObj.getJSONObject("data"); - String tokenId = data.get("token_id").toString(); - paramMap.put("customHttpHeaders", "X-ACCESS-TOKEN=" + tokenId); - paramMap.put("TokenId", tokenId); - } catch (Exception e) { - log.info("Access token is not supported" + e.getMessage()); - log.info("http response" + httpResponse); - } - - restApiCallNode.sendRequest(paramMap, ctx, null); - - establishPersistentConnection(paramMap, ctx); - } - - /** - * To establish persistent connection after receiving successful subscription response from controller - * - * @param paramMap holds the input configuration - * @param ctx restconf context - */ - public void establishPersistentConnection(Map<String, String> paramMap, RestConfContext ctx) { - - // check whether response is ok - if (ctx.getAttribute(Constants.RESPONSE_CODE).equals(Constants.RESPONSE_CODE_200)) { - - String id = ctx.getAttribute(Constants.OUTPUT_IDENTIFIER); - - String url = paramMap.get(Constants.KSETTING_SSE_CONNECT_URL); - - PersistentConnection connection = new PersistentConnection(url, ctx, paramMap); - runnableInfo.put(id, connection); - executor.execute(connection); - } else { - // error response is already updated in ctx - log.info("Failed to subscribe"); - } - } - - /** - * Get input parameter map - * - * @return input parameters map - */ - public Map<String, String> getParaMap() { - return paraMap; - } - - - /** - * Get restConf context which has information about message encoding type - * - * @return restconf context - */ - public RestConfContext getCtx() { - return ctx; - } - - public class PersistentConnection implements Runnable { - private String url; - private RestConfContext ctx; - private Map<String, String> paramMap; - private volatile boolean running = true; - - public PersistentConnection(String url, RestConfContext ctx, Map<String, String> paramMap) { - this.url = url; - this.ctx = ctx; - this.paramMap = paramMap; - } - - @Override - public void run() { - Parameters p = null; - try { - p = getParameters(paramMap); - } catch (Exception e) { - log.error("Exception occured!", e); - Thread.currentThread().interrupt(); - } - - Client client = ignoreSslClient().register(SseFeature.class); - WebTarget target = addAuthType(client, p).target(url); - String token = paramMap.get("TokenId"); - String headerName = "X-ACCESS-TOKEN"; - if (token == null) { - headerName = HttpHeaders.AUTHORIZATION; - if(null!=p) { - token = getAuthorizationToken(p.restapiUser, p.restapiPassword); - } - } - AdditionalHeaderWebTarget newTarget = new AdditionalHeaderWebTarget(target, token, headerName); - EventSource eventSource = EventSource.target(newTarget).build(); - eventSource.register(new DataChangeEventListener(ctx)); - eventSource.open(); - log.debug("Connected to SSE source"); - while (running) { - try { - log.debug("SSE state " + eventSource.isOpen()); - Thread.sleep(5000); - } catch (InterruptedException ie) { - log.debug("Exception: " + ie.getMessage()); - Thread.currentThread().interrupt(); - } - } - eventSource.close(); - log.info("Closed connection to SSE source"); - } - } - - private String getAuthorizationToken(String userName, String password) { - return "Basic " + Base64.getEncoder().encodeToString(( - userName + ":" + password).getBytes()); - } - - /** - * To process the array of events which are received from controller - * - * @param a JSONArray - * @throws Exception exception - */ - public static void handleEvents(JSONArray a) throws Exception { - for (int i = 0; i < a.length(); i++) { - if (!fProcessingInputQueue.offer(a.getJSONObject(i))) { - throw new Exception(); - } - } - log.debug("RestConfCollector.handleEvents:EVENTS has been published successfully!"); - } - - private Client ignoreSslClient() { - SSLContext sslcontext = null; - - try { - sslcontext = SSLContext.getInstance("TLS"); - sslcontext.init(null, new TrustManager[]{new X509TrustManager() { - @Override - public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { - } - - @Override - public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - } }, new java.security.SecureRandom()); - } catch (NoSuchAlgorithmException | KeyManagementException e) { - throw new IllegalStateException(e); - } - - return ClientBuilder.newBuilder().sslContext(sslcontext).hostnameVerifier((s1, s2) -> true).build(); - } -} - - diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNode.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNode.java deleted file mode 100755 index 33abca9..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNode.java +++ /dev/null @@ -1,510 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientHandlerException; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.UniformInterfaceException; -import com.sun.jersey.api.client.WebResource; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; -import com.sun.jersey.api.client.filter.HTTPDigestAuthFilter; -import com.sun.jersey.client.urlconnection.HTTPSProperties; -import com.sun.jersey.oauth.client.OAuthClientFilter; -import com.sun.jersey.oauth.signature.OAuthParameters; -import com.sun.jersey.oauth.signature.OAuthSecrets; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.ws.rs.core.EntityTag; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.UriBuilder; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.SocketException; -import java.net.URI; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.security.KeyStore; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.onap.dcae.collectors.restconf.common.RestapiCallNodeUtil.getParameters; -import static org.onap.dcae.collectors.restconf.common.RestapiCallNodeUtil.parseParam; - -public class RestapiCallNode { - private static final Logger log = LoggerFactory.getLogger(RestapiCallNode.class); - - public void sendRequest(Map<String, String> paramMap, RestConfContext ctx, Integer retryCount) throws Exception { - RetryPolicy retryPolicy = null; - HttpResponse r = new HttpResponse(); - try { - Parameters p = getParameters(paramMap); - String pp = p.responsePrefix != null ? p.responsePrefix + '.' : ""; - String req = null; - if (p.templateFileName != null) { - String reqTemplate = readFile(p.templateFileName); - req = buildXmlJsonRequest(ctx, reqTemplate, p.format); - } else if (p.requestBody != null) { - req = p.requestBody; - } - - r = sendHttpRequest(req, p); - setResponseStatus(ctx, p.responsePrefix, r); - - if (p.dumpHeaders && r.headers != null) { - for (Map.Entry<String, List<String>> a : r.headers.entrySet()) { - ctx.setAttribute(pp + "header." + a.getKey(), StringUtils.join(a.getValue(), ",")); - } - } - - if (p.returnRequestPayload && req != null) { - ctx.setAttribute(pp + "httpRequest", req); - } - - if (r.body != null && r.body.trim().length() > 0) { - ctx.setAttribute(pp + "httpResponse", r.body); - - if (p.convertResponse) { - Map<String, String> mm = null; - if (p.format == Format.XML) { - mm = XmlParser.convertToProperties(r.body, p.listNameList); - } else if (p.format == Format.JSON) { - mm = JsonParser.convertToProperties(r.body); - } - - if (mm != null) { - for (Map.Entry<String, String> entry : mm.entrySet()) - ctx.setAttribute(pp + entry.getKey(), entry.getValue()); - } - } - } - } catch (Exception e) { - boolean shouldRetry = false; - if (e.getCause().getCause() instanceof SocketException) { - shouldRetry = true; - } - - log.error("Error sending the request: " + e.getMessage(), e); - String prefix = parseParam(paramMap, "responsePrefix", false, null); - if (null == retryPolicy || !shouldRetry) { - setFailureResponseStatus(ctx, prefix, e.getMessage(), r); - } else { - if (retryCount == null) { - retryCount = 0; - } - String retryMessage = retryCount + " attempts were made out of " + retryPolicy.getMaximumRetries() + - " maximum retries."; - log.debug(retryMessage); - try { - retryCount = retryCount + 1; - if (retryCount < retryPolicy.getMaximumRetries() + 1) { - URI uri = new URI(paramMap.get("restapiUrl")); - String hostname = uri.getHost(); - String retryString = retryPolicy.getNextHostName(uri.toString()); - URI uriTwo = new URI(retryString); - URI retryUri = UriBuilder.fromUri(uri).host(uriTwo.getHost()).port(uriTwo.getPort()).scheme( - uriTwo.getScheme()).build(); - paramMap.put("restapiUrl", retryUri.toString()); - log.debug("URL was set to {}", retryUri.toString()); - log.debug("Failed to communicate with host {}. Request will be re-attempted using the host {}.", - hostname, retryString); - log.debug("This is retry attempt {} out of {}", retryCount, retryPolicy.getMaximumRetries()); - sendRequest(paramMap, ctx, retryCount); - } else { - log.debug("Maximum retries reached, calling setFailureResponseStatus."); - setFailureResponseStatus(ctx, prefix, e.getMessage(), r); - } - } catch (Exception ex) { - log.error("Could not attempt retry.", ex); - String retryErrorMessage = - "Retry attempt has failed. No further retry shall be attempted, calling " + - "setFailureResponseStatus."; - setFailureResponseStatus(ctx, prefix, retryErrorMessage, r); - } - } - } - - if (r != null && r.code >= 300) { - throw new Exception(String.valueOf(r.code) + ": " + r.message); - } - } - - protected String buildXmlJsonRequest(RestConfContext ctx, String template, Format format) throws Exception { - log.info("Building {} started", format); - long t1 = System.currentTimeMillis(); - - template = expandRepeats(ctx, template, 1); - - Map<String, String> mm = new HashMap<>(); - for (String s : ctx.getAttributeKeySet()) - mm.put(s, ctx.getAttribute(s)); - StringBuilder ss = new StringBuilder(); - int i = 0; - while (i < template.length()) { - int i1 = template.indexOf("${", i); - if (i1 < 0) { - ss.append(template.substring(i)); - break; - } - - int i2 = template.indexOf('}', i1 + 2); - if (i2 < 0) { - throw new Exception("Template error: Matching } not found"); - } - - String var1 = template.substring(i1 + 2, i2); - String value1 = format == Format.XML ? XmlJsonUtil.getXml(mm, var1) : XmlJsonUtil.getJson(mm, var1); - if (value1 == null || value1.trim().length() == 0) { - // delete the whole element (line) - int i3 = template.lastIndexOf('\n', i1); - if (i3 < 0) { - i3 = 0; - } - int i4 = template.indexOf('\n', i1); - if (i4 < 0) { - i4 = template.length(); - } - - if (i < i3) { - ss.append(template.substring(i, i3)); - } - i = i4; - } else { - ss.append(template.substring(i, i1)).append(value1); - i = i2 + 1; - } - } - - String req = format == Format.XML - ? XmlJsonUtil.removeEmptyStructXml(ss.toString()) : XmlJsonUtil.removeEmptyStructJson(ss.toString()); - - if (format == Format.JSON) { - req = XmlJsonUtil.removeLastCommaJson(req); - } - - long t2 = System.currentTimeMillis(); - log.info("Building {} completed. Time: {}", format, (t2 - t1)); - - return req; - } - - protected String expandRepeats(RestConfContext ctx, String template, int level) throws Exception { - StringBuilder newTemplate = new StringBuilder(); - int k = 0; - while (k < template.length()) { - int i1 = template.indexOf("${repeat:", k); - if (i1 < 0) { - newTemplate.append(template.substring(k)); - break; - } - - int i2 = template.indexOf(':', i1 + 9); - if (i2 < 0) { - throw new Exception( - "Template error: Context variable name followed by : is required after repeat"); - } - - // Find the closing }, store in i3 - int nn = 1; - int i3 = -1; - int i = i2; - while (nn > 0 && i < template.length()) { - i3 = template.indexOf('}', i); - if (i3 < 0) { - throw new Exception("Template error: Matching } not found"); - } - int i32 = template.indexOf('{', i); - if (i32 >= 0 && i32 < i3) { - nn++; - i = i32 + 1; - } else { - nn--; - i = i3 + 1; - } - } - - String var1 = template.substring(i1 + 9, i2); - String value1 = ctx.getAttribute(var1); - log.info(" {}:{}", var1, value1); - int n = 0; - try { - n = Integer.parseInt(value1); - } catch (NumberFormatException e) { - log.info("value1 not set or not a number, n will remain set at zero"); - } - - newTemplate.append(template.substring(k, i1)); - - String rpt = template.substring(i2 + 1, i3); - - for (int ii = 0; ii < n; ii++) { - String ss = rpt.replaceAll("\\[\\$\\{" + level + "\\}\\]", "[" + ii + "]"); - if (ii == n - 1 && ss.trim().endsWith(",")) { - int i4 = ss.lastIndexOf(','); - if (i4 > 0) { - ss = ss.substring(0, i4) + ss.substring(i4 + 1); - } - } - newTemplate.append(ss); - } - - k = i3 + 1; - } - - if (k == 0) { - return newTemplate.toString(); - } - - return expandRepeats(ctx, newTemplate.toString(), level + 1); - } - - protected String readFile(String fileName) throws Exception { - try { - byte[] encoded = Files.readAllBytes(Paths.get(fileName)); - return new String(encoded, "UTF-8"); - } catch (IOException | SecurityException e) { - throw new Exception("Unable to read file " + fileName + e.getLocalizedMessage(), e); - } - } - - protected Client addAuthType(Client client, Parameters p) throws Exception { - if (p.authtype == AuthType.Unspecified) { - if (p.restapiUser != null && p.restapiPassword != null) { - client.addFilter(new HTTPBasicAuthFilter(p.restapiUser, p.restapiPassword)); - } else if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null - && p.oAuthSignatureMethod != null) { - OAuthParameters params = new OAuthParameters() - .signatureMethod(p.oAuthSignatureMethod) - .consumerKey(p.oAuthConsumerKey) - .version(p.oAuthVersion); - - OAuthSecrets secrets = new OAuthSecrets() - .consumerSecret(p.oAuthConsumerSecret); - client.addFilter(new OAuthClientFilter(client.getProviders(), params, secrets)); - } - } else { - if (p.authtype == AuthType.DIGEST) { - if (p.restapiUser != null && p.restapiPassword != null) { - client.addFilter(new HTTPDigestAuthFilter(p.restapiUser, p.restapiPassword)); - } else { - throw new Exception("oAUTH authentication type selected but all restapiUser and restapiPassword " + - "parameters doesn't exist", new Throwable()); - } - } else if (p.authtype == AuthType.BASIC) { - if (p.restapiUser != null && p.restapiPassword != null) { - client.addFilter(new HTTPBasicAuthFilter(p.restapiUser, p.restapiPassword)); - } else { - throw new Exception("oAUTH authentication type selected but all restapiUser and restapiPassword " + - "parameters doesn't exist", new Throwable()); - } - } else if (p.authtype == AuthType.OAUTH) { - if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null && p.oAuthSignatureMethod != null) { - OAuthParameters params = new OAuthParameters() - .signatureMethod(p.oAuthSignatureMethod) - .consumerKey(p.oAuthConsumerKey) - .version(p.oAuthVersion); - - OAuthSecrets secrets = new OAuthSecrets() - .consumerSecret(p.oAuthConsumerSecret); - client.addFilter(new OAuthClientFilter(client.getProviders(), params, secrets)); - } else { - throw new Exception("oAUTH authentication type selected but all oAuthConsumerKey, oAuthConsumerSecret " + - "and oAuthSignatureMethod parameters doesn't exist", new Throwable()); - } - } - } - return client; - } - - protected HttpResponse sendHttpRequest(String request, Parameters p) throws Exception { - - ClientConfig config = new DefaultClientConfig(); - SSLContext ssl = null; - if (p.ssl && p.restapiUrl.startsWith("https")) { - ssl = createSSLContext(p); - } - if (ssl != null) { - HostnameVerifier hostnameVerifier = (hostname, session) -> true; - - config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, - new HTTPSProperties(hostnameVerifier, ssl)); - } - - logProperties(config.getProperties()); - - Client client = Client.create(config); - client.setConnectTimeout(5000); - WebResource webResource = addAuthType(client, p).resource(p.restapiUrl); - - log.info("Sending request:"); - log.info(request); - long t1 = System.currentTimeMillis(); - - HttpResponse r = new HttpResponse(); - r.code = 200; - - if (!p.skipSending) { - String tt = p.format == Format.XML ? "application/xml" : "application/json"; - String tt1 = tt + ";charset=UTF-8"; - if (p.contentType != null) { - tt = p.contentType; - tt1 = p.contentType; - } - - WebResource.Builder webResourceBuilder = webResource.accept(tt).type(tt1); - if (p.format == Format.NONE) { - webResourceBuilder = webResource.header("", ""); - } - - if (p.customHttpHeaders != null && p.customHttpHeaders.length() > 0) { - String[] keyValuePairs = p.customHttpHeaders.split(","); - for (String singlePair : keyValuePairs) { - int equalPosition = singlePair.indexOf('='); - webResourceBuilder.header(singlePair.substring(0, equalPosition), - singlePair.substring(equalPosition + 1, singlePair.length())); - } - } - - webResourceBuilder.header("X-ECOMP-RequestID", org.slf4j.MDC.get("X-ECOMP-RequestID")); - - ClientResponse response; - - try { - response = webResourceBuilder.method(p.httpMethod.toString(), ClientResponse.class, request); - } catch (UniformInterfaceException | ClientHandlerException e) { - throw new Exception("Exception while sending http request to client " - + e.getLocalizedMessage(), e); - } - - r.code = response.getStatus(); - r.headers = response.getHeaders(); - EntityTag etag = response.getEntityTag(); - if (etag != null) { - r.message = etag.getValue(); - } - if (response.hasEntity() && r.code != 204) { - r.body = response.getEntity(String.class); - } - } - - long t2 = System.currentTimeMillis(); - log.info("Response received. Time: {}", (t2 - t1)); - log.info("HTTP response code: {}", r.code); - log.info("HTTP response message: {}", r.message); - logHeaders(r.headers); - log.info("HTTP response: {}", r.body); - - return r; - } - - protected void setFailureResponseStatus(RestConfContext ctx, String prefix, String errorMessage, - HttpResponse resp) { - resp.code = 500; - resp.message = errorMessage; - String pp = prefix != null ? prefix + '.' : ""; - ctx.setAttribute(pp + "response-code", String.valueOf(resp.code)); - ctx.setAttribute(pp + "response-message", resp.message); - } - - protected void setResponseStatus(RestConfContext ctx, String prefix, HttpResponse r) { - String pp = prefix != null ? prefix + '.' : ""; - ctx.setAttribute(pp + "response-code", String.valueOf(r.code)); - ctx.setAttribute(pp + "response-message", r.message); - } - - protected SSLContext createSSLContext(Parameters p) { - try (FileInputStream in = new FileInputStream(p.keyStoreFileName)) { - System.setProperty("jsse.enableSNIExtension", "false"); - System.setProperty("javax.net.ssl.trustStore", p.trustStoreFileName); - System.setProperty("javax.net.ssl.trustStorePassword", p.trustStorePassword); - - HttpsURLConnection.setDefaultHostnameVerifier((string, ssls) -> true); - - KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - KeyStore ks = KeyStore.getInstance("PKCS12"); - char[] pwd = p.keyStorePassword.toCharArray(); - ks.load(in, pwd); - kmf.init(ks, pwd); - - SSLContext ctx = SSLContext.getInstance("TLS"); - ctx.init(kmf.getKeyManagers(), null, null); - return ctx; - } catch (Exception e) { - log.error("Error creating SSLContext: {}", e.getMessage(), e); - } - return null; - } - - protected void logProperties(Map<String, Object> mm) { - List<String> ll = new ArrayList<>(); - for (Object o : mm.keySet()) - ll.add((String) o); - Collections.sort(ll); - - log.info("Properties:"); - for (String name : ll) - log.info("--- {}:{}", name, String.valueOf(mm.get(name))); - } - - protected void logHeaders(MultivaluedMap<String, String> mm) { - log.info("HTTP response headers:"); - - if (mm == null) { - return; - } - - List<String> ll = new ArrayList<>(); - for (Object o : mm.keySet()) - ll.add((String) o); - Collections.sort(ll); - - for (String name : ll) - log.info("--- {}:{}", name, String.valueOf(mm.get(name))); - } - - private static class FileParam { - - public String fileName; - public String url; - public String user; - public String password; - public HttpMethod httpMethod; - public String responsePrefix; - public boolean skipSending; - public String oAuthConsumerKey; - public String oAuthConsumerSecret; - public String oAuthSignatureMethod; - public String oAuthVersion; - public AuthType authtype; - } - -}
\ No newline at end of file diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNodeUtil.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNodeUtil.java deleted file mode 100755 index 0e1d03b..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/RestapiCallNodeUtil.java +++ /dev/null @@ -1,178 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; -import org.glassfish.jersey.client.oauth1.ConsumerCredentials; -import org.glassfish.jersey.client.oauth1.OAuth1ClientSupport; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Feature; -import java.net.URI; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class RestapiCallNodeUtil { - - private static final Logger log = LoggerFactory.getLogger(RestapiCallNodeUtil.class); - - private RestapiCallNodeUtil() { - // Preventing instantiation of the same. - } - - public static Parameters getParameters(Map<String, String> paramMap) throws Exception { - Parameters p = new Parameters(); - p.templateFileName = parseParam(paramMap, "templateFileName", false, null); - p.requestBody = parseParam(paramMap, "requestBody", false, null); - p.restapiUrl = parseParam(paramMap, "restapiUrl", true, null); - validateUrl(p.restapiUrl); - p.restapiUser = parseParam(paramMap, "restapiUser", false, null); - p.restapiPassword = parseParam(paramMap, "restapiPassword", false, null); - p.oAuthConsumerKey = parseParam(paramMap, "oAuthConsumerKey", false, null); - p.oAuthConsumerSecret = parseParam(paramMap, "oAuthConsumerSecret", false, null); - p.oAuthSignatureMethod = parseParam(paramMap, "oAuthSignatureMethod", false, null); - p.oAuthVersion = parseParam(paramMap, "oAuthVersion", false, null); - p.contentType = parseParam(paramMap, "contentType", false, null); - p.format = Format.fromString(parseParam(paramMap, "format", false, "json")); - p.authtype = AuthType.fromString(parseParam(paramMap, "authType", false, "unspecified")); - p.httpMethod = HttpMethod.fromString(parseParam(paramMap, "httpMethod", false, "post")); - p.responsePrefix = parseParam(paramMap, "responsePrefix", false, null); - p.listNameList = getListNameList(paramMap); - String skipSendingStr = paramMap.get("skipSending"); - p.skipSending = "true".equalsIgnoreCase(skipSendingStr); - p.convertResponse = Boolean.valueOf(parseParam(paramMap, "convertResponse", false, "true")); - p.trustStoreFileName = parseParam(paramMap, "trustStoreFileName", false, null); - p.trustStorePassword = parseParam(paramMap, "trustStorePassword", false, null); - p.keyStoreFileName = parseParam(paramMap, "keyStoreFileName", false, null); - p.keyStorePassword = parseParam(paramMap, "keyStorePassword", false, null); - p.ssl = p.trustStoreFileName != null && p.trustStorePassword != null && p.keyStoreFileName != null && - p.keyStorePassword != null; - p.customHttpHeaders = parseParam(paramMap, "customHttpHeaders", false, null); - p.partner = parseParam(paramMap, "partner", false, null); - p.dumpHeaders = Boolean.valueOf(parseParam(paramMap, "dumpHeaders", false, null)); - p.returnRequestPayload = Boolean.valueOf(parseParam(paramMap, "returnRequestPayload", false, null)); - return p; - } - - public static String parseParam(Map<String, String> paramMap, String name, boolean required, String def) - throws Exception { - String s = paramMap.get(name); - - if (s == null || s.trim().length() == 0) { - if (!required) { - return def; - } - throw new Exception("Parameter " + name + " is required in RestapiCallNode"); - } - - s = s.trim(); - StringBuilder value = new StringBuilder(); - int i = 0; - int i1 = s.indexOf('%'); - while (i1 >= 0) { - int i2 = s.indexOf('%', i1 + 1); - if (i2 < 0) { - break; - } - - String varName = s.substring(i1 + 1, i2); - String varValue = System.getenv(varName); - if (varValue == null) { - varValue = "%" + varName + "%"; - } - - value.append(s.substring(i, i1)); - value.append(varValue); - - i = i2 + 1; - i1 = s.indexOf('%', i); - } - value.append(s.substring(i)); - - log.info("Parameter {}: [{}]", name, value); - return value.toString(); - } - - private static void validateUrl(String restapiUrl) throws Exception { - try { - URI.create(restapiUrl); - } catch (IllegalArgumentException e) { - throw new Exception("Invalid input of url " + e.getLocalizedMessage(), e); - } - } - - private static Set<String> getListNameList(Map<String, String> paramMap) { - Set<String> ll = new HashSet<>(); - for (Map.Entry<String, String> entry : paramMap.entrySet()) - if (entry.getKey().startsWith("listName")) { - ll.add(entry.getValue()); - } - return ll; - } - - public static Client addAuthType(Client client, Parameters p) { - if (p.authtype == AuthType.Unspecified) { - if (p.restapiUser != null && p.restapiPassword != null) { - client.register(HttpAuthenticationFeature.basic(p.restapiUser, p.restapiPassword)); - } else if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null - && p.oAuthSignatureMethod != null) { - Feature oAuth1Feature = OAuth1ClientSupport - .builder(new ConsumerCredentials(p.oAuthConsumerKey, p.oAuthConsumerSecret)) - .version(p.oAuthVersion).signatureMethod(p.oAuthSignatureMethod).feature().build(); - client.register(oAuth1Feature); - } - } else { - if (p.authtype == AuthType.DIGEST) { - if (p.restapiUser != null && p.restapiPassword != null) { - client.register(HttpAuthenticationFeature.digest(p.restapiUser, p.restapiPassword)); - } else { - throw new IllegalArgumentException( - "oAUTH authentication type selected but all restapiUser and restapiPassword " + - "parameters doesn't exist", new Throwable()); - } - } else if (p.authtype == AuthType.BASIC) { - if (p.restapiUser != null && p.restapiPassword != null) { - client.register(HttpAuthenticationFeature.basic(p.restapiUser, p.restapiPassword)); - } else { - throw new IllegalArgumentException( - "oAUTH authentication type selected but all restapiUser and restapiPassword " + - "parameters doesn't exist", new Throwable()); - } - } else if (p.authtype == AuthType.OAUTH) { - if (p.oAuthConsumerKey != null && p.oAuthConsumerSecret != null && p.oAuthSignatureMethod != null) { - Feature oAuth1Feature = OAuth1ClientSupport - .builder(new ConsumerCredentials(p.oAuthConsumerKey, p.oAuthConsumerSecret)) - .version(p.oAuthVersion).signatureMethod(p.oAuthSignatureMethod).feature().build(); - client.register(oAuth1Feature); - } else { - throw new IllegalArgumentException( - "oAUTH authentication type selected but all oAuthConsumerKey, oAuthConsumerSecret " + - "and oAuthSignatureMethod parameters doesn't exist", new Throwable()); - } - } - } - return client; - } -} - diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryException.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RetryException.java deleted file mode 100755 index aa40c33..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryException.java +++ /dev/null @@ -1,27 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -public class RetryException extends Exception { - public RetryException(String message) { - super(message); - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicy.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicy.java deleted file mode 100755 index 6c62394..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicy.java +++ /dev/null @@ -1,58 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -public class RetryPolicy { - private String[] hostnames; - private Integer maximumRetries; - - public Integer getMaximumRetries() { - return maximumRetries; - } - - public String getNextHostName(String uri) throws RetryException { - Integer position = null; - - for (int i = 0; i < hostnames.length; i++) { - if (uri.contains(hostnames[i])) { - position = i; - break; - } - } - - if (position == null) { - throw new RetryException("No match found for the provided uri[" + uri + "] " + - "so the next host name could not be retreived"); - } - position++; - - if (position > hostnames.length - 1) { - position = 0; - } - return hostnames[position]; - } - - public RetryPolicy(String[] hostnames, Integer maximumRetries) { - this.hostnames = hostnames; - this.maximumRetries = maximumRetries; - } - -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStore.java b/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStore.java deleted file mode 100755 index 0d1762f..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/RetryPolicyStore.java +++ /dev/null @@ -1,53 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashMap; - -public class RetryPolicyStore { - private static final Logger log = LoggerFactory.getLogger(RetryPolicyStore.class); - - HashMap<String, RetryPolicy> retryPolicies; - public String proxyServers; - - public String getProxyServers() { - return proxyServers; - } - - public void setProxyServers(String admServers) { - this.proxyServers = admServers; - String[] adminServersArray = admServers.split(","); - RetryPolicy adminPortalRetry = new RetryPolicy(adminServersArray, adminServersArray.length); - retryPolicies.put("dme2proxy", adminPortalRetry); - } - - public RetryPolicyStore() { - retryPolicies = new HashMap<>(); - } - - public RetryPolicy getRetryPolicy(String policyName) { - return (this.retryPolicies.get(policyName)); - } - -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/XmlJsonUtil.java b/src/main/java/org/onap/dcae/collectors/restconf/common/XmlJsonUtil.java deleted file mode 100755 index 6cac728..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/XmlJsonUtil.java +++ /dev/null @@ -1,412 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class XmlJsonUtil { - - private static final Logger log = LoggerFactory.getLogger(XmlJsonUtil.class); - - private XmlJsonUtil() { - // Preventing instantiation of the same. - } - - public static String getXml(Map<String, String> varmap, String var) { - boolean escape = true; - if (var.startsWith("'")) { - var = var.substring(1); - escape = false; - } - - Object o = createStructure(varmap, var); - return generateXml(o, 0, escape); - } - - public static String getJson(Map<String, String> varmap, String var) { - boolean escape = true; - if (var.startsWith("'")) { - var = var.substring(1); - escape = false; - } - - boolean quotes = true; - if (var.startsWith("\"")) { - var = var.substring(1); - quotes = false; - } - - Object o = createStructure(varmap, var); - return generateJson(o, escape, quotes); - } - - private static Object createStructure(Map<String, String> flatmap, String var) { - if (flatmap.containsKey(var)) { - if (var.endsWith("_length") || var.endsWith("].key")) { - return null; - } - return flatmap.get(var); - } - - Map<String, Object> mm = new HashMap<>(); - for (String k : flatmap.keySet()) - if (k.startsWith(var + ".")) { - int i1 = k.indexOf('.', var.length() + 1); - int i2 = k.indexOf('[', var.length() + 1); - int i3 = k.length(); - if (i1 > 0 && i1 < i3) { - i3 = i1; - } - if (i2 > 0 && i2 < i3) { - i3 = i2; - } - String k1 = k.substring(var.length() + 1, i3); - String var1 = k.substring(0, i3); - if (!mm.containsKey(k1)) { - Object str = createStructure(flatmap, var1); - if (str != null && (!(str instanceof String) || ((String) str).trim().length() > 0)) { - mm.put(k1, str); - } - } - } - if (!mm.isEmpty()) { - return mm; - } - - boolean arrayFound = false; - for (String k : flatmap.keySet()) - if (k.startsWith(var + "[")) { - arrayFound = true; - break; - } - - if (arrayFound) { - List<Object> ll = new ArrayList<>(); - - int length = Integer.MAX_VALUE; - String lengthStr = flatmap.get(var + "_length"); - if (lengthStr != null) { - try { - length = Integer.parseInt(lengthStr); - } catch (Exception e) { - log.warn("Invalid number for {}_length:{}", var, lengthStr, e); - } - } - - for (int i = 0; i < length; i++) { - Object v = createStructure(flatmap, var + '[' + i + ']'); - if (v == null) { - break; - } - ll.add(v); - } - - if (!ll.isEmpty()) { - return ll; - } - } - - return null; - } - - @SuppressWarnings("unchecked") - private static String generateXml(Object o, int indent, boolean escape) { - if (o == null) { - return null; - } - - if (o instanceof String) { - return escape ? escapeXml((String) o) : (String) o; - } - ; - - if (o instanceof Map) { - StringBuilder ss = new StringBuilder(); - Map<String, Object> mm = (Map<String, Object>) o; - for (Map.Entry<String, Object> entry : mm.entrySet()) { - Object v = entry.getValue(); - String key = entry.getKey(); - if (v instanceof String) { - String s = escape ? escapeXml((String) v) : (String) v; - ss.append(pad(indent)).append('<').append(key).append('>'); - ss.append(s); - ss.append("</").append(key).append('>').append('\n'); - } else if (v instanceof Map) { - ss.append(pad(indent)).append('<').append(key).append('>').append('\n'); - ss.append(generateXml(v, indent + 1, escape)); - ss.append(pad(indent)).append("</").append(key).append('>').append('\n'); - } else if (v instanceof List) { - List<Object> ll = (List<Object>) v; - for (Object o1 : ll) { - ss.append(pad(indent)).append('<').append(key).append('>').append('\n'); - ss.append(generateXml(o1, indent + 1, escape)); - ss.append(pad(indent)).append("</").append(key).append('>').append('\n'); - } - } - } - return ss.toString(); - } - - return null; - } - - private static String generateJson(Object o, boolean escape, boolean quotes) { - if (o == null) { - return null; - } - - StringBuilder ss = new StringBuilder(); - generateJson(ss, o, 0, false, escape, quotes); - return ss.toString(); - } - - @SuppressWarnings("unchecked") - private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape, boolean quotes) { - if (o instanceof String) { - String s = escape ? escapeJson((String) o) : (String) o; - if (padFirst) { - ss.append(pad(indent)); - } - if (quotes) { - ss.append('"').append(s).append('"'); - } else { - ss.append(s); - } - return; - } - - if (o instanceof Map) { - Map<String, Object> mm = (Map<String, Object>) o; - - if (padFirst) { - ss.append(pad(indent)); - } - ss.append("{\n"); - - boolean first = true; - for (Map.Entry<String, Object> entry : mm.entrySet()) { - if (!first) { - ss.append(",\n"); - } - first = false; - Object v = entry.getValue(); - String key = entry.getKey(); - ss.append(pad(indent + 1)).append('"').append(key).append("\": "); - generateJson(ss, v, indent + 1, false, escape, true); - } - - ss.append("\n"); - ss.append(pad(indent)).append('}'); - - return; - } - - if (o instanceof List) { - List<Object> ll = (List<Object>) o; - - if (padFirst) { - ss.append(pad(indent)); - } - ss.append("[\n"); - - boolean first = true; - for (Object o1 : ll) { - if (!first) { - ss.append(",\n"); - } - first = false; - - generateJson(ss, o1, indent + 1, true, escape, quotes); - } - - ss.append("\n"); - ss.append(pad(indent)).append(']'); - } - } - - public static String removeLastCommaJson(String s) { - StringBuilder sb = new StringBuilder(); - int k = 0; - int start = 0; - while (k < s.length()) { - int i11 = s.indexOf('}', k); - int i12 = s.indexOf(']', k); - int i1 = -1; - if (i11 < 0) { - i1 = i12; - } else if (i12 < 0) { - i1 = i11; - } else { - i1 = i11 < i12 ? i11 : i12; - } - if (i1 < 0) { - break; - } - - int i2 = s.lastIndexOf(',', i1); - if (i2 < 0) { - k = i1 + 1; - continue; - } - - String between = s.substring(i2 + 1, i1); - if (between.trim().length() > 0) { - k = i1 + 1; - continue; - } - - sb.append(s.substring(start, i2)); - start = i2 + 1; - k = i1 + 1; - } - - sb.append(s.substring(start, s.length())); - - return sb.toString(); - } - - public static String removeEmptyStructJson(String s) { - int k = 0; - while (k < s.length()) { - boolean curly = true; - int i11 = s.indexOf('{', k); - int i12 = s.indexOf('[', k); - int i1 = -1; - if (i11 < 0) { - i1 = i12; - curly = false; - } else if (i12 < 0) { - i1 = i11; - } else if (i11 < i12) { - i1 = i11; - } else { - i1 = i12; - curly = false; - } - - if (i1 >= 0) { - int i2 = curly ? s.indexOf('}', i1) : s.indexOf(']', i1); - if (i2 > 0) { - String value = s.substring(i1 + 1, i2); - if (value.trim().length() == 0) { - int i4 = s.lastIndexOf('\n', i1); - if (i4 < 0) { - i4 = 0; - } - int i5 = s.indexOf('\n', i2); - if (i5 < 0) { - i5 = s.length(); - } - - s = s.substring(0, i4) + s.substring(i5); - k = 0; - } else { - k = i1 + 1; - } - } else { - break; - } - } else { - break; - } - } - - return s; - } - - public static String removeEmptyStructXml(String s) { - int k = 0; - while (k < s.length()) { - int i1 = s.indexOf('<', k); - if (i1 < 0 || i1 == s.length() - 1) { - break; - } - - char c1 = s.charAt(i1 + 1); - if (c1 == '?' || c1 == '!') { - k = i1 + 2; - continue; - } - - int i2 = s.indexOf('>', i1); - if (i2 < 0) { - k = i1 + 1; - continue; - } - - String closingTag = "</" + s.substring(i1 + 1, i2 + 1); - int i3 = s.indexOf(closingTag, i2 + 1); - if (i3 < 0) { - k = i2 + 1; - continue; - } - - String value = s.substring(i2 + 1, i3); - if (value.trim().length() > 0) { - k = i2 + 1; - continue; - } - - int i4 = s.lastIndexOf('\n', i1); - if (i4 < 0) { - i4 = 0; - } - int i5 = s.indexOf('\n', i3); - if (i5 < 0) { - i5 = s.length(); - } - - s = s.substring(0, i4) + s.substring(i5); - k = 0; - } - - return s; - } - - private static String escapeXml(String v) { - String s = v.replaceAll("&", "&"); - s = s.replaceAll("<", "<"); - s = s.replaceAll("'", "'"); - s = s.replaceAll("\"", """); - s = s.replaceAll(">", ">"); - return s; - } - - private static String escapeJson(String v) { - String s = v.replaceAll("\\\\", "\\\\\\\\"); - s = s.replaceAll("\"", "\\\\\""); - return s; - } - - private static String pad(int n) { - StringBuilder s = new StringBuilder(); - for (int i = 0; i < n; i++) - s.append(Character.toString('\t')); - return s.toString(); - } -} - diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/XmlParser.java b/src/main/java/org/onap/dcae/collectors/restconf/common/XmlParser.java deleted file mode 100755 index 80bf2fc..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/XmlParser.java +++ /dev/null @@ -1,178 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static com.google.common.base.Preconditions.checkNotNull; - -public class XmlParser { - - private static final Logger log = LoggerFactory.getLogger(XmlParser.class); - - private XmlParser() { - // Preventing instantiation of the same. - } - - public static Map<String, String> convertToProperties(String s, Set<String> listNameList) - throws Exception { - - checkNotNull(s, "Input should not be null."); - - Handler handler = new Handler(listNameList); - try { - SAXParserFactory factory = SAXParserFactory.newInstance(); - SAXParser saxParser = factory.newSAXParser(); - InputStream in = new ByteArrayInputStream(s.getBytes()); - saxParser.parse(in, handler); - } catch (ParserConfigurationException | IOException | SAXException | NumberFormatException e) { - throw new Exception("Unable to convert XML to properties" + e.getLocalizedMessage(), e); - } - return handler.getProperties(); - } - - private static class Handler extends DefaultHandler { - - private Set<String> listNameList; - - private Map<String, String> properties = new HashMap<>(); - - public Map<String, String> getProperties() { - return properties; - } - - public Handler(Set<String> listNameList) { - super(); - this.listNameList = listNameList; - if (this.listNameList == null) { - this.listNameList = new HashSet<>(); - } - } - - StringBuilder currentName = new StringBuilder(); - StringBuilder currentValue = new StringBuilder(); - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) - throws SAXException { - super.startElement(uri, localName, qName, attributes); - - String name = localName; - if (name == null || name.trim().length() == 0) { - name = qName; - } - int i2 = name.indexOf(':'); - if (i2 >= 0) { - name = name.substring(i2 + 1); - } - - if (currentName.length() > 0) { - currentName.append(Character.toString('.')); - } - currentName.append(name); - - String listName = removeIndexes(currentName.toString()); - - if (listNameList.contains(listName)) { - String n = currentName.toString() + "_length"; - int len = getInt(properties, n); - properties.put(n, String.valueOf(len + 1)); - currentName.append("[").append(len).append("]"); - } - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - super.endElement(uri, localName, qName); - - String name = localName; - if (name == null || name.trim().length() == 0) { - name = qName; - } - int i2 = name.indexOf(':'); - if (i2 >= 0) { - name = name.substring(i2 + 1); - } - - String s = currentValue.toString().trim(); - if (s.length() > 0) { - properties.put(currentName.toString(), s); - - log.info("Added property: {} : {}", currentName, s); - currentValue = new StringBuilder(); - } - - int i1 = currentName.lastIndexOf("." + name); - if (i1 <= 0) { - currentName = new StringBuilder(); - } else { - currentName = new StringBuilder(currentName.substring(0, i1)); - } - } - - @Override - public void characters(char[] ch, int start, int length) throws SAXException { - super.characters(ch, start, length); - - String value = new String(ch, start, length); - currentValue.append(value); - } - - private static int getInt(Map<String, String> mm, String name) { - String s = mm.get(name); - if (s == null) { - return 0; - } - return Integer.parseInt(s); - } - - private String removeIndexes(String currentName) { - StringBuilder b = new StringBuilder(); - boolean add = true; - for (int i = 0; i < currentName.length(); i++) { - char c = currentName.charAt(i); - if (c == '[') { - add = false; - } else if (c == ']') { - add = true; - } else if (add) { - b.append(Character.toString(c)); - } - } - return b.toString(); - } - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParser.java b/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParser.java deleted file mode 100755 index 7e65d34..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPConfigurationParser.java +++ /dev/null @@ -1,107 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common.event.publishing; - -import io.vavr.collection.List; -import io.vavr.collection.Map; -import io.vavr.control.Option; -import io.vavr.control.Try; -import org.onap.dcae.collectors.restconf.common.AnyNode; - -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; - -import static io.vavr.API.List; -import static io.vavr.API.Try; -import static io.vavr.API.Tuple; -import static io.vavr.API.unchecked; -import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.enhanceError; -import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.f; - -public class DMaaPConfigurationParser { - - public static Try<Map<String, PublisherConfig>> parseToDomainMapping(Path configLocation) { - return readFromFile(configLocation) - .flatMap(DMaaPConfigurationParser::toJSON) - .flatMap(DMaaPConfigurationParser::toConfigMap); - } - - private static Try<String> readFromFile(Path configLocation) { - return Try(() -> new String(Files.readAllBytes(configLocation))) - .mapFailure(enhanceError(f("Could not read DMaaP configuration from location: '%s'", configLocation))); - } - - private static Try<AnyNode> toJSON(String config) { - return Try(() -> AnyNode.fromString(config)) - .mapFailure(enhanceError(f("DMaaP configuration '%s' is not a valid JSON document", config))); - } - - private static Try<Map<String, PublisherConfig>> toConfigMap(AnyNode config) { - return Try(() -> usesLegacyFormat(config) ? parseLegacyFormat(config) : parseNewFormat(config)) - .mapFailure(enhanceError( - f("Parsing DMaaP configuration: '%s' failed, probably it is in unexpected format", config))); - } - - private static boolean usesLegacyFormat(AnyNode dMaaPConfig) { - return dMaaPConfig.has("channels"); - } - - private static Map<String, PublisherConfig> parseLegacyFormat(AnyNode root) { - return root.get("channels").toList().toMap( - channel -> channel.get("name").toString(), - channel -> { - String destinationsStr = channel.getAsOption("cambria.url") - .getOrElse(channel.getAsOption("cambria.hosts").get()) - .toString(); - String topic = channel.get("cambria.topic").toString(); - Option<String> maybeUser = channel.getAsOption("basicAuthUsername").map(AnyNode::toString); - Option<String> maybePassword = channel.getAsOption("basicAuthPassword").map(AnyNode::toString); - List<String> destinations = List(destinationsStr.split(",")); - return buildBasedOnAuth(maybeUser, maybePassword, topic, destinations); - }); - } - - private static Map<String, PublisherConfig> parseNewFormat(AnyNode root) { - return root.keys().toMap( - channelName -> channelName, - channelName -> { - AnyNode channelConfig = root.get(channelName); - Option<String> maybeUser = channelConfig.getAsOption("aaf_username").map(AnyNode::toString); - Option<String> maybePassword = channelConfig.getAsOption("aaf_password").map(AnyNode::toString); - URL topicURL = unchecked( - () -> new URL(channelConfig.get("dmaap_info").get("topic_url").toString())).apply(); - String[] pathSegments = topicURL.getPath().substring(1).split("/"); - String topic = pathSegments[1]; - String destination = "events".equals(pathSegments[0]) ? topicURL.getAuthority() : topicURL.getHost(); - List<String> destinations = List(destination); - return buildBasedOnAuth(maybeUser, maybePassword, topic, destinations); - }); - } - - private static PublisherConfig buildBasedOnAuth(Option<String> maybeUser, Option<String> maybePassword, - String topic, List<String> destinations) { - return maybeUser.flatMap(user -> maybePassword.map(password -> Tuple(user, password))) - .map(credentials -> new PublisherConfig(destinations, topic, credentials._1, credentials._2)) - .getOrElse(new PublisherConfig(destinations, topic)); - } - -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisher.java b/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisher.java deleted file mode 100755 index 4c14275..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPEventPublisher.java +++ /dev/null @@ -1,75 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common.event.publishing; - -import com.att.nsa.cambria.client.CambriaBatchingPublisher; -import io.vavr.control.Try; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; - -public class DMaaPEventPublisher implements EventPublisher { - - private static final int PENDING_MESSAGE_LOG_THRESHOLD = 100; - private static final Logger log = LoggerFactory.getLogger(DMaaPEventPublisher.class); - private final DMaaPPublishersCache publishersCache; - private final Logger outputLogger; - - DMaaPEventPublisher(DMaaPPublishersCache DMaaPPublishersCache, - Logger outputLogger) { - this.publishersCache = DMaaPPublishersCache; - this.outputLogger = outputLogger; - } - - @Override - public void sendEvent(JSONObject event, String domain) { - publishersCache.getPublisher(domain) - .onEmpty(() -> - log.warn(VavrUtils.f("Could not find event publisher for domain: '%s', dropping message: '%s'", domain, event))) - .forEach(publisher -> sendEvent(event, domain, publisher)); - } - - private void sendEvent(JSONObject event, String domain, CambriaBatchingPublisher publisher) { - Try.run(() -> uncheckedSendEvent(event, domain, publisher)) - .onFailure(exc -> closePublisher(event, domain, exc)); - } - - private void uncheckedSendEvent(JSONObject event, String domain, CambriaBatchingPublisher publisher) - throws IOException { - System.out.println("printing publisher information" + publisher); - int pendingMsgs = publisher.send("MyPartitionKey", event.toString()); - if (pendingMsgs > PENDING_MESSAGE_LOG_THRESHOLD) { - log.info("Pending messages count: " + pendingMsgs); - } - String infoMsg = VavrUtils.f("Event: '%s' scheduled to be send asynchronously on domain: '%s'", event, domain); - log.info(infoMsg); - outputLogger.info(infoMsg); - } - - private void closePublisher(JSONObject event, String domain, Throwable e) { - log.error(VavrUtils.f("Unable to schedule event: '%s' on domain: '%s'. Closing publisher and dropping message.", - event, domain), e); - publishersCache.closePublisherFor(domain); - } - -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersBuilder.java b/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersBuilder.java deleted file mode 100755 index e6c7600..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersBuilder.java +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common.event.publishing; - -import com.att.nsa.cambria.client.CambriaBatchingPublisher; -import com.att.nsa.cambria.client.CambriaClientBuilders; -import com.att.nsa.cambria.client.CambriaClientBuilders.PublisherBuilder; -import io.vavr.control.Try; - -import static io.vavr.API.Try; -import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.enhanceError; -import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.f; - -/** - * @author Pawel Szalapski (pawel.szalapski@nokia.com) - */ -final class DMaaPPublishersBuilder { - - @SuppressWarnings("mapFailure takes a generic varargs, unchecked because of Javas type system limitation, actually safe to do") - static Try<CambriaBatchingPublisher> buildPublisher(PublisherConfig config) { - return Try(() -> builder(config).build()) - .mapFailure(enhanceError(f("DMaaP client builder throws exception for this configuration: '%s'", config))); - } - - private static PublisherBuilder builder(PublisherConfig config) { - if (config.isSecured()) { - return authenticatedBuilder(config); - } else { - return unAuthenticatedBuilder(config); - } - } - - private static PublisherBuilder authenticatedBuilder(PublisherConfig config) { - return unAuthenticatedBuilder(config) - .usingHttps() - .authenticatedByHttp(config.userName().get(), config.password().get()); - } - - private static PublisherBuilder unAuthenticatedBuilder(PublisherConfig config) { - return new CambriaClientBuilders.PublisherBuilder() - .usingHosts(config.destinations().mkString(",")) - .onTopic(config.topic()) - .logSendFailuresAfter(5); - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCache.java b/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCache.java deleted file mode 100755 index 6974bc9..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/DMaaPPublishersCache.java +++ /dev/null @@ -1,110 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common.event.publishing; - -import com.att.nsa.cambria.client.CambriaBatchingPublisher; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.cache.RemovalListener; -import com.google.common.cache.RemovalNotification; -import io.vavr.collection.Map; -import io.vavr.control.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Nonnull; -import java.io.IOException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; - -import static io.vavr.API.Option; -import static org.onap.dcae.collectors.restconf.common.event.publishing.VavrUtils.f; - -public class DMaaPPublishersCache { - - private static final Logger log = LoggerFactory.getLogger(DMaaPPublishersCache.class); - private final LoadingCache<String, CambriaBatchingPublisher> publishersCache; - private AtomicReference<Map<String, PublisherConfig>> dMaaPConfiguration; - - DMaaPPublishersCache(Map<String, PublisherConfig> dMaaPConfiguration) { - this.dMaaPConfiguration = new AtomicReference<>(dMaaPConfiguration); - this.publishersCache = CacheBuilder.newBuilder() - .removalListener(new OnPublisherRemovalListener()) - .build(new CambriaPublishersCacheLoader()); - } - - DMaaPPublishersCache(CambriaPublishersCacheLoader dMaaPPublishersCacheLoader, - OnPublisherRemovalListener onPublisherRemovalListener, - Map<String, PublisherConfig> dMaaPConfiguration) { - this.dMaaPConfiguration = new AtomicReference<>(dMaaPConfiguration); - this.publishersCache = CacheBuilder.newBuilder() - .removalListener(onPublisherRemovalListener) - .build(dMaaPPublishersCacheLoader); - } - - Option<CambriaBatchingPublisher> getPublisher(String streamID) { - try { - return Option(publishersCache.getUnchecked(streamID)); - } catch (Exception e) { - log.warn("Could not create / load Cambria Publisher for streamID", e); - return Option.none(); - } - } - - void closePublisherFor(String streamId) { - publishersCache.invalidate(streamId); - } - - static class OnPublisherRemovalListener implements RemovalListener<String, CambriaBatchingPublisher> { - - @Override - public void onRemoval(@Nonnull RemovalNotification<String, CambriaBatchingPublisher> notification) { - CambriaBatchingPublisher publisher = notification.getValue(); - if (publisher != null) { // The value might get Garbage Collected at this moment, regardless of @Nonnull - try { - int timeout = 20; - TimeUnit unit = TimeUnit.SECONDS; - java.util.List<?> stuck = publisher.close(timeout, unit); - if (!stuck.isEmpty()) { - log.error(f("Publisher got stuck and did not manage to close in '%s' '%s', " - + "%s messages were dropped", stuck.size(), timeout, unit)); - } - } catch (InterruptedException | IOException e) { - log.error("Could not close Cambria publisher, some messages might have been dropped", e); - } - } - } - } - - class CambriaPublishersCacheLoader extends CacheLoader<String, CambriaBatchingPublisher> { - - @Override - public CambriaBatchingPublisher load(@Nonnull String domain) { - return dMaaPConfiguration.get() - .get(domain) - .toTry(() -> new RuntimeException( - f("DMaaP configuration contains no configuration for domain: '%s'", domain))) - .flatMap(DMaaPPublishersBuilder::buildPublisher) - .get(); - } - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/EventPublisher.java b/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/EventPublisher.java deleted file mode 100755 index 28aace8..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/EventPublisher.java +++ /dev/null @@ -1,35 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ -package org.onap.dcae.collectors.restconf.common.event.publishing; - - -import io.vavr.collection.Map; -import org.json.JSONObject; -import org.slf4j.Logger; - -public interface EventPublisher { - - static EventPublisher createPublisher(Logger outputLogger, Map<String, PublisherConfig> dMaaPConfig) { - return new DMaaPEventPublisher(new DMaaPPublishersCache(dMaaPConfig), outputLogger); - } - - void sendEvent(JSONObject event, String domain); - -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/PublisherConfig.java b/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/PublisherConfig.java deleted file mode 100755 index 0e14a42..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/PublisherConfig.java +++ /dev/null @@ -1,95 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ -package org.onap.dcae.collectors.restconf.common.event.publishing; - -import io.vavr.collection.List; -import io.vavr.control.Option; - -import java.util.Objects; - -public class PublisherConfig { - private final List<String> destinations; - private final String topic; - private String userName; - private String password; - - PublisherConfig(List<String> destinations, String topic) { - this.destinations = destinations; - this.topic = topic; - } - - PublisherConfig(List<String> destinations, String topic, String userName, String password) { - this.destinations = destinations; - this.topic = topic; - this.userName = userName; - this.password = password; - } - - List<String> destinations() { - return destinations; - } - - String topic() { - return topic; - } - - Option<String> userName() { - return Option.of(userName); - } - - Option<String> password() { - return Option.of(password); - } - - boolean isSecured() { - return userName().isDefined() && password().isDefined(); - } - - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - PublisherConfig that = (PublisherConfig) o; - return Objects.equals(destinations, that.destinations) && - Objects.equals(topic, that.topic) && - Objects.equals(userName, that.userName) && - Objects.equals(password, that.password); - } - - @Override - public int hashCode() { - return Objects.hash(destinations, topic, userName, password); - } - - @Override - public String toString() { - return "PublisherConfig{" + - "destinations=" + destinations + - ", topic='" + topic + '\'' + - ", userName='" + userName + '\'' + - ", password='" + password + '\'' + - '}'; - } -} diff --git a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/VavrUtils.java b/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/VavrUtils.java deleted file mode 100755 index 4a82bed..0000000 --- a/src/main/java/org/onap/dcae/collectors/restconf/common/event/publishing/VavrUtils.java +++ /dev/null @@ -1,48 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.onap.dcaegen2.collectors.restconf - * ================================================================================ - * Copyright (C) 2018 Huawei. 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcae.collectors.restconf.common.event.publishing; - -import io.vavr.API; -import io.vavr.API.Match.Case; - -import static io.vavr.API.$; - - -public class VavrUtils { - private VavrUtils() { - // utils aggregator - } - - /** - * Shortcut for 'string interpolation' - */ - static String f(String msg, Object... args) { - return String.format(msg, args); - } - - /** - * Wrap failure with a more descriptive message of what has failed and chain original cause. Used to provide a - * context for errors instead of raw exception. - */ - static Case<Throwable, Throwable> enhanceError(String msg) { - return API.Case($(), e -> new RuntimeException(msg, e)); - } -} |