From 89be62e437148fb58c14ef36b9a3fac67e2706f4 Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Mon, 2 May 2016 14:52:47 +0000 Subject: [PATCH] git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portal/threadlocal-vars-cleaner@128403 82a268e6-3cf1-43bd-a215-b396298e98cf --- pom.xml | 2 +- .../SmartGearsPortalExecutor.java | 54 ------------------ .../SmartGearsPortalValve.java | 33 +++++++++++ target/maven-archiver/pom.properties | 4 +- target/profile.xml | 6 +- ...g.gcube.portal.threadlocalexec.AppTest.xml | 4 +- ...hreadlocal-vars-cleaner-0.0.1-SNAPSHOT.jar | Bin 4909 -> 0 bytes ...tGearsPortalExecutor$WrappedRunnable.class | Bin 2171 -> 0 bytes .../SmartGearsPortalExecutor.class | Bin 985 -> 0 bytes ...hreadlocal-vars-cleaner-1.0.0-SNAPSHOT.jar | Bin 0 -> 3901 bytes .../SmartGearsPortalValve.class | Bin 0 -> 1685 bytes 11 files changed, 41 insertions(+), 62 deletions(-) delete mode 100644 src/main/java/org/gcube/portal/threadlocalexec/SmartGearsPortalExecutor.java create mode 100644 src/main/java/org/gcube/portal/threadlocalexec/SmartGearsPortalValve.java delete mode 100644 target/threadlocal-vars-cleaner-0.0.1-SNAPSHOT.jar delete mode 100644 target/threadlocal-vars-cleaner-0.0.1-SNAPSHOT/WEB-INF/classes/org/gcube/portal/threadlocalexec/SmartGearsPortalExecutor$WrappedRunnable.class delete mode 100644 target/threadlocal-vars-cleaner-0.0.1-SNAPSHOT/WEB-INF/classes/org/gcube/portal/threadlocalexec/SmartGearsPortalExecutor.class create mode 100644 target/threadlocal-vars-cleaner-1.0.0-SNAPSHOT.jar create mode 100644 target/threadlocal-vars-cleaner-1.0.0-SNAPSHOT/WEB-INF/classes/org/gcube/portal/threadlocalexec/SmartGearsPortalValve.class diff --git a/pom.xml b/pom.xml index 1635a19..b7a7d04 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.gcube.portal threadlocal-vars-cleaner - 0.0.1-SNAPSHOT + 1.0.0-SNAPSHOT jar threadlocal-vars-cleaner diff --git a/src/main/java/org/gcube/portal/threadlocalexec/SmartGearsPortalExecutor.java b/src/main/java/org/gcube/portal/threadlocalexec/SmartGearsPortalExecutor.java deleted file mode 100644 index 6d63bf4..0000000 --- a/src/main/java/org/gcube/portal/threadlocalexec/SmartGearsPortalExecutor.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.gcube.portal.threadlocalexec; - -import org.apache.catalina.core.StandardThreadExecutor; -import org.gcube.common.authorization.library.provider.AuthorizationProvider; -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; -import org.gcube.common.scope.api.ScopeProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * - * @author Massimiliano Assante, CNR ISTI - * - */ -public class SmartGearsPortalExecutor extends StandardThreadExecutor { - private static final Logger _log = LoggerFactory.getLogger(SmartGearsPortalExecutor.class); - public SmartGearsPortalExecutor() { - } - -// @Override -// public void execute(Runnable command, long timeout, TimeUnit unit) { -// super.execute(new WrappedRunnable(command), timeout, unit); -// } - - @Override - public void execute(Runnable command) { - super.execute(new WrappedRunnable(command)); - } - - public static class WrappedRunnable implements Runnable{ - - private Runnable runnable; - - protected WrappedRunnable(Runnable runnable){ - this.runnable = runnable; - } - - public void run() { - try{ - this.runnable.run(); - _log.debug("execution finished on thread "+Thread.currentThread().getName() + " server.RStudioServiceImpl LOGtoRemove"); - System.out.println("execution finished on thread "+Thread.currentThread().getName()+ " server.RStudioServiceImpl LOGtoRemove"); - } finally { - SecurityTokenProvider.instance.reset(); - ScopeProvider.instance.reset(); - AuthorizationProvider.instance.reset(); - _log.debug("done reset all the thread locals on thread "+Thread.currentThread().getName()+ " server.RStudioServiceImpl LOGtoRemove"); - System.out.println("done reset all the thread locals on thread "+Thread.currentThread().getName()+ " server.RStudioServiceImpl LOGtoRemove"); - } - } - - } - -} - diff --git a/src/main/java/org/gcube/portal/threadlocalexec/SmartGearsPortalValve.java b/src/main/java/org/gcube/portal/threadlocalexec/SmartGearsPortalValve.java new file mode 100644 index 0000000..5ae9ecd --- /dev/null +++ b/src/main/java/org/gcube/portal/threadlocalexec/SmartGearsPortalValve.java @@ -0,0 +1,33 @@ +package org.gcube.portal.threadlocalexec; + +import java.io.IOException; + +import javax.servlet.ServletException; + +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; +import org.apache.catalina.valves.ValveBase; +import org.gcube.common.authorization.library.provider.AuthorizationProvider; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.scope.api.ScopeProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +/** + * + * @author Massimiliano Assante, CNR ISTI + * @author Lucio Lelii, CNR ISTI + * + */ +public class SmartGearsPortalValve extends ValveBase { + private static final Logger _log = LoggerFactory.getLogger(SmartGearsPortalValve.class); + + @Override + public void invoke(Request req, Response resp) throws IOException, ServletException { + SecurityTokenProvider.instance.reset(); + ScopeProvider.instance.reset(); + AuthorizationProvider.instance.reset(); + getNext().invoke(req, resp); + _log.trace("SmartGearsPortalValve SecurityTokenProvider and AuthorizationProvider reset OK"); + } +} + diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties index b0eeb1b..efeaa62 100644 --- a/target/maven-archiver/pom.properties +++ b/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Tue Apr 19 18:02:51 CEST 2016 -version=0.0.1-SNAPSHOT +#Mon May 02 16:49:27 CEST 2016 +version=1.0.0-SNAPSHOT groupId=org.gcube.portal artifactId=threadlocal-vars-cleaner diff --git a/target/profile.xml b/target/profile.xml index 6396089..580b167 100644 --- a/target/profile.xml +++ b/target/profile.xml @@ -10,14 +10,14 @@ threadlocal-vars-cleaner - 0.0.1-SNAPSHOT + 1.0.0-SNAPSHOT org.gcube.portal threadlocal-vars-cleaner - 0.0.1-SNAPSHOT + 1.0.0-SNAPSHOT - threadlocal-vars-cleaner-0.0.1-SNAPSHOT.war + threadlocal-vars-cleaner-1.0.0-SNAPSHOT.war diff --git a/target/surefire-reports/TEST-org.gcube.portal.threadlocalexec.AppTest.xml b/target/surefire-reports/TEST-org.gcube.portal.threadlocalexec.AppTest.xml index c04c785..3adb55f 100644 --- a/target/surefire-reports/TEST-org.gcube.portal.threadlocalexec.AppTest.xml +++ b/target/surefire-reports/TEST-org.gcube.portal.threadlocalexec.AppTest.xml @@ -26,13 +26,13 @@ "/> - + - + diff --git a/target/threadlocal-vars-cleaner-0.0.1-SNAPSHOT.jar b/target/threadlocal-vars-cleaner-0.0.1-SNAPSHOT.jar deleted file mode 100644 index 9fc65bb055159091974d160037206df0ed16b510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4909 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 FKLK4+UE%-$ diff --git a/target/threadlocal-vars-cleaner-0.0.1-SNAPSHOT/WEB-INF/classes/org/gcube/portal/threadlocalexec/SmartGearsPortalExecutor.class b/target/threadlocal-vars-cleaner-0.0.1-SNAPSHOT/WEB-INF/classes/org/gcube/portal/threadlocalexec/SmartGearsPortalExecutor.class deleted file mode 100644 index 315490c259c3d6824e97154d83e15db21293c393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 985 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 literal 0 HcmV?d00001 diff --git a/target/threadlocal-vars-cleaner-1.0.0-SNAPSHOT/WEB-INF/classes/org/gcube/portal/threadlocalexec/SmartGearsPortalValve.class b/target/threadlocal-vars-cleaner-1.0.0-SNAPSHOT/WEB-INF/classes/org/gcube/portal/threadlocalexec/SmartGearsPortalValve.class new file mode 100644 index 0000000000000000000000000000000000000000..3f642c684396c29f68e8af93dc3ed9123e42b5ea GIT binary patch literal 1685 zcmbtVSyK~15dMZhHd$6s5L85nCn2EYeFgDAz=HycP`p}`WelUsZk(N@!17OtRVY6A z1N>2zJsZH3#-h-d>F(L?ukYFKKfZnga04%0bmL+cmoVbek$u_Iri)v+?cfeW`>PGRUM&}LQ&9WN#dDt2QR=q=$dRhPjAhYglhX1X!^nXq4P?q*%ecyLa45Sz7~JU%UsjDGmk#baxW|y0 z@G119rfw;!XrHMsId)P;v0^g6ijp@<0&53De0g@+CvS^C(+6HGaH>fsay zJRHR_hWVC&xsvp2TA9sds%yBYqq1NHX`&XlG&yS{trwV=#HeEG(&#` z8T(OHQdJZ$S#GcX423_P|3#PZ51o9=rvFREErBQ^ry|X~+%ODh@}n(RZEx96wHk}$ zBg0Yqt@&-DQW`C6bNcdg$)E%xtniZ2Dy$^ied2eM8DU?FO@=Im)Og_-E;d_F1tN}% zjVPO)6>*kc&u)5kX;1BT5tkyK){@TSBypmQXh-2Q*hga8&_`!Fx$Hwf@m@m#CvcJ^ zW;d0ztnmi|OA#$>p=}$fEwt~TgJBElZ8(K(WX8sKkWJBr+taxNuMNLE43G~HQW~ex zg+anQgJBHOUtl=#nrk5MdL