| /******************************************************************************* |
| * 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; |
| } |
| } |
| } |