diff options
author | Jim Hahn <jrh3@att.com> | 2019-07-10 16:33:41 -0400 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2019-07-11 11:30:18 -0400 |
commit | 426ecdf2949b5951bb05a9cc83d6fa10d4ff04d4 (patch) | |
tree | de1fff722ea83aa60dfc8423ba1198063bcf0039 /policy-management/src/main/java/org/onap/policy/drools/protocol | |
parent | a593d0931f9a5785572bb52c5dfae32faa5d8116 (diff) |
Fix checkstyle issues in policy-management
Also deleted the checkstyle suppression file.
Moved classes into their own source files per checkstyle.
Change-Id: I586223aac0e5b7623cfd7b0acfceca4742ecc013
Issue-ID: POLICY-1908-mgmt-style
Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'policy-management/src/main/java/org/onap/policy/drools/protocol')
8 files changed, 1328 insertions, 1210 deletions
diff --git a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolCoder.java b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolCoder.java index 1297ff8c..62a0cbe2 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolCoder.java +++ b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolCoder.java @@ -21,15 +21,8 @@ package org.onap.policy.drools.protocol.coders; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; -import java.util.Map; import org.onap.policy.drools.controller.DroolsController; -import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Coder (Encoder/Decoder) of Events. @@ -349,959 +342,3 @@ public interface EventProtocolCoder { */ public String encode(String topic, Object event, DroolsController droolsController); } - -/** - * Protocol Coder that does its best attempt to decode/encode, selecting the best class and best fitted json parsing - * tools. - */ -class MultiplexorEventProtocolCoder implements EventProtocolCoder { - - /** - * Logger. - */ - private static Logger logger = LoggerFactory.getLogger(MultiplexorEventProtocolCoder.class); - - /** - * Decoders. - */ - protected EventProtocolDecoder decoders = new EventProtocolDecoder(); - - /** - * Encoders. - */ - protected EventProtocolEncoder encoders = new EventProtocolEncoder(); - - /** - * {@inheritDoc}. - */ - @Override - public void addDecoder(EventProtocolParams eventProtocolParams) { - logger.info( - "{}: add-decoder {}:{}:{}:{}:{}:{}:{}", - this, - eventProtocolParams.getGroupId(), - eventProtocolParams.getArtifactId(), - eventProtocolParams.getTopic(), - eventProtocolParams.getEventClass(), - eventProtocolParams.getProtocolFilter(), - eventProtocolParams.getCustomGsonCoder(), - eventProtocolParams.getModelClassLoaderHash()); - this.decoders.add(eventProtocolParams); - } - - /** - * {@inheritDoc}. - * - * @param eventProtocolParams parameter object for event encoder - */ - @Override - public void addEncoder(EventProtocolParams eventProtocolParams) { - logger.info( - "{}: add-decoder {}:{}:{}:{}:{}:{}:{}", - this, - eventProtocolParams.getGroupId(), - eventProtocolParams.getArtifactId(), - eventProtocolParams.getTopic(), - eventProtocolParams.getEventClass(), - eventProtocolParams.getProtocolFilter(), - eventProtocolParams.getCustomGsonCoder(), - eventProtocolParams.getModelClassLoaderHash()); - this.encoders.add(eventProtocolParams); - } - - /** - * {@inheritDoc}. - */ - @Override - public void removeDecoders(String groupId, String artifactId, String topic) { - logger.info("{}: remove-decoder {}:{}:{}", this, groupId, artifactId, topic); - this.decoders.remove(groupId, artifactId, topic); - } - - /** - * {@inheritDoc}. - */ - @Override - public void removeEncoders(String groupId, String artifactId, String topic) { - logger.info("{}: remove-encoder {}:{}:{}", this, groupId, artifactId, topic); - this.encoders.remove(groupId, artifactId, topic); - } - - /** - * {@inheritDoc}. - */ - @Override - public boolean isDecodingSupported(String groupId, String artifactId, String topic) { - return this.decoders.isCodingSupported(groupId, artifactId, topic); - } - - /** - * {@inheritDoc}. - */ - @Override - public boolean isEncodingSupported(String groupId, String artifactId, String topic) { - return this.encoders.isCodingSupported(groupId, artifactId, topic); - } - - /** - * {@inheritDoc}. - */ - @Override - public Object decode(String groupId, String artifactId, String topic, String json) { - logger.debug("{}: decode {}:{}:{}:{}", this, groupId, artifactId, topic, json); - return this.decoders.decode(groupId, artifactId, topic, json); - } - - /** - * {@inheritDoc}. - */ - @Override - public String encode(String groupId, String artifactId, String topic, Object event) { - logger.debug("{}: encode {}:{}:{}:{}", this, groupId, artifactId, topic, event); - return this.encoders.encode(groupId, artifactId, topic, event); - } - - /** - * {@inheritDoc}. - */ - @Override - public String encode(String topic, Object event) { - logger.debug("{}: encode {}:{}", this, topic, event); - return this.encoders.encode(topic, event); - } - - /** - * {@inheritDoc}. - */ - @Override - public String encode(String topic, Object event, DroolsController droolsController) { - logger.debug("{}: encode {}:{}:{}", this, topic, event, droolsController); - return this.encoders.encode(topic, event, droolsController); - } - - /** - * {@inheritDoc}. - */ - @Override - public List<CoderFilters> getDecoderFilters(String groupId, String artifactId, String topic) { - return this.decoders.getFilters(groupId, artifactId, topic); - } - - /** - * {@inheritDoc}. - */ - @Override - public CoderFilters getDecoderFilters( - String groupId, String artifactId, String topic, String classname) { - return this.decoders.getFilters(groupId, artifactId, topic, classname); - } - - /** - * {@inheritDoc}. - */ - @Override - public List<CoderFilters> getDecoderFilters(String groupId, String artifactId) { - return this.decoders.getFilters(groupId, artifactId); - } - - /** - * {@inheritDoc}. - */ - @Override - public ProtocolCoderToolset getDecoders(String groupId, String artifactId, String topic) { - ProtocolCoderToolset decoderToolsets = - this.decoders.getCoders(groupId, artifactId, topic); - if (decoderToolsets == null) { - throw new IllegalArgumentException( - "Decoders not found for " + groupId + ":" + artifactId + ":" + topic); - } - - return decoderToolsets; - } - - /** - * get all deocders by maven coordinates and topic. - * - * @param groupId group id - * @param artifactId artifact id - * @return list of decoders - * @throws IllegalArgumentException if invalid input - */ - @Override - public List<ProtocolCoderToolset> getDecoders(String groupId, String artifactId) { - - List<ProtocolCoderToolset> decoderToolsets = - this.decoders.getCoders(groupId, artifactId); - if (decoderToolsets == null) { - throw new IllegalArgumentException("Decoders not found for " + groupId + ":" + artifactId); - } - - return new ArrayList<>(decoderToolsets); - } - - /** - * {@inheritDoc}. - */ - @Override - public List<CoderFilters> getEncoderFilters(String groupId, String artifactId, String topic) { - return this.encoders.getFilters(groupId, artifactId, topic); - } - - /** - * {@inheritDoc}. - */ - @Override - public CoderFilters getEncoderFilters( - String groupId, String artifactId, String topic, String classname) { - return this.encoders.getFilters(groupId, artifactId, topic, classname); - } - - /** - * {@inheritDoc}. - */ - @Override - public List<CoderFilters> getEncoderFilters(String groupId, String artifactId) { - return this.encoders.getFilters(groupId, artifactId); - } - - /** - * {@inheritDoc}. - */ - @Override - public List<CoderFilters> getReverseEncoderFilters(String topic, String encodedClass) { - return this.encoders.getReverseFilters(topic, encodedClass); - } - - /** - * {@inheritDoc}. - */ - @Override - public DroolsController getDroolsController(String topic, Object encodedClass) { - return this.encoders.getDroolsController(topic, encodedClass); - } - - /** - * {@inheritDoc}. - */ - @Override - public List<DroolsController> getDroolsControllers(String topic, Object encodedClass) { - return this.encoders.getDroolsControllers(topic, encodedClass); - } - - /** - * {@inheritDoc}. - */ - @Override - public String toString() { - return "MultiplexorEventProtocolCoder [decoders=" - + decoders - + ", encoders=" - + encoders - + "]"; - } -} - -/** - * This protocol Coder that does its best attempt to decode/encode, selecting the best class and best fitted json - * parsing tools. - */ -abstract class GenericEventProtocolCoder { - - private static final String INVALID_ARTIFACT_ID_MSG = "Invalid artifact id"; - - private static final String INVALID_GROUP_ID_MSG = "Invalid group id"; - - private static final String INVALID_TOPIC_MSG = "Invalid Topic"; - - private static final String UNSUPPORTED_MSG = "Unsupported"; - - private static final String MISSING_CLASS = "class must be provided"; - - private static Logger logger = LoggerFactory.getLogger(GenericEventProtocolCoder.class); - - /** - * Mapping topic:controller-id -> /<protocol-decoder-toolset/> where protocol-coder-toolset contains - * a gson-protocol-coder-toolset. - */ - protected final HashMap<String, ProtocolCoderToolset> coders = - new HashMap<>(); - - /** - * Mapping topic + classname -> Protocol Set. - */ - protected final HashMap<String, List<ProtocolCoderToolset>> - reverseCoders = new HashMap<>(); - - GenericEventProtocolCoder() { - super(); - } - - /** - * Index a new coder. - * - * @param eventProtocolParams parameter object for event encoder - * @throw IllegalArgumentException if an invalid parameter is passed - */ - public void add(EventProtocolParams eventProtocolParams) { - if (eventProtocolParams.getGroupId() == null || eventProtocolParams.getGroupId().isEmpty()) { - throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); - } - - if (eventProtocolParams.getArtifactId() == null || eventProtocolParams.getArtifactId().isEmpty()) { - throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); - } - - if (eventProtocolParams.getTopic() == null || eventProtocolParams.getTopic().isEmpty()) { - throw new IllegalArgumentException(INVALID_TOPIC_MSG); - } - - if (eventProtocolParams.getEventClass() == null) { - throw new IllegalArgumentException("Invalid Event Class"); - } - - String key = this.codersKey(eventProtocolParams.getGroupId(), eventProtocolParams.getArtifactId(), - eventProtocolParams.getTopic()); - String reverseKey = this.reverseCodersKey(eventProtocolParams.getTopic(), eventProtocolParams.getEventClass()); - - synchronized (this) { - if (coders.containsKey(key)) { - ProtocolCoderToolset toolset = coders.get(key); - - logger.info("{}: adding coders for existing {}: {}", this, key, toolset); - - toolset - .addCoder( - eventProtocolParams.getEventClass(), - eventProtocolParams.getProtocolFilter(), - eventProtocolParams.getModelClassLoaderHash()); - - if (!reverseCoders.containsKey(reverseKey)) { - logger.info( - "{}: adding new reverse coders (multiple classes case) for {}:{}: {}", - this, - reverseKey, - key, - toolset); - - List<ProtocolCoderToolset> reverseMappings = - new ArrayList<>(); - reverseMappings.add(toolset); - reverseCoders.put(reverseKey, reverseMappings); - } - return; - } - - GsonProtocolCoderToolset coderTools = - new GsonProtocolCoderToolset(eventProtocolParams, key); - - logger.info("{}: adding coders for new {}: {}", this, key, coderTools); - - coders.put(key, coderTools); - - if (reverseCoders.containsKey(reverseKey)) { - // There is another controller (different group id/artifact id/topic) - // that shares the class and the topic. - - List<ProtocolCoderToolset> toolsets = - reverseCoders.get(reverseKey); - boolean present = false; - for (ProtocolCoderToolset parserSet : toolsets) { - // just doublecheck - present = parserSet.getControllerId().equals(key); - if (present) { - /* anomaly */ - logger.error( - "{}: unexpected toolset reverse mapping found for {}:{}: {}", - this, - reverseKey, - key, - parserSet); - } - } - - if (present) { - return; - } else { - logger.info("{}: adding coder set for {}: {} ", this, reverseKey, coderTools); - toolsets.add(coderTools); - } - } else { - List<ProtocolCoderToolset> toolsets = new ArrayList<>(); - toolsets.add(coderTools); - - logger.info("{}: adding toolset for reverse key {}: {}", this, reverseKey, toolsets); - reverseCoders.put(reverseKey, toolsets); - } - } - } - - /** - * produces key for indexing toolset entries. - * - * @param groupId group id - * @param artifactId artifact id - * @param topic topic - * @return index key - */ - protected String codersKey(String groupId, String artifactId, String topic) { - return groupId + ":" + artifactId + ":" + topic; - } - - /** - * produces a key for the reverse index. - * - * @param topic topic - * @param eventClass coded class - * @return reverse index key - */ - protected String reverseCodersKey(String topic, String eventClass) { - return topic + ":" + eventClass; - } - - /** - * remove coder. - * - * @param groupId group id - * @param artifactId artifact id - * @param topic topic - * @throws IllegalArgumentException if invalid input - */ - public void remove(String groupId, String artifactId, String topic) { - - if (groupId == null || groupId.isEmpty()) { - throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); - } - - if (artifactId == null || artifactId.isEmpty()) { - throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); - } - - if (topic == null || topic.isEmpty()) { - throw new IllegalArgumentException(INVALID_TOPIC_MSG); - } - - String key = this.codersKey(groupId, artifactId, topic); - - synchronized (this) { - if (coders.containsKey(key)) { - ProtocolCoderToolset coderToolset = coders.remove(key); - - logger.info("{}: removed toolset for {}: {}", this, key, coderToolset); - - for (CoderFilters codeFilter : coderToolset.getCoders()) { - String className = codeFilter.getCodedClass(); - String reverseKey = this.reverseCodersKey(topic, className); - if (this.reverseCoders.containsKey(reverseKey)) { - List<ProtocolCoderToolset> toolsets = - this.reverseCoders.get(reverseKey); - Iterator<ProtocolCoderToolset> toolsetsIter = - toolsets.iterator(); - while (toolsetsIter.hasNext()) { - ProtocolCoderToolset toolset = toolsetsIter.next(); - if (toolset.getControllerId().equals(key)) { - logger.info( - "{}: removed coder from toolset for {} from reverse mapping", this, reverseKey); - toolsetsIter.remove(); - } - } - - if (this.reverseCoders.get(reverseKey).isEmpty()) { - logger.info("{}: removing reverse mapping for {}: ", this, reverseKey); - this.reverseCoders.remove(reverseKey); - } - } - } - } - } - } - - /** - * does it support coding. - * - * @param groupId group id - * @param artifactId artifact id - * @param topic topic - * @return true if its is codable - */ - public boolean isCodingSupported(String groupId, String artifactId, String topic) { - - if (groupId == null || groupId.isEmpty()) { - throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); - } - - if (artifactId == null || artifactId.isEmpty()) { - throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); - } - - if (topic == null || topic.isEmpty()) { - throw new IllegalArgumentException(INVALID_TOPIC_MSG); - } - - String key = this.codersKey(groupId, artifactId, topic); - synchronized (this) { - return coders.containsKey(key); - } - } - - /** - * decode a json string into an Object. - * - * @param groupId group id - * @param artifactId artifact id - * @param topic topic - * @param json json string to convert to object - * @return the decoded object - * @throws IllegalArgumentException if invalid argument is provided - * @throws UnsupportedOperationException if the operation cannot be performed - */ - public Object decode(String groupId, String artifactId, String topic, String json) { - - if (!isCodingSupported(groupId, artifactId, topic)) { - throw new IllegalArgumentException( - "Unsupported:" + codersKey(groupId, artifactId, topic) + " for encoding"); - } - - String key = this.codersKey(groupId, artifactId, topic); - ProtocolCoderToolset coderTools = coders.get(key); - try { - Object event = coderTools.decode(json); - if (event != null) { - return event; - } - } catch (Exception e) { - logger.debug("{}, cannot decode {}", this, json, e); - } - - throw new UnsupportedOperationException("Cannot decode with gson"); - } - - /** - * encode an object into a json string. - * - * @param groupId group id - * @param artifactId artifact id - * @param topic topic - * @param event object to convert to string - * @return the json string - * @throws IllegalArgumentException if invalid argument is provided - * @throws UnsupportedOperationException if the operation cannot be performed - */ - public String encode(String groupId, String artifactId, String topic, Object event) { - - if (!isCodingSupported(groupId, artifactId, topic)) { - throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic)); - } - - if (event == null) { - throw new IllegalArgumentException("Unsupported topic:" + topic); - } - - // reuse the decoder set, since there must be affinity in the model - String key = this.codersKey(groupId, artifactId, topic); - return this.encodeInternal(key, event); - } - - /** - * encode an object into a json string. - * - * @param topic topic - * @param event object to convert to string - * @return the json string - * @throws IllegalArgumentException if invalid argument is provided - * @throws UnsupportedOperationException if the operation cannot be performed - */ - public String encode(String topic, Object event) { - - if (event == null) { - throw new IllegalArgumentException("Invalid encoded class"); - } - - if (topic == null || topic.isEmpty()) { - throw new IllegalArgumentException("Invalid topic"); - } - - String reverseKey = this.reverseCodersKey(topic, event.getClass().getName()); - if (!this.reverseCoders.containsKey(reverseKey)) { - throw new IllegalArgumentException("no reverse coder has been found"); - } - - List<ProtocolCoderToolset> toolsets = - this.reverseCoders.get(reverseKey); - - String key = - codersKey( - toolsets.get(0).getGroupId(), toolsets.get(0).getArtifactId(), topic); - return this.encodeInternal(key, event); - } - - /** - * encode an object into a json string. - * - * @param topic topic - * @param encodedClass object to convert to string - * @return the json string - * @throws IllegalArgumentException if invalid argument is provided - * @throws UnsupportedOperationException if the operation cannot be performed - */ - public String encode(String topic, Object encodedClass, DroolsController droolsController) { - - if (encodedClass == null) { - throw new IllegalArgumentException("Invalid encoded class"); - } - - if (topic == null || topic.isEmpty()) { - throw new IllegalArgumentException("Invalid topic"); - } - - String key = codersKey(droolsController.getGroupId(), droolsController.getArtifactId(), topic); - return this.encodeInternal(key, encodedClass); - } - - /** - * encode an object into a json string. - * - * @param key identifier - * @param event object to convert to string - * @return the json string - * @throws IllegalArgumentException if invalid argument is provided - * @throws UnsupportedOperationException if the operation cannot be performed - */ - protected String encodeInternal(String key, Object event) { - - logger.debug("{}: encode for {}: {}", this, key, event); - - ProtocolCoderToolset coderTools = coders.get(key); - try { - String json = coderTools.encode(event); - if (json != null && !json.isEmpty()) { - return json; - } - } catch (Exception e) { - logger.warn("{}: cannot encode (first) for {}: {}", this, key, event, e); - } - - throw new UnsupportedOperationException("Cannot decode with gson"); - } - - /** - * Drools creators. - * - * @param topic topic - * @param encodedClass encoded class - * @return list of controllers - * @throws IllegalStateException illegal state - * @throws IllegalArgumentException argument - */ - protected List<DroolsController> droolsCreators(String topic, Object encodedClass) { - - List<DroolsController> droolsControllers = new ArrayList<>(); - - String reverseKey = this.reverseCodersKey(topic, encodedClass.getClass().getName()); - if (!this.reverseCoders.containsKey(reverseKey)) { - logger.warn("{}: no reverse mapping for {}", this, reverseKey); - return droolsControllers; - } - - List<ProtocolCoderToolset> toolsets = - this.reverseCoders.get(reverseKey); - - // There must be multiple toolsets associated with <topic,classname> reverseKey - // case 2 different controllers use the same models and register the same encoder for - // the same topic. This is assumed not to occur often but for the purpose of encoding - // but there should be no side-effects. Ownership is crosscheck against classname and - // classloader reference. - - if (toolsets == null || toolsets.isEmpty()) { - throw new IllegalStateException( - "No Encoders toolsets available for topic " - + topic - + " encoder " - + encodedClass.getClass().getName()); - } - - for (ProtocolCoderToolset encoderSet : toolsets) { - // figure out the right toolset - String groupId = encoderSet.getGroupId(); - String artifactId = encoderSet.getArtifactId(); - List<CoderFilters> coderFilters = encoderSet.getCoders(); - for (CoderFilters coder : coderFilters) { - if (coder.getCodedClass().equals(encodedClass.getClass().getName())) { - DroolsController droolsController = DroolsController.factory.get(groupId, artifactId, ""); - if (droolsController.ownsCoder( - encodedClass.getClass(), coder.getModelClassLoaderHash())) { - droolsControllers.add(droolsController); - } - } - } - } - - if (droolsControllers.isEmpty()) { - throw new IllegalStateException( - "No Encoders toolsets available for " - + topic - + ":" - + encodedClass.getClass().getName()); - } - - return droolsControllers; - } - - /** - * get all filters by maven coordinates and topic. - * - * @param groupId group id - * @param artifactId artifact id - * @param topic topic - * @return list of coders - * @throws IllegalArgumentException if invalid input - */ - public List<CoderFilters> getFilters(String groupId, String artifactId, String topic) { - - if (!isCodingSupported(groupId, artifactId, topic)) { - throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic)); - } - - String key = this.codersKey(groupId, artifactId, topic); - ProtocolCoderToolset coderTools = coders.get(key); - return coderTools.getCoders(); - } - - /** - * get all coders by maven coordinates and topic. - * - * @param groupId group id - * @param artifactId artifact id - * @return list of coders - * @throws IllegalArgumentException if invalid input - */ - public List<CoderFilters> getFilters(String groupId, String artifactId) { - - if (groupId == null || groupId.isEmpty()) { - throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); - } - - if (artifactId == null || artifactId.isEmpty()) { - throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); - } - - String key = this.codersKey(groupId, artifactId, ""); - - List<CoderFilters> codersFilters = new ArrayList<>(); - for (Map.Entry<String, ProtocolCoderToolset> entry : - coders.entrySet()) { - if (entry.getKey().startsWith(key)) { - codersFilters.addAll(entry.getValue().getCoders()); - } - } - - return codersFilters; - } - - /** - * get all filters by maven coordinates, topic, and classname. - * - * @param groupId group id - * @param artifactId artifact id - * @param topic topic - * @param classname classname - * @return list of coders - * @throws IllegalArgumentException if invalid input - */ - public CoderFilters getFilters( - String groupId, String artifactId, String topic, String classname) { - - if (!isCodingSupported(groupId, artifactId, topic)) { - throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic)); - } - - if (classname == null || classname.isEmpty()) { - throw new IllegalArgumentException("classname must be provided"); - } - - String key = this.codersKey(groupId, artifactId, topic); - ProtocolCoderToolset coderTools = coders.get(key); - return coderTools.getCoder(classname); - } - - /** - * get all coders by maven coordinates and topic. - * - * @param groupId group id - * @param artifactId artifact id - * @param topic topic - * @return list of coders - * @throws IllegalArgumentException if invalid input - */ - public ProtocolCoderToolset getCoders( - String groupId, String artifactId, String topic) { - - if (!isCodingSupported(groupId, artifactId, topic)) { - throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic)); - } - - String key = this.codersKey(groupId, artifactId, topic); - return coders.get(key); - } - - /** - * get all coders by maven coordinates and topic. - * - * @param groupId group id - * @param artifactId artifact id - * @return list of coders - * @throws IllegalArgumentException if invalid input - */ - public List<ProtocolCoderToolset> getCoders( - String groupId, String artifactId) { - - if (groupId == null || groupId.isEmpty()) { - throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); - } - - if (artifactId == null || artifactId.isEmpty()) { - throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); - } - - String key = this.codersKey(groupId, artifactId, ""); - - List<ProtocolCoderToolset> coderToolset = new ArrayList<>(); - for (Map.Entry<String, ProtocolCoderToolset> entry : - coders.entrySet()) { - if (entry.getKey().startsWith(key)) { - coderToolset.add(entry.getValue()); - } - } - - return coderToolset; - } - - /** - * get coded based on class and topic. - * - * @param topic topic - * @param codedClass class - * @return list of reverse filters - */ - public List<CoderFilters> getReverseFilters(String topic, String codedClass) { - - if (topic == null || topic.isEmpty()) { - throw new IllegalArgumentException(UNSUPPORTED_MSG); - } - - if (codedClass == null) { - throw new IllegalArgumentException(MISSING_CLASS); - } - - String key = this.reverseCodersKey(topic, codedClass); - List<ProtocolCoderToolset> toolsets = this.reverseCoders.get(key); - if (toolsets == null) { - throw new IllegalArgumentException("No Coder found for " + key); - } - - List<CoderFilters> coderFilters = new ArrayList<>(); - for (ProtocolCoderToolset toolset : toolsets) { - coderFilters.addAll(toolset.getCoders()); - } - - return coderFilters; - } - - /** - * returns group and artifact id of the creator of the encoder. - * - * @param topic topic - * @param fact fact - * @return the drools controller - */ - DroolsController getDroolsController(String topic, Object fact) { - - if (topic == null || topic.isEmpty()) { - throw new IllegalArgumentException(UNSUPPORTED_MSG); - } - - if (fact == null) { - throw new IllegalArgumentException(MISSING_CLASS); - } - - List<DroolsController> droolsControllers = droolsCreators(topic, fact); - - if (droolsControllers.isEmpty()) { - throw new IllegalArgumentException("Invalid Topic: " + topic); - } - - if (droolsControllers.size() > 1) { - logger.warn( - "{}: multiple drools-controller {} for {}:{} ", - this, - droolsControllers, - topic, - fact.getClass().getName()); - // continue - } - return droolsControllers.get(0); - } - - /** - * returns group and artifact id of the creator of the encoder. - * - * @param topic topic - * @param fact fact - * @return list of drools controllers - */ - List<DroolsController> getDroolsControllers(String topic, Object fact) { - - if (topic == null || topic.isEmpty()) { - throw new IllegalArgumentException(UNSUPPORTED_MSG); - } - - if (fact == null) { - throw new IllegalArgumentException(MISSING_CLASS); - } - - List<DroolsController> droolsControllers = droolsCreators(topic, fact); - if (droolsControllers.size() > 1) { - // unexpected - logger.warn( - "{}: multiple drools-controller {} for {}:{} ", - this, - droolsControllers, - topic, - fact.getClass().getName()); - // continue - } - return droolsControllers; - } - - @Override - public String toString() { - return "GenericEventProtocolCoder [coders=" - + coders.keySet() - + ", reverseCoders=" - + reverseCoders.keySet() - + "]"; - } -} - -class EventProtocolDecoder extends GenericEventProtocolCoder { - - public EventProtocolDecoder() { - super(); - } - - @Override - public String toString() { - return "EventProtocolDecoder [toString()=" + super.toString() + "]"; - } -} - -class EventProtocolEncoder extends GenericEventProtocolCoder { - - public EventProtocolEncoder() { - super(); - } - - @Override - public String toString() { - return "EventProtocolEncoder [toString()=" + super.toString() + "]"; - } -} diff --git a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolDecoder.java b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolDecoder.java new file mode 100644 index 00000000..6bb3a623 --- /dev/null +++ b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolDecoder.java @@ -0,0 +1,33 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.protocol.coders; + +class EventProtocolDecoder extends GenericEventProtocolCoder { + + public EventProtocolDecoder() { + super(); + } + + @Override + public String toString() { + return "EventProtocolDecoder [toString()=" + super.toString() + "]"; + } +} diff --git a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolEncoder.java b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolEncoder.java new file mode 100644 index 00000000..461c66a8 --- /dev/null +++ b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/EventProtocolEncoder.java @@ -0,0 +1,33 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.protocol.coders; + +class EventProtocolEncoder extends GenericEventProtocolCoder { + + public EventProtocolEncoder() { + super(); + } + + @Override + public String toString() { + return "EventProtocolEncoder [toString()=" + super.toString() + "]"; + } +} diff --git a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/GenericEventProtocolCoder.java b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/GenericEventProtocolCoder.java new file mode 100644 index 00000000..8643da3d --- /dev/null +++ b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/GenericEventProtocolCoder.java @@ -0,0 +1,712 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.protocol.coders; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import org.onap.policy.drools.controller.DroolsController; +import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This protocol Coder that does its best attempt to decode/encode, selecting the best class and best fitted json + * parsing tools. + */ +abstract class GenericEventProtocolCoder { + + private static final String INVALID_ARTIFACT_ID_MSG = "Invalid artifact id"; + + private static final String INVALID_GROUP_ID_MSG = "Invalid group id"; + + private static final String INVALID_TOPIC_MSG = "Invalid Topic"; + + private static final String UNSUPPORTED_MSG = "Unsupported"; + + private static final String MISSING_CLASS = "class must be provided"; + + private static Logger logger = LoggerFactory.getLogger(GenericEventProtocolCoder.class); + + /** + * Mapping topic:controller-id -> /<protocol-decoder-toolset/> where protocol-coder-toolset contains + * a gson-protocol-coder-toolset. + */ + protected final HashMap<String, ProtocolCoderToolset> coders = + new HashMap<>(); + + /** + * Mapping topic + classname -> Protocol Set. + */ + protected final HashMap<String, List<ProtocolCoderToolset>> + reverseCoders = new HashMap<>(); + + GenericEventProtocolCoder() { + super(); + } + + /** + * Index a new coder. + * + * @param eventProtocolParams parameter object for event encoder + * @throw IllegalArgumentException if an invalid parameter is passed + */ + public void add(EventProtocolParams eventProtocolParams) { + if (eventProtocolParams.getGroupId() == null || eventProtocolParams.getGroupId().isEmpty()) { + throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); + } + + if (eventProtocolParams.getArtifactId() == null || eventProtocolParams.getArtifactId().isEmpty()) { + throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); + } + + if (eventProtocolParams.getTopic() == null || eventProtocolParams.getTopic().isEmpty()) { + throw new IllegalArgumentException(INVALID_TOPIC_MSG); + } + + if (eventProtocolParams.getEventClass() == null) { + throw new IllegalArgumentException("Invalid Event Class"); + } + + String key = this.codersKey(eventProtocolParams.getGroupId(), eventProtocolParams.getArtifactId(), + eventProtocolParams.getTopic()); + String reverseKey = this.reverseCodersKey(eventProtocolParams.getTopic(), eventProtocolParams.getEventClass()); + + synchronized (this) { + if (coders.containsKey(key)) { + ProtocolCoderToolset toolset = coders.get(key); + + logger.info("{}: adding coders for existing {}: {}", this, key, toolset); + + toolset + .addCoder( + eventProtocolParams.getEventClass(), + eventProtocolParams.getProtocolFilter(), + eventProtocolParams.getModelClassLoaderHash()); + + if (!reverseCoders.containsKey(reverseKey)) { + logger.info( + "{}: adding new reverse coders (multiple classes case) for {}:{}: {}", + this, + reverseKey, + key, + toolset); + + List<ProtocolCoderToolset> reverseMappings = + new ArrayList<>(); + reverseMappings.add(toolset); + reverseCoders.put(reverseKey, reverseMappings); + } + return; + } + + GsonProtocolCoderToolset coderTools = + new GsonProtocolCoderToolset(eventProtocolParams, key); + + logger.info("{}: adding coders for new {}: {}", this, key, coderTools); + + coders.put(key, coderTools); + + if (reverseCoders.containsKey(reverseKey)) { + // There is another controller (different group id/artifact id/topic) + // that shares the class and the topic. + + List<ProtocolCoderToolset> toolsets = + reverseCoders.get(reverseKey); + boolean present = false; + for (ProtocolCoderToolset parserSet : toolsets) { + // just doublecheck + present = parserSet.getControllerId().equals(key); + if (present) { + /* anomaly */ + logger.error( + "{}: unexpected toolset reverse mapping found for {}:{}: {}", + this, + reverseKey, + key, + parserSet); + } + } + + if (present) { + return; + } else { + logger.info("{}: adding coder set for {}: {} ", this, reverseKey, coderTools); + toolsets.add(coderTools); + } + } else { + List<ProtocolCoderToolset> toolsets = new ArrayList<>(); + toolsets.add(coderTools); + + logger.info("{}: adding toolset for reverse key {}: {}", this, reverseKey, toolsets); + reverseCoders.put(reverseKey, toolsets); + } + } + } + + /** + * produces key for indexing toolset entries. + * + * @param groupId group id + * @param artifactId artifact id + * @param topic topic + * @return index key + */ + protected String codersKey(String groupId, String artifactId, String topic) { + return groupId + ":" + artifactId + ":" + topic; + } + + /** + * produces a key for the reverse index. + * + * @param topic topic + * @param eventClass coded class + * @return reverse index key + */ + protected String reverseCodersKey(String topic, String eventClass) { + return topic + ":" + eventClass; + } + + /** + * remove coder. + * + * @param groupId group id + * @param artifactId artifact id + * @param topic topic + * @throws IllegalArgumentException if invalid input + */ + public void remove(String groupId, String artifactId, String topic) { + + if (groupId == null || groupId.isEmpty()) { + throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); + } + + if (artifactId == null || artifactId.isEmpty()) { + throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); + } + + if (topic == null || topic.isEmpty()) { + throw new IllegalArgumentException(INVALID_TOPIC_MSG); + } + + String key = this.codersKey(groupId, artifactId, topic); + + synchronized (this) { + if (coders.containsKey(key)) { + ProtocolCoderToolset coderToolset = coders.remove(key); + + logger.info("{}: removed toolset for {}: {}", this, key, coderToolset); + + for (CoderFilters codeFilter : coderToolset.getCoders()) { + String className = codeFilter.getCodedClass(); + String reverseKey = this.reverseCodersKey(topic, className); + if (this.reverseCoders.containsKey(reverseKey)) { + List<ProtocolCoderToolset> toolsets = + this.reverseCoders.get(reverseKey); + Iterator<ProtocolCoderToolset> toolsetsIter = + toolsets.iterator(); + while (toolsetsIter.hasNext()) { + ProtocolCoderToolset toolset = toolsetsIter.next(); + if (toolset.getControllerId().equals(key)) { + logger.info( + "{}: removed coder from toolset for {} from reverse mapping", this, reverseKey); + toolsetsIter.remove(); + } + } + + if (this.reverseCoders.get(reverseKey).isEmpty()) { + logger.info("{}: removing reverse mapping for {}: ", this, reverseKey); + this.reverseCoders.remove(reverseKey); + } + } + } + } + } + } + + /** + * does it support coding. + * + * @param groupId group id + * @param artifactId artifact id + * @param topic topic + * @return true if its is codable + */ + public boolean isCodingSupported(String groupId, String artifactId, String topic) { + + if (groupId == null || groupId.isEmpty()) { + throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); + } + + if (artifactId == null || artifactId.isEmpty()) { + throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); + } + + if (topic == null || topic.isEmpty()) { + throw new IllegalArgumentException(INVALID_TOPIC_MSG); + } + + String key = this.codersKey(groupId, artifactId, topic); + synchronized (this) { + return coders.containsKey(key); + } + } + + /** + * decode a json string into an Object. + * + * @param groupId group id + * @param artifactId artifact id + * @param topic topic + * @param json json string to convert to object + * @return the decoded object + * @throws IllegalArgumentException if invalid argument is provided + * @throws UnsupportedOperationException if the operation cannot be performed + */ + public Object decode(String groupId, String artifactId, String topic, String json) { + + if (!isCodingSupported(groupId, artifactId, topic)) { + throw new IllegalArgumentException( + "Unsupported:" + codersKey(groupId, artifactId, topic) + " for encoding"); + } + + String key = this.codersKey(groupId, artifactId, topic); + ProtocolCoderToolset coderTools = coders.get(key); + try { + Object event = coderTools.decode(json); + if (event != null) { + return event; + } + } catch (Exception e) { + logger.debug("{}, cannot decode {}", this, json, e); + } + + throw new UnsupportedOperationException("Cannot decode with gson"); + } + + /** + * encode an object into a json string. + * + * @param groupId group id + * @param artifactId artifact id + * @param topic topic + * @param event object to convert to string + * @return the json string + * @throws IllegalArgumentException if invalid argument is provided + * @throws UnsupportedOperationException if the operation cannot be performed + */ + public String encode(String groupId, String artifactId, String topic, Object event) { + + if (!isCodingSupported(groupId, artifactId, topic)) { + throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic)); + } + + if (event == null) { + throw new IllegalArgumentException("Unsupported topic:" + topic); + } + + // reuse the decoder set, since there must be affinity in the model + String key = this.codersKey(groupId, artifactId, topic); + return this.encodeInternal(key, event); + } + + /** + * encode an object into a json string. + * + * @param topic topic + * @param event object to convert to string + * @return the json string + * @throws IllegalArgumentException if invalid argument is provided + * @throws UnsupportedOperationException if the operation cannot be performed + */ + public String encode(String topic, Object event) { + + if (event == null) { + throw new IllegalArgumentException("Invalid encoded class"); + } + + if (topic == null || topic.isEmpty()) { + throw new IllegalArgumentException("Invalid topic"); + } + + String reverseKey = this.reverseCodersKey(topic, event.getClass().getName()); + if (!this.reverseCoders.containsKey(reverseKey)) { + throw new IllegalArgumentException("no reverse coder has been found"); + } + + List<ProtocolCoderToolset> toolsets = + this.reverseCoders.get(reverseKey); + + String key = + codersKey( + toolsets.get(0).getGroupId(), toolsets.get(0).getArtifactId(), topic); + return this.encodeInternal(key, event); + } + + /** + * encode an object into a json string. + * + * @param topic topic + * @param encodedClass object to convert to string + * @return the json string + * @throws IllegalArgumentException if invalid argument is provided + * @throws UnsupportedOperationException if the operation cannot be performed + */ + public String encode(String topic, Object encodedClass, DroolsController droolsController) { + + if (encodedClass == null) { + throw new IllegalArgumentException("Invalid encoded class"); + } + + if (topic == null || topic.isEmpty()) { + throw new IllegalArgumentException("Invalid topic"); + } + + String key = codersKey(droolsController.getGroupId(), droolsController.getArtifactId(), topic); + return this.encodeInternal(key, encodedClass); + } + + /** + * encode an object into a json string. + * + * @param key identifier + * @param event object to convert to string + * @return the json string + * @throws IllegalArgumentException if invalid argument is provided + * @throws UnsupportedOperationException if the operation cannot be performed + */ + protected String encodeInternal(String key, Object event) { + + logger.debug("{}: encode for {}: {}", this, key, event); + + ProtocolCoderToolset coderTools = coders.get(key); + try { + String json = coderTools.encode(event); + if (json != null && !json.isEmpty()) { + return json; + } + } catch (Exception e) { + logger.warn("{}: cannot encode (first) for {}: {}", this, key, event, e); + } + + throw new UnsupportedOperationException("Cannot decode with gson"); + } + + /** + * Drools creators. + * + * @param topic topic + * @param encodedClass encoded class + * @return list of controllers + * @throws IllegalStateException illegal state + * @throws IllegalArgumentException argument + */ + protected List<DroolsController> droolsCreators(String topic, Object encodedClass) { + + List<DroolsController> droolsControllers = new ArrayList<>(); + + String reverseKey = this.reverseCodersKey(topic, encodedClass.getClass().getName()); + if (!this.reverseCoders.containsKey(reverseKey)) { + logger.warn("{}: no reverse mapping for {}", this, reverseKey); + return droolsControllers; + } + + List<ProtocolCoderToolset> toolsets = + this.reverseCoders.get(reverseKey); + + // There must be multiple toolsets associated with <topic,classname> reverseKey + // case 2 different controllers use the same models and register the same encoder for + // the same topic. This is assumed not to occur often but for the purpose of encoding + // but there should be no side-effects. Ownership is crosscheck against classname and + // classloader reference. + + if (toolsets == null || toolsets.isEmpty()) { + throw new IllegalStateException( + "No Encoders toolsets available for topic " + + topic + + " encoder " + + encodedClass.getClass().getName()); + } + + for (ProtocolCoderToolset encoderSet : toolsets) { + // figure out the right toolset + String groupId = encoderSet.getGroupId(); + String artifactId = encoderSet.getArtifactId(); + List<CoderFilters> coderFilters = encoderSet.getCoders(); + for (CoderFilters coder : coderFilters) { + if (coder.getCodedClass().equals(encodedClass.getClass().getName())) { + DroolsController droolsController = DroolsController.factory.get(groupId, artifactId, ""); + if (droolsController.ownsCoder( + encodedClass.getClass(), coder.getModelClassLoaderHash())) { + droolsControllers.add(droolsController); + } + } + } + } + + if (droolsControllers.isEmpty()) { + throw new IllegalStateException( + "No Encoders toolsets available for " + + topic + + ":" + + encodedClass.getClass().getName()); + } + + return droolsControllers; + } + + /** + * get all filters by maven coordinates and topic. + * + * @param groupId group id + * @param artifactId artifact id + * @param topic topic + * @return list of coders + * @throws IllegalArgumentException if invalid input + */ + public List<CoderFilters> getFilters(String groupId, String artifactId, String topic) { + + if (!isCodingSupported(groupId, artifactId, topic)) { + throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic)); + } + + String key = this.codersKey(groupId, artifactId, topic); + ProtocolCoderToolset coderTools = coders.get(key); + return coderTools.getCoders(); + } + + /** + * get all coders by maven coordinates and topic. + * + * @param groupId group id + * @param artifactId artifact id + * @return list of coders + * @throws IllegalArgumentException if invalid input + */ + public List<CoderFilters> getFilters(String groupId, String artifactId) { + + if (groupId == null || groupId.isEmpty()) { + throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); + } + + if (artifactId == null || artifactId.isEmpty()) { + throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); + } + + String key = this.codersKey(groupId, artifactId, ""); + + List<CoderFilters> codersFilters = new ArrayList<>(); + for (Map.Entry<String, ProtocolCoderToolset> entry : + coders.entrySet()) { + if (entry.getKey().startsWith(key)) { + codersFilters.addAll(entry.getValue().getCoders()); + } + } + + return codersFilters; + } + + /** + * get all filters by maven coordinates, topic, and classname. + * + * @param groupId group id + * @param artifactId artifact id + * @param topic topic + * @param classname classname + * @return list of coders + * @throws IllegalArgumentException if invalid input + */ + public CoderFilters getFilters( + String groupId, String artifactId, String topic, String classname) { + + if (!isCodingSupported(groupId, artifactId, topic)) { + throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic)); + } + + if (classname == null || classname.isEmpty()) { + throw new IllegalArgumentException("classname must be provided"); + } + + String key = this.codersKey(groupId, artifactId, topic); + ProtocolCoderToolset coderTools = coders.get(key); + return coderTools.getCoder(classname); + } + + /** + * get all coders by maven coordinates and topic. + * + * @param groupId group id + * @param artifactId artifact id + * @param topic topic + * @return list of coders + * @throws IllegalArgumentException if invalid input + */ + public ProtocolCoderToolset getCoders( + String groupId, String artifactId, String topic) { + + if (!isCodingSupported(groupId, artifactId, topic)) { + throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic)); + } + + String key = this.codersKey(groupId, artifactId, topic); + return coders.get(key); + } + + /** + * get all coders by maven coordinates and topic. + * + * @param groupId group id + * @param artifactId artifact id + * @return list of coders + * @throws IllegalArgumentException if invalid input + */ + public List<ProtocolCoderToolset> getCoders( + String groupId, String artifactId) { + + if (groupId == null || groupId.isEmpty()) { + throw new IllegalArgumentException(INVALID_GROUP_ID_MSG); + } + + if (artifactId == null || artifactId.isEmpty()) { + throw new IllegalArgumentException(INVALID_ARTIFACT_ID_MSG); + } + + String key = this.codersKey(groupId, artifactId, ""); + + List<ProtocolCoderToolset> coderToolset = new ArrayList<>(); + for (Map.Entry<String, ProtocolCoderToolset> entry : + coders.entrySet()) { + if (entry.getKey().startsWith(key)) { + coderToolset.add(entry.getValue()); + } + } + + return coderToolset; + } + + /** + * get coded based on class and topic. + * + * @param topic topic + * @param codedClass class + * @return list of reverse filters + */ + public List<CoderFilters> getReverseFilters(String topic, String codedClass) { + + if (topic == null || topic.isEmpty()) { + throw new IllegalArgumentException(UNSUPPORTED_MSG); + } + + if (codedClass == null) { + throw new IllegalArgumentException(MISSING_CLASS); + } + + String key = this.reverseCodersKey(topic, codedClass); + List<ProtocolCoderToolset> toolsets = this.reverseCoders.get(key); + if (toolsets == null) { + throw new IllegalArgumentException("No Coder found for " + key); + } + + List<CoderFilters> coderFilters = new ArrayList<>(); + for (ProtocolCoderToolset toolset : toolsets) { + coderFilters.addAll(toolset.getCoders()); + } + + return coderFilters; + } + + /** + * returns group and artifact id of the creator of the encoder. + * + * @param topic topic + * @param fact fact + * @return the drools controller + */ + DroolsController getDroolsController(String topic, Object fact) { + + if (topic == null || topic.isEmpty()) { + throw new IllegalArgumentException(UNSUPPORTED_MSG); + } + + if (fact == null) { + throw new IllegalArgumentException(MISSING_CLASS); + } + + List<DroolsController> droolsControllers = droolsCreators(topic, fact); + + if (droolsControllers.isEmpty()) { + throw new IllegalArgumentException("Invalid Topic: " + topic); + } + + if (droolsControllers.size() > 1) { + logger.warn( + "{}: multiple drools-controller {} for {}:{} ", + this, + droolsControllers, + topic, + fact.getClass().getName()); + // continue + } + return droolsControllers.get(0); + } + + /** + * returns group and artifact id of the creator of the encoder. + * + * @param topic topic + * @param fact fact + * @return list of drools controllers + */ + List<DroolsController> getDroolsControllers(String topic, Object fact) { + + if (topic == null || topic.isEmpty()) { + throw new IllegalArgumentException(UNSUPPORTED_MSG); + } + + if (fact == null) { + throw new IllegalArgumentException(MISSING_CLASS); + } + + List<DroolsController> droolsControllers = droolsCreators(topic, fact); + if (droolsControllers.size() > 1) { + // unexpected + logger.warn( + "{}: multiple drools-controller {} for {}:{} ", + this, + droolsControllers, + topic, + fact.getClass().getName()); + // continue + } + return droolsControllers; + } + + @Override + public String toString() { + return "GenericEventProtocolCoder [coders=" + + coders.keySet() + + ", reverseCoders=" + + reverseCoders.keySet() + + "]"; + } +} diff --git a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/GsonProtocolCoderToolset.java b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/GsonProtocolCoderToolset.java new file mode 100644 index 00000000..57976a3e --- /dev/null +++ b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/GsonProtocolCoderToolset.java @@ -0,0 +1,249 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.protocol.coders; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.time.Instant; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import org.onap.policy.common.gson.annotation.GsonJsonIgnore; +import org.onap.policy.drools.controller.DroolsController; +import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Tools used for encoding/decoding using GSON. + */ +class GsonProtocolCoderToolset extends ProtocolCoderToolset { + /** + * Logger. + */ + private static final Logger logger = LoggerFactory.getLogger(GsonProtocolCoderToolset.class); + + /** + * Formatter for JSON encoding/decoding. + */ + @JsonIgnore + @GsonJsonIgnore + public static final DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSxxx"); + + @JsonIgnore + @GsonJsonIgnore + public static final DateTimeFormatter zuluFormat = DateTimeFormatter.ISO_INSTANT; + + /** + * Adapter for ZonedDateTime. + */ + public static class GsonUtcAdapter implements JsonSerializer<ZonedDateTime>, JsonDeserializer<ZonedDateTime> { + @Override + public ZonedDateTime deserialize(JsonElement element, Type type, + JsonDeserializationContext context) { + try { + return ZonedDateTime.parse(element.getAsString(), format); + } catch (final Exception e) { + logger.info("GsonUTCAdapter: cannot parse {} because of {}", element, e.getMessage(), e); + } + return null; + } + + @Override + public JsonElement serialize(ZonedDateTime datetime, Type type, + JsonSerializationContext context) { + return new JsonPrimitive(datetime.format(format)); + } + } + + public static class GsonInstantAdapter implements JsonSerializer<Instant>, JsonDeserializer<Instant> { + + @Override + public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { + return Instant.ofEpochMilli(json.getAsLong()); + } + + @Override + public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(src.toEpochMilli()); + } + + } + + + /** + * decoder. + */ + @JsonIgnore + @GsonJsonIgnore + protected final Gson decoder = new GsonBuilder().disableHtmlEscaping() + .registerTypeAdapter(ZonedDateTime.class, new GsonUtcAdapter()) + .registerTypeAdapter(Instant.class, new GsonInstantAdapter()).create(); + + /** + * encoder. + */ + @JsonIgnore + @GsonJsonIgnore + protected final Gson encoder = new GsonBuilder().disableHtmlEscaping() + .registerTypeAdapter(ZonedDateTime.class, new GsonUtcAdapter()) + .registerTypeAdapter(Instant.class, new GsonInstantAdapter()).create(); + + /** + * Toolset to encode/decode tools associated with a topic. + * + * @param eventProtocolParams parameter object for event encoder + * @param controllerId controller id + */ + public GsonProtocolCoderToolset(EventProtocolParams eventProtocolParams, String controllerId) { + super(eventProtocolParams, controllerId); + } + + /** + * gets the Gson decoder. + * + * @return the Gson decoder + */ + @JsonIgnore + @GsonJsonIgnore + protected Gson getDecoder() { + return this.decoder; + } + + /** + * gets the Gson encoder. + * + * @return the Gson encoder + */ + @JsonIgnore + @GsonJsonIgnore + protected Gson getEncoder() { + return this.encoder; + } + + /** + * {@inheritDoc}. + */ + @Override + public Object decode(String json) { + + final DroolsController droolsController = + DroolsController.factory.get(this.groupId, this.artifactId, ""); + if (droolsController == null) { + logger.warn("{}: no drools-controller to process {}", this, json); + throw new IllegalStateException("no drools-controller to process event"); + } + + final CoderFilters decoderFilter = this.filter(json); + if (decoderFilter == null) { + logger.debug("{}: no decoder to process {}", this, json); + throw new UnsupportedOperationException("no decoder to process event"); + } + + Class<?> decoderClass; + try { + decoderClass = droolsController.fetchModelClass(decoderFilter.getCodedClass()); + if (decoderClass == null) { + logger.warn("{}: cannot fetch application class {}", this, decoderFilter.getCodedClass()); + throw new IllegalStateException( + "cannot fetch application class " + decoderFilter.getCodedClass()); + } + } catch (final Exception e) { + logger.warn("{}: cannot fetch application class {} because of {}", this, + decoderFilter.getCodedClass(), e.getMessage()); + throw new UnsupportedOperationException( + "cannot fetch application class " + decoderFilter.getCodedClass(), e); + } + + if (this.customCoder != null) { + try { + final Class<?> gsonClassContainer = + droolsController.fetchModelClass(this.customCoder.getClassContainer()); + final Field gsonField = gsonClassContainer.getField(this.customCoder.staticCoderField); + final Object gsonObject = gsonField.get(null); + final Method fromJsonMethod = gsonObject.getClass().getDeclaredMethod("fromJson", + new Class[] {String.class, Class.class}); + return fromJsonMethod.invoke(gsonObject, json, decoderClass); + } catch (final Exception e) { + logger.warn("{}: cannot fetch application class {} because of {}", this, + decoderFilter.getCodedClass(), e.getMessage()); + throw new UnsupportedOperationException( + "cannot fetch application class " + decoderFilter.getCodedClass(), e); + } + } else { + try { + return this.decoder.fromJson(json, decoderClass); + } catch (final Exception e) { + logger.warn("{} cannot decode {} into {} because of {}", this, json, decoderClass.getName(), + e.getMessage(), e); + throw new UnsupportedOperationException( + "cannont decode into " + decoderFilter.getCodedClass(), e); + } + } + } + + /** + * {@inheritDoc}. + */ + @Override + public String encode(Object event) { + + if (this.customCoder != null) { + try { + final DroolsController droolsController = + DroolsController.factory.get(this.groupId, this.artifactId, null); + final Class<?> gsonClassContainer = + droolsController.fetchModelClass(this.customCoder.getClassContainer()); + final Field gsonField = gsonClassContainer.getField(this.customCoder.staticCoderField); + final Object gsonObject = gsonField.get(null); + final Method toJsonMethod = + gsonObject.getClass().getDeclaredMethod("toJson", new Class[] {Object.class}); + return (String) toJsonMethod.invoke(gsonObject, event); + } catch (final Exception e) { + logger.warn("{} cannot custom-encode {} because of {}", this, event, e.getMessage(), e); + throw new UnsupportedOperationException("event cannot be encoded", e); + } + } else { + try { + return this.encoder.toJson(event); + } catch (final Exception e) { + logger.warn("{} cannot encode {} because of {}", this, event, e.getMessage(), e); + throw new UnsupportedOperationException("event cannot be encoded", e); + } + } + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("GsonProtocolCoderToolset [toString()=").append(super.toString()).append("]"); + return builder.toString(); + } +} diff --git a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/MultiplexorEventProtocolCoder.java b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/MultiplexorEventProtocolCoder.java new file mode 100644 index 00000000..a8f3c3a3 --- /dev/null +++ b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/MultiplexorEventProtocolCoder.java @@ -0,0 +1,278 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.protocol.coders; + +import java.util.ArrayList; +import java.util.List; +import org.onap.policy.drools.controller.DroolsController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Protocol Coder that does its best attempt to decode/encode, selecting the best class and best fitted json parsing + * tools. + */ +class MultiplexorEventProtocolCoder implements EventProtocolCoder { + + /** + * Logger. + */ + private static Logger logger = LoggerFactory.getLogger(MultiplexorEventProtocolCoder.class); + + /** + * Decoders. + */ + protected EventProtocolDecoder decoders = new EventProtocolDecoder(); + + /** + * Encoders. + */ + protected EventProtocolEncoder encoders = new EventProtocolEncoder(); + + /** + * {@inheritDoc}. + */ + @Override + public void addDecoder(EventProtocolParams eventProtocolParams) { + logger.info( + "{}: add-decoder {}:{}:{}:{}:{}:{}:{}", + this, + eventProtocolParams.getGroupId(), + eventProtocolParams.getArtifactId(), + eventProtocolParams.getTopic(), + eventProtocolParams.getEventClass(), + eventProtocolParams.getProtocolFilter(), + eventProtocolParams.getCustomGsonCoder(), + eventProtocolParams.getModelClassLoaderHash()); + this.decoders.add(eventProtocolParams); + } + + /** + * {@inheritDoc}. + * + * @param eventProtocolParams parameter object for event encoder + */ + @Override + public void addEncoder(EventProtocolParams eventProtocolParams) { + logger.info( + "{}: add-decoder {}:{}:{}:{}:{}:{}:{}", + this, + eventProtocolParams.getGroupId(), + eventProtocolParams.getArtifactId(), + eventProtocolParams.getTopic(), + eventProtocolParams.getEventClass(), + eventProtocolParams.getProtocolFilter(), + eventProtocolParams.getCustomGsonCoder(), + eventProtocolParams.getModelClassLoaderHash()); + this.encoders.add(eventProtocolParams); + } + + /** + * {@inheritDoc}. + */ + @Override + public void removeDecoders(String groupId, String artifactId, String topic) { + logger.info("{}: remove-decoder {}:{}:{}", this, groupId, artifactId, topic); + this.decoders.remove(groupId, artifactId, topic); + } + + /** + * {@inheritDoc}. + */ + @Override + public void removeEncoders(String groupId, String artifactId, String topic) { + logger.info("{}: remove-encoder {}:{}:{}", this, groupId, artifactId, topic); + this.encoders.remove(groupId, artifactId, topic); + } + + /** + * {@inheritDoc}. + */ + @Override + public boolean isDecodingSupported(String groupId, String artifactId, String topic) { + return this.decoders.isCodingSupported(groupId, artifactId, topic); + } + + /** + * {@inheritDoc}. + */ + @Override + public boolean isEncodingSupported(String groupId, String artifactId, String topic) { + return this.encoders.isCodingSupported(groupId, artifactId, topic); + } + + /** + * {@inheritDoc}. + */ + @Override + public Object decode(String groupId, String artifactId, String topic, String json) { + logger.debug("{}: decode {}:{}:{}:{}", this, groupId, artifactId, topic, json); + return this.decoders.decode(groupId, artifactId, topic, json); + } + + /** + * {@inheritDoc}. + */ + @Override + public String encode(String groupId, String artifactId, String topic, Object event) { + logger.debug("{}: encode {}:{}:{}:{}", this, groupId, artifactId, topic, event); + return this.encoders.encode(groupId, artifactId, topic, event); + } + + /** + * {@inheritDoc}. + */ + @Override + public String encode(String topic, Object event) { + logger.debug("{}: encode {}:{}", this, topic, event); + return this.encoders.encode(topic, event); + } + + /** + * {@inheritDoc}. + */ + @Override + public String encode(String topic, Object event, DroolsController droolsController) { + logger.debug("{}: encode {}:{}:{}", this, topic, event, droolsController); + return this.encoders.encode(topic, event, droolsController); + } + + /** + * {@inheritDoc}. + */ + @Override + public List<CoderFilters> getDecoderFilters(String groupId, String artifactId, String topic) { + return this.decoders.getFilters(groupId, artifactId, topic); + } + + /** + * {@inheritDoc}. + */ + @Override + public CoderFilters getDecoderFilters( + String groupId, String artifactId, String topic, String classname) { + return this.decoders.getFilters(groupId, artifactId, topic, classname); + } + + /** + * {@inheritDoc}. + */ + @Override + public List<CoderFilters> getDecoderFilters(String groupId, String artifactId) { + return this.decoders.getFilters(groupId, artifactId); + } + + /** + * {@inheritDoc}. + */ + @Override + public ProtocolCoderToolset getDecoders(String groupId, String artifactId, String topic) { + ProtocolCoderToolset decoderToolsets = + this.decoders.getCoders(groupId, artifactId, topic); + if (decoderToolsets == null) { + throw new IllegalArgumentException( + "Decoders not found for " + groupId + ":" + artifactId + ":" + topic); + } + + return decoderToolsets; + } + + /** + * get all deocders by maven coordinates and topic. + * + * @param groupId group id + * @param artifactId artifact id + * @return list of decoders + * @throws IllegalArgumentException if invalid input + */ + @Override + public List<ProtocolCoderToolset> getDecoders(String groupId, String artifactId) { + + List<ProtocolCoderToolset> decoderToolsets = + this.decoders.getCoders(groupId, artifactId); + if (decoderToolsets == null) { + throw new IllegalArgumentException("Decoders not found for " + groupId + ":" + artifactId); + } + + return new ArrayList<>(decoderToolsets); + } + + /** + * {@inheritDoc}. + */ + @Override + public List<CoderFilters> getEncoderFilters(String groupId, String artifactId, String topic) { + return this.encoders.getFilters(groupId, artifactId, topic); + } + + /** + * {@inheritDoc}. + */ + @Override + public CoderFilters getEncoderFilters( + String groupId, String artifactId, String topic, String classname) { + return this.encoders.getFilters(groupId, artifactId, topic, classname); + } + + /** + * {@inheritDoc}. + */ + @Override + public List<CoderFilters> getEncoderFilters(String groupId, String artifactId) { + return this.encoders.getFilters(groupId, artifactId); + } + + /** + * {@inheritDoc}. + */ + @Override + public List<CoderFilters> getReverseEncoderFilters(String topic, String encodedClass) { + return this.encoders.getReverseFilters(topic, encodedClass); + } + + /** + * {@inheritDoc}. + */ + @Override + public DroolsController getDroolsController(String topic, Object encodedClass) { + return this.encoders.getDroolsController(topic, encodedClass); + } + + /** + * {@inheritDoc}. + */ + @Override + public List<DroolsController> getDroolsControllers(String topic, Object encodedClass) { + return this.encoders.getDroolsControllers(topic, encodedClass); + } + + /** + * {@inheritDoc}. + */ + @Override + public String toString() { + return "MultiplexorEventProtocolCoder [decoders=" + + decoders + + ", encoders=" + + encoders + + "]"; + } +} diff --git a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/ProtocolCoderToolset.java b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/ProtocolCoderToolset.java index 394e73af..a4add9ce 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/ProtocolCoderToolset.java +++ b/policy-management/src/main/java/org/onap/policy/drools/protocol/coders/ProtocolCoderToolset.java @@ -21,27 +21,10 @@ package org.onap.policy.drools.protocol.coders; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; import com.google.gson.JsonParser; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.time.Instant; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -import org.onap.policy.common.gson.annotation.GsonJsonIgnore; -import org.onap.policy.drools.controller.DroolsController; import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters; import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomCoder; import org.slf4j.Logger; @@ -309,210 +292,3 @@ public abstract class ProtocolCoderToolset { return builder.toString(); } } - -/** - * Tools used for encoding/decoding using GSON. - */ -class GsonProtocolCoderToolset extends ProtocolCoderToolset { - /** - * Logger. - */ - private static final Logger logger = LoggerFactory.getLogger(GsonProtocolCoderToolset.class); - - /** - * Formatter for JSON encoding/decoding. - */ - @JsonIgnore - @GsonJsonIgnore - public static final DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSxxx"); - - @JsonIgnore - @GsonJsonIgnore - public static final DateTimeFormatter zuluFormat = DateTimeFormatter.ISO_INSTANT; - - /** - * Adapter for ZonedDateTime. - */ - public static class GsonUTCAdapter implements JsonSerializer<ZonedDateTime>, JsonDeserializer<ZonedDateTime> { - @Override - public ZonedDateTime deserialize(JsonElement element, Type type, - JsonDeserializationContext context) { - try { - return ZonedDateTime.parse(element.getAsString(), format); - } catch (final Exception e) { - logger.info("GsonUTCAdapter: cannot parse {} because of {}", element, e.getMessage(), e); - } - return null; - } - - @Override - public JsonElement serialize(ZonedDateTime datetime, Type type, - JsonSerializationContext context) { - return new JsonPrimitive(datetime.format(format)); - } - } - - public static class GsonInstantAdapter implements JsonSerializer<Instant>, JsonDeserializer<Instant> { - - @Override - public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { - return Instant.ofEpochMilli(json.getAsLong()); - } - - @Override - public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) { - return new JsonPrimitive(src.toEpochMilli()); - } - - } - - - /** - * decoder. - */ - @JsonIgnore - @GsonJsonIgnore - protected final Gson decoder = new GsonBuilder().disableHtmlEscaping() - .registerTypeAdapter(ZonedDateTime.class, new GsonUTCAdapter()) - .registerTypeAdapter(Instant.class, new GsonInstantAdapter()).create(); - - /** - * encoder. - */ - @JsonIgnore - @GsonJsonIgnore - protected final Gson encoder = new GsonBuilder().disableHtmlEscaping() - .registerTypeAdapter(ZonedDateTime.class, new GsonUTCAdapter()) - .registerTypeAdapter(Instant.class, new GsonInstantAdapter()).create(); - - /** - * Toolset to encode/decode tools associated with a topic. - * - * @param eventProtocolParams parameter object for event encoder - * @param controllerId controller id - */ - public GsonProtocolCoderToolset(EventProtocolParams eventProtocolParams, String controllerId) { - super(eventProtocolParams, controllerId); - } - - /** - * gets the Gson decoder. - * - * @return the Gson decoder - */ - @JsonIgnore - @GsonJsonIgnore - protected Gson getDecoder() { - return this.decoder; - } - - /** - * gets the Gson encoder. - * - * @return the Gson encoder - */ - @JsonIgnore - @GsonJsonIgnore - protected Gson getEncoder() { - return this.encoder; - } - - /** - * {@inheritDoc}. - */ - @Override - public Object decode(String json) { - - final DroolsController droolsController = - DroolsController.factory.get(this.groupId, this.artifactId, ""); - if (droolsController == null) { - logger.warn("{}: no drools-controller to process {}", this, json); - throw new IllegalStateException("no drools-controller to process event"); - } - - final CoderFilters decoderFilter = this.filter(json); - if (decoderFilter == null) { - logger.debug("{}: no decoder to process {}", this, json); - throw new UnsupportedOperationException("no decoder to process event"); - } - - Class<?> decoderClass; - try { - decoderClass = droolsController.fetchModelClass(decoderFilter.getCodedClass()); - if (decoderClass == null) { - logger.warn("{}: cannot fetch application class {}", this, decoderFilter.getCodedClass()); - throw new IllegalStateException( - "cannot fetch application class " + decoderFilter.getCodedClass()); - } - } catch (final Exception e) { - logger.warn("{}: cannot fetch application class {} because of {}", this, - decoderFilter.getCodedClass(), e.getMessage()); - throw new UnsupportedOperationException( - "cannot fetch application class " + decoderFilter.getCodedClass(), e); - } - - if (this.customCoder != null) { - try { - final Class<?> gsonClassContainer = - droolsController.fetchModelClass(this.customCoder.getClassContainer()); - final Field gsonField = gsonClassContainer.getField(this.customCoder.staticCoderField); - final Object gsonObject = gsonField.get(null); - final Method fromJsonMethod = gsonObject.getClass().getDeclaredMethod("fromJson", - new Class[] {String.class, Class.class}); - return fromJsonMethod.invoke(gsonObject, json, decoderClass); - } catch (final Exception e) { - logger.warn("{}: cannot fetch application class {} because of {}", this, - decoderFilter.getCodedClass(), e.getMessage()); - throw new UnsupportedOperationException( - "cannot fetch application class " + decoderFilter.getCodedClass(), e); - } - } else { - try { - return this.decoder.fromJson(json, decoderClass); - } catch (final Exception e) { - logger.warn("{} cannot decode {} into {} because of {}", this, json, decoderClass.getName(), - e.getMessage(), e); - throw new UnsupportedOperationException( - "cannont decode into " + decoderFilter.getCodedClass(), e); - } - } - } - - /** - * {@inheritDoc}. - */ - @Override - public String encode(Object event) { - - if (this.customCoder != null) { - try { - final DroolsController droolsController = - DroolsController.factory.get(this.groupId, this.artifactId, null); - final Class<?> gsonClassContainer = - droolsController.fetchModelClass(this.customCoder.getClassContainer()); - final Field gsonField = gsonClassContainer.getField(this.customCoder.staticCoderField); - final Object gsonObject = gsonField.get(null); - final Method toJsonMethod = - gsonObject.getClass().getDeclaredMethod("toJson", new Class[] {Object.class}); - return (String) toJsonMethod.invoke(gsonObject, event); - } catch (final Exception e) { - logger.warn("{} cannot custom-encode {} because of {}", this, event, e.getMessage(), e); - throw new UnsupportedOperationException("event cannot be encoded", e); - } - } else { - try { - return this.encoder.toJson(event); - } catch (final Exception e) { - logger.warn("{} cannot encode {} because of {}", this, event, e.getMessage(), e); - throw new UnsupportedOperationException("event cannot be encoded", e); - } - } - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("GsonProtocolCoderToolset [toString()=").append(super.toString()).append("]"); - return builder.toString(); - } -} diff --git a/policy-management/src/main/java/org/onap/policy/drools/protocol/configuration/PdpdConfiguration.java b/policy-management/src/main/java/org/onap/policy/drools/protocol/configuration/PdpdConfiguration.java index f83f480e..572bc14f 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/protocol/configuration/PdpdConfiguration.java +++ b/policy-management/src/main/java/org/onap/policy/drools/protocol/configuration/PdpdConfiguration.java @@ -7,9 +7,9 @@ * 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. @@ -50,7 +50,7 @@ public class PdpdConfiguration { /** Unique Transaction ID. This is an UUID. (Required) */ @JsonProperty("requestID") @GsonJsonProperty("requestID") - private String requestID; + private String requestId; /* Set of entities on which configuration can be performed: controller (Required) */ @JsonProperty("entity") @GsonJsonProperty("entity") @@ -70,14 +70,14 @@ public class PdpdConfiguration { /** * Constructor. - * - * @param requestID request id + * + * @param requestId request id * @param entity entity * @param controllers controllers */ public PdpdConfiguration( - String requestID, String entity, List<ControllerConfiguration> controllers) { - this.requestID = requestID; + String requestId, String entity, List<ControllerConfiguration> controllers) { + this.requestId = requestId; this.entity = entity; this.controllers = controllers; } @@ -89,23 +89,23 @@ public class PdpdConfiguration { */ @JsonProperty("requestID") @GsonJsonProperty("requestID") - public String getRequestID() { - return requestID; + public String getRequestId() { + return requestId; } /** * Unique Transaction ID. This is an UUID. (Required) * - * @param requestID The requestID + * @param requestId The requestID */ @JsonProperty("requestID") @GsonJsonProperty("requestID") - public void setRequestID(String requestID) { - this.requestID = requestID; + public void setRequestId(String requestId) { + this.requestId = requestId; } - public PdpdConfiguration withRequestID(String requestID) { - this.requestID = requestID; + public PdpdConfiguration withRequestId(String requestId) { + this.requestId = requestId; return this; } @@ -204,7 +204,7 @@ public class PdpdConfiguration { protected Object declaredPropertyOrNotFound(String name, Object notFoundValue) { switch (name) { case "requestID": - return getRequestID(); + return getRequestId(); case "entity": return getEntity(); case "controllers": @@ -216,7 +216,7 @@ public class PdpdConfiguration { /** * Get. - * + * * @param name name * @return object */ @@ -232,7 +232,7 @@ public class PdpdConfiguration { /** * Set property. - * + * * @param name name * @param value value */ @@ -255,7 +255,7 @@ public class PdpdConfiguration { @Override public int hashCode() { return new HashCodeBuilder() - .append(requestID) + .append(requestId) .append(entity) .append(controllers) .append(additionalProperties) @@ -272,7 +272,7 @@ public class PdpdConfiguration { } PdpdConfiguration rhs = (PdpdConfiguration) other; return new EqualsBuilder() - .append(requestID, rhs.requestID) + .append(requestId, rhs.requestId) .append(entity, rhs.entity) .append(controllers, rhs.controllers) .append(additionalProperties, rhs.additionalProperties) @@ -281,12 +281,12 @@ public class PdpdConfiguration { /** * Call set request id. - * + * * @param value value */ public void callSetRequestId(Object value) { if (value instanceof String) { - setRequestID((String) value); + setRequestId((String) value); } else { throw new IllegalArgumentException( "property \"requestID\" is of type \"java.lang.String\", but got " @@ -296,7 +296,7 @@ public class PdpdConfiguration { /** * Call set entity. - * + * * @param value value */ public void callSetEntity(Object value) { @@ -311,7 +311,7 @@ public class PdpdConfiguration { /** * Call set controllers. - * + * * @param value value */ @SuppressWarnings("unchecked") |