/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.webdav.util; import java.io.CharArrayWriter; import java.util.BitSet; /** * Created by The eXo Platform SAS. * @author Vitaly Guly - gavrikvetal@gmail.com * * @version $Id: PutCommand.java 12004 2007-01-17 12:03:57Z geaz $ */ public class TextUtil { /** * Unescapes string using escape symbol. * * @param string string * @param escape escape symbol * @return unescaped string */ public static String unescape(String string, char escape) { CharArrayWriter out = new CharArrayWriter(string.length()); for (int i = 0; i < string.length(); i++) { char c = string.charAt(i); if (c == escape) { try { out.write(Integer.parseInt(string.substring(i + 1, i + 3), 16)); } catch (NumberFormatException e) { throw new IllegalArgumentException(e); } i += 2; } else { out.write(c); } } return new String(out.toCharArray()); } public static BitSet URISave; public static BitSet URISaveEx; static { URISave = new BitSet(256); int i; for (i = 'a'; i <= 'z'; i++) { URISave.set(i); } for (i = 'A'; i <= 'Z'; i++) { URISave.set(i); } for (i = '0'; i <= '9'; i++) { URISave.set(i); } URISave.set('-'); URISave.set('_'); URISave.set('.'); URISave.set('!'); URISave.set('~'); URISave.set('*'); URISave.set('\''); URISave.set('('); URISave.set(')'); URISave.set(':'); URISave.set('?'); URISave.set('='); URISaveEx = (BitSet)URISave.clone(); URISaveEx.set('/'); } /** * Hexademical characters. */ public static final char[] hexTable = "0123456789abcdef".toCharArray(); /** * Escapes string using escape symbol. * * @param string string * @param escape escape symbol * @param isPath if the string is path * * @return escaped string */ public static String escape(String string, char escape, boolean isPath) { try { BitSet validChars = isPath ? URISaveEx : URISave; byte[] bytes = string.getBytes("utf-8"); StringBuffer out = new StringBuffer(bytes.length); for (int i = 0; i < bytes.length; i++) { int c = bytes[i] & 0xff; if (validChars.get(c) && c != escape) { out.append((char)c); } else { out.append(escape); out.append(hexTable[(c >> 4) & 0x0f]); out.append(hexTable[(c) & 0x0f]); } } return out.toString(); } catch (Exception exc) { throw new InternalError(exc.toString()); } } /** * Creates relative path from string. * * @param path path * @return relative path */ public static String relativizePath(String path) { return relativizePath(path, true); } /** * Creates relative path from string. * * @param path path * @param withIndex indicates whether we should keep the index or not * @return relative path */ public static String relativizePath(String path, boolean withIndex) { if (path.startsWith("/")) path = path.substring(1); if (!withIndex && path.endsWith("]")) { int index = path.lastIndexOf('['); return index == -1 ? path : path.substring(0, index); } return path; } /** * Removes the index from the path if it has an index defined */ public static String removeIndexFromPath(String path) { if (path.endsWith("]")) { int index = path.lastIndexOf('['); if (index != -1) { return path.substring(0, index); } } return path; } /** * Cuts the path from string. * * @param path full path * @return relative path. */ public static String pathOnly(String path) { String curPath = path; curPath = curPath.substring(curPath.indexOf("/")); curPath = curPath.substring(0, curPath.lastIndexOf("/")); if ("".equals(curPath)) { curPath = "/"; } return curPath; } /** * @param path * path * @return parentPath */ public static String parentPath(final String path) { int index = path.lastIndexOf("/"); if (index == -1) { throw new IllegalArgumentException("Invalid path, it must contain at least one '/'"); } String curPath = path.substring(0, index); if (curPath.length() == 0) { curPath = "/"; } return curPath; } /** * Cuts the current name from the path. * * @param path path * @return current name */ public static String nameOnly(String path) { int index = path.lastIndexOf('/'); String name = index == -1 ? path : path.substring(index + 1); if (name.endsWith("]")) { index = name.lastIndexOf('['); return index == -1 ? name : name.substring(0, index); } return name; } /** * Checks if Mime-Type is media mime type. * * @param mimeType Mime-Type * @return true if is media false if not. */ public static boolean isMediaFile(String mimeType) { return mimeType.contains("image"); } /** * Extracts the extension of the file. * * @param filename file name * @return extension or emtpy string if file has no extension */ public static String getExtension(String filename) { int index = filename.lastIndexOf('.'); if (index >= 0) { return filename.substring(index + 1); } return ""; } }