| /* |
| * 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.felix.bundlerepository; |
| |
| import java.io.*; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.Constants; |
| |
| public class Util |
| { |
| public static String getClassName(String className) |
| { |
| if (className == null) |
| { |
| className = ""; |
| } |
| return (className.lastIndexOf('.') < 0) |
| ? "" : className.substring(className.lastIndexOf('.') + 1); |
| } |
| |
| public static String getBundleName(Bundle bundle) |
| { |
| String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME); |
| return (name == null) |
| ? "Bundle " + Long.toString(bundle.getBundleId()) |
| : name; |
| } |
| |
| /** |
| * Parses delimited string and returns an array containing the tokens. This |
| * parser obeys quotes, so the delimiter character will be ignored if it is |
| * inside of a quote. This method assumes that the quote character is not |
| * included in the set of delimiter characters. |
| * @param value the delimited string to parse. |
| * @param delim the characters delimiting the tokens. |
| * @return an array of string tokens or null if there were no tokens. |
| **/ |
| public static String[] parseDelimitedString(String value, String delim) |
| { |
| if (value == null) |
| { |
| value = ""; |
| } |
| |
| List list = new ArrayList(); |
| |
| int CHAR = 1; |
| int DELIMITER = 2; |
| int STARTQUOTE = 4; |
| int ENDQUOTE = 8; |
| |
| StringBuffer sb = new StringBuffer(); |
| |
| int expecting = (CHAR | DELIMITER | STARTQUOTE); |
| |
| for (int i = 0; i < value.length(); i++) |
| { |
| char c = value.charAt(i); |
| |
| boolean isDelimiter = (delim.indexOf(c) >= 0); |
| boolean isQuote = (c == '"'); |
| |
| if (isDelimiter && ((expecting & DELIMITER) > 0)) |
| { |
| list.add(sb.toString().trim()); |
| sb.delete(0, sb.length()); |
| expecting = (CHAR | DELIMITER | STARTQUOTE); |
| } |
| else if (isQuote && ((expecting & STARTQUOTE) > 0)) |
| { |
| sb.append(c); |
| expecting = CHAR | ENDQUOTE; |
| } |
| else if (isQuote && ((expecting & ENDQUOTE) > 0)) |
| { |
| sb.append(c); |
| expecting = (CHAR | STARTQUOTE | DELIMITER); |
| } |
| else if ((expecting & CHAR) > 0) |
| { |
| sb.append(c); |
| } |
| else |
| { |
| throw new IllegalArgumentException("Invalid delimited string: " + value); |
| } |
| } |
| |
| if (sb.length() > 0) |
| { |
| list.add(sb.toString().trim()); |
| } |
| |
| return (String[]) list.toArray(new String[list.size()]); |
| } |
| |
| public static int compareVersion(int[] v1, int[] v2) |
| { |
| if (v1[0] > v2[0]) |
| { |
| return 1; |
| } |
| else if (v1[0] < v2[0]) |
| { |
| return -1; |
| } |
| else if (v1[1] > v2[1]) |
| { |
| return 1; |
| } |
| else if (v1[1] < v2[1]) |
| { |
| return -1; |
| } |
| else if (v1[2] > v2[2]) |
| { |
| return 1; |
| } |
| else if (v1[2] < v2[2]) |
| { |
| return -1; |
| } |
| return 0; |
| } |
| |
| private static final byte encTab[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, |
| 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, |
| 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, |
| 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, |
| 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, |
| 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f }; |
| |
| private static final byte decTab[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, |
| -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, |
| -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, |
| 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, |
| 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, |
| 48, 49, 50, 51, -1, -1, -1, -1, -1 }; |
| |
| public static String base64Encode(String s) throws IOException |
| { |
| return encode(s.getBytes(), 0); |
| } |
| |
| /** |
| * Encode a raw byte array to a Base64 String. |
| * |
| * @param in Byte array to encode. |
| * @param len Length of Base64 lines. 0 means no line breaks. |
| **/ |
| public static String encode(byte[] in, int len) throws IOException |
| { |
| ByteArrayOutputStream baos = null; |
| ByteArrayInputStream bais = null; |
| try |
| { |
| baos = new ByteArrayOutputStream(); |
| bais = new ByteArrayInputStream(in); |
| encode(bais, baos, len); |
| // ASCII byte array to String |
| return (new String(baos.toByteArray())); |
| } |
| finally |
| { |
| if (baos != null) |
| { |
| baos.close(); |
| } |
| if (bais != null) |
| { |
| bais.close(); |
| } |
| } |
| } |
| |
| public static void encode(InputStream in, OutputStream out, int len) |
| throws IOException |
| { |
| |
| // Check that length is a multiple of 4 bytes |
| if (len % 4 != 0) |
| { |
| throw new IllegalArgumentException("Length must be a multiple of 4"); |
| } |
| |
| // Read input stream until end of file |
| int bits = 0; |
| int nbits = 0; |
| int nbytes = 0; |
| int b; |
| |
| while ((b = in.read()) != -1) |
| { |
| bits = (bits << 8) | b; |
| nbits += 8; |
| while (nbits >= 6) |
| { |
| nbits -= 6; |
| out.write(encTab[0x3f & (bits >> nbits)]); |
| nbytes++; |
| // New line |
| if (len != 0 && nbytes >= len) |
| { |
| out.write(0x0d); |
| out.write(0x0a); |
| nbytes -= len; |
| } |
| } |
| } |
| |
| switch (nbits) |
| { |
| case 2: |
| out.write(encTab[0x3f & (bits << 4)]); |
| out.write(0x3d); // 0x3d = '=' |
| out.write(0x3d); |
| break; |
| case 4: |
| out.write(encTab[0x3f & (bits << 2)]); |
| out.write(0x3d); |
| break; |
| } |
| |
| if (len != 0) |
| { |
| if (nbytes != 0) |
| { |
| out.write(0x0d); |
| out.write(0x0a); |
| } |
| out.write(0x0d); |
| out.write(0x0a); |
| } |
| } |
| } |