blob: 5a6392349590bac573c4e3cf3a9465417ccdbb21 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.http.registry.internal;
import java.io.IOException;
import java.net.URL;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.osgi.framework.Bundle;
import org.osgi.service.http.HttpContext;
public class DefaultRegistryHttpContext implements HttpContext {
private HttpContext delegate;
private List resourceMappings;
private Properties mimeMappings;
public DefaultRegistryHttpContext(HttpContext delegate) {
this.delegate = delegate;
}
public void addResourceMapping(Bundle contributingBundle, String path) {
if (resourceMappings == null)
resourceMappings = new ArrayList();
resourceMappings.add(new ResourceMapping(contributingBundle, path));
}
public void addMimeMapping(String mimeExtension, String mimeType) {
if (mimeMappings == null)
mimeMappings = new Properties();
mimeMappings.put(mimeExtension, mimeType);
}
public String getMimeType(String name) {
if (mimeMappings != null) {
int dotIndex = name.lastIndexOf('.');
if (dotIndex != -1) {
String mimeExtension = name.substring(dotIndex + 1);
String mimeType = mimeMappings.getProperty(mimeExtension);
if (mimeType != null)
return mimeType;
}
}
return delegate.getMimeType(name);
}
public boolean handleSecurity(HttpServletRequest arg0, HttpServletResponse arg1) throws IOException {
return delegate.handleSecurity(arg0, arg1);
}
public URL getResource(String name) {
if (resourceMappings == null)
return null;
for (Iterator it = resourceMappings.iterator(); it.hasNext();) {
ResourceMapping mapping = (ResourceMapping) it.next();
URL resourceURL = mapping.getResource(name);
if (resourceURL != null)
return resourceURL;
}
return null;
}
public Set getResourcePaths(String path) {
if (resourceMappings == null || path == null || !path.startsWith("/")) //$NON-NLS-1$
return null;
Set result = null;
for (Iterator it = resourceMappings.iterator(); it.hasNext();) {
ResourceMapping mapping = (ResourceMapping) it.next();
Set resourcePaths = mapping.getResourcePaths(path);
if (resourcePaths != null) {
if (result == null)
result = new HashSet();
result.addAll(resourcePaths);
}
}
return result;
}
public static class ResourceMapping {
private Bundle bundle;
private String bundlePath;
public ResourceMapping(Bundle bundle, String path) {
this.bundle = bundle;
if (path != null) {
if (path.endsWith("/")) //$NON-NLS-1$
path = path.substring(0, path.length() - 1);
if (path.length() == 0)
path = null;
}
this.bundlePath = path;
}
public URL getResource(String resourceName) {
if (bundlePath != null)
resourceName = bundlePath + resourceName;
int lastSlash = resourceName.lastIndexOf('/');
if (lastSlash == -1)
return null;
String path = resourceName.substring(0, lastSlash);
if (path.length() == 0)
path = "/"; //$NON-NLS-1$
String file = sanitizeEntryName(resourceName.substring(lastSlash + 1));
Enumeration entryPaths = bundle.findEntries(path, file, false);
if (entryPaths != null && entryPaths.hasMoreElements())
return (URL) entryPaths.nextElement();
return null;
}
private String sanitizeEntryName(String name) {
StringBuffer buffer = null;
for (int i = 0; i < name.length(); i++) {
char c = name.charAt(i);
switch (c) {
case '*' :
case '\\' :
// we need to escape '*' and '\'
if (buffer == null) {
buffer = new StringBuffer(name.length() + 16);
buffer.append(name.substring(0, i));
}
buffer.append('\\').append(c);
break;
default :
if (buffer != null)
buffer.append(c);
break;
}
}
return (buffer == null) ? name : buffer.toString();
}
public Set getResourcePaths(String path) {
if (bundlePath != null)
path = bundlePath + path;
Enumeration entryPaths = bundle.findEntries(path, null, false);
if (entryPaths == null)
return null;
Set result = new HashSet();
while (entryPaths.hasMoreElements()) {
URL entryURL = (URL) entryPaths.nextElement();
String entryPath = entryURL.getFile();
if (bundlePath == null)
result.add(entryPath);
else
result.add(entryPath.substring(bundlePath.length()));
}
return result;
}
}
}