| | |
| | | */
|
| | | package com.gitblit.utils;
|
| | |
|
| | | import java.io.ByteArrayOutputStream;
|
| | | import java.io.UnsupportedEncodingException;
|
| | | import java.nio.ByteBuffer;
|
| | | import java.nio.CharBuffer;
|
| | |
| | | import java.util.LinkedHashSet;
|
| | | import java.util.List;
|
| | | import java.util.Set;
|
| | | import java.util.regex.Matcher;
|
| | | import java.util.regex.Pattern;
|
| | | import java.util.regex.PatternSyntaxException;
|
| | |
|
| | | /**
|
| | |
| | | * @return plain text escaped for html
|
| | | */
|
| | | public static String escapeForHtml(String inStr, boolean changeSpace) {
|
| | | StringBuffer retStr = new StringBuffer();
|
| | | StringBuilder retStr = new StringBuilder();
|
| | | int i = 0;
|
| | | while (i < inStr.length()) {
|
| | | if (inStr.charAt(i) == '&') {
|
| | |
| | | * @return properly escaped url
|
| | | */
|
| | | public static String encodeURL(String inStr) {
|
| | | StringBuffer retStr = new StringBuffer();
|
| | | StringBuilder retStr = new StringBuilder();
|
| | | int i = 0;
|
| | | while (i < inStr.length()) {
|
| | | if (inStr.charAt(i) == '/') {
|
| | |
| | | * @return the relative path
|
| | | */
|
| | | public static String getRelativePath(String basePath, String fullPath) {
|
| | | String relativePath = fullPath.substring(basePath.length()).replace('\\', '/');
|
| | | if (relativePath.charAt(0) == '/') {
|
| | | relativePath = relativePath.substring(1);
|
| | | String bp = basePath.replace('\\', '/').toLowerCase();
|
| | | String fp = fullPath.replace('\\', '/').toLowerCase();
|
| | | if (fp.startsWith(bp)) {
|
| | | String relativePath = fullPath.substring(basePath.length()).replace('\\', '/');
|
| | | if (relativePath.charAt(0) == '/') {
|
| | | relativePath = relativePath.substring(1);
|
| | | }
|
| | | return relativePath;
|
| | | }
|
| | | return relativePath;
|
| | | return fullPath;
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | * @return the first invalid character found or null if string is acceptable
|
| | | */
|
| | | public static Character findInvalidCharacter(String name) {
|
| | | char[] validChars = { '/', '.', '_', '-' };
|
| | | char[] validChars = { '/', '.', '_', '-', '~' };
|
| | | for (char c : name.toCharArray()) {
|
| | | if (!Character.isLetterOrDigit(c)) {
|
| | | boolean ok = false;
|
| | |
| | | // ignore unsupported charsets
|
| | | }
|
| | | }
|
| | | value = new String(content, Charset.forName("UTF-8"));
|
| | | if (value.startsWith("\uFEFF")) {
|
| | | // strip UTF-8 BOM
|
| | | return value.substring(1);
|
| | | }
|
| | | return value;
|
| | | }
|
| | | |
| | | /**
|
| | | * Attempt to extract a repository name from a given url using regular
|
| | | * expressions. If no match is made, then return whatever trails after
|
| | | * the final / character.
|
| | | * |
| | | * @param regexUrls
|
| | | * @return a repository path
|
| | | */
|
| | | public static String extractRepositoryPath(String url, String... urlpatterns) {
|
| | | for (String urlPattern : urlpatterns) {
|
| | | Pattern p = Pattern.compile(urlPattern);
|
| | | Matcher m = p.matcher(url);
|
| | | while (m.find()) {
|
| | | String repositoryPath = m.group(1);
|
| | | return repositoryPath;
|
| | | }
|
| | | }
|
| | | // last resort
|
| | | if (url.lastIndexOf('/') > -1) {
|
| | | return url.substring(url.lastIndexOf('/') + 1);
|
| | | }
|
| | | return url;
|
| | | }
|
| | | |
| | | /**
|
| | | * Converts a string with \nnn sequences into a UTF-8 encoded string.
|
| | | * @param input
|
| | | * @return
|
| | | */
|
| | | public static String convertOctal(String input) {
|
| | | try {
|
| | | ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
| | | Pattern p = Pattern.compile("(\\\\\\d{3})");
|
| | | Matcher m = p.matcher(input);
|
| | | int i = 0;
|
| | | while (m.find()) {
|
| | | bytes.write(input.substring(i, m.start()).getBytes("UTF-8"));
|
| | | // replace octal encoded value
|
| | | // strip leading \ character
|
| | | String oct = m.group().substring(1);
|
| | | bytes.write(Integer.parseInt(oct, 8));
|
| | | i = m.end(); |
| | | }
|
| | | if (bytes.size() == 0) {
|
| | | // no octal matches
|
| | | return input;
|
| | | } else {
|
| | | if (i < input.length()) {
|
| | | // add remainder of string
|
| | | bytes.write(input.substring(i).getBytes("UTF-8"));
|
| | | }
|
| | | }
|
| | | return bytes.toString("UTF-8");
|
| | | } catch (Exception e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | | return input;
|
| | | }
|
| | | |
| | | /**
|
| | | * Returns the first path element of a path string. If no path separator is
|
| | | * found in the path, an empty string is returned. |
| | | * |
| | | * @param path
|
| | | * @return the first element in the path
|
| | | */
|
| | | public static String getFirstPathElement(String path) {
|
| | | if (path.indexOf('/') > -1) {
|
| | | return path.substring(0, path.indexOf('/')).trim();
|
| | | }
|
| | | return "";
|
| | | }
|
| | | |
| | | /**
|
| | | * Returns the last path element of a path string
|
| | | * |
| | | * @param path
|
| | | * @return the last element in the path
|
| | | */
|
| | | public static String getLastPathElement(String path) {
|
| | | if (path.indexOf('/') > -1) {
|
| | | return path.substring(path.lastIndexOf('/') + 1);
|
| | | }
|
| | | return path;
|
| | | }
|
| | | } |