blob: ef234a99c9a86b50107871fc435c49dd480782f4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.fsprovider.internal.mapper;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.BitSet;
import org.apache.commons.lang3.CharEncoding;
/**
* Manages deescaping for platform file names to resource names.
*/
public final class Escape {
/**
* List of characters typically prohibited on unix and windows file systems.
* "/" is not included because it is neither allowed in resource nor in file names on any system.
*/
private static final char[] RESERVED_CHARS = {
'<',
'>',
':',
'"',
'\\',
'|',
'?',
'*',
0x00
};
private static final BitSet RESERVED_CHARS_SET = new BitSet();
static {
for (int i=0; i<RESERVED_CHARS.length; i++) {
RESERVED_CHARS_SET.set(RESERVED_CHARS[i]);
}
}
private Escape() {
// static methods only
}
/**
* Convert file name to resource name.
* Applies same rules as Apache Sling JCR ContentLoader.
* @param path File name or path
* @return Resource name or path
*/
public static String fileToResourceName(String path) {
// check for encoded characters (%xx)
// has encoded characters, need to decode
if (path.indexOf('%') >= 0) {
try {
return URLDecoder.decode(path, "UTF-8");
}
catch (UnsupportedEncodingException ex) {
throw new RuntimeException("Unsupported encoding.", ex);
}
}
return path;
}
/**
* Converts resource name to file name.
* Allows all characters, but URL-encodes characters that are in the list of {@link #RESERVED_CHARS}.
* @param path Resource name or path
* @return File name or path
*/
public static String resourceToFileName(String path) {
try {
StringBuilder result = new StringBuilder();
for (int i=0; i<path.length(); i++) {
char c = path.charAt(i);
if (RESERVED_CHARS_SET.get(c)) {
result.append(URLEncoder.encode(String.valueOf(c), CharEncoding.UTF_8));
}
else {
result.append(c);
}
}
return result.toString();
}
catch (UnsupportedEncodingException ex) {
throw new RuntimeException("Unsupported encoding.", ex);
}
}
}