diff --git a/.classpath b/.classpath
index 953de0b..e43402f 100644
--- a/.classpath
+++ b/.classpath
@@ -22,12 +22,12 @@
-
+
-
+
diff --git a/pom.xml b/pom.xml
index 0239e8a..11d55fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
org.gcube.core
common-gcore-stubs
- 1.2.0-SNAPSHOT
+ 1.2.1-SNAPSHOT
GCore Stubs
JAXWS Stub Support for gCore Service
@@ -35,17 +35,22 @@
common-scope
[1.1.0-SNAPSHOT,2.0.0-SNAPSHOT)
-
-
-
+
+ org.gcube.common
+ common-authorization
+ [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT)
+
+
+
+
org.slf4j
slf4j-simple
1.6.4
test
-
+
diff --git a/src/main/java/org/gcube/common/clients/stubs/jaxws/StubFactory.java b/src/main/java/org/gcube/common/clients/stubs/jaxws/StubFactory.java
index 9ced1c6..a02b5fe 100644
--- a/src/main/java/org/gcube/common/clients/stubs/jaxws/StubFactory.java
+++ b/src/main/java/org/gcube/common/clients/stubs/jaxws/StubFactory.java
@@ -19,6 +19,7 @@ import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder;
import org.gcube.common.clients.stubs.jaxws.StubFactoryDSL.AtClause;
import org.gcube.common.clients.stubs.jaxws.handlers.GCoreJAXWSHandler;
+import org.gcube.common.clients.stubs.jaxws.proxies.GenericProxyFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -107,12 +108,14 @@ public class StubFactory implements StubFactoryDSL.AtClause {
// get JAXWS stub
T stub = service.getPort(reference,target.type(),features);
+
+
BindingProvider provider = (BindingProvider) stub;
// configure stub for gCube calls
registerHandler(provider, target);
- return stub;
+ return GenericProxyFactory.getProxy(target.type(), stub);
} catch (Error e) { //bad stubs/wsdls cause java.lang.Errors
diff --git a/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/AuthorizationHandler.java b/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/AuthorizationHandler.java
new file mode 100644
index 0000000..ccbca2b
--- /dev/null
+++ b/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/AuthorizationHandler.java
@@ -0,0 +1,26 @@
+package org.gcube.common.clients.stubs.jaxws.handlers;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
+import org.gcube.common.clients.stubs.jaxws.GCoreService;
+
+public class AuthorizationHandler extends AbstractHandler {
+
+ /** Namespace of scope-related headers */
+ public static final String TOKEN_NS = "http://gcube-system.org/namespaces/gcube-token";
+
+ /** Name of the scope call header. */
+ public static final String TOKEN_HEADER_NAME = "gcube-token";
+ public static final QName TOKEN_QNAME = new QName(TOKEN_NS,TOKEN_HEADER_NAME);
+
+ @Override
+ public void handleRequest(GCoreService> target, SOAPHeader header, SOAPMessageContext context) throws Exception {
+ String token = SecurityTokenProvider.instance.get();
+ if (token!=null)
+ addHeader(header,TOKEN_QNAME, token);
+ }
+}
+
diff --git a/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/ClientInfoHandler.java b/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/ClientInfoHandler.java
index 37fa209..38caf21 100644
--- a/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/ClientInfoHandler.java
+++ b/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/ClientInfoHandler.java
@@ -4,6 +4,7 @@ import javax.xml.namespace.QName;
import javax.xml.soap.SOAPHeader;
import javax.xml.ws.handler.soap.SOAPMessageContext;
+import org.gcube.common.authorization.library.provider.CalledMethodProvider;
import org.gcube.common.clients.stubs.jaxws.GCoreService;
/**
@@ -21,9 +22,16 @@ public class ClientInfoHandler extends AbstractHandler {
public static final String CALLER_NS = "http://gcube-system.org/namespaces/caller";
public static final QName CALLER_QNAME = new QName(CALLER_NS,CALLER_HEADER_NAME);
+
+ public static final String CALLED_METHOD_HEADER_NAME = "gcube-method";
+ /** Namespace of scope-related headers */
+ public static final String CALLED_METHOD_NS = "http://gcube-system.org/namespaces/method";
+
+ public static final QName CALLED_METHOD_QNAME = new QName(CALLED_METHOD_NS,CALLED_METHOD_HEADER_NAME);
@Override
public void handleRequest(GCoreService> target, SOAPHeader header, SOAPMessageContext context) throws Exception {
addHeader(header,CALLER_QNAME, target.clientId());
+ addHeader(header, CALLED_METHOD_QNAME, CalledMethodProvider.instance.get());
}
}
diff --git a/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/ScopeHandler.java b/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/ScopeHandler.java
index eb510a0..f97704e 100644
--- a/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/ScopeHandler.java
+++ b/src/main/java/org/gcube/common/clients/stubs/jaxws/handlers/ScopeHandler.java
@@ -24,8 +24,6 @@ public class ScopeHandler extends AbstractHandler {
@Override
public void handleRequest(GCoreService> target, SOAPHeader header, SOAPMessageContext context) throws Exception {
String scope = ScopeProvider.instance.get();
- if (scope==null)
- throw new IllegalStateException("no scope is defined for this call");
addHeader(header,SCOPE_QNAME, scope);
}
}
diff --git a/src/main/java/org/gcube/common/clients/stubs/jaxws/proxies/GenericProxyFactory.java b/src/main/java/org/gcube/common/clients/stubs/jaxws/proxies/GenericProxyFactory.java
new file mode 100644
index 0000000..277695f
--- /dev/null
+++ b/src/main/java/org/gcube/common/clients/stubs/jaxws/proxies/GenericProxyFactory.java
@@ -0,0 +1,15 @@
+package org.gcube.common.clients.stubs.jaxws.proxies;
+
+import java.lang.reflect.Proxy;
+
+public class GenericProxyFactory {
+
+ @SuppressWarnings("unchecked")
+ public static T getProxy(Class intf,
+ final I obj) {
+ return (T)
+ Proxy.newProxyInstance(obj.getClass().getClassLoader(),
+ new Class[] { intf },
+ new MethodRetriever(obj));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/gcube/common/clients/stubs/jaxws/proxies/MethodRetriever.java b/src/main/java/org/gcube/common/clients/stubs/jaxws/proxies/MethodRetriever.java
new file mode 100644
index 0000000..b10242c
--- /dev/null
+++ b/src/main/java/org/gcube/common/clients/stubs/jaxws/proxies/MethodRetriever.java
@@ -0,0 +1,32 @@
+package org.gcube.common.clients.stubs.jaxws.proxies;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+import org.gcube.common.authorization.library.provider.CalledMethodProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MethodRetriever implements InvocationHandler{
+
+ public static Logger log = LoggerFactory.getLogger(MethodRetriever.class);
+
+ private T service;
+
+ public MethodRetriever(T service){
+ this.service= service;
+ }
+
+ public Object invoke(Object proxy, Method method,
+ Object[] args) throws Throwable {
+ CalledMethodProvider.instance.set(method.getName());
+ try{
+ return method.invoke(service, args);
+ }finally{
+ CalledMethodProvider.instance.reset();
+ }
+ }
+
+
+
+}
diff --git a/src/main/resources/META-INF/services/org.gcube.common.clients.stubs.jaxws.handlers.CallHandler b/src/main/resources/META-INF/services/org.gcube.common.clients.stubs.jaxws.handlers.CallHandler
index 34f8b70..5be2097 100644
--- a/src/main/resources/META-INF/services/org.gcube.common.clients.stubs.jaxws.handlers.CallHandler
+++ b/src/main/resources/META-INF/services/org.gcube.common.clients.stubs.jaxws.handlers.CallHandler
@@ -1,4 +1,5 @@
org.gcube.common.clients.stubs.jaxws.handlers.ScopeHandler
+org.gcube.common.clients.stubs.jaxws.handlers.AuthorizationHandler
org.gcube.common.clients.stubs.jaxws.handlers.TargetServiceHandler
org.gcube.common.clients.stubs.jaxws.handlers.ClientInfoHandler
org.gcube.common.clients.stubs.jaxws.handlers.LegacyWSAddressingHandler
\ No newline at end of file