blob: ac86c9b4a77b94e56a65c80c7cbcd05220e838f6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.framework.manager.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.osee.framework.core.server.ISessionManager;
import org.eclipse.osee.framework.core.server.SecureOseeHttpServlet;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.type.Pair;
import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
import org.eclipse.osee.framework.jdk.core.util.Lib;
import org.eclipse.osee.framework.manager.servlet.data.HttpRequestDecoder;
import org.eclipse.osee.framework.manager.servlet.data.ServletResourceBridge;
import org.eclipse.osee.framework.resource.management.IResource;
import org.eclipse.osee.framework.resource.management.IResourceLocator;
import org.eclipse.osee.framework.resource.management.IResourceManager;
import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
import org.eclipse.osee.logger.Log;
/**
* This class is responsible for managing server-side resources. The class accepts HTTP requests to perform uploads,
* deletes, and gets from clients granting access to server-side managed resources.
*
* @author Roberto E. Escobar
*/
public class ResourceManagerServlet extends SecureOseeHttpServlet {
private static final long serialVersionUID = 3777506351978711657L;
private final IResourceManager resourceManager;
public ResourceManagerServlet(Log logger, ISessionManager sessionManager, IResourceManager resourceManager) {
super(logger, sessionManager);
this.resourceManager = resourceManager;
}
private void handleError(HttpServletResponse response, String message, Throwable ex) {
getLogger().error(ex, message);
try {
response.getWriter().println(message);
} catch (IOException ex1) {
getLogger().error(ex, message);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
InputStream inputStream = null;
try {
Pair<String, Boolean> parameters = HttpRequestDecoder.fromGetRequest(request);
String path = parameters.getFirst();
boolean isCheckExistance = parameters.getSecond();
PropertyStore options = HttpRequestDecoder.getOptions(request);
IResourceLocator locator = resourceManager.getResourceLocator(path);
if (isCheckExistance) {
boolean exists = resourceManager.exists(locator);
response.setStatus(exists ? HttpServletResponse.SC_OK : HttpServletResponse.SC_NOT_FOUND);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().println(String.format("[%s] was %sfound.", path, exists ? "" : "not "));
} else {
IResource resource = resourceManager.acquire(locator, options);
if (resource != null) {
inputStream = resource.getContent();
response.setStatus(HttpServletResponse.SC_OK);
response.setContentLength(inputStream.available());
response.setCharacterEncoding("ISO-8859-1");
String mimeType = URLConnection.guessContentTypeFromStream(inputStream);
if (mimeType == null) {
mimeType = URLConnection.guessContentTypeFromName(resource.getLocation().toString());
if (mimeType == null) {
mimeType = "application/*";
}
}
response.setContentType(mimeType);
response.setHeader("Content-Disposition", "attachment; filename=" + resource.getName());
Lib.inputStreamToOutputStream(inputStream, response.getOutputStream());
} else {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.flushBuffer();
}
}
} catch (MalformedLocatorException ex) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
handleError(response, String.format("Unable to locate resource: [%s]", request.getRequestURI()), ex);
} catch (Exception ex) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
handleError(response, String.format("Unable to acquire resource: [%s]", request.getRequestURI()), ex);
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
@Override
protected void doPut(HttpServletRequest request, HttpServletResponse response) {
int result = HttpServletResponse.SC_BAD_REQUEST;
try {
String[] args = HttpRequestDecoder.fromPutRequest(request);
PropertyStore options = HttpRequestDecoder.getOptions(request);
IResourceLocator locator = resourceManager.generateResourceLocator(args[0], args[1], args[2]);
IResource tempResource = new ServletResourceBridge(request, locator);
IResourceLocator actualLocator = resourceManager.save(locator, tempResource, options);
result = HttpServletResponse.SC_CREATED;
response.setStatus(result);
response.setContentType("text/plain");
response.getWriter().write(actualLocator.toString());
} catch (MalformedLocatorException ex) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setContentType("text/plain");
handleError(response, String.format("Unable to locate resource: [%s] - %s", request.getRequestURI(), ex), ex);
} catch (Exception ex) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.setContentType("text/plain");
handleError(response, String.format("Error saving resource: [%s]", ex), ex);
}
}
@Override
protected void doDelete(HttpServletRequest request, HttpServletResponse response) {
int result = HttpServletResponse.SC_BAD_REQUEST;
try {
String path = HttpRequestDecoder.fromDeleteRequest(request);
IResourceLocator locator = resourceManager.getResourceLocator(path);
int status = IResourceManager.OK;
//Activator.getInstance().getResourceManager().delete(locator);
if (status == IResourceManager.OK) {
result = HttpServletResponse.SC_ACCEPTED;
} else {
result = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}
response.setStatus(result);
response.setContentType("text/plain");
response.getWriter().write("Deleted: " + locator.toString());
response.flushBuffer();
} catch (MalformedLocatorException ex) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setContentType("text/plain");
handleError(response, String.format("Unable to locate resource: [%s]", request.getRequestURI()), ex);
} catch (Exception ex) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.setContentType("text/plain");
handleError(response, String.format("Unable to delete resource: [%s]", request.getRequestURI()), ex);
}
}
// TODO Allow for bulk loading of resources
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp); // Remove this line once implemented
Set<IResourceLocator> locators = new HashSet<IResourceLocator>();
for (IResourceLocator locator : locators) {
try {
PropertyStore options = new PropertyStore();
resourceManager.acquire(locator, options);
} catch (OseeCoreException ex) {
//
}
}
}
}