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 org.onap.dmaap.dbcapi.service.DmaapService;
private String formatUuid;
private ReplicationType replicationCase;
private String globalMrURL; // optional: URL of global MR to replicate to/from
+ private FqtnType fqtnStyle;
+ private String version;
private ArrayList<MR_Client> clients;
private static Dmaap dmaap = new DmaapService().getDmaap();
-
+
+ // 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
+ private static String removeDots( String source, String def ) {
+ if ( source == null || source.isEmpty()) {
+ return def;
+ }
+ return source.replaceAll("\\.", "_");
+ }
//
// utility function to generate the FQTN of a topic
- public static String genFqtn( String name ) {
+ public String genFqtn( ) {
+ DmaapConfig dc = (DmaapConfig)DmaapConfig.getConfig();
+ String projectId = dc.getProperty("MR.projectID", "99999");
CharSequence signal = ".";
String ret;
- if ( name.contains( signal )) {
+ if ( this.getTopicName().contains( signal )) {
// presence of a dot indicates the name is already fully qualified
- ret = name;
+ ret = this.getTopicName();
} else {
- ret = dmaap.getTopicNsRoot() + "." + dmaap.getDmaapName() + "." + name;
+ // these vars may not contain dots
+ String p = removeDots( projectId, "90909");
+ String v = removeDots( this.getVersion(), "v1");
+ switch( this.getFqtnStyle() ) {
+ case FQTN_PROJECTID_VERSION_FORMAT:
+
+ ret = dmaap.getTopicNsRoot() + "." + dmaap.getDmaapName() + "." + p + "-" + this.getTopicName() + "-" + v;
+ break;
+
+ case FQTN_PROJECTID_FORMAT:
+
+ ret = dmaap.getTopicNsRoot() + "." + dmaap.getDmaapName() + "." + p + "-" + this.getTopicName();
+ break;
+
+ case FQTN_LEGACY_FORMAT:
+ default: // for backwards compatibility
+ ret = dmaap.getTopicNsRoot() + "." + dmaap.getDmaapName() + "." + this.getTopicName();
+ break;
+
+
+ }
+
}
return ret;
}
this.setLastMod();
this.setStatus( DmaapObject_Status.NEW );
this.replicationCase = ReplicationType.Validator("none");
+ this.fqtnStyle = FqtnType.Validator("none");
logger.debug( "Topic constructor " + this.getLastMod() );
}
+
+ // 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.setLastMod();
+ this.setStatus( (String) jsonObj.get( "status" ) );
+ this.setReplicationCase( ReplicationType.Validator( (String) jsonObj.get( "replicationCase" ) ));
+ this.setFqtnStyle( FqtnType.Validator( (String) jsonObj.get( "fqtnStyle" ) ) );
+
+ }
public String getFqtn() {
return fqtn;
}
public void setReplicationCase(ReplicationType t) {
this.replicationCase = t;
}
+ public FqtnType getFqtnStyle() {
+ return fqtnStyle;
+ }
+
+ public void setFqtnStyle(FqtnType t) {
+ this.fqtnStyle = t;
+ }
public String getGlobalMrURL() {
return globalMrURL;
+ public String getVersion() {
+ return version;
+ }
+
+
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+
+
public String toProvJSON() {
StringBuilder str = new StringBuilder();
str.append("{ \"topicName\": \"");