All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.crsh.util.Utils Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2012 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.crsh.util;

import javax.naming.Context;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.Flushable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.net.Socket;
import java.nio.charset.Charset;
import java.sql.*;
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Utils {

  /** . */
  private static final Iterator EMPTY_ITERATOR = Collections.emptyList().iterator();

  /** . */
  private static final Pattern p = Pattern.compile("\\S+");

  public static  Iterator iterator() {
    @SuppressWarnings("unchecked")
    Iterator iterator = (Iterator)EMPTY_ITERATOR;
    return iterator;
  }

  public static  Iterator iterator(final E element) {
    return new BaseIterator() {
      boolean hasNext = true;
      @Override
      public boolean hasNext() {
        return hasNext;
      }
      @Override
      public E next() {
        if (hasNext) {
          hasNext = false;
          return element;
        } else {
          throw new NoSuchElementException();
        }
      }
    };
  }

  public static  E first(Iterable elements) {
    Iterator i = elements.iterator();
    return i.hasNext() ? i.next() : null;
  }

  public static > M map(M map, K key, V value) {
    map.put(key, value);
    return map;
  }

  public static  HashMap map(K key, V value) {
    HashMap map = new HashMap();
    map.put(key, value);
    return map;
  }

  public static  HashSet set(E... elements) {
    HashSet set = new HashSet(elements.length);
    Collections.addAll(set, elements);
    return set;
  }

  public static  List list(E... elements) {
    return Arrays.asList(elements);
  }

  public static  List list(Iterable iterable) {
    return list(iterable.iterator());
  }

  public static  List list(Iterator iterator) {
    ArrayList list = new ArrayList();
    while (iterator.hasNext()) {
      list.add(iterator.next());
    }
    return list;
  }

  public static int indexOf(CharSequence s, int off, char c) {
    for (int len = s.length();off < len;off++) {
      if (s.charAt(off) == c) {
        return off;
      }
    }
    return -1;
  }

  public static String trimLeft(String s) {
    if (s == null) {
      throw new NullPointerException("No null string accepted");
    }
    int index = 0;
    int len = s.length();
    while (index < len) {
      if (s.charAt(index) == ' ') {
        index++;
      } else {
        break;
      }
    }
    if (index > 0) {
      return s.substring(index);
    } else {
      return s;
    }
  }

  private static final Pattern blankPattern = Pattern.compile("^\\s*$");

  public static boolean notBlank(String s) {
    return !blankPattern.matcher(s).find();
  }

  public static  E notNull(E e1, E e2) {
    if (e1 != null) {
      return e1;
    } else {
      return e2;
    }
  }

  /**
   * Return the value when it is positive otherwise return 0.
   *
   * @param value the value
   * @return the non negative value
   */
  public static int notNegative(int value) {
    return value >= 0 ? value : 0;
  }

  private static final Pattern FOO = Pattern.compile("" +
      "(\\*)" + // Wildcard *
      "|" +
      "(\\?)" + // Wildcard ?
      "|" +
      "(?:\\[([^)]+)\\])" + // Range
      "|" +
      "(\\\\.)" // Escape
  );

  /**
   * Create a pattern that transforms a glob expression into a regular expression, the following task are supported
   * 
    *
  • * : Match any number of unknown characters
  • *
  • ? : Match one unknown character
  • *
  • [characters] : Match a character as part of a group of characters
  • *
  • \ : Escape character
  • *
* * @param globex the glob expression * @return the regular expression * @throws NullPointerException when the globex argument is null */ public static String globexToRegex(String globex) throws NullPointerException { if (globex == null) { throw new NullPointerException("No null globex accepted"); } StringBuilder regex = new StringBuilder(); int prev = 0; Matcher matcher = FOO.matcher(globex); while (matcher.find()) { int next = matcher.start(); if (next > prev) { regex.append(Pattern.quote(globex.substring(prev, next))); } if (matcher.group(1) != null) { regex.append(".*"); } else if (matcher.group(2) != null) { regex.append("."); } else if (matcher.group(3) != null) { regex.append("["); regex.append(Pattern.quote(matcher.group(3))); regex.append("]"); } else if (matcher.group(4) != null) { regex.append(Pattern.quote(Character.toString(matcher.group(4).charAt(1)))); } else { throw new UnsupportedOperationException("Not handled yet"); } prev = matcher.end(); } if (prev < globex.length()) { regex.append(Pattern.quote(globex.substring(prev))); } return regex.toString(); } /** <<<<<<< HEAD * Close the socket and catch any exception thrown. * * @param socket the socket to close * @return any Exception thrown during the close operation */ public static Exception close(Socket socket) { if (socket != null) { try { socket.close(); } catch (Exception e) { return e; } } return null; } /** * Close the closeable and catch any exception thrown. * * @param closeable the closeable to close * @return any Exception thrown during the close operation */ public static Exception close(Closeable closeable) { if (closeable != null) { try { closeable.close(); } catch (Exception e) { return e; } } return null; } /** * Close the connection and catch any exception thrown. * * @param connection the socket to close * @return any Exception thrown during the close operation */ public static Exception close(Connection connection) { if (connection != null) { try { connection.close(); } catch (Exception e) { return e; } } return null; } /** * Close the statement and catch any exception thrown. * * @param statement the statement to close * @return any Exception thrown during the close operation */ public static Exception close(java.sql.Statement statement) { if (statement != null) { try { statement.close(); } catch (Exception e) { return e; } } return null; } /** * Close the result set and catch any exception thrown. * * @param rs the result set to close * @return any Exception thrown during the close operation */ public static Exception close(ResultSet rs) { if (rs != null) { try { rs.close(); } catch (Exception e) { return e; } } return null; } /** * Close the context and catch any exception thrown. * * @param context the context to close * @return any Exception thrown during the close operation */ public static Exception close(Context context) { if (context != null) { try { context.close(); } catch (Exception e) { return e; } } return null; } public static void rethrow(Class throwableClass, Throwable cause) throws T { T throwable; // try { throwable = throwableClass.newInstance(); } catch (Exception e) { throw new AssertionError(e); } // throwable.initCause(cause); // throw throwable; } public static boolean equals(Object o1, Object o2) { return o1 == null ? o2 == null : (o2 != null && o1.equals(o2)); } public static boolean notEquals(Object o1, Object o2) { return !equals(o1, o2); } /** * Flush the flushable and catch any exception thrown. * * @param flushable the flushable to flush * @return any Exception thrown during the flush operation */ public static Exception flush(Flushable flushable) { if (flushable != null) { try { flushable.flush(); } catch (Exception e) { return e; } } return null; } public static List chunks(CharSequence s) { List chunks = new ArrayList(); Matcher m = p.matcher(s); while (m.find()) { chunks.add(m.group()); } return chunks; } public static String join(Iterable strings, String separator) { Iterator i = strings.iterator(); if (i.hasNext()) { String first = i.next(); if (i.hasNext()) { StringBuilder buf = new StringBuilder(); buf.append(first); while (i.hasNext()) { buf.append(separator); buf.append(i.next()); } return buf.toString(); } else { return first; } } else { return ""; } } public static String[] split(CharSequence s, char separator) { return foo(s, separator, 0, 0, 0); } public static String[] split(CharSequence s, char separator, int rightPadding) { if (rightPadding < 0) { throw new IllegalArgumentException("Right padding cannot be negative"); } return foo(s, separator, 0, 0, rightPadding); } private static String[] foo(CharSequence s, char separator, int count, int from, int rightPadding) { int len = s.length(); if (from < len) { int to = from; while (to < len && s.charAt(to) != separator) { to++; } String[] ret; if (to == len - 1) { ret = new String[count + 2 + rightPadding]; ret[count + 1] = ""; } else { ret = to == len ? new String[count + 1 + rightPadding] : foo(s, separator, count + 1, to + 1, rightPadding); } ret[count] = from == to ? "" : s.subSequence(from, to).toString(); return ret; } else if (from == len) { return new String[count + rightPadding]; } else { throw new AssertionError(); } } /** * @see #findLongestCommonPrefix(Iterable) */ public static String findLongestCommonPrefix(CharSequence... seqs) { return findLongestCommonPrefix(Arrays.asList(seqs)); } /** * Find the longest possible common prefix of the provided char sequence. * * @param seqs the sequences * @return the longest possible prefix */ public static String findLongestCommonPrefix(Iterable seqs) { String common = ""; out: while (true) { String candidate = null; for (CharSequence s : seqs) { if (common.length() + 1 > s.length()) { break out; } else { if (candidate == null) { candidate = s.subSequence(0, common.length() + 1).toString(); } else if (s.subSequence(0, common.length() + 1).toString().equals(candidate)) { // Ok it is a prefix } else { break out; } } } if (candidate == null) { break; } else { common = candidate; } } return common; } public static byte[] readAsBytes(InputStream in) throws IOException { return read(in).toByteArray(); } public static String readAsUTF8(InputStream in) { try { ByteArrayOutputStream baos = read(in); return baos.toString("UTF-8"); } catch (IOException e) { e.printStackTrace(); return null; } } public static void copy(InputStream in, OutputStream out) throws IOException { if (in == null) { throw new NullPointerException(); } try { byte[] buffer = new byte[256]; for (int l = in.read(buffer); l != -1; l = in.read(buffer)) { out.write(buffer, 0, l); } } finally { close(in); } } private static ByteArrayOutputStream read(InputStream in) throws IOException { if (in == null) { throw new NullPointerException(); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); copy(in, baos); return baos; } /* * Convert an file URL to a file, avoids issues on windows with whitespaces. * * @param url the URL to convert * @return the related file * @throws java.lang.IllegalArgumentException if the url protocol is not file * @throws java.lang.NullPointerException if the url argument is null */ public static File toFile(URL url) throws IllegalArgumentException, NullPointerException { if (url == null) { throw new NullPointerException("No null URL accepted"); } if (!url.getProtocol().equals("file")) { throw new IllegalArgumentException("Not file protocol"); } try { return new File(url.toURI()); } catch(URISyntaxException e) { return new File(url.getPath()); } } public static Class resolveToClass(Type implementation, Class type, int parameterIndex) { if (implementation == null) { throw new NullPointerException("No null type accepted"); } // First resolve to type Type resolvedType = resolve(implementation, type, parameterIndex); // if (resolvedType != null) { return resolveToClass(resolvedType); } else { return null; } } public static Class resolveToClass(Type type) { if (type == null) { throw new NullPointerException("No null type accepted"); } if (type instanceof Class) { return (Class)type; } else if (type instanceof TypeVariable) { TypeVariable resolvedTypeVariable = (TypeVariable)type; return resolveToClass(resolvedTypeVariable.getBounds()[0]); } else { throw new UnsupportedOperationException("Type resolution of " + type + " not yet implemented"); } } /** * A simplistic implementation, it may not handle all cases but it should handle enough. * * @param implementation the type for which the parameter requires a resolution * @param type the type that owns the parameter * @param parameterIndex the parameter index * @return the resolved type */ public static Type resolve(Type implementation, Class type, int parameterIndex) { if (implementation == null) { throw new NullPointerException(); } // if (implementation == type) { TypeVariable>[] tp = type.getTypeParameters(); if (parameterIndex < tp.length) { return tp[parameterIndex]; } else { throw new IllegalArgumentException(); } } else if (implementation instanceof Class) { Class c = (Class) implementation; Type gsc = c.getGenericSuperclass(); Type resolved = null; if (gsc != null) { resolved = resolve(gsc, type, parameterIndex); if (resolved == null) { // Try with interface } } return resolved; } else if (implementation instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) implementation; Type[] typeArgs = pt.getActualTypeArguments(); Type rawType = pt.getRawType(); if (rawType == type) { return typeArgs[parameterIndex]; } else if (rawType instanceof Class) { Class classRawType = (Class)rawType; Type resolved = resolve(classRawType, type, parameterIndex); if (resolved == null) { return null; } else if (resolved instanceof TypeVariable) { TypeVariable resolvedTV = (TypeVariable)resolved; TypeVariable[] a = classRawType.getTypeParameters(); for (int i = 0;i < a.length;i++) { if (a[i].equals(resolvedTV)) { return resolve(implementation, classRawType, i); } } throw new AssertionError(); } else { throw new UnsupportedOperationException("Cannot support resolution of " + resolved); } } else { throw new UnsupportedOperationException(); } } else { throw new UnsupportedOperationException("todo " + implementation + " " + implementation.getClass()); } } public static boolean instanceOf(Class c, List types) { for (String type: types) { if (instanceOf(c, type)) { return true; } } return false; } public static boolean instanceOf(Class c, String type) { if (c.getName().equals(type)) { return true; } for (Class i : c.getInterfaces()) { if (instanceOf(i, type)) { return true; } } if (c.getSuperclass() != null) { return instanceOf(c.getSuperclass(), type); } return false; } /** . */ private static final int ESCAPE = -1, SCANNING = 0, DOLLAR = 1, EVALUATING = 2; /** * Interpolate a string and replace the occurence from a context map, the syntax for a variable * is ${} and it can accept a default value used when the variable cannot be resolved * with the :- separator: * *
    *
  • {} + "foo" => "foo"
  • *
  • {} + "${foo}" => ""
  • *
  • {} + "\\${foo}" => "${foo}"
  • *
  • {foo:bar} + "${foo}" => "bar"
  • *
  • {} + "${foo:-bar}" => "bar"
  • *
* * @param interpolated the value to interpolate * @param context the context * @return the interpolated string * @throws NullPointerException if the interpolated argument is null */ public static String interpolate(String interpolated, Map context) throws NullPointerException { StringBuilder sb = new StringBuilder(); int status = 0; int prev = 0; int length = interpolated.length(); for (int i = 0;i < length;i++) { char c = interpolated.charAt(i); switch (status) { case ESCAPE: if (c == '$') { sb.append('$'); } else { sb.append('\\').append(c); } status = SCANNING; break; case SCANNING: if (c == '$') { status = DOLLAR; } else if (c == '\\') { status = ESCAPE; } else { sb.append(c); } break; case DOLLAR: if (c == '{') { status = EVALUATING; prev = i + 1; } else { sb.append('$').append(c); } break; case EVALUATING: if (c == '}') { int j = prev + 1; while (j < i) { if (j < length && interpolated.charAt(j - 1) == ':' && interpolated.charAt(j) == '-') { break; } else { j++; } } Object value; if (j < i) { String key = interpolated.substring(prev, j - 1); value = context.get(key); if (value == null) { value = interpolated.substring(j + 1, i); } } else { String key = interpolated.substring(prev, i); value = context.get(key); } if (value != null) { sb.append(value); } status = SCANNING; } break; } } switch (status) { case DOLLAR: sb.append('$'); break; case EVALUATING: sb.append("${").append(interpolated, prev, interpolated.length()); break; } return sb.toString(); } /** * @return the current user directory */ public static File getCurrentDirectory() { String userDir = System.getProperty("user.dir"); return new File(userDir); } /** . */ public static final Charset UTF_8; static { UTF_8 = Charset.forName("UTF-8"); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy