diff options
-rw-r--r-- | INFO.yaml | 52 | ||||
-rw-r--r-- | musictrigger/src/MusicTrigger.java | 60 | ||||
-rwxr-xr-x | pom.xml | 8 | ||||
-rw-r--r-- | src/main/java/org/onap/music/datastore/MusicDataStore.java | 53 | ||||
-rw-r--r-- | src/main/java/org/onap/music/datastore/jsonobjects/JsonCallback.java | 115 | ||||
-rwxr-xr-x | src/main/java/org/onap/music/main/MusicUtil.java | 56 | ||||
-rwxr-xr-x | src/main/java/org/onap/music/main/PropertiesListener.java | 3 | ||||
-rwxr-xr-x | src/main/java/org/onap/music/rest/RestMusicAdminAPI.java | 114 | ||||
-rw-r--r-- | version.properties | 2 |
9 files changed, 387 insertions, 76 deletions
@@ -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' diff --git a/musictrigger/src/MusicTrigger.java b/musictrigger/src/MusicTrigger.java index a27a6c40..b3a54293 100644 --- a/musictrigger/src/MusicTrigger.java +++ b/musictrigger/src/MusicTrigger.java @@ -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..."); @@ -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> @@ -338,6 +338,12 @@ <artifactId>jbcrypt</artifactId> <version>0.4</version> </dependency> + <dependency> + <groupId>com.owlike</groupId> + <artifactId>genson</artifactId> + <version>0.99</version> + </dependency> + </dependencies> <reporting> diff --git a/src/main/java/org/onap/music/datastore/MusicDataStore.java b/src/main/java/org/onap/music/datastore/MusicDataStore.java index 563e07f5..7557247d 100644 --- a/src/main/java/org/onap/music/datastore/MusicDataStore.java +++ b/src/main/java/org/onap/music/datastore/MusicDataStore.java @@ -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 index 00000000..42b12f10 --- /dev/null +++ b/src/main/java/org/onap/music/datastore/jsonobjects/JsonCallback.java @@ -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; + } + +} diff --git a/src/main/java/org/onap/music/main/MusicUtil.java b/src/main/java/org/onap/music/main/MusicUtil.java index a161fd56..2dd2f231 100755 --- a/src/main/java/org/onap/music/main/MusicUtil.java +++ b/src/main/java/org/onap/music/main/MusicUtil.java @@ -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"))); + + } } diff --git a/src/main/java/org/onap/music/main/PropertiesListener.java b/src/main/java/org/onap/music/main/PropertiesListener.java index 8b00e473..0619cd41 100755 --- a/src/main/java/org/onap/music/main/PropertiesListener.java +++ b/src/main/java/org/onap/music/main/PropertiesListener.java @@ -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); diff --git a/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java b/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java index d1e82337..71570b6c 100755 --- a/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java +++ b/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java @@ -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(); } } diff --git a/version.properties b/version.properties index 0a767e5b..023460f3 100644 --- a/version.properties +++ b/version.properties @@ -4,7 +4,7 @@ major=3 minor=0 -patch=3 +patch=5 base_version=${major}.${minor}.${patch} |