/** * */ package com.ibm.xsp.extlib.sbt.files.proxy.provider; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.http.HttpEntity; import org.apache.http.message.BasicHttpResponse; import com.ibm.commons.util.StringUtil; import com.ibm.sbt.service.basic.ProxyEndpointService; import com.ibm.sbt.services.client.ClientService.Args; import com.ibm.sbt.services.client.ClientServicesException; import com.ibm.sbt.services.endpoints.AbstractEndpoint; import com.ibm.sbt.services.endpoints.DropBoxOAuthEndpoint; import com.ibm.sbt.services.endpoints.Endpoint; import com.ibm.sbt.services.endpoints.EndpointFactory; import com.ibm.xsp.FacesExceptionEx; import com.ibm.xsp.extlib.sbt.files.type.AbstractType; import com.ibm.xsp.extlib.sbt.files.type.DropboxFiles; import com.ibm.xsp.extlib.sbt.services.client.DropboxService; import com.ibm.xsp.extlib.util.ExtLibUtil; import com.ibm.xsp.util.URLEncoding; /** * @author doconnor * */ public class DropboxProxyEndpointService extends ProxyEndpointService { public static final String TYPE = "dropbox"; @Override public void service(HttpServletRequest request, HttpServletResponse servletResponse) throws ServletException, IOException { //TODO make use of findUrl functionality here instead of cloning the EndpointBean try { String endpointName = request.getParameter(AbstractType.PARAM_ENDPOINT_NAME); if(StringUtil.isEmpty(endpointName)){ endpointName = TYPE; } Endpoint bean = EndpointFactory.getEndpoint(endpointName); if (bean == null) { throw new ServletException("AuthorizationBean not found in application scope"); } //TODO - padraic review with phil what clone is about AbstractEndpoint clonedBean = (AbstractEndpoint) bean; clonedBean.setUrl("https://api-content.dropbox.com/"); String path = request.getParameter("path"); // DropboxFiles Service - https://api-content.dropbox.com/<version>/files/dropbox/<path> DropboxService svc = new DropboxService(buildHref(path, bean)); BasicHttpResponse httpResp = null; Args args = new Args(); try { httpResp = (BasicHttpResponse) svc.get(args).getData(); } catch (ClientServicesException e) { throw new FacesExceptionEx(e, "Failed to execute proxy request"); } servletResponse.setContentType(request.getParameter("mimeType")); String status = httpResp.getStatusLine().toString(); status = status.substring(status.indexOf(" ") + 1, status.lastIndexOf(" ")); try { Integer statusInt = Integer.parseInt(status); servletResponse.setStatus(statusInt); } catch (NumberFormatException nfe) { } HttpEntity entity = httpResp.getEntity(); ServletOutputStream servletOut = servletResponse.getOutputStream(); entity.writeTo(servletOut); servletOut.close(); } catch (Exception e) { throw new ServletException(e); } } public String buildHref(String path, Endpoint bean) { try { // Encode path URL for spaces & special characters path = URLEncoding.encodeURIString(path, null, 0, false); } catch (IOException e) { throw new FacesExceptionEx(e, "Failed to encode URI string: {0}", path); } String href = ExtLibUtil.concatPath(getDropBoxApiVersion(bean), "files/dropbox", '/'); href = ExtLibUtil.concatPath(href, path, '/'); return href; } public String getDropBoxApiVersion(Endpoint ep){ // if(StringUtil.equals("-1", ((DropBoxOAuthEndpoint)ep).getApiVersion())){ // return "1";//latestAPI; // } // return ((DropBoxOAuthEndpoint)ep).getApiVersion(); return DropboxFiles.DEFAULT_API_VERSION; } }