diff options
Diffstat (limited to 'ecomp-sdk/epsdk-music')
7 files changed, 300 insertions, 5 deletions
diff --git a/ecomp-sdk/epsdk-music/pom.xml b/ecomp-sdk/epsdk-music/pom.xml index d1b6ef27..44970e13 100644 --- a/ecomp-sdk/epsdk-music/pom.xml +++ b/ecomp-sdk/epsdk-music/pom.xml @@ -5,12 +5,12 @@ <parent> <groupId>org.onap.portal.sdk</groupId> <artifactId>epsdk-project</artifactId> - <version>2.2.0-SNAPSHOT</version> + <version>2.4.0-SNAPSHOT</version> </parent> - + <groupId>org.onap.portal.sdk</groupId> <artifactId>epsdk-music</artifactId> - <version>2.2.0-SNAPSHOT</version> + <version>2.4.0-SNAPSHOT</version> <packaging>jar</packaging> <name>ONAP Portal SDK Music</name> @@ -114,13 +114,20 @@ </exclusions> </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.0.1</version> + <scope>provided</scope> + </dependency> + <!-- Music --> <dependency> <groupId>org.onap.music</groupId> <artifactId>MUSIC</artifactId> <version>2.5.3</version> - </dependency> - + </dependency> + <!-- Mapper --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> diff --git a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/conf/MusicSessionRepositoryHandler.java b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/conf/MusicSessionRepositoryHandler.java index ad90d4ec..7d2e51ff 100644 --- a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/conf/MusicSessionRepositoryHandler.java +++ b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/conf/MusicSessionRepositoryHandler.java @@ -85,6 +85,7 @@ public class MusicSessionRepositoryHandler { sessions.put(id, musicSession); try { MusicService.setMetaAttribute(musicSession); + MusicService.cleanUpMusic(); } catch (Exception e) { logger.error(EELFLoggerDelegate.errorLogger, "setMetaAttribute failed with id " + id, e); } diff --git a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/filter/MusicSessionRepositoryFilter.java b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/filter/MusicSessionRepositoryFilter.java new file mode 100644 index 00000000..aa9e2e3e --- /dev/null +++ b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/filter/MusicSessionRepositoryFilter.java @@ -0,0 +1,70 @@ +/* + * ============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.filter; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.onap.music.eelf.logging.EELFLoggerDelegate; +import org.onap.portalapp.music.util.MusicUtil; +import org.springframework.web.filter.DelegatingFilterProxy; + +public class MusicSessionRepositoryFilter extends DelegatingFilterProxy{ + private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicUtil.class); + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + try{ + if (request instanceof HttpServletRequest) { + String path = ((HttpServletRequest)request).getRequestURI().substring(((HttpServletRequest) request).getContextPath().length()); + if(MusicUtil.isExcludedApi(path)) + request.setAttribute("org.springframework.session.web.http.SessionRepositoryFilter.FILTERED", Boolean.TRUE); + } + }catch(Exception e){ + logger.error(EELFLoggerDelegate.errorLogger, "Failed to check the exclude apis ", e); + } + super.doFilter(request, response, filterChain); + } +} diff --git a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/service/MusicService.java b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/service/MusicService.java index 4ceac22c..801e9c03 100644 --- a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/service/MusicService.java +++ b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/service/MusicService.java @@ -38,7 +38,12 @@ package org.onap.portalapp.music.service; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.onap.music.datastore.PreparedQueryObject; @@ -61,6 +66,7 @@ import org.springframework.session.Session; import org.springframework.web.client.RestTemplate; import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.Row; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -539,5 +545,108 @@ public class MusicService { path.append("/"); return path.toString(); } + + /** + * Get a list of sessions that need to be cleaned up + * + * @return List<String> + */ + private static List<String> getSessionToBeDeleted(){ + logger.debug(EELFLoggerDelegate.debugLogger, "initial getSessionToBeDeleted ..."); + + PreparedQueryObject queryObject = new PreparedQueryObject(); + ResultSet result = null; + List<String> sessionIDList = new ArrayList<>(); + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + StringBuilder querySB = new StringBuilder(); + String cleanUpThreshold = MusicProperties.getProperty(MusicProperties.MUSIC_CLEAN_UP_THRESHOLD); //Clean up sessions that's cleanUpThreshold hours ago + Date dateForCleanup = new Date(System.currentTimeMillis() - 3600 * 1000 * Integer.valueOf(cleanUpThreshold)); // Get the threshold date that needs to be clean up + String dateForCleanupCondition = dateFormat.format(dateForCleanup); + querySB.append("SELECT ").append(MusicProperties.PRIMARY_ID).append(" FROM ").append(musicKeySpace) + .append(".").append(getTableName(true)).append(" WHERE ").append(MusicProperties.LAST_ACCESS_TIME) + .append("< ? ").append(" ALLOW FILTERING"); + queryObject.appendQueryString(querySB.toString()); + queryObject.addValue(dateForCleanupCondition); + + try{ + if (isAtomicGet) + result = MusicCore.atomicGet(musicKeySpace, musicMetaTable, null, queryObject); + else + result = MusicCore.get(queryObject); + Row row = result.one(); + while(row!=null){ + sessionIDList.add(row.get(MusicProperties.PRIMARY_ID, String.class)); + row = result.one(); + } + }catch(Exception e){ + logger.error(EELFLoggerDelegate.errorLogger, "Error while cleaning up music tables" , e); + } + return sessionIDList; + } + + /** + * Remove session data in music base on the defined frequency + * + * @return List<String> + */ + public static void cleanUpMusic() { + boolean timeToCleanUp = MusicUtil.cleanUp(); // Decide whether to clean up or not + ReturnType result = null; + if(timeToCleanUp){ + /**Getting a list of sessions that need to be cleaned up*/ + List<String> sessionIDList = getSessionToBeDeleted(); + if(sessionIDList!=null || sessionIDList.size()!=0){ + StringBuilder sessionIDListCondition = new StringBuilder(); + sessionIDListCondition.append("('"); + for(String s : sessionIDList){ + sessionIDListCondition.append(s); + sessionIDListCondition.append("','"); + } + sessionIDListCondition.deleteCharAt(sessionIDListCondition.length()-1); + sessionIDListCondition.deleteCharAt(sessionIDListCondition.length()-1); + sessionIDListCondition.append(")"); + StringBuilder querySB = new StringBuilder(); + PreparedQueryObject queryObject = new PreparedQueryObject(); + /**Deleting attributes table**/ + querySB = new StringBuilder(); + queryObject = new PreparedQueryObject(); + querySB.append("DELETE FROM ").append(musicKeySpace) + .append(".").append(getTableName(false)).append(" WHERE ").append(MusicProperties.PRIMARY_ID) + .append(" in ").append(sessionIDListCondition); + queryObject.appendQueryString(querySB.toString()); + try{ + if (isAtomicPut) + result = MusicCore.atomicPut(musicKeySpace, null, null, queryObject, null); + else + result = MusicCore.eventualPut(queryObject); + }catch(Exception e){ + logger.error(EELFLoggerDelegate.errorLogger, "Error while cleaning up music attributes tables" , e); + } + logger.debug(EELFLoggerDelegate.debugLogger, "Music sessions have been cleaned up !"); + + /**Deleting meta table**/ + logger.debug(EELFLoggerDelegate.debugLogger, "Cleaning up meta table ..."); + querySB = new StringBuilder(); + queryObject = new PreparedQueryObject(); + querySB.append("DELETE FROM ").append(musicKeySpace) + .append(".").append(getTableName(true)).append(" WHERE ").append(MusicProperties.PRIMARY_ID) + .append(" in ").append(sessionIDListCondition); + queryObject.appendQueryString(querySB.toString()); + try{ + if (isAtomicPut) + result = MusicCore.atomicPut(musicKeySpace, null, null, queryObject, null); + else + result = MusicCore.eventualPut(queryObject); + }catch(Exception e){ + logger.error(EELFLoggerDelegate.errorLogger, "Error while cleaning up music meta tables" , e); + } + + logger.debug(EELFLoggerDelegate.debugLogger, "Cleaned up attributes table ... "); + }else{ + logger.debug(EELFLoggerDelegate.debugLogger, "No Session needs to be cleaned up"); + } + + } + } } diff --git a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicCleanUp.java b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicCleanUp.java new file mode 100644 index 00000000..aab04eaf --- /dev/null +++ b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicCleanUp.java @@ -0,0 +1,62 @@ +/* + * ============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.util; + +import java.util.Date; + +public class MusicCleanUp { + private static volatile MusicCleanUp musicCleanUp = new MusicCleanUp(); + // private constructor restricted to this class itself + private MusicCleanUp(){ + } + + private Date lastCleanUpTime = new Date(); + + public static MusicCleanUp getInstance(){ + return musicCleanUp; + } + + public Date getLastCleanUpTime(){ + return lastCleanUpTime; + } + + public synchronized void updateLastCleanUpTimeToCurrent() { + lastCleanUpTime = new Date(); + } +} diff --git a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicProperties.java b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicProperties.java index bdc9c543..802634b6 100644 --- a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicProperties.java +++ b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicProperties.java @@ -93,6 +93,12 @@ public class MusicProperties { public static final String MUSIC_ATOMIC_POST = "music.atomic.post"; + public static final String MUSIC_EXCLUDE_API = "music.exclude.api"; + + public static final String MUSIC_CLEAN_UP_FREQUENCY = "music.cleanup.frequency"; + + public static final String MUSIC_CLEAN_UP_THRESHOLD = "music.cleanup.threshold"; + public static final String SESSION_MAX_INACTIVE_INTERVAL_SECONDS = "music.session.max.inactive.interval.seconds"; public static final String ATTRIBUTE_NAME = "ATTRIBUTE_NAME"; diff --git a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicUtil.java b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicUtil.java index 2744796e..ff1edb74 100644 --- a/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicUtil.java +++ b/ecomp-sdk/epsdk-music/src/main/java/org/onap/portalapp/music/util/MusicUtil.java @@ -46,6 +46,7 @@ import java.nio.ByteBuffer; import java.time.Duration; import java.time.Instant; import java.util.Arrays; +import java.util.Date; import java.util.HashSet; import java.util.Set; import java.util.zip.GZIPInputStream; @@ -64,6 +65,7 @@ public class MusicUtil { private static String atomicPut = MusicProperties.getProperty(MusicProperties.MUSIC_ATOMIC_PUT); private static String atomicGet = MusicProperties.getProperty(MusicProperties.MUSIC_ATOMIC_GET); private static String cached = MusicProperties.getProperty(MusicProperties.MUSIC_CACHE); + private static String cleanUpFreq = MusicProperties.getProperty(MusicProperties.MUSIC_CLEAN_UP_FREQUENCY); private static String musicSerializeCompress = MusicProperties.getProperty(MusicProperties.MUSIC_SERIALIZE_COMPRESS); public static boolean isSessionMetaAttr(String key){ return sessionAttrNameSet.contains(key); @@ -127,6 +129,23 @@ public class MusicUtil { musicSession.setMaxInactiveInterval(Duration.parse(row.getString("max_inactive_interval"))); return musicSession; } + + public static Set<String> getMusicExcludedAPI(){ + Set<String> excludedApiSet = new HashSet<>(); + String musicExcludedApi = MusicProperties.getProperty(MusicProperties.MUSIC_EXCLUDE_API); + String[] musicExcludedApiArray = musicExcludedApi.split(","); + if(musicExcludedApiArray.length>0){ + for(String str : musicExcludedApiArray){ + excludedApiSet.add(str.trim()); + } + } + return excludedApiSet; + } + + public static boolean isExcludedApi(String api){ + Set<String> excludedApiSet = getMusicExcludedAPI(); + return excludedApiSet.contains(api); + } public static boolean isMusicSerializeCompress(){ if(musicSerializeCompress==null){ @@ -159,4 +178,25 @@ public class MusicUtil { } return cached.trim().equalsIgnoreCase("true"); } + + public static int convertHoursToMillSec(int hour){ + return hour*3600000; + } + + public static boolean cleanUp(){ + Date lastCleanUpDate = MusicCleanUp.getInstance().getLastCleanUpTime(); + if(lastCleanUpDate==null) + return false; + else{ + int cleanUpDurationMili = convertHoursToMillSec(Integer.valueOf(cleanUpFreq)); + Date currentTime = new Date(); + long diffInMillies = Math.abs(currentTime.getTime() - lastCleanUpDate.getTime()); + if(diffInMillies > cleanUpDurationMili){ + MusicCleanUp.getInstance().updateLastCleanUpTimeToCurrent(); + return true; + } + else + return false; + } + } } |