blob: 2f79d9b75fc0789a255aab86ad35a16305d13c75 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.io.internal;
import java.net.URL;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.gemini.blueprint.io.OsgiBundleResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.UrlResource;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* Utility class used for IO resources.
*
* @author Costin Leau
*
*/
public abstract class OsgiResourceUtils {
public static final String EMPTY_PREFIX = "";
public static final String PREFIX_DELIMITER = ":";
public static final String FOLDER_DELIMITER = "/";
// PREFIXES TYPES
// non-osgi prefixes (file, http)
public static final int PREFIX_TYPE_UNKNOWN = -1;
// no prefix
public static final int PREFIX_TYPE_NOT_SPECIFIED = 0x00000000;
// osgibundlejar:
public static final int PREFIX_TYPE_BUNDLE_JAR = 0x00000001;
// osgibundle:
public static final int PREFIX_TYPE_BUNDLE_SPACE = 0x00000010;
// classpath:
public static final int PREFIX_TYPE_CLASS_SPACE = 0x00000100;
// classpath*:
public static final int PREFIX_TYPE_CLASS_ALL_SPACE = 0x00000200;
/**
* Return the path prefix if there is any or {@link #EMPTY_PREFIX}
* otherwise.
*
* @param path
* @return
*/
public static String getPrefix(String path) {
if (path == null)
return EMPTY_PREFIX;
int index = path.indexOf(PREFIX_DELIMITER);
return ((index > 0) ? path.substring(0, index + 1) : EMPTY_PREFIX);
}
/**
* Return the search type to be used for the give string based on the
* prefix.
*
* @param path
* @return
*/
public static int getSearchType(String path) {
Assert.notNull(path);
int type = PREFIX_TYPE_NOT_SPECIFIED;
String prefix = getPrefix(path);
// no prefix is treated just like osgibundle:
if (!StringUtils.hasText(prefix))
type = PREFIX_TYPE_NOT_SPECIFIED;
else if (prefix.startsWith(OsgiBundleResource.BUNDLE_URL_PREFIX))
type = PREFIX_TYPE_BUNDLE_SPACE;
else if (prefix.startsWith(OsgiBundleResource.BUNDLE_JAR_URL_PREFIX))
type = PREFIX_TYPE_BUNDLE_JAR;
else if (prefix.startsWith(ResourceLoader.CLASSPATH_URL_PREFIX))
type = PREFIX_TYPE_CLASS_SPACE;
else if (prefix.startsWith(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX))
type = PREFIX_TYPE_CLASS_ALL_SPACE;
else
type = PREFIX_TYPE_UNKNOWN;
return type;
}
public static boolean isClassPathType(int type) {
return (type == PREFIX_TYPE_CLASS_SPACE || type == PREFIX_TYPE_CLASS_ALL_SPACE);
}
public static String stripPrefix(String path) {
// strip prefix
int index = path.indexOf(PREFIX_DELIMITER);
return (index > -1 ? path.substring(index + 1) : path);
}
public static Resource[] convertURLArraytoResourceArray(URL[] urls) {
if (urls == null) {
return new Resource[0];
}
// convert this into a resource array
Resource[] res = new Resource[urls.length];
for (int i = 0; i < urls.length; i++) {
res[i] = new UrlResource(urls[i]);
}
return res;
}
public static Resource[] convertURLEnumerationToResourceArray(Enumeration<URL> enm) {
Set<UrlResource> resources = new LinkedHashSet<UrlResource>(4);
while (enm != null && enm.hasMoreElements()) {
resources.add(new UrlResource(enm.nextElement()));
}
return (Resource[]) resources.toArray(new Resource[resources.size()]);
}
/**
* Similar to /path/path1/ -> /path/, /path/file -> /path/
*
* @return
*/
public static String findUpperFolder(String path) {
if (path.length() < 2)
return path;
String newPath = path;
// if it's a folder
if (path.endsWith(FOLDER_DELIMITER)) {
newPath = path.substring(0, path.length() - 1);
}
int index = newPath.lastIndexOf(FOLDER_DELIMITER);
if (index > 0)
return newPath.substring(0, index + 1);
else
// fallback to defaults
return path;
}
}