X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fdmaap%2Fdbcapi%2Fmodel%2FTopic.java;h=b715a248733a09d50be5b2a9a912dd9d8a0bd0f8;hb=6e1a53af3af64578619763238649ed7b76865241;hp=7c957dc7cdd1a3c29f3dcfffa29ee2d338b3994a;hpb=0ab116b376402b076b2b8558dedc8e6f88d1a2d5;p=dmaap%2Fdbcapi.git diff --git a/src/main/java/org/onap/dmaap/dbcapi/model/Topic.java b/src/main/java/org/onap/dmaap/dbcapi/model/Topic.java index 7c957dc..b715a24 100644 --- a/src/main/java/org/onap/dmaap/dbcapi/model/Topic.java +++ b/src/main/java/org/onap/dmaap/dbcapi/model/Topic.java @@ -20,38 +20,65 @@ package org.onap.dmaap.dbcapi.model; +import com.google.common.base.Objects; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; - +import org.json.simple.*; +import org.json.simple.parser.*; import javax.xml.bind.annotation.XmlRootElement; import org.onap.dmaap.dbcapi.util.DmaapConfig; +import io.swagger.annotations.ApiModelProperty; + import org.onap.dmaap.dbcapi.service.DmaapService; +import org.onap.dmaap.dbcapi.service.TopicService; @XmlRootElement public class Topic extends DmaapObject { + @ApiModelProperty( value="Fully Qualified Topic Name constructed by dbcapi, following the rules for `fqtnStyle`") private String fqtn; + @ApiModelProperty( value="the short name used by humans, and utilized to construct the `FQTN`") private String topicName; + @ApiModelProperty( value="a description of what this Topic is used for") private String topicDescription; private String tnxEnabled; + @ApiModelProperty( value="a label used to identify who requested this `Topic` to be provisioned. In the future this " + + "may be an AAF Identity.") private String owner; + @ApiModelProperty( value="a reference to an identifier that describes a data format used for this `Topic`") private String formatUuid; + @ApiModelProperty( value="An indicator for how this `Topic` should be replicated when there are more than one `MR_Cluster` instances") private ReplicationType replicationCase; + @ApiModelProperty( value="the URL of an outside MR instance") private String globalMrURL; // optional: URL of global MR to replicate to/from + @ApiModelProperty( value="the construction rule for the `fqtn` field") private FqtnType fqtnStyle; + @ApiModelProperty( value="a hook for any versioning needed for managing a `Topic` over time") private String version; - + @ApiModelProperty( value="the kafka attribute for specifying the number of partitions") + private String partitionCount; + @ApiModelProperty( value="the kafka attribute for specifying replication within an `MR_Cluster` instance") + private String replicationCount; + @ApiModelProperty( value="a value generated by dbcapi, this AAF Role has permission to publish to this `Topic`") + private String publisherRole; + @ApiModelProperty( value="a value generated by dbcapi, this AAF Role has permission to subscribe to this `Topic`") + private String subscriberRole; + + @ApiModelProperty( value="an array of `MR_Client` objects associated to this `Topic`") private ArrayList clients; private static Dmaap dmaap = new DmaapService().getDmaap(); - + + private static String defaultPartitionCount; + private static String defaultReplicationCount; + // during unit testing, discovered that presence of dots in some values // creates an unplanned topic namespace as we compose the FQTN. // this may create sensitivity (i.e. 403) for subsequent creation of AAF perms, so best to not allow it @@ -102,7 +129,7 @@ public class Topic extends DmaapObject { public Topic() { super(); - this.clients = new ArrayList(); + this.clients = new ArrayList<>(); this.lastMod = new Date(); this.replicationCase = ReplicationType.Validator("none"); this.setLastMod(); @@ -114,14 +141,48 @@ public class Topic extends DmaapObject { this.fqtn = fqtn; this.topicName = topicName; this.topicDescription = topicDescription; - //this.dcaeLocationName = dcaeLocationName; this.tnxEnabled = tnxEnabled; this.owner = owner; + this.init(); this.setLastMod(); + logger.debug( "Topic constructor w args " + this.getLastMod() ); + } + + public Topic init() { + DmaapConfig p = (DmaapConfig)DmaapConfig.getConfig(); + + defaultPartitionCount = p.getProperty( "MR.partitionCount", "2"); + defaultReplicationCount = p.getProperty( "MR.replicationCount", "1"); + this.setStatus( DmaapObject_Status.NEW ); this.replicationCase = ReplicationType.Validator("none"); this.fqtnStyle = FqtnType.Validator("none"); - logger.debug( "Topic constructor " + this.getLastMod() ); + this.setPartitionCount( defaultPartitionCount ); + this.setReplicationCount( defaultReplicationCount ); + + return this; + } + + // expects a String in JSON format, with known fields to populate Topic object + public Topic ( String json ) { + JSONParser parser = new JSONParser(); + JSONObject jsonObj; + try { + jsonObj = (JSONObject) parser.parse( json ); + } catch ( ParseException pe ) { + logger.error( "Error parsing provisioning data: " + json ); + this.setStatus( DmaapObject_Status.INVALID ); + return; + } + this.setFqtn( (String) jsonObj.get( "fqtn" ) ); + this.setTopicName( (String) jsonObj.get( "topicName" ) ); + this.setTopicDescription( (String) jsonObj.get( "topicDescription" )); + this.setOwner( (String) jsonObj.get( "owner" ) ); + this.setStatus( (String) jsonObj.get( "status" ) ); + this.setReplicationCase( ReplicationType.Validator( (String) jsonObj.get( "replicationCase" ) )); + this.setFqtnStyle( FqtnType.Validator( (String) jsonObj.get( "fqtnStyle" ) ) ); + this.setPartitionCount( (String) jsonObj.get("partitionCount")); + } public String getFqtn() { return fqtn; @@ -154,6 +215,18 @@ public class Topic extends DmaapObject { public void setOwner(String owner) { this.owner = owner; } + public String getPartitionCount() { + return partitionCount; + } + public void setPartitionCount(String partitions) { + this.partitionCount = partitions; + } + public String getReplicationCount() { + return replicationCount; + } + public void setReplicationCount(String replicationCount) { + this.replicationCount = replicationCount; + } public void setClients(ArrayList clients) { @@ -164,6 +237,7 @@ public class Topic extends DmaapObject { return clients; } + @ApiModelProperty( hidden=true ) public int getNumClients() { if ( this.clients == null ) { return 0; @@ -189,13 +263,6 @@ public class Topic extends DmaapObject { return replicationCase; } - - - /* - public void setReplicationCase(String val) { - this.replicationCase = ReplicationType.Validator(val); - } - */ public void setReplicationCase(ReplicationType t) { this.replicationCase = t; @@ -233,18 +300,56 @@ public class Topic extends DmaapObject { + public String getPublisherRole() { + return publisherRole; + } + public void setPublisherRole(String publisherRole) { + this.publisherRole = publisherRole; + } + public String getSubscriberRole() { + return subscriberRole; + } + public void setSubscriberRole(String subscriberRole) { + this.subscriberRole = subscriberRole; + } public String toProvJSON() { StringBuilder str = new StringBuilder(); str.append("{ \"topicName\": \""); str.append( this.getFqtn() ); str.append( "\", \"topicDescription\": \""); str.append( this.getTopicDescription()); - str.append( "\", \"partitionCount\": \"2\", \"replicationCount\": \"1\" } "); + str.append( "\", \"partitionCount\": \""); + str.append( this.getPartitionCount()); + str.append( "\", \"replicationCount\": \""); + str.append( this.getReplicationCount()); + str.append( "\" } "); + logger.info( str.toString() ); return str.toString(); } - + @ApiModelProperty( hidden=true ) public byte[] getBytes() { return toProvJSON().getBytes(StandardCharsets.UTF_8); } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Topic topic = (Topic) o; + return Objects.equal(fqtn, topic.fqtn) && + Objects.equal(topicName, topic.topicName) && + Objects.equal(tnxEnabled, topic.tnxEnabled) && + Objects.equal(owner, topic.owner); + } + + @Override + public int hashCode() { + return Objects.hashCode(fqtn, topicName, tnxEnabled, owner); + } }