package org.gcube.datatransfer.resolver.requesthandler; import java.io.IOException; import java.net.URI; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.container.ResourceContext; import javax.ws.rs.core.Application; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import javax.ws.rs.ext.Provider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.datatransfer.resolver.MultiReadHttpServletRequest; import org.gcube.datatransfer.resolver.UriResolverServices; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The Class TokenSetter. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * Feb 19, 2019 */ @Provider public class TokenSetter implements ContainerRequestFilter, ContainerResponseFilter { public static final String ROOT_SCOPE = "root-scope"; public static final String ROOT_APP_TOKEN = "root-app-token"; private static final Logger log = LoggerFactory.getLogger(TokenSetter.class); @Context ServletContext context; @Context HttpServletRequest webRequest; @Context Application application; @Context ResourceContext resourceContext; /* (non-Javadoc) * @see javax.ws.rs.container.ContainerRequestFilter#filter(javax.ws.rs.container.ContainerRequestContext) */ @Override public void filter(ContainerRequestContext reqContext) throws IOException { log.info("TokenSetter Request called"); if(SecurityTokenProvider.instance.get()==null) SecurityTokenProvider.instance.set(context.getInitParameter(ROOT_APP_TOKEN)); if(ScopeProvider.instance.get()==null) ScopeProvider.instance.set(context.getInitParameter(ROOT_SCOPE)); MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest(webRequest); String requestURI = multiReadRequest.getRequestURI(); String queryString = multiReadRequest.getQueryString(); log.debug("Request URI: " + requestURI + ", QueryString: " +queryString+ ", Path Info: "+multiReadRequest.getPathInfo()); List listOfPath = UriResolverServices.getInstance().getListOfResourcePath(application.getClasses()); log.info("The resources are: {}", listOfPath); UriInfo uriInfo = reqContext.getUriInfo(); String prefix = "/redirect"; String path = uriInfo.getRequestUri().getPath(); log.info("The path is: {}", path); if(requestURI.startsWith("qqqqq")){ URI newRequestURI = uriInfo.getBaseUriBuilder().path("new").build(); reqContext.setRequestUri(newRequestURI); } } /* (non-Javadoc) * @see javax.ws.rs.container.ContainerResponseFilter#filter(javax.ws.rs.container.ContainerRequestContext, javax.ws.rs.container.ContainerResponseContext) */ @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { log.info("TokenSetter Response called"); SecurityTokenProvider.instance.reset(); ScopeProvider.instance.reset(); } }