/* * ============LICENSE_START========================================== * ONAP Portal SDK * =================================================================== * Copyright © 2017 AT&T Intellectual Property. All rights reserved. * =================================================================== * * Unless otherwise specified, all software contained herein is licensed * under the Apache License, Version 2.0 (the "License"); * you may not use this software 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. * * Unless otherwise specified, all documentation contained herein is licensed * under the Creative Commons License, Attribution 4.0 Intl. (the "License"); * you may not use this documentation except in compliance with the License. * You may obtain a copy of the License at * * https://creativecommons.org/licenses/by/4.0/ * * Unless required by applicable law or agreed to in writing, documentation * 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.portalapp.music.service; import java.util.HashMap; import java.util.Map; import org.onap.music.datastore.PreparedQueryObject; import org.onap.music.eelf.logging.EELFLoggerDelegate; import org.onap.music.exceptions.MusicLockingException; import org.onap.music.exceptions.MusicServiceException; import org.onap.music.main.MusicCore; import org.onap.music.main.ReturnType; import org.onap.portalapp.music.conf.MusicSession; import org.onap.portalapp.music.model.RestResponse; import org.onap.portalapp.music.model.RestStatusEnum; import org.onap.portalapp.music.util.MusicProperties; import org.onap.portalapp.music.util.MusicUtil; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.session.Session; import org.springframework.web.client.RestTemplate; import com.datastax.driver.core.ResultSet; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class MusicService { static RestTemplate template = new RestTemplate(); private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicService.class); private static boolean isAtomicPut = MusicUtil.isAtomicPut(); private static boolean isAtomicGet = MusicUtil.isAtomicGet(); private static String musicKeySpace = MusicProperties.getProperty(MusicProperties.MUSIC_SESSION_KEYSPACE); private static String musicMetaTable = MusicProperties.getProperty(MusicProperties.MUSIC_SESSION_META_TABLES); private static String musicAttrTable = MusicProperties.getProperty(MusicProperties.MUSIC_SESSION_ATTR_TABLES); /** * Store session attribute name and values into Cassandra via Music * * @param attributeName * @param value * @param sessionId * @return ReturnType that includes required body information for Music api * @throws Exception */ public static ReturnType setAttribute(String attributeName, Object value, String sessionId) throws Exception { logger.debug(EELFLoggerDelegate.debugLogger, "setAttribute: start with id " + sessionId); String tableName = null; ReturnType result = null; boolean isMeta = MusicUtil.isSessionMetaAttr(attributeName); PreparedQueryObject queryObject = new PreparedQueryObject(); StringBuilder querySB = new StringBuilder(); querySB.append("INSERT INTO ").append(musicKeySpace).append(".").append(getTableName(isMeta)) .append(getInsertQuery(isMeta, attributeName)); queryObject.appendQueryString(querySB.toString()); if (isMeta) { queryObject.addValue(sessionId); queryObject.addValue(String.valueOf(value)); tableName = musicMetaTable; } else { queryObject.addValue(sessionId); queryObject.addValue(attributeName); queryObject.addValue(MusicUtil.musicSerialize(value)); tableName = musicAttrTable; } if (isAtomicPut) result = MusicCore.atomicPut(musicKeySpace, tableName, sessionId, queryObject, null); else result = MusicCore.eventualPut(queryObject); logger.debug(EELFLoggerDelegate.debugLogger, "setAttribute: attributeName: " + attributeName + " with session id: " + sessionId + "result:" + result.getMessage()); return result; } /** * Store session meta data values into Cassandra via Music * * @param session * @return ReturnType that includes required body information for Music api * @throws Exception */ public static ReturnType setMetaAttribute(Session session) throws Exception { logger.debug(EELFLoggerDelegate.debugLogger, "setMetaAttribute: start with session id: " + session.getId()); ReturnType result = null; PreparedQueryObject queryObject = new PreparedQueryObject(); StringBuilder querySB = new StringBuilder(); querySB.append("INSERT INTO ").append(musicKeySpace).append(".").append(musicMetaTable).append("(") .append(MusicProperties.PRIMARY_ID).append(",").append(MusicProperties.CREATION_TIME).append(",") .append(MusicProperties.LAST_ACCESS_TIME).append(",").append(MusicProperties.MAX_INACTIVE_INTERVAL) .append(",").append(MusicProperties.SESSION_ID).append(") VALUES (?,?,?,?,?);"); queryObject.appendQueryString(querySB.toString()); queryObject.addValue(session.getId()); queryObject.addValue(String.valueOf(session.getCreationTime())); queryObject.addValue(String.valueOf(session.getLastAccessedTime())); queryObject.addValue(String.valueOf(session.getMaxInactiveInterval())); queryObject.addValue(session.getId()); if (isAtomicPut) result = MusicCore.atomicPut(musicKeySpace, musicMetaTable, session.getId(), queryObject, null); else result = MusicCore.eventualPut(queryObject); logger.debug(EELFLoggerDelegate.debugLogger, "setMetaAttribute: with session id: " + session + "result:" + result.getMessage()); return result; } /** * Retrieve session meta data from Cassandra via Music * * @param sessionId * @return MusicSession * @throws Exception */ public static MusicSession getMetaAttribute(String sessionId) throws Exception { logger.debug(EELFLoggerDelegate.debugLogger, "getMetaAttribute: start with session Id: "+ sessionId); ResultSet result = null; PreparedQueryObject queryObject = new PreparedQueryObject(); StringBuilder querySB = new StringBuilder(); querySB.append("SELECT * FROM ").append(musicKeySpace).append(".").append(musicMetaTable).append(" WHERE ") .append(MusicProperties.PRIMARY_ID).append("=?;"); queryObject.appendQueryString(querySB.toString()); queryObject.addValue(sessionId); if (isAtomicGet) result = MusicCore.atomicGet(musicKeySpace, musicMetaTable, sessionId, queryObject); else result = MusicCore.get(queryObject); logger.debug(EELFLoggerDelegate.debugLogger, "getMetaAttribute: with session id: " + sessionId); return MusicUtil.parseMetaData(result.one()); } /** * Get proper column names (from meta or attribute table) base on isMeta * * @param isMeta * @param attributeName * @return String */ private static String getInsertQuery(boolean isMeta, String attributeName) { logger.debug(EELFLoggerDelegate.debugLogger, "getInsertQuery: start inserting : " + attributeName); StringBuilder querySB = new StringBuilder(); if (isMeta) { querySB.append(" (").append(MusicProperties.PRIMARY_ID).append(",").append(attributeName) .append(") VALUES (?,?);"); } else { querySB.append(" (").append(MusicProperties.PRIMARY_ID).append(",").append(MusicProperties.ATTRIBUTE_NAME) .append(",").append(MusicProperties.ATTRIBUTE_BYTES).append(") VALUES (?,?,?);"); } return querySB.toString(); } /** * Retrieve session attribute data from Cassandra via Music * * @param attributeName * @param sessionId * @return attribute value with T type * @throws Exception */ public static T getAttribute(String attributeName, String sessionId) throws Exception { logger.debug(EELFLoggerDelegate.debugLogger, "getAttribute: start with session id: " + sessionId); ResultSet result = null; String tableName = null; boolean isMeta = MusicUtil.isSessionMetaAttr(attributeName); PreparedQueryObject queryObject = new PreparedQueryObject(); StringBuilder querySB = new StringBuilder(); querySB.append("SELECT ").append(getColumn(attributeName, isMeta)).append(" FROM ").append(musicKeySpace) .append(".").append(getTableName(isMeta)).append(" WHERE ").append(MusicProperties.PRIMARY_ID) .append("= ?"); queryObject.addValue(sessionId); if (!isMeta) { querySB.append(" and ").append(MusicProperties.ATTRIBUTE_NAME).append("= ?"); queryObject.addValue(attributeName); tableName = musicAttrTable; } else tableName = musicMetaTable; queryObject.appendQueryString(querySB.toString()); if (isAtomicGet) result = MusicCore.atomicGet(musicKeySpace, tableName, sessionId, queryObject); else result = MusicCore.get(queryObject); return MusicUtil.musicRestResponseDataParsing(result, attributeName); } /** * Remove session attribute data from Cassandra via Music * * @param attributeName * @param sessionId * @return ReturnType * @throws MusicServiceException * @throws MusicLockingException */ public static ReturnType removeAttribute(String attributeName, String sessionId) throws MusicServiceException, MusicLockingException { logger.debug(EELFLoggerDelegate.debugLogger, "removeAttribute: start with session id: " + sessionId); boolean isMeta = MusicUtil.isSessionMetaAttr(attributeName); ReturnType result = null; String tableName = null; PreparedQueryObject queryObject = new PreparedQueryObject(); StringBuilder querySB = new StringBuilder(); querySB.append("DELETE ").append(getDelColumn(isMeta, attributeName)).append(" FROM ").append(musicKeySpace) .append(".").append(getTableName(isMeta)).append(" WHERE ").append(MusicProperties.PRIMARY_ID) .append("= ? "); queryObject.addValue(sessionId); if (!isMeta) { querySB.append(" and ").append(MusicProperties.ATTRIBUTE_NAME).append("= ?"); queryObject.addValue(attributeName); tableName = musicAttrTable; } else tableName = musicMetaTable; queryObject.appendQueryString(querySB.toString()); if (isAtomicPut) result = MusicCore.atomicPut(musicKeySpace, tableName, sessionId, queryObject, null); else result = MusicCore.eventualPut(queryObject); logger.debug(EELFLoggerDelegate.debugLogger, "removeSession: " + attributeName + " with session id: " + sessionId + "result:" + result.getMessage()); return result; } /** * Remove entire session from Cassandra via Music * * @param sessionId * @return ReturnType * @throws MusicServiceException * @throws MusicLockingException */ public static ReturnType removeSession(String sessionId) throws MusicServiceException, MusicLockingException { ReturnType result = null; boolean isAtomic = isAtomicPut; logger.debug(EELFLoggerDelegate.debugLogger, "removeSession: start with session id: " + sessionId); PreparedQueryObject queryObject = new PreparedQueryObject(); StringBuilder querySB = new StringBuilder(); querySB.append("DELETE ").append(" FROM ").append(musicKeySpace).append(".").append(musicMetaTable) .append(" WHERE ").append(MusicProperties.PRIMARY_ID).append("= ? "); queryObject.appendQueryString(querySB.toString()); queryObject.addValue(sessionId); if (isAtomic) result = MusicCore.atomicPut(musicKeySpace, musicMetaTable, sessionId, queryObject, null); else result = MusicCore.eventualPut(queryObject); logger.debug(EELFLoggerDelegate.debugLogger, "removeSession: " + musicMetaTable + " with session id: " + sessionId + "result:" + result.getMessage()); queryObject = new PreparedQueryObject(); querySB = new StringBuilder(); querySB.append("DELETE ").append(" FROM ").append(musicKeySpace).append(".").append(musicAttrTable) .append(" WHERE ").append(MusicProperties.PRIMARY_ID).append("= ? "); queryObject.appendQueryString(querySB.toString()); queryObject.addValue(sessionId); if (isAtomic) result = MusicCore.atomicPut(musicKeySpace, musicAttrTable, sessionId, queryObject, null); else result = MusicCore.eventualPut(queryObject); logger.debug(EELFLoggerDelegate.debugLogger, "removeSession: " + musicAttrTable + " with session id: " + sessionId + "result:" + result.getMessage()); return result; } /** * Get proper table name (Meta or Attribute) base on isMeta. * * @param isMeta * @return String */ private static String getTableName(boolean isMeta) { StringBuilder querySB = new StringBuilder(); if (isMeta) querySB.append(musicMetaTable); else querySB.append(musicAttrTable); return querySB.toString(); } /** * Get proper column name (Meta or Attribute) base on isMeta. * * @param attributeName * @param isMeta * @return String */ private static String getColumn(String attributeName, boolean isMeta) { StringBuilder querySB = new StringBuilder(); if (isMeta) querySB.append(attributeName); else querySB.append("attribute_bytes"); return querySB.toString(); } /** * Get proper column name (Meta or Attribute) base on isMeta for removing. * * @param attributeName * @param isMeta * @return String */ private static String getDelColumn(boolean isMeta, String attributeName) { StringBuilder querySB = new StringBuilder(); if (isMeta) querySB.append(attributeName); return querySB.toString(); } /** * To set session attributes in Music * * @param attributeName * @param value * @param session * @param sessionId * @param isMeta * @return RestResponse * @throws JsonProcessingException */ public static RestResponse setAttributeAPI(String attributeName, Object value, Session session, String sessionId, String className, boolean isMeta) throws JsonProcessingException { System.out.println("setAttribute: " + attributeName); RestResponse portalRestResponse = null; HttpEntity> entity = new HttpEntity>( getMusicRestBody(attributeName, value, sessionId, session, className, isMeta), getMusicHeader()); String url = getInsertUrl(isMeta); ResponseEntity response = null; try { response = template.exchange(url, HttpMethod.POST, entity, String.class); portalRestResponse = new RestResponse(RestStatusEnum.OK, "success", response.getBody()); } catch (Exception e) { portalRestResponse = new RestResponse(RestStatusEnum.ERROR, e.getMessage(), null); } return portalRestResponse; } /** * To get session attribute in Music * * @param attributeName * @param value * @param sessionId * @param isMeta * @return RestResponse */ public static RestResponse getAttributeAPI(String attributeName, Object value, String sessionId, boolean isMeta) { System.out.println("getAttribute: " + attributeName); RestResponse portalRestResponse = null; HttpEntity entity = new HttpEntity(null, getMusicHeader()); ResponseEntity response = null; String url = getSelectSessionIdUrl(attributeName, sessionId, isMeta); try { response = template.exchange(url, HttpMethod.GET, entity, String.class); portalRestResponse = new RestResponse(RestStatusEnum.OK, "success", response.getBody()); } catch (Exception e) { portalRestResponse = new RestResponse(RestStatusEnum.ERROR, e.getMessage(), null); } return portalRestResponse; } /** * To remove session attribute or session meta in Music * * @param attributeName * @param value * @param sessionId * @param isMeta * @return RestResponse */ public static RestResponse removeAttributeAPI(String attributeName, String sessionId, boolean isMeta) { RestResponse portalRestResponse = null; HttpEntity> entity = new HttpEntity<>(getMusicDelRestBody(null), getMusicHeader()); ResponseEntity response = null; String url = getSelectSessionIdUrl(attributeName, sessionId, true); try { response = template.exchange(url, HttpMethod.DELETE, entity, String.class); portalRestResponse = new RestResponse(RestStatusEnum.OK, "success", response.getBody()); url = getSelectSessionIdUrl(attributeName, sessionId, false); response = template.exchange(url, HttpMethod.DELETE, entity, String.class); portalRestResponse = new RestResponse(RestStatusEnum.OK, "success", response.getBody()); } catch (Exception e) { portalRestResponse = new RestResponse(RestStatusEnum.ERROR, e.getMessage(), null); } return portalRestResponse; } /** * Generate body for Music api calls * * @return String that includes required body information for Music api * calls * @throws JsonProcessingException */ public static Map getMusicRestBody(String attributeName, Object value, String sessionId, Session session, String className, boolean isMeta) throws JsonProcessingException { Map map = new HashMap<>(); /* Set up column values */ Map valueMap = new HashMap<>(); if (isMeta) { valueMap.put(MusicProperties.PRIMARY_ID, session.getId()); valueMap.put(MusicProperties.SESSION_ID, session.getId()); valueMap.put(MusicProperties.CREATION_TIME, session.getCreationTime().toString()); valueMap.put(MusicProperties.LAST_ACCESS_TIME, session.getLastAccessedTime().toString()); valueMap.put(MusicProperties.MAX_INACTIVE_INTERVAL, session.getMaxInactiveInterval().toString()); } else { ObjectMapper mapper = new ObjectMapper(); valueMap.put(MusicProperties.PRIMARY_ID, sessionId); valueMap.put(MusicProperties.ATTRIBUTE_NAME, attributeName); valueMap.put(MusicProperties.ATTRIBUTE_BYTES, mapper.writeValueAsString(value)); valueMap.put(MusicProperties.ATTRIBUTE_CLASS, className); } map.put("values", valueMap); /* Set up consistency setting */ Map consistencyInfoMap = new HashMap<>(); consistencyInfoMap.put(MusicProperties.getProperty(MusicProperties.MUSIC_CONSISTENCYINFO), MusicProperties.getProperty(MusicProperties.MUSIC_CONSISTENCYINFO_VALUE)); map.put("consistencyInfo", consistencyInfoMap); return map; } /** * Generate body for Music delete api calls * * @return String that includes required body information for Music api * calls * @throws JsonProcessingException */ public static Map getMusicDelRestBody(String attribute_name) { Map map = new HashMap<>(); Map consistencyInfoMap = new HashMap<>(); consistencyInfoMap.put(MusicProperties.getProperty(MusicProperties.MUSIC_CONSISTENCYINFO), MusicProperties.getProperty(MusicProperties.MUSIC_CONSISTENCYINFO_VALUE)); if (attribute_name != null && !attribute_name.equals("")) { Map conditionsMap = new HashMap<>(); conditionsMap.put("attribute_name", attribute_name); map.put("conditions", conditionsMap); } map.put("consistencyInfo", consistencyInfoMap); return map; } private static String getSelectSessionIdUrl(String attributeName, String sessionId, boolean isMeta) { String path = constructPath(isMeta); StringBuilder attriPath = new StringBuilder(); attriPath.append(path).append(MusicProperties.getProperty(MusicProperties.MUSIC_ROWS)).append("?") .append(MusicProperties.PRIMARY_ID).append("=").append(sessionId); return attriPath.toString(); } private static String getInsertUrl(boolean isMeta) { String path = constructPath(isMeta); StringBuilder attriPath = new StringBuilder(); attriPath.append(path); attriPath.append(MusicProperties.getProperty(MusicProperties.MUSIC_ROWS)); return attriPath.toString(); } /** * Generate header for Music api calls * * @return header that contains required header information for Music api * calls */ private static HttpHeaders getMusicHeader() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.add("X-minorVersion", MusicProperties.getProperty(MusicProperties.MUSIC_X_MINOR_VERSION)); headers.add("X-patchVersion", MusicProperties.getProperty(MusicProperties.MUSIC_X_PATCH_VERSION)); headers.add("ns", MusicProperties.getProperty(MusicProperties.MUSIC_NS)); headers.add("userId", MusicProperties.getProperty(MusicProperties.MUSIC_USER_ID)); headers.add("password", MusicProperties.getProperty(MusicProperties.MUSIC_PASSWORD)); return headers; } /** * Construct URL for Music api calls * * @return path */ private static String constructPath(boolean isMeta) { StringBuilder path = new StringBuilder(); path.append(MusicProperties.getProperty(MusicProperties.MUSIC_ENDPOINT)) .append(MusicProperties.getProperty(MusicProperties.MUSIC_VERSION)).append("/") .append(MusicProperties.getProperty(MusicProperties.MUSIC_KEYSPACE)).append("/").append(musicKeySpace) .append("/").append(MusicProperties.getProperty(MusicProperties.MUSIC_TABLES)).append("/"); if (isMeta) path.append(musicMetaTable); else path.append(musicAttrTable); path.append("/"); return path.toString(); } }