Updates to Callback Api and Connection 45/59545/1
authorThomas Nelson Jr <tn1381@att.com>
Wed, 8 Aug 2018 00:17:33 +0000 (00:17 +0000)
committerThomas Nelson Jr <tn1381@att.com>
Wed, 8 Aug 2018 00:17:33 +0000 (00:17 +0000)
Change-Id: I6a3f0537a616ae4d54b47fa2c70ba5128e39f123
Issue-ID: MUSIC-92
Signed-off-by: Thomas Nelson Jr <tn1381@att.com>
INFO.yaml
musictrigger/src/MusicTrigger.java
pom.xml
src/main/java/org/onap/music/datastore/MusicDataStore.java
src/main/java/org/onap/music/datastore/jsonobjects/JsonCallback.java [new file with mode: 0644]
src/main/java/org/onap/music/main/MusicUtil.java
src/main/java/org/onap/music/main/PropertiesListener.java
src/main/java/org/onap/music/rest/RestMusicAdminAPI.java
version.properties

index af41ab2..e69de29 100644 (file)
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -1,52 +0,0 @@
----
-project: 'music'
-project_creation_date: '2018-01-17'
-lifecycle_state: 'Incubation'
-project_lead: &onap_releng_ptl
-    name: 'Bharath Balasubramanian'
-    email: 'bharathb@research.att.com'
-    id: 'bharathb'
-    company: 'ATT'
-    timezone: 'America/New York'
-primary_contact: *onap_releng_ptl
-issue_tracking:
-    type: 'jira'
-    url: 'https://jira.onap.org/projects/MUSIC'
-    key: 'MUSIC'
-meetings:
-    - type: 'zoom'
-        agenda: 'https://wiki.onap.org/display/DW/MUSIC+Project'
-        url: 'https://wiki.onap.org/display/DW/MUSIC+Project'
-        server: 'n/a'
-        channel: 'n/a'
-        repeats: 'weekly'
-        time: '14:00 UTC'
-committers:
-    - <<: *onap_releng_ptl
-    - name: 'Thomas Nelson'
-        email: 'tn1381@att.com'
-        company: 'ATT'
-        id: 'arthurdent3'
-        timezone: 'America/New York'
-    - name: 'Brendan Tschaen'
-        email: 'bptschaen@gmail.com'
-        company: ''
-        id: 'bptschaen'
-        timezone: ''
-    - name: 'Greg Waines'
-        email: 'greg.waines@windriver.com'
-        company: 'Windriver'
-        id: 'gwaines'
-        timezone: ''
-    - name: 'Viswanath Kumar Skand Priya'
-        email: 'viswanath.kumarskandpriya@verizon.com'
-        company: 'Verizon'
-        id: 'kspviswa-vz'
-        timezone: ''
-    - name: 'Shashank Kumar Shankar'
-        email: 'shashank.kumar.shankar@intel.com'
-        company: 'Intel'
-        id: 'shashank.kumar....'
-        timezone: 'America/Portland'
-tsc:
-    approval: 'https://lists.onap.org/pipermail/onap-tsc'
index a27a6c4..b3a5429 100644 (file)
@@ -33,6 +33,7 @@ import org.apache.cassandra.db.Clustering;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.partitions.Partition;
 import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.Row;
 import org.apache.cassandra.db.rows.Unfiltered;
 import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.triggers.ITrigger;
@@ -47,14 +48,41 @@ public class MusicTrigger implements ITrigger {
 
        private static final Logger logger = LoggerFactory.getLogger(MusicTrigger.class);
 
+       
     public Collection<Mutation> augment(Partition partition)
     {
+       boolean isDelete = false;
+       logger.info("Step 1: "+partition.partitionLevelDeletion().isLive());
+       if(partition.partitionLevelDeletion().isLive()) {
+               
+       } else {
+            // Partition Level Deletion
+               isDelete = true;
+        }
+       logger.info("MusicTrigger isDelete: " + isDelete);
+       String ksName = partition.metadata().ksName;
         String tableName = partition.metadata().cfName;
         logger.info("MusicTrigger Table: " + tableName);
-
+        boolean isInsert = checkQueryType(partition);
         org.json.simple.JSONObject obj = new org.json.simple.JSONObject();
-        obj.put("message_id", partition.metadata().getKeyValidator().getString(partition.partitionKey().getKey()));
-
+        
+        
+        String operation = null;
+        if(isDelete)
+               operation = "delete";
+        else if(isInsert)
+               operation = "insert";
+        else
+               operation = "update";
+        
+        
+        obj.put("operation", operation);
+        obj.put("keyspace", ksName);
+        obj.put("table_name", tableName);
+        obj.put("full_table", ksName+"."+tableName);
+        obj.put("primary_key", partition.metadata().getKeyValidator().getString(partition.partitionKey().getKey()));
+        
+        //obj.put("message_id", partition.metadata().getKeyValidator().getString(partition.partitionKey().getKey()));
         try {
             UnfilteredRowIterator it = partition.unfilteredIterator();
             while (it.hasNext()) {
@@ -67,18 +95,38 @@ public class MusicTrigger implements ITrigger {
                     ColumnDefinition columnDef = columns.next();
                     Cell cell = cells.next();
                     String data = new String(cell.value().array()); // If cell type is text
+                    logger.info("Inside triggers loop: "+columnDef.toString()+" : "+data);
                     obj.put(columnDef.toString(), data);
                 }
             }
         } catch (Exception e) {
 
         }
-        logger.info("What is this? "+obj.toString());
-        
-        notifyMusic(obj.toString());
+        logger.info("Sending response: "+obj.toString());
+        try {
+            notifyMusic(obj.toString());
+        } catch(Exception e) {
+            e.printStackTrace();
+            logger.error("Notification failed..."+e.getMessage()s);
+        }
         return Collections.emptyList();
     }
+    
+    private boolean checkQueryType(Partition partition) { 
+        UnfilteredRowIterator it = partition.unfilteredIterator();
+        while (it.hasNext()) {
+            Unfiltered unfiltered = it.next();
+            Row row = (Row) unfiltered;
+            if (isInsert(row)) {
+                return true;
+            }
+        }
+        return false;
+    }
 
+    private boolean isInsert(Row row) {
+        return row.primaryKeyLivenessInfo().timestamp() != Long.MIN_VALUE;
+    }
        
        private void notifyMusic(String request) {
                System.out.println("notifyMusic...");
diff --git a/pom.xml b/pom.xml
index 7fc4c90..8ec039d 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
     <groupId>org.onap.music</groupId>
     <artifactId>MUSIC</artifactId>
     <packaging>war</packaging>
-    <version>3.0.3</version>
+    <version>3.0.5-SNAPSHOT</version>
     <description>
             This is the MUSIC REST interface, packaged as a war file.
     </description>
             <artifactId>jbcrypt</artifactId>
             <version>0.4</version>
         </dependency>
+        <dependency>
+                  <groupId>com.owlike</groupId>
+                  <artifactId>genson</artifactId>
+                  <version>0.99</version>
+        </dependency>
+
     </dependencies>
 
     <reporting>
index 563e07f..7557247 100644 (file)
@@ -42,8 +42,10 @@ import com.datastax.driver.core.ColumnDefinitions;
 import com.datastax.driver.core.ColumnDefinitions.Definition;
 import com.datastax.driver.core.ConsistencyLevel;
 import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.HostDistance;
 import com.datastax.driver.core.KeyspaceMetadata;
 import com.datastax.driver.core.Metadata;
+import com.datastax.driver.core.PoolingOptions;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
@@ -149,16 +151,35 @@ public class MusicDataStore {
      * clusters.
      */
     private void connectToCassaCluster() {
-        Iterator<String> it = getAllPossibleLocalIps().iterator();
+       Iterator<String> it = getAllPossibleLocalIps().iterator();
         String address = "localhost";
+        String[] addresses = null;
+        address = MusicUtil.getMyCassaHost();
+               addresses = address.split(",");
+               
         logger.info(EELFLoggerDelegate.applicationLogger,
                         "Connecting to cassa cluster: Iterating through possible ips:"
                                         + getAllPossibleLocalIps());
+        PoolingOptions poolingOptions = new PoolingOptions();
+        poolingOptions
+        .setConnectionsPerHost(HostDistance.LOCAL,  4, 10)
+        .setConnectionsPerHost(HostDistance.REMOTE, 2, 4);
         while (it.hasNext()) {
             try {
-                cluster = Cluster.builder().withPort(9042)
-                                .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
-                                .addContactPoint(address).build();
+               if(MusicUtil.getCassName() != null && MusicUtil.getCassPwd() != null) {
+                       logger.info(EELFLoggerDelegate.applicationLogger,
+                                       "Building with credentials "+MusicUtil.getCassName()+" & "+MusicUtil.getCassPwd());
+                       cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
+                                          .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
+                                          //.withLoadBalancingPolicy(new RoundRobinPolicy())
+                                          .withPoolingOptions(poolingOptions)
+                                          .addContactPoints(addresses).build();
+               }
+               else
+                       cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
+                                                               //.withLoadBalancingPolicy(new RoundRobinPolicy())
+                                                               .addContactPoints(addresses).build();
+                
                 Metadata metadata = cluster.getMetadata();
                 logger.info(EELFLoggerDelegate.applicationLogger, "Connected to cassa cluster "
                                 + metadata.getClusterName() + " at " + address);
@@ -185,9 +206,27 @@ public class MusicDataStore {
      * @param address
      */
     private void connectToCassaCluster(String address) throws MusicServiceException {
-        cluster = Cluster.builder().withPort(9042)
-                        .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
-                        .addContactPoint(address).build();
+       String[] addresses = null;
+               addresses = address.split(",");
+               PoolingOptions poolingOptions = new PoolingOptions();
+        poolingOptions
+        .setConnectionsPerHost(HostDistance.LOCAL,  4, 10)
+        .setConnectionsPerHost(HostDistance.REMOTE, 2, 4);
+        if(MusicUtil.getCassName() != null && MusicUtil.getCassPwd() != null) {
+               logger.info(EELFLoggerDelegate.applicationLogger,
+                               "Building with credentials "+MusicUtil.getCassName()+" & "+MusicUtil.getCassPwd());
+               cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
+                          .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
+                          //.withLoadBalancingPolicy(new RoundRobinPolicy())
+                          .withPoolingOptions(poolingOptions)
+                          .addContactPoints(addresses).build();
+        }
+        else {
+               cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
+                                       //.withLoadBalancingPolicy(new RoundRobinPolicy())
+                                       .withPoolingOptions(poolingOptions)
+                                       .addContactPoints(addresses).build();
+        }
         Metadata metadata = cluster.getMetadata();
         logger.info(EELFLoggerDelegate.applicationLogger, "Connected to cassa cluster "
                         + metadata.getClusterName() + " at " + address);
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonCallback.java b/src/main/java/org/onap/music/datastore/jsonobjects/JsonCallback.java
new file mode 100644 (file)
index 0000000..42b12f1
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ *  Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ *  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.music.datastore.jsonobjects;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "JsonCallback", description = "Json model for callback")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class JsonCallback implements Serializable {
+       private String applicationName;
+    private String applicationUsername;
+    private String applicationPassword;
+    private String applicationNotificationEndpoint;
+    private String notifyOn;
+    private String notifyWhenChangeIn;
+    private String notifyWhenInsertsIn;
+    private String notifyWhenDeletesIn;
+
+    @ApiModelProperty(value = "application name")
+    public String getApplicationName() {
+        return applicationName;
+    }
+
+    public void setApplicationName(String applicationName) {
+        this.applicationName = applicationName;
+    }
+    
+    @ApiModelProperty(value = "notify On")
+    public String getNotifyOn() {
+        return notifyOn;
+    }
+
+    public void setNotifyOn(String notifyOn) {
+        this.notifyOn = notifyOn;
+    }
+    
+    @ApiModelProperty(value = "application User name")
+    public String getApplicationUsername() {
+        return applicationUsername;
+    }
+
+    public void setApplicationUsername(String applicationUsername) {
+        this.applicationUsername = applicationUsername;
+    }
+
+    @ApiModelProperty(value = "application password")
+    public String getApplicationPassword() {
+        return applicationPassword;
+    }
+
+    public void setApplicationPassword(String applicationPassword) {
+        this.applicationPassword = applicationPassword;
+    }
+
+    @ApiModelProperty(value = "application notification endpoint")
+    public String getApplicationNotificationEndpoint() {
+        return applicationNotificationEndpoint;
+    }
+
+    public void setApplicationNotificationEndpoint(String applicationNotificationEndpoint) {
+        this.applicationNotificationEndpoint = applicationNotificationEndpoint;
+    }
+
+    @ApiModelProperty(value = "notify when updates")
+    public String getNotifyWhenChangeIn() {
+        return notifyWhenChangeIn;
+    }
+
+    public void setNotifyWhenChangeIn(String notifyWhenChangeIn) {
+        this.notifyWhenChangeIn = notifyWhenChangeIn;
+    }
+
+    @ApiModelProperty(value = "notify when inserts")
+    public String getNotifyWhenInsertsIn() {
+        return notifyWhenInsertsIn;
+    }
+
+    public void setNotifyWhenInsertsIn(String notifyWhenInsertsIn) {
+        this.notifyWhenInsertsIn = notifyWhenInsertsIn;
+    }
+
+    @ApiModelProperty(value = "notify when deletes")
+    public String getNotifyWhenDeletesIn() {
+        return notifyWhenDeletesIn;
+    }
+
+    public void setNotifyWhenDeletesIn(String notifyWhenDeletesIn) {
+        this.notifyWhenDeletesIn = notifyWhenDeletesIn;
+    }
+
+}
index a161fd5..2dd2f23 100755 (executable)
@@ -23,12 +23,15 @@ package org.onap.music.main;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Scanner;
 import java.util.StringTokenizer;
 import java.util.UUID;
@@ -69,7 +72,8 @@ public class MusicUtil {
     public static final String UPSERT = "upsert";
     public static final String USERID = "userId";
     public static final String PASSWORD = "password";
-    public static final String AUTHORIZATION = "Authorization";
+
+       public static final String AUTHORIZATION = "Authorization";
 
     private static final String LOCALHOST = "localhost";
     private static final String PROPERTIES_FILE = "/opt/app/music/etc/music.properties";
@@ -81,6 +85,8 @@ public class MusicUtil {
     private static String myZkHost = LOCALHOST;
     private static String myCassaHost = LOCALHOST;
     private static String defaultMusicIp = LOCALHOST;
+    private static int cassandraPort = 9042;
+    
     private static boolean debug = true;
     private static String version = "2.3.0";
     private static String musicRestIp = LOCALHOST;
@@ -88,7 +94,7 @@ public class MusicUtil {
     private static long defaultLockLeasePeriod = 6000;
     private static final String[] propKeys = new String[] { "zookeeper.host", "cassandra.host", "music.ip", "debug",
             "version", "music.rest.ip", "music.properties", "lock.lease.period", "id", "all.ids", "public.ip",
-            "all.pubic.ips", "cassandra.user", "cassandra.password", "aaf.endpoint.url" };
+            "all.pubic.ips", "cassandra.user", "cassandra.password", "aaf.endpoint.url","cassandra.port" };
 
     private static String cassName = "cassandra";
     private static String cassPwd;
@@ -98,8 +104,21 @@ public class MusicUtil {
     private MusicUtil() {
         throw new IllegalStateException("Utility Class");
     }
-    
-    
+    /**
+     * 
+     * @return cassandra port
+     */
+    public static int getCassandraPort() {
+               return cassandraPort;
+       }
+
+    /**
+     * set cassandra port
+     * @param cassandraPort
+     */
+       public static void setCassandraPort(int cassandraPort) {
+               MusicUtil.cassandraPort = cassandraPort;
+       }
     /**
      * @return the cassName
      */
@@ -562,5 +581,34 @@ public class MusicUtil {
        return authValues;
        
     }
+    
+    public static void loadProperties() throws Exception {
+               Properties prop = new Properties();
+           InputStream input = null;
+           try {
+               // load the properties file
+               input = MusicUtil.class.getClassLoader().getResourceAsStream("music.properties");
+               prop.load(input);
+           } catch (Exception ex) {
+               logger.error(EELFLoggerDelegate.errorLogger, "Unable to find properties file.");
+               throw new Exception();
+           } finally {
+               if (input != null) {
+                   try {
+                       input.close();
+                   } catch (IOException e) {
+                       e.printStackTrace();
+                   }
+               }
+           }
+           // get the property value and return it
+               MusicUtil.setMyCassaHost(prop.getProperty("cassandra.host"));
+               String zkHosts = prop.getProperty("zookeeper.host");
+               MusicUtil.setMyZkHost(zkHosts);
+               MusicUtil.setCassName(prop.getProperty("cassandra.user"));
+               MusicUtil.setCassPwd(prop.getProperty("cassandra.password"));
+               MusicUtil.setCassandraPort(Integer.parseInt(prop.getProperty("cassandra.port")));
+               
+       }
 
 }
index 8b00e47..0619cd4 100755 (executable)
@@ -119,6 +119,9 @@ public class PropertiesListener implements ServletContextListener {
                         case "aaf.endpoint.url":
                             MusicUtil.setAafEndpointUrl(prop.getProperty(key));
                             break;
+                        case "cassandra.port":
+                            MusicUtil.setCassandraPort(Integer.parseInt(prop.getProperty(key)));
+                            break;
                         default:
                             logger.error(EELFLoggerDelegate.errorLogger,
                                             "No case found for " + key);
index d1e8233..71570b6 100755 (executable)
@@ -29,10 +29,12 @@ import java.util.Map;
 import java.util.UUID;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
@@ -41,20 +43,32 @@ import javax.ws.rs.core.Response.Status;
 import org.mindrot.jbcrypt.BCrypt;
 import org.onap.music.datastore.PreparedQueryObject;
 import org.onap.music.datastore.jsonobjects.JSONObject;
+import org.onap.music.datastore.jsonobjects.JsonCallback;
 import org.onap.music.datastore.jsonobjects.JsonOnboard;
 import org.onap.music.eelf.logging.EELFLoggerDelegate;
 import org.onap.music.eelf.logging.format.AppMessages;
 import org.onap.music.eelf.logging.format.ErrorSeverity;
 import org.onap.music.eelf.logging.format.ErrorTypes;
+//import org.onap.music.main.CacheAccess;
 import org.onap.music.main.CachingUtil;
 import org.onap.music.main.MusicCore;
 import org.onap.music.main.MusicUtil;
 import org.onap.music.main.ResultType;
+import org.onap.music.response.jsonobjects.JsonResponse;
+
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
+import com.datastax.driver.core.exceptions.InvalidQueryException;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.core.util.Base64;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.jcs.JCS;
+import org.apache.commons.jcs.access.CacheAccess;
 
 @Path("/v2/admin")
 // @Path("/v{version: [0-9]+}/admin")
@@ -63,7 +77,6 @@ import io.swagger.annotations.ApiOperation;
 public class RestMusicAdminAPI {
     private static EELFLoggerDelegate logger =
                     EELFLoggerDelegate.getLogger(RestMusicAdminAPI.class);
-
     /*
      * API to onboard an application with MUSIC. This is the mandatory first step.
      * 
@@ -370,14 +383,105 @@ public class RestMusicAdminAPI {
 
         return Response.status(Status.OK).entity(resultMap).build();
     }
+
+    Client client = Client.create();
     
     @POST
     @Path("/callbackOps")
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
-    public String callbackOps(JSONObject inputJsonObj) throws Exception {
-       
-       System.out.println("Input JSON: "+inputJsonObj.getData());
-       return "Success";
+       public String callbackOps(JSONObject inputJsonObj) {
+         // trigger response  {"full_table":"admin.race_winners","keyspace":"admin","name":"Siri","operation":"update","table_name":"race_winner","primary_key":"1"}
+        try {
+               logger.info("Got notification: " + inputJsonObj.getData());
+               String dataStr = inputJsonObj.getData();
+               String[] dataStrArr = dataStr.substring(1, dataStr.length() - 1).split(",");
+
+               for (String key : dataStrArr) {
+                       if (key.contains("full_table")) {
+                               String tableName = key.split(":")[1].substring(1, key.split(":")[1].length() - 1);
+                               PreparedQueryObject pQuery = new PreparedQueryObject();
+                       pQuery.appendQueryString(
+                                       "select endpoint, username, password from admin.callback_api where changes = ? allow filtering");
+                       pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), tableName));
+                       ResultSet rs = MusicCore.get(pQuery);
+                       Row row = rs.all().get(0);
+                       if(row != null) {
+                           String endpoint = row.getString("endpoint");
+                           String username = row.getString("username");
+                           String password = row.getString("password");
+                           logger.info("Notifying the changes to endpoint: "+endpoint);
+                           WebResource webResource = client.resource(endpoint);
+                           String authData = username+":"+password;
+                           byte[] plainCredsBytes = authData.getBytes();
+                           byte[] base64CredsBytes = Base64.encode(plainCredsBytes);
+                           String base64Creds = new String(base64CredsBytes);
+                           ClientResponse response = webResource.header("Authorization", "Basic " + base64Creds).accept("application/json")
+                               .post(ClientResponse.class, inputJsonObj);
+                           if(response.getStatus() != 200){
+                               logger.error("Exception while notifying");
+                           }
+                       }
+                       break;
+                       }
+               }
+        } catch(Exception e) {
+            e.printStackTrace();
+            logger.info("Exception...");
+        }
+               return "Success";
+       }
+
+    @POST
+    @Path("/addCallback")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response addCallback(JsonCallback jsonCallback) throws Exception {
+        Map<String, Object> resultMap = new HashMap<>();
+        ResponseBuilder response =
+                        Response.noContent().header("X-latestVersion", MusicUtil.getVersion());
+        String username = jsonCallback.getApplicationUsername();
+        String password = jsonCallback.getApplicationPassword();
+        String endpoint = jsonCallback.getApplicationNotificationEndpoint();
+        String changes = jsonCallback.getNotifyWhenChangeIn();
+        String inserts = jsonCallback.getNotifyWhenInsertsIn();
+        String deletes = jsonCallback.getNotifyWhenDeletesIn();
+        PreparedQueryObject pQuery = new PreparedQueryObject();
+        if (username == null || password == null || endpoint == null || changes == null || inserts == null || deletes == null) {
+            logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGINFO,
+                            ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+            resultMap.put("Exception",
+                            "Please check the request parameters. Some of the required values are missing.");
+            return Response.status(Status.BAD_REQUEST).entity(resultMap).build();
+        }
+        String uuid = CachingUtil.generateUUID();
+        try {
+        pQuery.appendQueryString(
+                        "INSERT INTO admin.callback_api (uuid, username, password, endpoint, "
+                                        + "changes, inserts, deletes) VALUES (?,?,?,?,?,?,?)");
+        pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
+        pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), username));
+        pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), password));
+        pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), endpoint));
+        pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), changes));
+        pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), inserts));
+        pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), deletes));
+        MusicCore.eventualPut(pQuery);
+        
+        Map<String, String> jsonMap = new HashMap<>();
+        jsonMap.put("username", username);
+        jsonMap.put("password", password);
+        jsonMap.put("endpoint", endpoint);
+        jsonMap.put("changes", changes);
+        jsonMap.put("inserts", inserts);
+        jsonMap.put("deletes", deletes);
+        
+        //callBackCache.put(jsonCallback.getApplicationName(), jsonMap);
+        } catch (InvalidQueryException e) {
+            logger.error(EELFLoggerDelegate.errorLogger,"Exception callback_api table not configured."+e.getMessage());
+            resultMap.put("Exception", "Please make sure admin.callback_api table is configured.");
+            return Response.status(Status.BAD_REQUEST).entity(resultMap).build();
+        }
+       return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("Callback api successfully registered").toMap()).build();
     }
 }
index 0a767e5..023460f 100644 (file)
@@ -4,7 +4,7 @@
 
 major=3
 minor=0
-patch=3
+patch=5
 
 base_version=${major}.${minor}.${patch}