diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-02-24 19:54:22 -0800 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2010-02-25 11:39:33 -0800 |
commit | 5dda951bcfbc600ae25efb58920586e31def1f8e (patch) | |
tree | 5a22f0322b2d038eccd720e31e4bf093b8b5f61d /common | |
parent | d49c1ced10a5019b237064b8a5061a1cd9abdce3 (diff) | |
download | frameworks_native-5dda951bcfbc600ae25efb58920586e31def1f8e.zip frameworks_native-5dda951bcfbc600ae25efb58920586e31def1f8e.tar.gz frameworks_native-5dda951bcfbc600ae25efb58920586e31def1f8e.tar.bz2 |
Re-arrange android-common so framework no longer links with it.
This is the framework part, moving classes around so the framework
no longer needs to link to android-common. Makes some APIs public,
others that didn't need to be public are private in the framework,
some small things are copied.
Diffstat (limited to 'common')
18 files changed, 1 insertions, 3513 deletions
diff --git a/common/java/com/android/common/AndroidHttpClient.java b/common/java/com/android/common/AndroidHttpClient.java deleted file mode 100644 index 4c65eb0..0000000 --- a/common/java/com/android/common/AndroidHttpClient.java +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.HttpEntityEnclosingRequest; -import org.apache.http.HttpException; -import org.apache.http.HttpHost; -import org.apache.http.HttpRequest; -import org.apache.http.HttpRequestInterceptor; -import org.apache.http.HttpResponse; -import org.apache.http.entity.AbstractHttpEntity; -import org.apache.http.entity.ByteArrayEntity; -import org.apache.http.client.HttpClient; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.protocol.ClientContext; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.params.HttpClientParams; -import org.apache.http.conn.ClientConnectionManager; -import org.apache.http.conn.scheme.PlainSocketFactory; -import org.apache.http.conn.scheme.Scheme; -import org.apache.http.conn.scheme.SchemeRegistry; -import org.apache.http.conn.ssl.SSLSocketFactory; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.client.RequestWrapper; -import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpParams; -import org.apache.http.params.HttpProtocolParams; -import org.apache.http.protocol.BasicHttpProcessor; -import org.apache.http.protocol.HttpContext; -import org.apache.http.protocol.BasicHttpContext; - -import java.io.IOException; -import java.io.InputStream; -import java.io.ByteArrayOutputStream; -import java.io.OutputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; -import java.net.URI; -import java.security.KeyManagementException; - -import android.content.Context; -import android.content.ContentResolver; -import android.net.SSLCertificateSocketFactory; -import android.net.SSLSessionCache; -import android.os.Looper; -import android.util.Log; - -/** - * Subclass of the Apache {@link DefaultHttpClient} that is configured with - * reasonable default settings and registered schemes for Android, and - * also lets the user add {@link HttpRequestInterceptor} classes. - * Don't create this directly, use the {@link #newInstance} factory method. - * - * <p>This client processes cookies but does not retain them by default. - * To retain cookies, simply add a cookie store to the HttpContext:</p> - * - * <pre>context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);</pre> - */ -public final class AndroidHttpClient implements HttpClient { - - // Gzip of data shorter than this probably won't be worthwhile - public static long DEFAULT_SYNC_MIN_GZIP_BYTES = 256; - - private static final String TAG = "AndroidHttpClient"; - - - /** Interceptor throws an exception if the executing thread is blocked */ - private static final HttpRequestInterceptor sThreadCheckInterceptor = - new HttpRequestInterceptor() { - public void process(HttpRequest request, HttpContext context) { - // Prevent the HttpRequest from being sent on the main thread - if (Looper.myLooper() != null && Looper.myLooper() == Looper.getMainLooper() ) { - throw new RuntimeException("This thread forbids HTTP requests"); - } - } - }; - - /** - * Create a new HttpClient with reasonable defaults (which you can update). - * - * @param userAgent to report in your HTTP requests - * @param context to use for caching SSL sessions (may be null for no caching) - * @return AndroidHttpClient for you to use for all your requests. - */ - public static AndroidHttpClient newInstance(String userAgent, Context context) { - HttpParams params = new BasicHttpParams(); - - // Turn off stale checking. Our connections break all the time anyway, - // and it's not worth it to pay the penalty of checking every time. - HttpConnectionParams.setStaleCheckingEnabled(params, false); - - // Default connection and socket timeout of 20 seconds. Tweak to taste. - HttpConnectionParams.setConnectionTimeout(params, 20 * 1000); - HttpConnectionParams.setSoTimeout(params, 20 * 1000); - HttpConnectionParams.setSocketBufferSize(params, 8192); - - // Don't handle redirects -- return them to the caller. Our code - // often wants to re-POST after a redirect, which we must do ourselves. - HttpClientParams.setRedirecting(params, false); - - // Use a session cache for SSL sockets - SSLSessionCache sessionCache = context == null ? null : new SSLSessionCache(context); - - // Set the specified user agent and register standard protocols. - HttpProtocolParams.setUserAgent(params, userAgent); - SchemeRegistry schemeRegistry = new SchemeRegistry(); - schemeRegistry.register(new Scheme("http", - PlainSocketFactory.getSocketFactory(), 80)); - schemeRegistry.register(new Scheme("https", - SSLCertificateSocketFactory.getHttpSocketFactory(30 * 1000, sessionCache), 443)); - - ClientConnectionManager manager = - new ThreadSafeClientConnManager(params, schemeRegistry); - - // We use a factory method to modify superclass initialization - // parameters without the funny call-a-static-method dance. - return new AndroidHttpClient(manager, params); - } - - /** - * Create a new HttpClient with reasonable defaults (which you can update). - * @param userAgent to report in your HTTP requests. - * @return AndroidHttpClient for you to use for all your requests. - */ - public static AndroidHttpClient newInstance(String userAgent) { - return newInstance(userAgent, null /* session cache */); - } - - private final HttpClient delegate; - - private RuntimeException mLeakedException = new IllegalStateException( - "AndroidHttpClient created and never closed"); - - private AndroidHttpClient(ClientConnectionManager ccm, HttpParams params) { - this.delegate = new DefaultHttpClient(ccm, params) { - @Override - protected BasicHttpProcessor createHttpProcessor() { - // Add interceptor to prevent making requests from main thread. - BasicHttpProcessor processor = super.createHttpProcessor(); - processor.addRequestInterceptor(sThreadCheckInterceptor); - processor.addRequestInterceptor(new CurlLogger()); - - return processor; - } - - @Override - protected HttpContext createHttpContext() { - // Same as DefaultHttpClient.createHttpContext() minus the - // cookie store. - HttpContext context = new BasicHttpContext(); - context.setAttribute( - ClientContext.AUTHSCHEME_REGISTRY, - getAuthSchemes()); - context.setAttribute( - ClientContext.COOKIESPEC_REGISTRY, - getCookieSpecs()); - context.setAttribute( - ClientContext.CREDS_PROVIDER, - getCredentialsProvider()); - return context; - } - }; - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - if (mLeakedException != null) { - Log.e(TAG, "Leak found", mLeakedException); - mLeakedException = null; - } - } - - /** - * Modifies a request to indicate to the server that we would like a - * gzipped response. (Uses the "Accept-Encoding" HTTP header.) - * @param request the request to modify - * @see #getUngzippedContent - */ - public static void modifyRequestToAcceptGzipResponse(HttpRequest request) { - request.addHeader("Accept-Encoding", "gzip"); - } - - /** - * Gets the input stream from a response entity. If the entity is gzipped - * then this will get a stream over the uncompressed data. - * - * @param entity the entity whose content should be read - * @return the input stream to read from - * @throws IOException - */ - public static InputStream getUngzippedContent(HttpEntity entity) - throws IOException { - InputStream responseStream = entity.getContent(); - if (responseStream == null) return responseStream; - Header header = entity.getContentEncoding(); - if (header == null) return responseStream; - String contentEncoding = header.getValue(); - if (contentEncoding == null) return responseStream; - if (contentEncoding.contains("gzip")) responseStream - = new GZIPInputStream(responseStream); - return responseStream; - } - - /** - * Release resources associated with this client. You must call this, - * or significant resources (sockets and memory) may be leaked. - */ - public void close() { - if (mLeakedException != null) { - getConnectionManager().shutdown(); - mLeakedException = null; - } - } - - public HttpParams getParams() { - return delegate.getParams(); - } - - public ClientConnectionManager getConnectionManager() { - return delegate.getConnectionManager(); - } - - public HttpResponse execute(HttpUriRequest request) throws IOException { - return delegate.execute(request); - } - - public HttpResponse execute(HttpUriRequest request, HttpContext context) - throws IOException { - return delegate.execute(request, context); - } - - public HttpResponse execute(HttpHost target, HttpRequest request) - throws IOException { - return delegate.execute(target, request); - } - - public HttpResponse execute(HttpHost target, HttpRequest request, - HttpContext context) throws IOException { - return delegate.execute(target, request, context); - } - - public <T> T execute(HttpUriRequest request, - ResponseHandler<? extends T> responseHandler) - throws IOException, ClientProtocolException { - return delegate.execute(request, responseHandler); - } - - public <T> T execute(HttpUriRequest request, - ResponseHandler<? extends T> responseHandler, HttpContext context) - throws IOException, ClientProtocolException { - return delegate.execute(request, responseHandler, context); - } - - public <T> T execute(HttpHost target, HttpRequest request, - ResponseHandler<? extends T> responseHandler) throws IOException, - ClientProtocolException { - return delegate.execute(target, request, responseHandler); - } - - public <T> T execute(HttpHost target, HttpRequest request, - ResponseHandler<? extends T> responseHandler, HttpContext context) - throws IOException, ClientProtocolException { - return delegate.execute(target, request, responseHandler, context); - } - - /** - * Compress data to send to server. - * Creates a Http Entity holding the gzipped data. - * The data will not be compressed if it is too short. - * @param data The bytes to compress - * @return Entity holding the data - */ - public static AbstractHttpEntity getCompressedEntity(byte data[], ContentResolver resolver) - throws IOException { - AbstractHttpEntity entity; - if (data.length < getMinGzipSize(resolver)) { - entity = new ByteArrayEntity(data); - } else { - ByteArrayOutputStream arr = new ByteArrayOutputStream(); - OutputStream zipper = new GZIPOutputStream(arr); - zipper.write(data); - zipper.close(); - entity = new ByteArrayEntity(arr.toByteArray()); - entity.setContentEncoding("gzip"); - } - return entity; - } - - /** - * Retrieves the minimum size for compressing data. - * Shorter data will not be compressed. - */ - public static long getMinGzipSize(ContentResolver resolver) { - return DEFAULT_SYNC_MIN_GZIP_BYTES; // For now, this is just a constant. - } - - /* cURL logging support. */ - - /** - * Logging tag and level. - */ - private static class LoggingConfiguration { - - private final String tag; - private final int level; - - private LoggingConfiguration(String tag, int level) { - this.tag = tag; - this.level = level; - } - - /** - * Returns true if logging is turned on for this configuration. - */ - private boolean isLoggable() { - return Log.isLoggable(tag, level); - } - - /** - * Prints a message using this configuration. - */ - private void println(String message) { - Log.println(level, tag, message); - } - } - - /** cURL logging configuration. */ - private volatile LoggingConfiguration curlConfiguration; - - /** - * Enables cURL request logging for this client. - * - * @param name to log messages with - * @param level at which to log messages (see {@link android.util.Log}) - */ - public void enableCurlLogging(String name, int level) { - if (name == null) { - throw new NullPointerException("name"); - } - if (level < Log.VERBOSE || level > Log.ASSERT) { - throw new IllegalArgumentException("Level is out of range [" - + Log.VERBOSE + ".." + Log.ASSERT + "]"); - } - - curlConfiguration = new LoggingConfiguration(name, level); - } - - /** - * Disables cURL logging for this client. - */ - public void disableCurlLogging() { - curlConfiguration = null; - } - - /** - * Logs cURL commands equivalent to requests. - */ - private class CurlLogger implements HttpRequestInterceptor { - public void process(HttpRequest request, HttpContext context) - throws HttpException, IOException { - LoggingConfiguration configuration = curlConfiguration; - if (configuration != null - && configuration.isLoggable() - && request instanceof HttpUriRequest) { - // Never print auth token -- we used to check ro.secure=0 to - // enable that, but can't do that in unbundled code. - configuration.println(toCurl((HttpUriRequest) request, false)); - } - } - } - - /** - * Generates a cURL command equivalent to the given request. - */ - private static String toCurl(HttpUriRequest request, boolean logAuthToken) throws IOException { - StringBuilder builder = new StringBuilder(); - - builder.append("curl "); - - for (Header header: request.getAllHeaders()) { - if (!logAuthToken - && (header.getName().equals("Authorization") || - header.getName().equals("Cookie"))) { - continue; - } - builder.append("--header \""); - builder.append(header.toString().trim()); - builder.append("\" "); - } - - URI uri = request.getURI(); - - // If this is a wrapped request, use the URI from the original - // request instead. getURI() on the wrapper seems to return a - // relative URI. We want an absolute URI. - if (request instanceof RequestWrapper) { - HttpRequest original = ((RequestWrapper) request).getOriginal(); - if (original instanceof HttpUriRequest) { - uri = ((HttpUriRequest) original).getURI(); - } - } - - builder.append("\""); - builder.append(uri); - builder.append("\""); - - if (request instanceof HttpEntityEnclosingRequest) { - HttpEntityEnclosingRequest entityRequest = - (HttpEntityEnclosingRequest) request; - HttpEntity entity = entityRequest.getEntity(); - if (entity != null && entity.isRepeatable()) { - if (entity.getContentLength() < 1024) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - entity.writeTo(stream); - String entityString = stream.toString(); - - // TODO: Check the content type, too. - builder.append(" --data-ascii \"") - .append(entityString) - .append("\""); - } else { - builder.append(" [TOO MUCH DATA TO INCLUDE]"); - } - } - } - - return builder.toString(); - } -} diff --git a/common/java/com/android/common/DNParser.java b/common/java/com/android/common/DNParser.java deleted file mode 100644 index 32d57c0..0000000 --- a/common/java/com/android/common/DNParser.java +++ /dev/null @@ -1,447 +0,0 @@ -/* - * 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 com.android.common; - -import android.util.Log; - -import java.io.IOException; - -import javax.security.auth.x500.X500Principal; - -/** - * A simple distinguished name(DN) parser. - * - * <p>This class is based on org.apache.harmony.security.x509.DNParser. It's customized to remove - * external references which are unnecessary for our requirements. - * - * <p>This class is only meant for extracting a string value from a DN. e.g. it doesn't support - * values in the hex-string style. - * - * <p>This class is used by {@link DomainNameValidator} only. However, in order to make this - * class visible from unit tests, it's made public. - */ -public final class DNParser { - private static final String TAG = "DNParser"; - - /** DN to be parsed. */ - private final String dn; - - // length of distinguished name string - private final int length; - - private int pos, beg, end; - - // tmp vars to store positions of the currently parsed item - private int cur; - - // distinguished name chars - private char[] chars; - - /** - * Exception message thrown when we failed to parse DN, which shouldn't happen because we - * only handle DNs that {@link X500Principal#getName} returns, which shouldn't be malformed. - */ - private static final String ERROR_PARSE_ERROR = "Failed to parse DN"; - - /** - * Constructor. - * - * @param principal - {@link X500Principal} to be parsed - */ - public DNParser(X500Principal principal) { - this.dn = principal.getName(X500Principal.RFC2253); - this.length = dn.length(); - } - - // gets next attribute type: (ALPHA 1*keychar) / oid - private String nextAT() throws IOException { - - // skip preceding space chars, they can present after - // comma or semicolon (compatibility with RFC 1779) - for (; pos < length && chars[pos] == ' '; pos++) { - } - if (pos == length) { - return null; // reached the end of DN - } - - // mark the beginning of attribute type - beg = pos; - - // attribute type chars - pos++; - for (; pos < length && chars[pos] != '=' && chars[pos] != ' '; pos++) { - // we don't follow exact BNF syntax here: - // accept any char except space and '=' - } - if (pos >= length) { - // unexpected end of DN - throw new IOException(ERROR_PARSE_ERROR); - } - - // mark the end of attribute type - end = pos; - - // skip trailing space chars between attribute type and '=' - // (compatibility with RFC 1779) - if (chars[pos] == ' ') { - for (; pos < length && chars[pos] != '=' && chars[pos] == ' '; pos++) { - } - - if (chars[pos] != '=' || pos == length) { - // unexpected end of DN - throw new IOException(ERROR_PARSE_ERROR); - } - } - - pos++; //skip '=' char - - // skip space chars between '=' and attribute value - // (compatibility with RFC 1779) - for (; pos < length && chars[pos] == ' '; pos++) { - } - - // in case of oid attribute type skip its prefix: "oid." or "OID." - // (compatibility with RFC 1779) - if ((end - beg > 4) && (chars[beg + 3] == '.') - && (chars[beg] == 'O' || chars[beg] == 'o') - && (chars[beg + 1] == 'I' || chars[beg + 1] == 'i') - && (chars[beg + 2] == 'D' || chars[beg + 2] == 'd')) { - beg += 4; - } - - return new String(chars, beg, end - beg); - } - - // gets quoted attribute value: QUOTATION *( quotechar / pair ) QUOTATION - private String quotedAV() throws IOException { - - pos++; - beg = pos; - end = beg; - while (true) { - - if (pos == length) { - // unexpected end of DN - throw new IOException(ERROR_PARSE_ERROR); - } - - if (chars[pos] == '"') { - // enclosing quotation was found - pos++; - break; - } else if (chars[pos] == '\\') { - chars[end] = getEscaped(); - } else { - // shift char: required for string with escaped chars - chars[end] = chars[pos]; - } - pos++; - end++; - } - - // skip trailing space chars before comma or semicolon. - // (compatibility with RFC 1779) - for (; pos < length && chars[pos] == ' '; pos++) { - } - - return new String(chars, beg, end - beg); - } - - // gets hex string attribute value: "#" hexstring - private String hexAV() throws IOException { - - if (pos + 4 >= length) { - // encoded byte array must be not less then 4 c - throw new IOException(ERROR_PARSE_ERROR); - } - - beg = pos; // store '#' position - pos++; - while (true) { - - // check for end of attribute value - // looks for space and component separators - if (pos == length || chars[pos] == '+' || chars[pos] == ',' - || chars[pos] == ';') { - end = pos; - break; - } - - if (chars[pos] == ' ') { - end = pos; - pos++; - // skip trailing space chars before comma or semicolon. - // (compatibility with RFC 1779) - for (; pos < length && chars[pos] == ' '; pos++) { - } - break; - } else if (chars[pos] >= 'A' && chars[pos] <= 'F') { - chars[pos] += 32; //to low case - } - - pos++; - } - - // verify length of hex string - // encoded byte array must be not less then 4 and must be even number - int hexLen = end - beg; // skip first '#' char - if (hexLen < 5 || (hexLen & 1) == 0) { - throw new IOException(ERROR_PARSE_ERROR); - } - - // get byte encoding from string representation - byte[] encoded = new byte[hexLen / 2]; - for (int i = 0, p = beg + 1; i < encoded.length; p += 2, i++) { - encoded[i] = (byte) getByte(p); - } - - return new String(chars, beg, hexLen); - } - - // gets string attribute value: *( stringchar / pair ) - private String escapedAV() throws IOException { - - beg = pos; - end = pos; - while (true) { - - if (pos >= length) { - // the end of DN has been found - return new String(chars, beg, end - beg); - } - - switch (chars[pos]) { - case '+': - case ',': - case ';': - // separator char has beed found - return new String(chars, beg, end - beg); - case '\\': - // escaped char - chars[end++] = getEscaped(); - pos++; - break; - case ' ': - // need to figure out whether space defines - // the end of attribute value or not - cur = end; - - pos++; - chars[end++] = ' '; - - for (; pos < length && chars[pos] == ' '; pos++) { - chars[end++] = ' '; - } - if (pos == length || chars[pos] == ',' || chars[pos] == '+' - || chars[pos] == ';') { - // separator char or the end of DN has beed found - return new String(chars, beg, cur - beg); - } - break; - default: - chars[end++] = chars[pos]; - pos++; - } - } - } - - // returns escaped char - private char getEscaped() throws IOException { - - pos++; - if (pos == length) { - throw new IOException(ERROR_PARSE_ERROR); - } - - switch (chars[pos]) { - case '"': - case '\\': - case ',': - case '=': - case '+': - case '<': - case '>': - case '#': - case ';': - case ' ': - case '*': - case '%': - case '_': - //FIXME: escaping is allowed only for leading or trailing space char - return chars[pos]; - default: - // RFC doesn't explicitly say that escaped hex pair is - // interpreted as UTF-8 char. It only contains an example of such DN. - return getUTF8(); - } - } - - // decodes UTF-8 char - // see http://www.unicode.org for UTF-8 bit distribution table - private char getUTF8() throws IOException { - - int res = getByte(pos); - pos++; //FIXME tmp - - if (res < 128) { // one byte: 0-7F - return (char) res; - } else if (res >= 192 && res <= 247) { - - int count; - if (res <= 223) { // two bytes: C0-DF - count = 1; - res = res & 0x1F; - } else if (res <= 239) { // three bytes: E0-EF - count = 2; - res = res & 0x0F; - } else { // four bytes: F0-F7 - count = 3; - res = res & 0x07; - } - - int b; - for (int i = 0; i < count; i++) { - pos++; - if (pos == length || chars[pos] != '\\') { - return 0x3F; //FIXME failed to decode UTF-8 char - return '?' - } - pos++; - - b = getByte(pos); - pos++; //FIXME tmp - if ((b & 0xC0) != 0x80) { - return 0x3F; //FIXME failed to decode UTF-8 char - return '?' - } - - res = (res << 6) + (b & 0x3F); - } - return (char) res; - } else { - return 0x3F; //FIXME failed to decode UTF-8 char - return '?' - } - } - - // Returns byte representation of a char pair - // The char pair is composed of DN char in - // specified 'position' and the next char - // According to BNF syntax: - // hexchar = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" - // / "a" / "b" / "c" / "d" / "e" / "f" - private int getByte(int position) throws IOException { - - if ((position + 1) >= length) { - // to avoid ArrayIndexOutOfBoundsException - throw new IOException(ERROR_PARSE_ERROR); - } - - int b1, b2; - - b1 = chars[position]; - if (b1 >= '0' && b1 <= '9') { - b1 = b1 - '0'; - } else if (b1 >= 'a' && b1 <= 'f') { - b1 = b1 - 87; // 87 = 'a' - 10 - } else if (b1 >= 'A' && b1 <= 'F') { - b1 = b1 - 55; // 55 = 'A' - 10 - } else { - throw new IOException(ERROR_PARSE_ERROR); - } - - b2 = chars[position + 1]; - if (b2 >= '0' && b2 <= '9') { - b2 = b2 - '0'; - } else if (b2 >= 'a' && b2 <= 'f') { - b2 = b2 - 87; // 87 = 'a' - 10 - } else if (b2 >= 'A' && b2 <= 'F') { - b2 = b2 - 55; // 55 = 'A' - 10 - } else { - throw new IOException(ERROR_PARSE_ERROR); - } - - return (b1 << 4) + b2; - } - - /** - * Parses the DN and returns the attribute value for an attribute type. - * - * @param attributeType attribute type to look for (e.g. "ca") - * @return value of the attribute that first found, or null if none found - */ - public String find(String attributeType) { - try { - // Initialize internal state. - pos = 0; - beg = 0; - end = 0; - cur = 0; - chars = dn.toCharArray(); - - String attType = nextAT(); - if (attType == null) { - return null; - } - while (true) { - String attValue = ""; - - if (pos == length) { - return null; - } - - switch (chars[pos]) { - case '"': - attValue = quotedAV(); - break; - case '#': - attValue = hexAV(); - break; - case '+': - case ',': - case ';': // compatibility with RFC 1779: semicolon can separate RDNs - //empty attribute value - break; - default: - attValue = escapedAV(); - } - - if (attributeType.equalsIgnoreCase(attType)) { - return attValue; - } - - if (pos >= length) { - return null; - } - - if (chars[pos] == ',' || chars[pos] == ';') { - } else if (chars[pos] != '+') { - throw new IOException(ERROR_PARSE_ERROR); - } - - pos++; - attType = nextAT(); - if (attType == null) { - throw new IOException(ERROR_PARSE_ERROR); - } - } - } catch (IOException e) { - // Parse error shouldn't happen, because we only handle DNs that - // X500Principal.getName() returns, which shouldn't be malformed. - Log.e(TAG, "Failed to parse DN: " + dn); - return null; - } - } -} diff --git a/common/java/com/android/common/DomainNameValidator.java b/common/java/com/android/common/DomainNameValidator.java deleted file mode 100644 index 25dc007..0000000 --- a/common/java/com/android/common/DomainNameValidator.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import android.util.Config; -import android.util.Log; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.security.cert.CertificateParsingException; -import java.security.cert.X509Certificate; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; - -import javax.security.auth.x500.X500Principal; - -public class DomainNameValidator { - private final static String TAG = "DomainNameValidator"; - - private static final boolean DEBUG = false; - private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV; - - private static Pattern QUICK_IP_PATTERN; - static { - try { - QUICK_IP_PATTERN = Pattern.compile("^[a-f0-9\\.:]+$"); - } catch (PatternSyntaxException e) {} - } - - private static final int ALT_DNS_NAME = 2; - private static final int ALT_IPA_NAME = 7; - - /** - * Checks the site certificate against the domain name of the site being visited - * @param certificate The certificate to check - * @param thisDomain The domain name of the site being visited - * @return True iff if there is a domain match as specified by RFC2818 - */ - public static boolean match(X509Certificate certificate, String thisDomain) { - if (certificate == null || thisDomain == null || thisDomain.length() == 0) { - return false; - } - - thisDomain = thisDomain.toLowerCase(); - if (!isIpAddress(thisDomain)) { - return matchDns(certificate, thisDomain); - } else { - return matchIpAddress(certificate, thisDomain); - } - } - - /** - * @return True iff the domain name is specified as an IP address - */ - private static boolean isIpAddress(String domain) { - boolean rval = (domain != null && domain.length() != 0); - if (rval) { - try { - // do a quick-dirty IP match first to avoid DNS lookup - rval = QUICK_IP_PATTERN.matcher(domain).matches(); - if (rval) { - rval = domain.equals( - InetAddress.getByName(domain).getHostAddress()); - } - } catch (UnknownHostException e) { - String errorMessage = e.getMessage(); - if (errorMessage == null) { - errorMessage = "unknown host exception"; - } - - if (LOG_ENABLED) { - Log.v(TAG, "DomainNameValidator.isIpAddress(): " + errorMessage); - } - - rval = false; - } - } - - return rval; - } - - /** - * Checks the site certificate against the IP domain name of the site being visited - * @param certificate The certificate to check - * @param thisDomain The DNS domain name of the site being visited - * @return True iff if there is a domain match as specified by RFC2818 - */ - private static boolean matchIpAddress(X509Certificate certificate, String thisDomain) { - if (LOG_ENABLED) { - Log.v(TAG, "DomainNameValidator.matchIpAddress(): this domain: " + thisDomain); - } - - try { - Collection subjectAltNames = certificate.getSubjectAlternativeNames(); - if (subjectAltNames != null) { - Iterator i = subjectAltNames.iterator(); - while (i.hasNext()) { - List altNameEntry = (List)(i.next()); - if (altNameEntry != null && 2 <= altNameEntry.size()) { - Integer altNameType = (Integer)(altNameEntry.get(0)); - if (altNameType != null) { - if (altNameType.intValue() == ALT_IPA_NAME) { - String altName = (String)(altNameEntry.get(1)); - if (altName != null) { - if (LOG_ENABLED) { - Log.v(TAG, "alternative IP: " + altName); - } - if (thisDomain.equalsIgnoreCase(altName)) { - return true; - } - } - } - } - } - } - } - } catch (CertificateParsingException e) {} - - return false; - } - - /** - * Checks the site certificate against the DNS domain name of the site being visited - * @param certificate The certificate to check - * @param thisDomain The DNS domain name of the site being visited - * @return True iff if there is a domain match as specified by RFC2818 - */ - private static boolean matchDns(X509Certificate certificate, String thisDomain) { - boolean hasDns = false; - try { - Collection subjectAltNames = certificate.getSubjectAlternativeNames(); - if (subjectAltNames != null) { - Iterator i = subjectAltNames.iterator(); - while (i.hasNext()) { - List altNameEntry = (List)(i.next()); - if (altNameEntry != null && 2 <= altNameEntry.size()) { - Integer altNameType = (Integer)(altNameEntry.get(0)); - if (altNameType != null) { - if (altNameType.intValue() == ALT_DNS_NAME) { - hasDns = true; - String altName = (String)(altNameEntry.get(1)); - if (altName != null) { - if (matchDns(thisDomain, altName)) { - return true; - } - } - } - } - } - } - } - } catch (CertificateParsingException e) { - String errorMessage = e.getMessage(); - if (errorMessage == null) { - errorMessage = "failed to parse certificate"; - } - - Log.w(TAG, "DomainNameValidator.matchDns(): " + errorMessage); - return false; - } - - if (!hasDns) { - final String cn = new DNParser(certificate.getSubjectX500Principal()) - .find("cn"); - if (LOG_ENABLED) { - Log.v(TAG, "Validating subject: DN:" - + certificate.getSubjectX500Principal().getName(X500Principal.CANONICAL) - + " CN:" + cn); - } - if (cn != null) { - return matchDns(thisDomain, cn); - } - } - - return false; - } - - /** - * @param thisDomain The domain name of the site being visited - * @param thatDomain The domain name from the certificate - * @return True iff thisDomain matches thatDomain as specified by RFC2818 - */ - // not private for testing - public static boolean matchDns(String thisDomain, String thatDomain) { - if (LOG_ENABLED) { - Log.v(TAG, "DomainNameValidator.matchDns():" + - " this domain: " + thisDomain + - " that domain: " + thatDomain); - } - - if (thisDomain == null || thisDomain.length() == 0 || - thatDomain == null || thatDomain.length() == 0) { - return false; - } - - thatDomain = thatDomain.toLowerCase(); - - // (a) domain name strings are equal, ignoring case: X matches X - boolean rval = thisDomain.equals(thatDomain); - if (!rval) { - String[] thisDomainTokens = thisDomain.split("\\."); - String[] thatDomainTokens = thatDomain.split("\\."); - - int thisDomainTokensNum = thisDomainTokens.length; - int thatDomainTokensNum = thatDomainTokens.length; - - // (b) OR thatHost is a '.'-suffix of thisHost: Z.Y.X matches X - if (thisDomainTokensNum >= thatDomainTokensNum) { - for (int i = thatDomainTokensNum - 1; i >= 0; --i) { - rval = thisDomainTokens[i].equals(thatDomainTokens[i]); - if (!rval) { - // (c) OR we have a special *-match: - // *.Y.X matches Z.Y.X but *.X doesn't match Z.Y.X - rval = (i == 0 && thisDomainTokensNum == thatDomainTokensNum); - if (rval) { - rval = thatDomainTokens[0].equals("*"); - if (!rval) { - // (d) OR we have a *-component match: - // f*.com matches foo.com but not bar.com - rval = domainTokenMatch( - thisDomainTokens[0], thatDomainTokens[0]); - } - } - break; - } - } - } else { - // (e) OR thatHost has a '*.'-prefix of thisHost: - // *.Y.X matches Y.X - rval = thatDomain.equals("*." + thisDomain); - } - } - - return rval; - } - - /** - * @param thisDomainToken The domain token from the current domain name - * @param thatDomainToken The domain token from the certificate - * @return True iff thisDomainToken matches thatDomainToken, using the - * wildcard match as specified by RFC2818-3.1. For example, f*.com must - * match foo.com but not bar.com - */ - private static boolean domainTokenMatch(String thisDomainToken, String thatDomainToken) { - if (thisDomainToken != null && thatDomainToken != null) { - int starIndex = thatDomainToken.indexOf('*'); - if (starIndex >= 0) { - if (thatDomainToken.length() - 1 <= thisDomainToken.length()) { - String prefix = thatDomainToken.substring(0, starIndex); - String suffix = thatDomainToken.substring(starIndex + 1); - - return thisDomainToken.startsWith(prefix) && thisDomainToken.endsWith(suffix); - } - } - } - - return false; - } -} diff --git a/common/java/com/android/common/FastXmlSerializer.java b/common/java/com/android/common/FastXmlSerializer.java deleted file mode 100644 index 0d33941..0000000 --- a/common/java/com/android/common/FastXmlSerializer.java +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import org.xmlpull.v1.XmlSerializer; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.Charset; -import java.nio.charset.CharsetEncoder; -import java.nio.charset.CoderResult; -import java.nio.charset.IllegalCharsetNameException; -import java.nio.charset.UnsupportedCharsetException; - -/** - * This is a quick and dirty implementation of XmlSerializer that isn't horribly - * painfully slow like the normal one. It only does what is needed for the - * specific XML files being written with it. - */ -public class FastXmlSerializer implements XmlSerializer { - private static final String ESCAPE_TABLE[] = new String[] { - null, null, null, null, null, null, null, null, // 0-7 - null, null, null, null, null, null, null, null, // 8-15 - null, null, null, null, null, null, null, null, // 16-23 - null, null, null, null, null, null, null, null, // 24-31 - null, null, """, null, null, null, "&", null, // 32-39 - null, null, null, null, null, null, null, null, // 40-47 - null, null, null, null, null, null, null, null, // 48-55 - null, null, null, null, "<", null, ">", null, // 56-63 - }; - - private static final int BUFFER_LEN = 8192; - - private final char[] mText = new char[BUFFER_LEN]; - private int mPos; - - private Writer mWriter; - - private OutputStream mOutputStream; - private CharsetEncoder mCharset; - private ByteBuffer mBytes = ByteBuffer.allocate(BUFFER_LEN); - - private boolean mInTag; - - private void append(char c) throws IOException { - int pos = mPos; - if (pos >= (BUFFER_LEN-1)) { - flush(); - pos = mPos; - } - mText[pos] = c; - mPos = pos+1; - } - - private void append(String str, int i, final int length) throws IOException { - if (length > BUFFER_LEN) { - final int end = i + length; - while (i < end) { - int next = i + BUFFER_LEN; - append(str, i, next<end ? BUFFER_LEN : (end-i)); - i = next; - } - return; - } - int pos = mPos; - if ((pos+length) > BUFFER_LEN) { - flush(); - pos = mPos; - } - str.getChars(i, i+length, mText, pos); - mPos = pos + length; - } - - private void append(char[] buf, int i, final int length) throws IOException { - if (length > BUFFER_LEN) { - final int end = i + length; - while (i < end) { - int next = i + BUFFER_LEN; - append(buf, i, next<end ? BUFFER_LEN : (end-i)); - i = next; - } - return; - } - int pos = mPos; - if ((pos+length) > BUFFER_LEN) { - flush(); - pos = mPos; - } - System.arraycopy(buf, i, mText, pos, length); - mPos = pos + length; - } - - private void append(String str) throws IOException { - append(str, 0, str.length()); - } - - private void escapeAndAppendString(final String string) throws IOException { - final int N = string.length(); - final char NE = (char)ESCAPE_TABLE.length; - final String[] escapes = ESCAPE_TABLE; - int lastPos = 0; - int pos; - for (pos=0; pos<N; pos++) { - char c = string.charAt(pos); - if (c >= NE) continue; - String escape = escapes[c]; - if (escape == null) continue; - if (lastPos < pos) append(string, lastPos, pos-lastPos); - lastPos = pos + 1; - append(escape); - } - if (lastPos < pos) append(string, lastPos, pos-lastPos); - } - - private void escapeAndAppendString(char[] buf, int start, int len) throws IOException { - final char NE = (char)ESCAPE_TABLE.length; - final String[] escapes = ESCAPE_TABLE; - int end = start+len; - int lastPos = start; - int pos; - for (pos=start; pos<end; pos++) { - char c = buf[pos]; - if (c >= NE) continue; - String escape = escapes[c]; - if (escape == null) continue; - if (lastPos < pos) append(buf, lastPos, pos-lastPos); - lastPos = pos + 1; - append(escape); - } - if (lastPos < pos) append(buf, lastPos, pos-lastPos); - } - - public XmlSerializer attribute(String namespace, String name, String value) throws IOException, - IllegalArgumentException, IllegalStateException { - append(' '); - if (namespace != null) { - append(namespace); - append(':'); - } - append(name); - append("=\""); - - escapeAndAppendString(value); - append('"'); - return this; - } - - public void cdsect(String text) throws IOException, IllegalArgumentException, - IllegalStateException { - throw new UnsupportedOperationException(); - } - - public void comment(String text) throws IOException, IllegalArgumentException, - IllegalStateException { - throw new UnsupportedOperationException(); - } - - public void docdecl(String text) throws IOException, IllegalArgumentException, - IllegalStateException { - throw new UnsupportedOperationException(); - } - - public void endDocument() throws IOException, IllegalArgumentException, IllegalStateException { - flush(); - } - - public XmlSerializer endTag(String namespace, String name) throws IOException, - IllegalArgumentException, IllegalStateException { - if (mInTag) { - append(" />\n"); - } else { - append("</"); - if (namespace != null) { - append(namespace); - append(':'); - } - append(name); - append(">\n"); - } - mInTag = false; - return this; - } - - public void entityRef(String text) throws IOException, IllegalArgumentException, - IllegalStateException { - throw new UnsupportedOperationException(); - } - - private void flushBytes() throws IOException { - int position; - if ((position = mBytes.position()) > 0) { - mBytes.flip(); - mOutputStream.write(mBytes.array(), 0, position); - mBytes.clear(); - } - } - - public void flush() throws IOException { - //Log.i("PackageManager", "flush mPos=" + mPos); - if (mPos > 0) { - if (mOutputStream != null) { - CharBuffer charBuffer = CharBuffer.wrap(mText, 0, mPos); - CoderResult result = mCharset.encode(charBuffer, mBytes, true); - while (true) { - if (result.isError()) { - throw new IOException(result.toString()); - } else if (result.isOverflow()) { - flushBytes(); - result = mCharset.encode(charBuffer, mBytes, true); - continue; - } - break; - } - flushBytes(); - mOutputStream.flush(); - } else { - mWriter.write(mText, 0, mPos); - mWriter.flush(); - } - mPos = 0; - } - } - - public int getDepth() { - throw new UnsupportedOperationException(); - } - - public boolean getFeature(String name) { - throw new UnsupportedOperationException(); - } - - public String getName() { - throw new UnsupportedOperationException(); - } - - public String getNamespace() { - throw new UnsupportedOperationException(); - } - - public String getPrefix(String namespace, boolean generatePrefix) - throws IllegalArgumentException { - throw new UnsupportedOperationException(); - } - - public Object getProperty(String name) { - throw new UnsupportedOperationException(); - } - - public void ignorableWhitespace(String text) throws IOException, IllegalArgumentException, - IllegalStateException { - throw new UnsupportedOperationException(); - } - - public void processingInstruction(String text) throws IOException, IllegalArgumentException, - IllegalStateException { - throw new UnsupportedOperationException(); - } - - public void setFeature(String name, boolean state) throws IllegalArgumentException, - IllegalStateException { - if (name.equals("http://xmlpull.org/v1/doc/features.html#indent-output")) { - return; - } - throw new UnsupportedOperationException(); - } - - public void setOutput(OutputStream os, String encoding) throws IOException, - IllegalArgumentException, IllegalStateException { - if (os == null) - throw new IllegalArgumentException(); - if (true) { - try { - mCharset = Charset.forName(encoding).newEncoder(); - } catch (IllegalCharsetNameException e) { - throw (UnsupportedEncodingException) (new UnsupportedEncodingException( - encoding).initCause(e)); - } catch (UnsupportedCharsetException e) { - throw (UnsupportedEncodingException) (new UnsupportedEncodingException( - encoding).initCause(e)); - } - mOutputStream = os; - } else { - setOutput( - encoding == null - ? new OutputStreamWriter(os) - : new OutputStreamWriter(os, encoding)); - } - } - - public void setOutput(Writer writer) throws IOException, IllegalArgumentException, - IllegalStateException { - mWriter = writer; - } - - public void setPrefix(String prefix, String namespace) throws IOException, - IllegalArgumentException, IllegalStateException { - throw new UnsupportedOperationException(); - } - - public void setProperty(String name, Object value) throws IllegalArgumentException, - IllegalStateException { - throw new UnsupportedOperationException(); - } - - public void startDocument(String encoding, Boolean standalone) throws IOException, - IllegalArgumentException, IllegalStateException { - append("<?xml version='1.0' encoding='utf-8' standalone='" - + (standalone ? "yes" : "no") + "' ?>\n"); - } - - public XmlSerializer startTag(String namespace, String name) throws IOException, - IllegalArgumentException, IllegalStateException { - if (mInTag) { - append(">\n"); - } - append('<'); - if (namespace != null) { - append(namespace); - append(':'); - } - append(name); - mInTag = true; - return this; - } - - public XmlSerializer text(char[] buf, int start, int len) throws IOException, - IllegalArgumentException, IllegalStateException { - if (mInTag) { - append(">"); - mInTag = false; - } - escapeAndAppendString(buf, start, len); - return this; - } - - public XmlSerializer text(String text) throws IOException, IllegalArgumentException, - IllegalStateException { - if (mInTag) { - append(">"); - mInTag = false; - } - escapeAndAppendString(text); - return this; - } - -} diff --git a/common/java/com/android/common/HttpDateTime.java b/common/java/com/android/common/HttpDateTime.java deleted file mode 100644 index f4052cc..0000000 --- a/common/java/com/android/common/HttpDateTime.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import android.text.format.Time; - -import java.util.Calendar; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -/** {@hide} */ -public final class HttpDateTime { - - /* - * Regular expression for parsing HTTP-date. - * - * Wdy, DD Mon YYYY HH:MM:SS GMT - * RFC 822, updated by RFC 1123 - * - * Weekday, DD-Mon-YY HH:MM:SS GMT - * RFC 850, obsoleted by RFC 1036 - * - * Wdy Mon DD HH:MM:SS YYYY - * ANSI C's asctime() format - * - * with following variations - * - * Wdy, DD-Mon-YYYY HH:MM:SS GMT - * Wdy, (SP)D Mon YYYY HH:MM:SS GMT - * Wdy,DD Mon YYYY HH:MM:SS GMT - * Wdy, DD-Mon-YY HH:MM:SS GMT - * Wdy, DD Mon YYYY HH:MM:SS -HHMM - * Wdy, DD Mon YYYY HH:MM:SS - * Wdy Mon (SP)D HH:MM:SS YYYY - * Wdy Mon DD HH:MM:SS YYYY GMT - * - * HH can be H if the first digit is zero. - * - * Mon can be the full name of the month. - */ - private static final String HTTP_DATE_RFC_REGEXP = - "([0-9]{1,2})[- ]([A-Za-z]{3,9})[- ]([0-9]{2,4})[ ]" - + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])"; - - private static final String HTTP_DATE_ANSIC_REGEXP = - "[ ]([A-Za-z]{3,9})[ ]+([0-9]{1,2})[ ]" - + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])[ ]([0-9]{2,4})"; - - /** - * The compiled version of the HTTP-date regular expressions. - */ - private static final Pattern HTTP_DATE_RFC_PATTERN = - Pattern.compile(HTTP_DATE_RFC_REGEXP); - private static final Pattern HTTP_DATE_ANSIC_PATTERN = - Pattern.compile(HTTP_DATE_ANSIC_REGEXP); - - private static class TimeOfDay { - TimeOfDay(int h, int m, int s) { - this.hour = h; - this.minute = m; - this.second = s; - } - - int hour; - int minute; - int second; - } - - public static Long parse(String timeString) - throws IllegalArgumentException { - - int date = 1; - int month = Calendar.JANUARY; - int year = 1970; - TimeOfDay timeOfDay; - - Matcher rfcMatcher = HTTP_DATE_RFC_PATTERN.matcher(timeString); - if (rfcMatcher.find()) { - date = getDate(rfcMatcher.group(1)); - month = getMonth(rfcMatcher.group(2)); - year = getYear(rfcMatcher.group(3)); - timeOfDay = getTime(rfcMatcher.group(4)); - } else { - Matcher ansicMatcher = HTTP_DATE_ANSIC_PATTERN.matcher(timeString); - if (ansicMatcher.find()) { - month = getMonth(ansicMatcher.group(1)); - date = getDate(ansicMatcher.group(2)); - timeOfDay = getTime(ansicMatcher.group(3)); - year = getYear(ansicMatcher.group(4)); - } else { - throw new IllegalArgumentException(); - } - } - - // FIXME: Y2038 BUG! - if (year >= 2038) { - year = 2038; - month = Calendar.JANUARY; - date = 1; - } - - Time time = new Time(Time.TIMEZONE_UTC); - time.set(timeOfDay.second, timeOfDay.minute, timeOfDay.hour, date, - month, year); - return time.toMillis(false /* use isDst */); - } - - private static int getDate(String dateString) { - if (dateString.length() == 2) { - return (dateString.charAt(0) - '0') * 10 - + (dateString.charAt(1) - '0'); - } else { - return (dateString.charAt(0) - '0'); - } - } - - /* - * jan = 9 + 0 + 13 = 22 - * feb = 5 + 4 + 1 = 10 - * mar = 12 + 0 + 17 = 29 - * apr = 0 + 15 + 17 = 32 - * may = 12 + 0 + 24 = 36 - * jun = 9 + 20 + 13 = 42 - * jul = 9 + 20 + 11 = 40 - * aug = 0 + 20 + 6 = 26 - * sep = 18 + 4 + 15 = 37 - * oct = 14 + 2 + 19 = 35 - * nov = 13 + 14 + 21 = 48 - * dec = 3 + 4 + 2 = 9 - */ - private static int getMonth(String monthString) { - int hash = Character.toLowerCase(monthString.charAt(0)) + - Character.toLowerCase(monthString.charAt(1)) + - Character.toLowerCase(monthString.charAt(2)) - 3 * 'a'; - switch (hash) { - case 22: - return Calendar.JANUARY; - case 10: - return Calendar.FEBRUARY; - case 29: - return Calendar.MARCH; - case 32: - return Calendar.APRIL; - case 36: - return Calendar.MAY; - case 42: - return Calendar.JUNE; - case 40: - return Calendar.JULY; - case 26: - return Calendar.AUGUST; - case 37: - return Calendar.SEPTEMBER; - case 35: - return Calendar.OCTOBER; - case 48: - return Calendar.NOVEMBER; - case 9: - return Calendar.DECEMBER; - default: - throw new IllegalArgumentException(); - } - } - - private static int getYear(String yearString) { - if (yearString.length() == 2) { - int year = (yearString.charAt(0) - '0') * 10 - + (yearString.charAt(1) - '0'); - if (year >= 70) { - return year + 1900; - } else { - return year + 2000; - } - } else if (yearString.length() == 3) { - // According to RFC 2822, three digit years should be added to 1900. - int year = (yearString.charAt(0) - '0') * 100 - + (yearString.charAt(1) - '0') * 10 - + (yearString.charAt(2) - '0'); - return year + 1900; - } else if (yearString.length() == 4) { - return (yearString.charAt(0) - '0') * 1000 - + (yearString.charAt(1) - '0') * 100 - + (yearString.charAt(2) - '0') * 10 - + (yearString.charAt(3) - '0'); - } else { - return 1970; - } - } - - private static TimeOfDay getTime(String timeString) { - // HH might be H - int i = 0; - int hour = timeString.charAt(i++) - '0'; - if (timeString.charAt(i) != ':') - hour = hour * 10 + (timeString.charAt(i++) - '0'); - // Skip ':' - i++; - - int minute = (timeString.charAt(i++) - '0') * 10 - + (timeString.charAt(i++) - '0'); - // Skip ':' - i++; - - int second = (timeString.charAt(i++) - '0') * 10 - + (timeString.charAt(i++) - '0'); - - return new TimeOfDay(hour, minute, second); - } -} diff --git a/common/java/com/android/common/OperationScheduler.java b/common/java/com/android/common/OperationScheduler.java index 0c7ca83..0a48fe7 100644 --- a/common/java/com/android/common/OperationScheduler.java +++ b/common/java/com/android/common/OperationScheduler.java @@ -17,6 +17,7 @@ package com.android.common; import android.content.SharedPreferences; +import android.net.http.HttpDateTime; import android.text.format.Time; import java.util.Map; diff --git a/common/java/com/android/common/Patterns.java b/common/java/com/android/common/Patterns.java deleted file mode 100644 index 3b3b038..0000000 --- a/common/java/com/android/common/Patterns.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Commonly used regular expression patterns. - */ -public class Patterns { - /** - * Regular expression to match all IANA top-level domains. - * List accurate as of 2010/02/05. List taken from: - * http://data.iana.org/TLD/tlds-alpha-by-domain.txt - * This pattern is auto-generated by frameworks/base/common/tools/make-iana-tld-pattern.py - */ - public static final String TOP_LEVEL_DOMAIN_STR = - "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])" - + "|(biz|b[abdefghijmnorstvwyz])" - + "|(cat|com|coop|c[acdfghiklmnoruvxyz])" - + "|d[ejkmoz]" - + "|(edu|e[cegrstu])" - + "|f[ijkmor]" - + "|(gov|g[abdefghilmnpqrstuwy])" - + "|h[kmnrtu]" - + "|(info|int|i[delmnoqrst])" - + "|(jobs|j[emop])" - + "|k[eghimnprwyz]" - + "|l[abcikrstuvy]" - + "|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])" - + "|(name|net|n[acefgilopruz])" - + "|(org|om)" - + "|(pro|p[aefghklmnrstwy])" - + "|qa" - + "|r[eosuw]" - + "|s[abcdeghijklmnortuvyz]" - + "|(tel|travel|t[cdfghjklmnoprtvwz])" - + "|u[agksyz]" - + "|v[aceginu]" - + "|w[fs]" - + "|(xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-80akhbyknj4f|xn\\-\\-9t4b11yi5a|xn\\-\\-deba0ad|xn\\-\\-g6w251d|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-zckzah)" - + "|y[etu]" - + "|z[amw])"; - - /** - * Regular expression pattern to match all IANA top-level domains. - */ - public static final Pattern TOP_LEVEL_DOMAIN = - Pattern.compile(TOP_LEVEL_DOMAIN_STR); - - /** - * Regular expression to match all IANA top-level domains for WEB_URL. - * List accurate as of 2010/02/05. List taken from: - * http://data.iana.org/TLD/tlds-alpha-by-domain.txt - * This pattern is auto-generated by frameworks/base/common/tools/make-iana-tld-pattern.py - */ - public static final String TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL = - "(?:" - + "(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])" - + "|(?:biz|b[abdefghijmnorstvwyz])" - + "|(?:cat|com|coop|c[acdfghiklmnoruvxyz])" - + "|d[ejkmoz]" - + "|(?:edu|e[cegrstu])" - + "|f[ijkmor]" - + "|(?:gov|g[abdefghilmnpqrstuwy])" - + "|h[kmnrtu]" - + "|(?:info|int|i[delmnoqrst])" - + "|(?:jobs|j[emop])" - + "|k[eghimnprwyz]" - + "|l[abcikrstuvy]" - + "|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])" - + "|(?:name|net|n[acefgilopruz])" - + "|(?:org|om)" - + "|(?:pro|p[aefghklmnrstwy])" - + "|qa" - + "|r[eosuw]" - + "|s[abcdeghijklmnortuvyz]" - + "|(?:tel|travel|t[cdfghjklmnoprtvwz])" - + "|u[agksyz]" - + "|v[aceginu]" - + "|w[fs]" - + "|(?:xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-80akhbyknj4f|xn\\-\\-9t4b11yi5a|xn\\-\\-deba0ad|xn\\-\\-g6w251d|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-zckzah)" - + "|y[etu]" - + "|z[amw]))"; - - /** - * Good characters for Internationalized Resource Identifiers (IRI). - * This comprises most common used Unicode characters allowed in IRI - * as detailed in RFC 3987. - * Specifically, those two byte Unicode characters are not included. - */ - public static final String GOOD_IRI_CHAR = - "a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF"; - - /** - * Regular expression pattern to match most part of RFC 3987 - * Internationalized URLs, aka IRIs. Commonly used Unicode characters are - * added. - */ - public static final Pattern WEB_URL = Pattern.compile( - "((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)" - + "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_" - + "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?" - + "((?:(?:[" + GOOD_IRI_CHAR + "][" + GOOD_IRI_CHAR + "\\-]{0,64}\\.)+" // named host - + TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL - + "|(?:(?:25[0-5]|2[0-4]" // or ip address - + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]" - + "|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]" - + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}" - + "|[1-9][0-9]|[0-9])))" - + "(?:\\:\\d{1,5})?)" // plus option port number - + "(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~" // plus option query params - + "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?" - + "(?:\\b|$)"); // and finally, a word boundary or end of - // input. This is to stop foo.sure from - // matching as foo.su - - public static final Pattern IP_ADDRESS - = Pattern.compile( - "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]" - + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]" - + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}" - + "|[1-9][0-9]|[0-9]))"); - - public static final Pattern DOMAIN_NAME - = Pattern.compile( - "(((([" + GOOD_IRI_CHAR + "][" + GOOD_IRI_CHAR + "\\-]*)*[" + GOOD_IRI_CHAR + "]\\.)+" - + TOP_LEVEL_DOMAIN + ")|" - + IP_ADDRESS + ")"); - - public static final Pattern EMAIL_ADDRESS - = Pattern.compile( - "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + - "\\@" + - "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + - "(" + - "\\." + - "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + - ")+" - ); - - /** - * This pattern is intended for searching for things that look like they - * might be phone numbers in arbitrary text, not for validating whether - * something is in fact a phone number. It will miss many things that - * are legitimate phone numbers. - * - * <p> The pattern matches the following: - * <ul> - * <li>Optionally, a + sign followed immediately by one or more digits. Spaces, dots, or dashes - * may follow. - * <li>Optionally, sets of digits in parentheses, separated by spaces, dots, or dashes. - * <li>A string starting and ending with a digit, containing digits, spaces, dots, and/or dashes. - * </ul> - */ - public static final Pattern PHONE - = Pattern.compile( // sdd = space, dot, or dash - "(\\+[0-9]+[\\- \\.]*)?" // +<digits><sdd>* - + "(\\([0-9]+\\)[\\- \\.]*)?" // (<digits>)<sdd>* - + "([0-9][0-9\\- \\.][0-9\\- \\.]+[0-9])"); // <digit><digit|sdd>+<digit> - - /** - * Convenience method to take all of the non-null matching groups in a - * regex Matcher and return them as a concatenated string. - * - * @param matcher The Matcher object from which grouped text will - * be extracted - * - * @return A String comprising all of the non-null matched - * groups concatenated together - */ - public static final String concatGroups(Matcher matcher) { - StringBuilder b = new StringBuilder(); - final int numGroups = matcher.groupCount(); - - for (int i = 1; i <= numGroups; i++) { - String s = matcher.group(i); - - System.err.println("Group(" + i + ") : " + s); - - if (s != null) { - b.append(s); - } - } - - return b.toString(); - } - - /** - * Convenience method to return only the digits and plus signs - * in the matching string. - * - * @param matcher The Matcher object from which digits and plus will - * be extracted - * - * @return A String comprising all of the digits and plus in - * the match - */ - public static final String digitsAndPlusOnly(Matcher matcher) { - StringBuilder buffer = new StringBuilder(); - String matchingRegion = matcher.group(); - - for (int i = 0, size = matchingRegion.length(); i < size; i++) { - char character = matchingRegion.charAt(i); - - if (character == '+' || Character.isDigit(character)) { - buffer.append(character); - } - } - return buffer.toString(); - } - - /** - * Do not create this static utility class. - */ - private Patterns() {} -} diff --git a/common/java/com/android/common/XmlUtils.java b/common/java/com/android/common/XmlUtils.java deleted file mode 100644 index dd57e49..0000000 --- a/common/java/com/android/common/XmlUtils.java +++ /dev/null @@ -1,796 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlSerializer; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import android.util.Xml; - -/** {@hide} */ -public class XmlUtils -{ - - public static void skipCurrentTag(XmlPullParser parser) - throws XmlPullParserException, IOException { - int outerDepth = parser.getDepth(); - int type; - while ((type=parser.next()) != XmlPullParser.END_DOCUMENT - && (type != XmlPullParser.END_TAG - || parser.getDepth() > outerDepth)) { - } - } - - public static final int - convertValueToList(CharSequence value, String[] options, int defaultValue) - { - if (null != value) { - for (int i = 0; i < options.length; i++) { - if (value.equals(options[i])) - return i; - } - } - - return defaultValue; - } - - public static final boolean - convertValueToBoolean(CharSequence value, boolean defaultValue) - { - boolean result = false; - - if (null == value) - return defaultValue; - - if (value.equals("1") - || value.equals("true") - || value.equals("TRUE")) - result = true; - - return result; - } - - public static final int - convertValueToInt(CharSequence charSeq, int defaultValue) - { - if (null == charSeq) - return defaultValue; - - String nm = charSeq.toString(); - - // XXX This code is copied from Integer.decode() so we don't - // have to instantiate an Integer! - - int value; - int sign = 1; - int index = 0; - int len = nm.length(); - int base = 10; - - if ('-' == nm.charAt(0)) { - sign = -1; - index++; - } - - if ('0' == nm.charAt(index)) { - // Quick check for a zero by itself - if (index == (len - 1)) - return 0; - - char c = nm.charAt(index + 1); - - if ('x' == c || 'X' == c) { - index += 2; - base = 16; - } else { - index++; - base = 8; - } - } - else if ('#' == nm.charAt(index)) - { - index++; - base = 16; - } - - return Integer.parseInt(nm.substring(index), base) * sign; - } - - public static final int - convertValueToUnsignedInt(String value, int defaultValue) - { - if (null == value) - return defaultValue; - - return parseUnsignedIntAttribute(value); - } - - public static final int - parseUnsignedIntAttribute(CharSequence charSeq) - { - String value = charSeq.toString(); - - long bits; - int index = 0; - int len = value.length(); - int base = 10; - - if ('0' == value.charAt(index)) { - // Quick check for zero by itself - if (index == (len - 1)) - return 0; - - char c = value.charAt(index + 1); - - if ('x' == c || 'X' == c) { // check for hex - index += 2; - base = 16; - } else { // check for octal - index++; - base = 8; - } - } else if ('#' == value.charAt(index)) { - index++; - base = 16; - } - - return (int) Long.parseLong(value.substring(index), base); - } - - /** - * Flatten a Map into an output stream as XML. The map can later be - * read back with readMapXml(). - * - * @param val The map to be flattened. - * @param out Where to write the XML data. - * - * @see #writeMapXml(Map, String, XmlSerializer) - * @see #writeListXml - * @see #writeValueXml - * @see #readMapXml - */ - public static final void writeMapXml(Map val, OutputStream out) - throws XmlPullParserException, java.io.IOException { - XmlSerializer serializer = new FastXmlSerializer(); - serializer.setOutput(out, "utf-8"); - serializer.startDocument(null, true); - serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); - writeMapXml(val, null, serializer); - serializer.endDocument(); - } - - /** - * Flatten a List into an output stream as XML. The list can later be - * read back with readListXml(). - * - * @param val The list to be flattened. - * @param out Where to write the XML data. - * - * @see #writeListXml(List, String, XmlSerializer) - * @see #writeMapXml - * @see #writeValueXml - * @see #readListXml - */ - public static final void writeListXml(List val, OutputStream out) - throws XmlPullParserException, java.io.IOException - { - XmlSerializer serializer = Xml.newSerializer(); - serializer.setOutput(out, "utf-8"); - serializer.startDocument(null, true); - serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); - writeListXml(val, null, serializer); - serializer.endDocument(); - } - - /** - * Flatten a Map into an XmlSerializer. The map can later be read back - * with readThisMapXml(). - * - * @param val The map to be flattened. - * @param name Name attribute to include with this list's tag, or null for - * none. - * @param out XmlSerializer to write the map into. - * - * @see #writeMapXml(Map, OutputStream) - * @see #writeListXml - * @see #writeValueXml - * @see #readMapXml - */ - public static final void writeMapXml(Map val, String name, XmlSerializer out) - throws XmlPullParserException, java.io.IOException - { - if (val == null) { - out.startTag(null, "null"); - out.endTag(null, "null"); - return; - } - - Set s = val.entrySet(); - Iterator i = s.iterator(); - - out.startTag(null, "map"); - if (name != null) { - out.attribute(null, "name", name); - } - - while (i.hasNext()) { - Map.Entry e = (Map.Entry)i.next(); - writeValueXml(e.getValue(), (String)e.getKey(), out); - } - - out.endTag(null, "map"); - } - - /** - * Flatten a List into an XmlSerializer. The list can later be read back - * with readThisListXml(). - * - * @param val The list to be flattened. - * @param name Name attribute to include with this list's tag, or null for - * none. - * @param out XmlSerializer to write the list into. - * - * @see #writeListXml(List, OutputStream) - * @see #writeMapXml - * @see #writeValueXml - * @see #readListXml - */ - public static final void writeListXml(List val, String name, XmlSerializer out) - throws XmlPullParserException, java.io.IOException - { - if (val == null) { - out.startTag(null, "null"); - out.endTag(null, "null"); - return; - } - - out.startTag(null, "list"); - if (name != null) { - out.attribute(null, "name", name); - } - - int N = val.size(); - int i=0; - while (i < N) { - writeValueXml(val.get(i), null, out); - i++; - } - - out.endTag(null, "list"); - } - - /** - * Flatten a byte[] into an XmlSerializer. The list can later be read back - * with readThisByteArrayXml(). - * - * @param val The byte array to be flattened. - * @param name Name attribute to include with this array's tag, or null for - * none. - * @param out XmlSerializer to write the array into. - * - * @see #writeMapXml - * @see #writeValueXml - */ - public static final void writeByteArrayXml(byte[] val, String name, - XmlSerializer out) - throws XmlPullParserException, java.io.IOException { - - if (val == null) { - out.startTag(null, "null"); - out.endTag(null, "null"); - return; - } - - out.startTag(null, "byte-array"); - if (name != null) { - out.attribute(null, "name", name); - } - - final int N = val.length; - out.attribute(null, "num", Integer.toString(N)); - - StringBuilder sb = new StringBuilder(val.length*2); - for (int i=0; i<N; i++) { - int b = val[i]; - int h = b>>4; - sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); - h = b&0xff; - sb.append(h >= 10 ? ('a'+h-10) : ('0'+h)); - } - - out.text(sb.toString()); - - out.endTag(null, "byte-array"); - } - - /** - * Flatten an int[] into an XmlSerializer. The list can later be read back - * with readThisIntArrayXml(). - * - * @param val The int array to be flattened. - * @param name Name attribute to include with this array's tag, or null for - * none. - * @param out XmlSerializer to write the array into. - * - * @see #writeMapXml - * @see #writeValueXml - * @see #readThisIntArrayXml - */ - public static final void writeIntArrayXml(int[] val, String name, - XmlSerializer out) - throws XmlPullParserException, java.io.IOException { - - if (val == null) { - out.startTag(null, "null"); - out.endTag(null, "null"); - return; - } - - out.startTag(null, "int-array"); - if (name != null) { - out.attribute(null, "name", name); - } - - final int N = val.length; - out.attribute(null, "num", Integer.toString(N)); - - for (int i=0; i<N; i++) { - out.startTag(null, "item"); - out.attribute(null, "value", Integer.toString(val[i])); - out.endTag(null, "item"); - } - - out.endTag(null, "int-array"); - } - - /** - * Flatten an object's value into an XmlSerializer. The value can later - * be read back with readThisValueXml(). - * - * Currently supported value types are: null, String, Integer, Long, - * Float, Double Boolean, Map, List. - * - * @param v The object to be flattened. - * @param name Name attribute to include with this value's tag, or null - * for none. - * @param out XmlSerializer to write the object into. - * - * @see #writeMapXml - * @see #writeListXml - * @see #readValueXml - */ - public static final void writeValueXml(Object v, String name, XmlSerializer out) - throws XmlPullParserException, java.io.IOException - { - String typeStr; - if (v == null) { - out.startTag(null, "null"); - if (name != null) { - out.attribute(null, "name", name); - } - out.endTag(null, "null"); - return; - } else if (v instanceof String) { - out.startTag(null, "string"); - if (name != null) { - out.attribute(null, "name", name); - } - out.text(v.toString()); - out.endTag(null, "string"); - return; - } else if (v instanceof Integer) { - typeStr = "int"; - } else if (v instanceof Long) { - typeStr = "long"; - } else if (v instanceof Float) { - typeStr = "float"; - } else if (v instanceof Double) { - typeStr = "double"; - } else if (v instanceof Boolean) { - typeStr = "boolean"; - } else if (v instanceof byte[]) { - writeByteArrayXml((byte[])v, name, out); - return; - } else if (v instanceof int[]) { - writeIntArrayXml((int[])v, name, out); - return; - } else if (v instanceof Map) { - writeMapXml((Map)v, name, out); - return; - } else if (v instanceof List) { - writeListXml((List)v, name, out); - return; - } else if (v instanceof CharSequence) { - // XXX This is to allow us to at least write something if - // we encounter styled text... but it means we will drop all - // of the styling information. :( - out.startTag(null, "string"); - if (name != null) { - out.attribute(null, "name", name); - } - out.text(v.toString()); - out.endTag(null, "string"); - return; - } else { - throw new RuntimeException("writeValueXml: unable to write value " + v); - } - - out.startTag(null, typeStr); - if (name != null) { - out.attribute(null, "name", name); - } - out.attribute(null, "value", v.toString()); - out.endTag(null, typeStr); - } - - /** - * Read a HashMap from an InputStream containing XML. The stream can - * previously have been written by writeMapXml(). - * - * @param in The InputStream from which to read. - * - * @return HashMap The resulting map. - * - * @see #readListXml - * @see #readValueXml - * @see #readThisMapXml - * #see #writeMapXml - */ - public static final HashMap readMapXml(InputStream in) - throws XmlPullParserException, java.io.IOException - { - XmlPullParser parser = Xml.newPullParser(); - parser.setInput(in, null); - return (HashMap)readValueXml(parser, new String[1]); - } - - /** - * Read an ArrayList from an InputStream containing XML. The stream can - * previously have been written by writeListXml(). - * - * @param in The InputStream from which to read. - * - * @return HashMap The resulting list. - * - * @see #readMapXml - * @see #readValueXml - * @see #readThisListXml - * @see #writeListXml - */ - public static final ArrayList readListXml(InputStream in) - throws XmlPullParserException, java.io.IOException - { - XmlPullParser parser = Xml.newPullParser(); - parser.setInput(in, null); - return (ArrayList)readValueXml(parser, new String[1]); - } - - /** - * Read a HashMap object from an XmlPullParser. The XML data could - * previously have been generated by writeMapXml(). The XmlPullParser - * must be positioned <em>after</em> the tag that begins the map. - * - * @param parser The XmlPullParser from which to read the map data. - * @param endTag Name of the tag that will end the map, usually "map". - * @param name An array of one string, used to return the name attribute - * of the map's tag. - * - * @return HashMap The newly generated map. - * - * @see #readMapXml - */ - public static final HashMap readThisMapXml(XmlPullParser parser, String endTag, String[] name) - throws XmlPullParserException, java.io.IOException - { - HashMap map = new HashMap(); - - int eventType = parser.getEventType(); - do { - if (eventType == parser.START_TAG) { - Object val = readThisValueXml(parser, name); - if (name[0] != null) { - //System.out.println("Adding to map: " + name + " -> " + val); - map.put(name[0], val); - } else { - throw new XmlPullParserException( - "Map value without name attribute: " + parser.getName()); - } - } else if (eventType == parser.END_TAG) { - if (parser.getName().equals(endTag)) { - return map; - } - throw new XmlPullParserException( - "Expected " + endTag + " end tag at: " + parser.getName()); - } - eventType = parser.next(); - } while (eventType != parser.END_DOCUMENT); - - throw new XmlPullParserException( - "Document ended before " + endTag + " end tag"); - } - - /** - * Read an ArrayList object from an XmlPullParser. The XML data could - * previously have been generated by writeListXml(). The XmlPullParser - * must be positioned <em>after</em> the tag that begins the list. - * - * @param parser The XmlPullParser from which to read the list data. - * @param endTag Name of the tag that will end the list, usually "list". - * @param name An array of one string, used to return the name attribute - * of the list's tag. - * - * @return HashMap The newly generated list. - * - * @see #readListXml - */ - public static final ArrayList readThisListXml(XmlPullParser parser, String endTag, String[] name) - throws XmlPullParserException, java.io.IOException - { - ArrayList list = new ArrayList(); - - int eventType = parser.getEventType(); - do { - if (eventType == parser.START_TAG) { - Object val = readThisValueXml(parser, name); - list.add(val); - //System.out.println("Adding to list: " + val); - } else if (eventType == parser.END_TAG) { - if (parser.getName().equals(endTag)) { - return list; - } - throw new XmlPullParserException( - "Expected " + endTag + " end tag at: " + parser.getName()); - } - eventType = parser.next(); - } while (eventType != parser.END_DOCUMENT); - - throw new XmlPullParserException( - "Document ended before " + endTag + " end tag"); - } - - /** - * Read an int[] object from an XmlPullParser. The XML data could - * previously have been generated by writeIntArrayXml(). The XmlPullParser - * must be positioned <em>after</em> the tag that begins the list. - * - * @param parser The XmlPullParser from which to read the list data. - * @param endTag Name of the tag that will end the list, usually "list". - * @param name An array of one string, used to return the name attribute - * of the list's tag. - * - * @return Returns a newly generated int[]. - * - * @see #readListXml - */ - public static final int[] readThisIntArrayXml(XmlPullParser parser, - String endTag, String[] name) - throws XmlPullParserException, java.io.IOException { - - int num; - try { - num = Integer.parseInt(parser.getAttributeValue(null, "num")); - } catch (NullPointerException e) { - throw new XmlPullParserException( - "Need num attribute in byte-array"); - } catch (NumberFormatException e) { - throw new XmlPullParserException( - "Not a number in num attribute in byte-array"); - } - - int[] array = new int[num]; - int i = 0; - - int eventType = parser.getEventType(); - do { - if (eventType == parser.START_TAG) { - if (parser.getName().equals("item")) { - try { - array[i] = Integer.parseInt( - parser.getAttributeValue(null, "value")); - } catch (NullPointerException e) { - throw new XmlPullParserException( - "Need value attribute in item"); - } catch (NumberFormatException e) { - throw new XmlPullParserException( - "Not a number in value attribute in item"); - } - } else { - throw new XmlPullParserException( - "Expected item tag at: " + parser.getName()); - } - } else if (eventType == parser.END_TAG) { - if (parser.getName().equals(endTag)) { - return array; - } else if (parser.getName().equals("item")) { - i++; - } else { - throw new XmlPullParserException( - "Expected " + endTag + " end tag at: " - + parser.getName()); - } - } - eventType = parser.next(); - } while (eventType != parser.END_DOCUMENT); - - throw new XmlPullParserException( - "Document ended before " + endTag + " end tag"); - } - - /** - * Read a flattened object from an XmlPullParser. The XML data could - * previously have been written with writeMapXml(), writeListXml(), or - * writeValueXml(). The XmlPullParser must be positioned <em>at</em> the - * tag that defines the value. - * - * @param parser The XmlPullParser from which to read the object. - * @param name An array of one string, used to return the name attribute - * of the value's tag. - * - * @return Object The newly generated value object. - * - * @see #readMapXml - * @see #readListXml - * @see #writeValueXml - */ - public static final Object readValueXml(XmlPullParser parser, String[] name) - throws XmlPullParserException, java.io.IOException - { - int eventType = parser.getEventType(); - do { - if (eventType == parser.START_TAG) { - return readThisValueXml(parser, name); - } else if (eventType == parser.END_TAG) { - throw new XmlPullParserException( - "Unexpected end tag at: " + parser.getName()); - } else if (eventType == parser.TEXT) { - throw new XmlPullParserException( - "Unexpected text: " + parser.getText()); - } - eventType = parser.next(); - } while (eventType != parser.END_DOCUMENT); - - throw new XmlPullParserException( - "Unexpected end of document"); - } - - private static final Object readThisValueXml(XmlPullParser parser, String[] name) - throws XmlPullParserException, java.io.IOException - { - final String valueName = parser.getAttributeValue(null, "name"); - final String tagName = parser.getName(); - - //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName); - - Object res; - - if (tagName.equals("null")) { - res = null; - } else if (tagName.equals("string")) { - String value = ""; - int eventType; - while ((eventType = parser.next()) != parser.END_DOCUMENT) { - if (eventType == parser.END_TAG) { - if (parser.getName().equals("string")) { - name[0] = valueName; - //System.out.println("Returning value for " + valueName + ": " + value); - return value; - } - throw new XmlPullParserException( - "Unexpected end tag in <string>: " + parser.getName()); - } else if (eventType == parser.TEXT) { - value += parser.getText(); - } else if (eventType == parser.START_TAG) { - throw new XmlPullParserException( - "Unexpected start tag in <string>: " + parser.getName()); - } - } - throw new XmlPullParserException( - "Unexpected end of document in <string>"); - } else if (tagName.equals("int")) { - res = Integer.parseInt(parser.getAttributeValue(null, "value")); - } else if (tagName.equals("long")) { - res = Long.valueOf(parser.getAttributeValue(null, "value")); - } else if (tagName.equals("float")) { - res = new Float(parser.getAttributeValue(null, "value")); - } else if (tagName.equals("double")) { - res = new Double(parser.getAttributeValue(null, "value")); - } else if (tagName.equals("boolean")) { - res = Boolean.valueOf(parser.getAttributeValue(null, "value")); - } else if (tagName.equals("int-array")) { - parser.next(); - res = readThisIntArrayXml(parser, "int-array", name); - name[0] = valueName; - //System.out.println("Returning value for " + valueName + ": " + res); - return res; - } else if (tagName.equals("map")) { - parser.next(); - res = readThisMapXml(parser, "map", name); - name[0] = valueName; - //System.out.println("Returning value for " + valueName + ": " + res); - return res; - } else if (tagName.equals("list")) { - parser.next(); - res = readThisListXml(parser, "list", name); - name[0] = valueName; - //System.out.println("Returning value for " + valueName + ": " + res); - return res; - } else { - throw new XmlPullParserException( - "Unknown tag: " + tagName); - } - - // Skip through to end tag. - int eventType; - while ((eventType = parser.next()) != parser.END_DOCUMENT) { - if (eventType == parser.END_TAG) { - if (parser.getName().equals(tagName)) { - name[0] = valueName; - //System.out.println("Returning value for " + valueName + ": " + res); - return res; - } - throw new XmlPullParserException( - "Unexpected end tag in <" + tagName + ">: " + parser.getName()); - } else if (eventType == parser.TEXT) { - throw new XmlPullParserException( - "Unexpected text in <" + tagName + ">: " + parser.getName()); - } else if (eventType == parser.START_TAG) { - throw new XmlPullParserException( - "Unexpected start tag in <" + tagName + ">: " + parser.getName()); - } - } - throw new XmlPullParserException( - "Unexpected end of document in <" + tagName + ">"); - } - - public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException - { - int type; - while ((type=parser.next()) != parser.START_TAG - && type != parser.END_DOCUMENT) { - ; - } - - if (type != parser.START_TAG) { - throw new XmlPullParserException("No start tag found"); - } - - if (!parser.getName().equals(firstElementName)) { - throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() + - ", expected " + firstElementName); - } - } - - public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException - { - int type; - while ((type=parser.next()) != parser.START_TAG - && type != parser.END_DOCUMENT) { - ; - } - } -} diff --git a/common/java/com/android/common/speech/Recognition.java b/common/java/com/android/common/speech/Recognition.java index bf60c9a..a79a19b 100644 --- a/common/java/com/android/common/speech/Recognition.java +++ b/common/java/com/android/common/speech/Recognition.java @@ -23,15 +23,6 @@ package com.android.common.speech; * @see android.speech.RecognizerIntent */ public class Recognition { - - /** - * The extra key used in an intent to the speech recognizer for voice search. Not - * generally to be used by developers. The system search dialog uses this, for example, - * to set a calling package for identification by a voice search API. If this extra - * is set by anyone but the system process, it should be overridden by the voice search - * implementation. - */ - public static final String EXTRA_CALLING_PACKAGE = "calling_package"; /** * The key to the extra in the Bundle returned by diff --git a/common/tests/res/raw/alt_ip_only.crt b/common/tests/res/raw/alt_ip_only.crt deleted file mode 100644 index 3ac9f5a..0000000 --- a/common/tests/res/raw/alt_ip_only.crt +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICsjCCAZqgAwIBAgIJALrC37YAXFIeMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNV -BAYTAkpQMCAXDTEwMDExMjIxMzk0NloYDzIwNjQxMDE1MjEzOTQ2WjANMQswCQYD -VQQGEwJKUDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr8s/4Abpby -IYks5YCJE2nbWH7kj6XbwnRzsVP9RVC33bPoQ1M+2ZY24HqkigjQS/HEXR0s0bYh -dewNUnTj1uGyGs6cYzsbu7x114vmVYqjxUo3hKjwfYiPeF6f3IE1vpLI7I2G32gq -Zwm9c1/vXNHIdWQxCpFcuPA8P3YGfoApFX4pQPFplBUNAQqnjdmA68cbxxMC+1F3 -mX42D7iIEVwyVpah5HjyxjIZQlf3X7QBj0bCmkL+ibIHTALrkNNwNM6i4xzYLz/5 -14GkN9ncHY87eSOk6r53ptER6mQMhCe9qPRjSHnpWTTyj6IXTaYe+dDQw657B80w -cSHL7Ed25zUCAwEAAaMTMBEwDwYDVR0RBAgwBocEwKgKATANBgkqhkiG9w0BAQUF -AAOCAQEAgrwrtOWZT3fbi1AafpGaAiOBWSJqYqRhtQy0AfiZBxv1U0XaYqmZmpnq -DVAqr0NkljowD28NBrxIFO5gBNum2ZOPDl2/5vjFn+IirUCJ9u9wS7zYkTCW2lQR -xE7Ic3mfWv7wUbKDfjlWqP1IDHUxwkrBTAl+HnwOPiaKKk1ttwcrgS8AHlqASe03 -mlwnvJ+Stk54IneRaegL0L93sNAy63RZqnPCTxGz7eHcFwX8Jdr4sbxTxQqV6pIc -WPjHQcWfpkFzAF5wyOq0kveVfx0g5xPhOVDd+U+q7WastbXICpCoHp9FxISmZVik -sAyifp8agkYdzaSh55fFmKXlFnRsQw== ------END CERTIFICATE----- diff --git a/common/tests/res/raw/subject_alt_only.crt b/common/tests/res/raw/subject_alt_only.crt deleted file mode 100644 index d5808fb..0000000 --- a/common/tests/res/raw/subject_alt_only.crt +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICvTCCAaWgAwIBAgIJALbA0TZk2YmNMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNV -BAYTAkpQMCAXDTEwMDExMjIwNTg1NFoYDzIwNjQxMDE1MjA1ODU0WjANMQswCQYD -VQQGEwJKUDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMEg6acVC9V4 -xNGoLNVLPbqBc8IvMvcsc88dF6MW3d9VagX3aeWU8c79tI/KOV/1AOakH7WYxw/w -yD8aOX7+9BK1Hu0qKKKbSM+ycqaMthXd6xytrNDsIx5WiGUz8zTko0Gk3orIR7p7 -rPcNzB/zwtESkscqPv85aEn7S/yClNkzLfEzm3CtaYOc0tfhBMyzi/ipXzGMxUmx -PvOLr3v/Oz5pZEQw7Kxlm4+tAtn7bJlHziQ1UW4WPIy+T3hySBEpODFiqZi7Ok3X -Zjxdii62fgo5B2Ee7q5Amo0mUIwcQTDjJ2CLAqzYnSh3tpiPJGjEIjmRyCoMQ1bx -7D+y7nSPIq8CAwEAAaMeMBwwGgYDVR0RBBMwEYIPd3d3LmV4YW1wbGUuY29tMA0G -CSqGSIb3DQEBBQUAA4IBAQBsGEh+nHc0l9FJTzWqvG3qs7i6XoJZdtThCDx4HjKJ -8GMrJtreNN4JvIxn7KC+alVbnILjzCRO+c3rsnpxKBi5cp2imjuw5Kf/x2Seimb9 -UvZbaJvBVOzy4Q1IGef9bLy3wZzy2/WfBFyvPTAkgkRaX7LN2jnYOYVhNoNFrwqe -EWxkA6fzrpyseUEFeGFFjGxRSRCDcQ25Eq6d9rkC1x21zNtt4QwZBO0wHrTy155M -JPRynf9244Pn0Sr/wsnmdsTRFIFYynrc51hQ7DkwbUxpcaewkZzilru/SwZ3+pPT -9JSqm5hJ1pg5WDlPkW7c/1VA0/141N52Q8MIU+2ZpuOj ------END CERTIFICATE----- diff --git a/common/tests/res/raw/subject_only.crt b/common/tests/res/raw/subject_only.crt deleted file mode 100644 index 11b34e7..0000000 --- a/common/tests/res/raw/subject_only.crt +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC0TCCAbmgAwIBAgIJANCQbJPPw31SMA0GCSqGSIb3DQEBBQUAMCcxCzAJBgNV -BAYTAkpQMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wIBcNMTAwMTEyMjA1ODE4 -WhgPMjA2NDEwMTUyMDU4MThaMCcxCzAJBgNVBAYTAkpQMRgwFgYDVQQDEw93d3cu -ZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDsdUJk -4KxADA3vlDHxNbyC27Ozw4yiSVzPTHUct471YmdDRW3orO2P5a5hRnUGV70gjH9X -MU4oeOdWYAgXB9pxfLyr6621k1+uNrmaZtzp0ECH9twcwxNJJFDZsN7o9vt7V6Ej -NN9weeqDr/aeQXo07a12vyVfR6jWO8jHB0e4aemwZNoYjNvM69fivQTse2ZoRVfj -eSHhjRTX6I8ry4a31Hwt+fT1QiWWNN6o7+WOtpJAhX3eg4smhSD1svi2kOT8tdUe -NS4hWlmXmumU9G4tI8PBurcLNTm7PB2lUlbn/IV18WavqKE/Uy/1WgAx+a1EJNdp -i07AG1PsqaONKkf1AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAJrNsuL7fZZNC8gL -BdePJ7DYW2e7mXANU3bCBe2BZqmXKQxKwibZnEsqA+yMLqcSd8uxISlyHY2tw9wT -4wB9KPIttfNLbwn/rk+MbOTHpvyF60d9WhJJVUkPBl8D4VuPSl+VnlA54kU9dtZN -+ZYdxYbNtSsI/Flz9SCoOV79W9GhN+uYJhv6RwyIMIHeMpZpyX1xSUVx5dZlmerQ -WAUvghDH3fFRt2ZdnA4OXoKkTAaM3Pv7PUMsnah8bux6MQi0AuLMWFWOI1H34koH -rs2oQLwOLnuifH52ey9+tJguabo+brlYYigAuWWFEzJfBzikDkIwnE/L7wlrypIk -taXDWI4= ------END CERTIFICATE----- diff --git a/common/tests/res/raw/subject_with_alt_names.crt b/common/tests/res/raw/subject_with_alt_names.crt deleted file mode 100644 index 6963c7e..0000000 --- a/common/tests/res/raw/subject_with_alt_names.crt +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDBDCCAeygAwIBAgIJALv14qjcuhw9MA0GCSqGSIb3DQEBBQUAMCcxCzAJBgNV -BAYTAkpQMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wIBcNMTAwMTEyMjA1OTM4 -WhgPMjA2NDEwMTUyMDU5MzhaMCcxCzAJBgNVBAYTAkpQMRgwFgYDVQQDEw93d3cu -ZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCiTVgU -kBO9KNYZZLmiPR0eBrk8u61CLnm35BGKW8EFpDaINLbbIFIQvqOMekURON/N+xFY -D8roo7aFZVuHWAUqFcOJ4e6NmviK5qocLihtzAexsw4f4AzZxM3A8kcLlWLyAt7e -EVLxhcMHogY7GaF6q+33Z8p+zp6x3tj07mwyPrriCLse2PeRsRunZl/fp/VvRlr6 -YbC7CbRrhnIv5nqohs8BsbBiiFpxQftsMQmiXhY2LUzqY2RXUIOw24fHjoQkHTL2 -4z5nUM3b6ueQe+CBnobUS6fzK/36Nct4dRpev9i/ORdRLuIDKJ+QR16G1V/BJYBR -dAK+3iXvg6z8vP1XAgMBAAGjMTAvMC0GA1UdEQQmMCSCEHd3dzIuZXhhbXBsZS5j -b22CEHd3dzMuZXhhbXBsZS5jb20wDQYJKoZIhvcNAQEFBQADggEBAJQNf38uXm3h -0vsF+Yd6/HqM48Su7tWnTDAfTXnQZZkzjzITq3JXzquMXICktAVN2cLnT9zPfRAE -8V8A3BNO5zXiR5W3o/mJP5HQ3/WxpzBGM2N+YmDCJyBoQrIVaAZaXAZUaBBvn5A+ -kEVfGWquwIFuvA67xegbJOCRLD4eUzRdNsn5+NFiakWO1tkFqEzqyQ0PNPviRjgu -z9NxdPvd1JQOhydkucsPKJzlEBbGyL5QL/Jkot3Qy+FOeuNzgQUfAGtQgzRrsZDK -hrTVypLSoRXuTB2aWilu4p6aNh84xTdyqo2avtNr2MiQMZIcdamBq8LdBIAShFXI -h5G2eVGXH/Y= ------END CERTIFICATE----- diff --git a/common/tests/res/raw/subject_with_wild_alt_name.crt b/common/tests/res/raw/subject_with_wild_alt_name.crt deleted file mode 100644 index 19b1174..0000000 --- a/common/tests/res/raw/subject_with_wild_alt_name.crt +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC8DCCAdigAwIBAgIJAL/oWJ64VAdXMA0GCSqGSIb3DQEBBQUAMCcxCzAJBgNV -BAYTAkpQMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wIBcNMTAwMTEyMjEwMDAx -WhgPMjA2NDEwMTUyMTAwMDFaMCcxCzAJBgNVBAYTAkpQMRgwFgYDVQQDEw93d3cu -ZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbx1QB -92iea7VybLYICA4MX4LWipYrRsgXUXQrcIQ3YLTQ9rH0VwScrHL4O4JDxgXCQnR+ -4VOzD42q1KXHJAqzqGUYCNPyvZEzkGCnQ4FBIUEmxZd5SNEefJVH3Z6GizYJomTh -p78yDcoqymD9umxRC2cWFu8GscfFGMVyhsqLlOofu7UWOs22mkXPo43jDx+VOAoV -n48YP3P57a2Eo0gcd4zVL00y62VegqBO/1LW38aTS7teiCBFc1TkNYa5I40yN9lP -rB9ICHYQWyzf/7OxU9iauEK2w6DmSsQoLs9JzEhgeNZddkcc77ciSUCo2Hx0VpOJ -BFyf2rbryJeAk+FDAgMBAAGjHTAbMBkGA1UdEQQSMBCCDiouZXhhbXBsZTIuY29t -MA0GCSqGSIb3DQEBBQUAA4IBAQA2a14pRL+4laJ8sscQlucaDB/oSdb0cwhk4IkE -kKl/ZKr6rKwPZ81sJRgzvI4imLbUAKt4AJHdpI9cIQUq1gw9bzil7LKwmFtFSPmC -MYb1iadaYrvp7RE4yXrWCcSbU0hup9JQLHTrHLlqLtRuU48NHMvWYThBcS9Q/hQp -nJ/JxYy3am99MHALWLAfuRxQXhE4C5utDmBwI2KD6A8SA30s+CnuegmkYScuSqBu -Y3R0HZvKzNIU3pwAm69HCJoG+/9MZEIDJb0WJc5UygxDT45XE9zQMQe4dBOTaNXT -+ntgaB62kE10HzrzpqXAgoAWxWK4RzFcUpBWw9qYq9xOCewJ ------END CERTIFICATE----- diff --git a/common/tests/res/raw/wild_alt_name_only.crt b/common/tests/res/raw/wild_alt_name_only.crt deleted file mode 100644 index fafdebf..0000000 --- a/common/tests/res/raw/wild_alt_name_only.crt +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICuzCCAaOgAwIBAgIJAP82tgcvmAGxMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNV -BAYTAkpQMCAXDTEwMDExMjIxMDAyN1oYDzIwNjQxMDE1MjEwMDI3WjANMQswCQYD -VQQGEwJKUDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALs528EQbcB1 -x4BwxthQBZrgDJzoO7KPV3dhGYoeP8EnRjapZm+T/sj9P/O4HvfxjnB+fsjYSdmE -WWUtnFrP7wtG9DUC748Ea2PMV8WFhOG58dqBNIko5XzkHB7SxkNZD5S/0KQYMGLr -rchDsDlmsEf2Qb6qiqpNEU70aSkExZJcH+B9nWdeBpsVFu7wtezwSWEc2NUa2bhW -gcXQ/aafwHZ4o2PyGwy0sgS/UifqO9tEllC2tPleSNJOmYsVudv5Bz4Q0GG38BSz -Pc0IcOoln0ZWpXbGr03V2vlXWCwzaFAl3I1T3O7YVqDiaSWoP+d0tHZzmw8aJLXd -B+KaUUGxRPsCAwEAAaMcMBowGAYDVR0RBBEwD4INKi5leGFtcGxlLmNvbTANBgkq -hkiG9w0BAQUFAAOCAQEAJbVan4QgJ0cvpJnK9UWIVJNC+UbP87RC5go2fQiTnmGv -prOrIuMqz1+vGcpIheLTLctJRHPoadXq0+UbQEIaU3pQbY6C4nNdfl+hcvmJeqrt -kOCcvmIamO68iNvTSeszuHuu4O38PefrW2Xd0nn7bjFZrzBzHFhTudmnqNliP3ue -KKQpqkUt5lCytnH8V/u/UCWdvVx5LnUa2XFGVLi3ongBIojW5fvF+yxn9ADqxdrI -va++ow5r1VxQXFJc0ZPzsDo+6TlktoDHaRQJGMqQomqHWT4i7F5UZgf6BHGfEUPU -qep+GsF3QRHSBtpObWkVDZNFvky3a1iZ2q25+hFIqQ== ------END CERTIFICATE----- diff --git a/common/tests/src/com/android/common/DNParserTest.java b/common/tests/src/com/android/common/DNParserTest.java deleted file mode 100644 index 34b140a..0000000 --- a/common/tests/src/com/android/common/DNParserTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import javax.security.auth.x500.X500Principal; - -import junit.framework.TestCase; - -public class DNParserTest extends TestCase { - public void testFind() { - checkFind("", "cn", null); - checkFind("ou=xxx", "cn", null); - checkFind("ou=xxx,cn=xxx", "cn", "xxx"); - checkFind("ou=xxx+cn=yyy,cn=zzz+cn=abc", "cn", "yyy"); - checkFind("2.5.4.3=a,ou=xxx", "cn", "a"); // OID - checkFind("cn=a,cn=b", "cn", "a"); - checkFind("ou=Cc,ou=Bb,ou=Aa", "ou", "Cc"); - checkFind("cn=imap.gmail.com", "cn", "imap.gmail.com"); - - // Quoted string (see http://www.ietf.org/rfc/rfc2253.txt) - checkFind("o=\"\\\" a ,=<>#;\"", "o", "\" a ,=<>#;"); - checkFind("o=abc\\,def", "o", "abc,def"); - - // UTF-8 (example in rfc 2253) - checkFind("cn=Lu\\C4\\8Di\\C4\\87", "cn", "\u004c\u0075\u010d\u0069\u0107"); - - // whitespaces - checkFind("ou=a, o= a b ,cn=x", "o", "a b"); - checkFind("o=\" a b \" ,cn=x", "o", " a b "); - } - - private void checkFind(String dn, String attrType, String expected) { - String actual = new DNParser(new X500Principal(dn)).find(attrType); - assertEquals("dn:" + dn + " attr:" + attrType, expected, actual); - } -} diff --git a/common/tests/src/com/android/common/DomainNameValidatorTest.java b/common/tests/src/com/android/common/DomainNameValidatorTest.java deleted file mode 100644 index b825be4..0000000 --- a/common/tests/src/com/android/common/DomainNameValidatorTest.java +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import com.android.common.tests.R; - -import android.test.AndroidTestCase; - -import java.io.InputStream; -import java.math.BigInteger; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.Principal; -import java.security.PublicKey; -import java.security.SignatureException; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateException; -import java.security.cert.CertificateExpiredException; -import java.security.cert.CertificateFactory; -import java.security.cert.CertificateNotYetValidException; -import java.security.cert.CertificateParsingException; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - -import javax.security.auth.x500.X500Principal; - -public class DomainNameValidatorTest extends AndroidTestCase { - private static final int ALT_UNKNOWN = 0; - private static final int ALT_DNS_NAME = 2; - private static final int ALT_IPA_NAME = 7; - - /** - * Tests {@link DomainNameValidator#match}, using a simple {@link X509Certificate} - * implementation. - */ - public void testMatch() { - checkMatch("11", new StubX509Certificate("cn=imap.g.com"), "imap.g.com", true); - checkMatch("12", new StubX509Certificate("cn=imap2.g.com"), "imap.g.com", false); - checkMatch("13", new StubX509Certificate("cn=sub.imap.g.com"), "imap.g.com", false); - - // If a subjectAltName extension of type dNSName is present, that MUST - // be used as the identity - checkMatch("21", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_DNS_NAME, "a.y.com") - , "imap.g.com", false); - checkMatch("22", new StubX509Certificate("cn=imap.g.com") // This cn should be ignored - .addSubjectAlternativeName(ALT_DNS_NAME, "a.y.com") - , "imap.g.com", false); - checkMatch("23", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com") - , "imap.g.com", true); - - // With wildcards - checkMatch("24", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_DNS_NAME, "*.g.com") - , "imap.g.com", true); - - // host name is ip address - checkMatch("31", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_IPA_NAME, "1.2.3.4") - , "1.2.3.4", true); - checkMatch("32", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_IPA_NAME, "1.2.3.4") - , "1.2.3.5", false); - checkMatch("32", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_IPA_NAME, "1.2.3.4") - .addSubjectAlternativeName(ALT_IPA_NAME, "192.168.100.1") - , "192.168.100.1", true); - - // Has unknown subject alternative names - checkMatch("41", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 1") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 2") - .addSubjectAlternativeName(ALT_DNS_NAME, "a.b.c.d") - .addSubjectAlternativeName(ALT_DNS_NAME, "*.google.com") - .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com") - .addSubjectAlternativeName(ALT_IPA_NAME, "2.33.44.55") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 3") - , "imap.g.com", true); - - checkMatch("42", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 1") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 2") - .addSubjectAlternativeName(ALT_DNS_NAME, "a.b.c.d") - .addSubjectAlternativeName(ALT_DNS_NAME, "*.google.com") - .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com") - .addSubjectAlternativeName(ALT_IPA_NAME, "2.33.44.55") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 3") - , "2.33.44.55", true); - - checkMatch("43", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 1") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 2") - .addSubjectAlternativeName(ALT_DNS_NAME, "a.b.c.d") - .addSubjectAlternativeName(ALT_DNS_NAME, "*.google.com") - .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com") - .addSubjectAlternativeName(ALT_IPA_NAME, "2.33.44.55") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 3") - , "g.com", false); - - checkMatch("44", new StubX509Certificate("") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 1") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 2") - .addSubjectAlternativeName(ALT_DNS_NAME, "a.b.c.d") - .addSubjectAlternativeName(ALT_DNS_NAME, "*.google.com") - .addSubjectAlternativeName(ALT_DNS_NAME, "imap.g.com") - .addSubjectAlternativeName(ALT_IPA_NAME, "2.33.44.55") - .addSubjectAlternativeName(ALT_UNKNOWN, "random string 3") - , "2.33.44.1", false); - } - - private void checkMatch(String message, X509Certificate certificate, String thisDomain, - boolean expected) { - Boolean actual = DomainNameValidator.match(certificate, thisDomain); - assertEquals(message, (Object) expected, (Object) actual); - } - - /** - * Tests {@link DomainNameValidator#matchDns} - */ - public void testMatchDns() { - checkMatchDns("11", "a.b.c.d", "a.b.c.d", true); - checkMatchDns("12", "a.b.c.d", "*.b.c.d", true); - checkMatchDns("13", "b.c.d", "*.b.c.d", true); - checkMatchDns("14", "b.c.d", "b*.c.d", true); - - checkMatchDns("15", "a.b.c.d", "*.*.c.d", false); - checkMatchDns("16", "a.b.c.d", "*.c.d", false); - - checkMatchDns("21", "imap.google.com", "imap.google.com", true); - checkMatchDns("22", "imap2.google.com", "imap.google.com", false); - checkMatchDns("23", "imap.google.com", "*.google.com", true); - checkMatchDns("24", "imap2.google.com", "*.google.com", true); - checkMatchDns("25", "imap.google.com", "*.googl.com", false); - checkMatchDns("26", "imap2.google2.com", "*.google3.com", false); - checkMatchDns("27", "imap.google.com", "ima*.google.com", true); - checkMatchDns("28", "imap.google.com", "imap*.google.com", true); - checkMatchDns("29", "imap.google.com", "*.imap.google.com", true); - - checkMatchDns("41", "imap.google.com", "a*.google.com", false); - checkMatchDns("42", "imap.google.com", "ix*.google.com", false); - - checkMatchDns("51", "imap.google.com", "iMap.Google.Com", true); - } - - private void checkMatchDns(String message, String thisDomain, String thatDomain, - boolean expected) { - boolean actual = DomainNameValidator.matchDns(thisDomain, thatDomain); - assertEquals(message, expected, actual); - } - - /** - * Test {@link DomainNameValidator#match} with actual certificates. - */ - public void testWithActualCert() throws Exception { - // subject_only - // - // subject: C=JP, CN=www.example.com - // subject alt names: n/a - checkWithActualCert("11", R.raw.subject_only, "www.example.com", true); - checkWithActualCert("12", R.raw.subject_only, "www2.example.com", false); - - // subject_alt_only - // - // subject: C=JP (no CN) - // subject alt names: DNS:www.example.com - checkWithActualCert("21", R.raw.subject_alt_only, "www.example.com", true); - checkWithActualCert("22", R.raw.subject_alt_only, "www2.example.com", false); - - // subject_with_alt_names - // - // subject: C=JP, CN=www.example.com - // subject alt names: DNS:www2.example.com, DNS:www3.example.com - // * Subject should be ignored, because it has subject alt names. - checkWithActualCert("31", R.raw.subject_with_alt_names, "www.example.com", false); - checkWithActualCert("32", R.raw.subject_with_alt_names, "www2.example.com", true); - checkWithActualCert("33", R.raw.subject_with_alt_names, "www3.example.com", true); - checkWithActualCert("34", R.raw.subject_with_alt_names, "www4.example.com", false); - - // subject_with_wild_alt_name - // - // subject: C=JP, CN=www.example.com - // subject alt names: DNS:*.example2.com - // * Subject should be ignored, because it has subject alt names. - checkWithActualCert("41", R.raw.subject_with_wild_alt_name, "www.example.com", false); - checkWithActualCert("42", R.raw.subject_with_wild_alt_name, "www2.example.com", false); - checkWithActualCert("43", R.raw.subject_with_wild_alt_name, "www.example2.com", true); - checkWithActualCert("44", R.raw.subject_with_wild_alt_name, "abc.example2.com", true); - checkWithActualCert("45", R.raw.subject_with_wild_alt_name, "www.example3.com", false); - - // wild_alt_name_only - // - // subject: C=JP - // subject alt names: DNS:*.example.com - checkWithActualCert("51", R.raw.wild_alt_name_only, "www.example.com", true); - checkWithActualCert("52", R.raw.wild_alt_name_only, "www2.example.com", true); - checkWithActualCert("53", R.raw.wild_alt_name_only, "www.example2.com", false); - - // wild_alt_name_only - // - // subject: C=JP - // subject alt names: IP Address:192.168.10.1 - checkWithActualCert("61", R.raw.alt_ip_only, "192.168.10.1", true); - checkWithActualCert("61", R.raw.alt_ip_only, "192.168.10.2", false); - } - - private void checkWithActualCert(String message, int resId, String domain, - boolean expected) throws Exception { - CertificateFactory factory = CertificateFactory.getInstance("X509"); - InputStream certStream = getContext().getResources().openRawResource(resId); - X509Certificate certificate = (X509Certificate) factory.generateCertificate(certStream); - - checkMatch(message, certificate, domain, expected); - } - - /** - * Minimal {@link X509Certificate} implementation for {@link DomainNameValidator}. - */ - private static class StubX509Certificate extends X509Certificate { - private final X500Principal subjectX500Principal; - private Collection<List<?>> subjectAlternativeNames; - - public StubX509Certificate(String subjectDn) { - subjectX500Principal = new X500Principal(subjectDn); - subjectAlternativeNames = null; - } - - public StubX509Certificate addSubjectAlternativeName(int type, String name) { - if (subjectAlternativeNames == null) { - subjectAlternativeNames = new ArrayList<List<?>>(); - } - LinkedList<Object> entry = new LinkedList<Object>(); - entry.add(type); - entry.add(name); - subjectAlternativeNames.add(entry); - return this; - } - - @Override - public Collection<List<?>> getSubjectAlternativeNames() throws CertificateParsingException { - return subjectAlternativeNames; - } - - @Override - public X500Principal getSubjectX500Principal() { - return subjectX500Principal; - } - - @Override - public void checkValidity() throws CertificateExpiredException, - CertificateNotYetValidException { - throw new RuntimeException("Method not implemented"); - } - - @Override - public void checkValidity(Date date) throws CertificateExpiredException, - CertificateNotYetValidException { - throw new RuntimeException("Method not implemented"); - } - - @Override - public int getBasicConstraints() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public Principal getIssuerDN() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public boolean[] getIssuerUniqueID() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public boolean[] getKeyUsage() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public Date getNotAfter() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public Date getNotBefore() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public BigInteger getSerialNumber() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public String getSigAlgName() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public String getSigAlgOID() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public byte[] getSigAlgParams() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public byte[] getSignature() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public Principal getSubjectDN() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public boolean[] getSubjectUniqueID() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public byte[] getTBSCertificate() throws CertificateEncodingException { - throw new RuntimeException("Method not implemented"); - } - - @Override - public int getVersion() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public byte[] getEncoded() throws CertificateEncodingException { - throw new RuntimeException("Method not implemented"); - } - - @Override - public PublicKey getPublicKey() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public String toString() { - throw new RuntimeException("Method not implemented"); - } - - @Override - public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException, - InvalidKeyException, NoSuchProviderException, SignatureException { - throw new RuntimeException("Method not implemented"); - } - - @Override - public void verify(PublicKey key, String sigProvider) throws CertificateException, - NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, - SignatureException { - throw new RuntimeException("Method not implemented"); - } - - public Set<String> getCriticalExtensionOIDs() { - throw new RuntimeException("Method not implemented"); - } - - public byte[] getExtensionValue(String oid) { - throw new RuntimeException("Method not implemented"); - } - - public Set<String> getNonCriticalExtensionOIDs() { - throw new RuntimeException("Method not implemented"); - } - - public boolean hasUnsupportedCriticalExtension() { - throw new RuntimeException("Method not implemented"); - } - } -} diff --git a/common/tests/src/com/android/common/PatternsTest.java b/common/tests/src/com/android/common/PatternsTest.java deleted file mode 100644 index 9e2ad58..0000000 --- a/common/tests/src/com/android/common/PatternsTest.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed 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 com.android.common; - -import android.test.suitebuilder.annotation.SmallTest; -import junit.framework.TestCase; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class PatternsTest extends TestCase { - - @SmallTest - public void testTldPattern() throws Exception { - boolean t; - - t = Patterns.TOP_LEVEL_DOMAIN.matcher("com").matches(); - assertTrue("Missed valid TLD", t); - - // One of the new top level domain. - t = Patterns.TOP_LEVEL_DOMAIN.matcher("me").matches(); - assertTrue("Missed valid TLD", t); - - // One of the new top level test domain. - t = Patterns.TOP_LEVEL_DOMAIN.matcher("xn--0zwm56d").matches(); - assertTrue("Missed valid TLD", t); - - t = Patterns.TOP_LEVEL_DOMAIN.matcher("mem").matches(); - assertFalse("Matched invalid TLD!", t); - - t = Patterns.TOP_LEVEL_DOMAIN.matcher("xn").matches(); - assertFalse("Matched invalid TLD!", t); - - t = Patterns.TOP_LEVEL_DOMAIN.matcher("xer").matches(); - assertFalse("Matched invalid TLD!", t); - } - - @SmallTest - public void testUrlPattern() throws Exception { - boolean t; - - t = Patterns.WEB_URL.matcher("http://www.google.com").matches(); - assertTrue("Valid URL", t); - - // Google in one of the new top level domain. - t = Patterns.WEB_URL.matcher("http://www.google.me").matches(); - assertTrue("Valid URL", t); - t = Patterns.WEB_URL.matcher("google.me").matches(); - assertTrue("Valid URL", t); - - // Test url in Chinese: http://xn--fsqu00a.xn--0zwm56d - t = Patterns.WEB_URL.matcher("http://xn--fsqu00a.xn--0zwm56d").matches(); - assertTrue("Valid URL", t); - t = Patterns.WEB_URL.matcher("xn--fsqu00a.xn--0zwm56d").matches(); - assertTrue("Valid URL", t); - - // Internationalized URL. - t = Patterns.WEB_URL.matcher("http://\uD604\uAE08\uC601\uC218\uC99D.kr").matches(); - assertTrue("Valid URL", t); - t = Patterns.WEB_URL.matcher("\uD604\uAE08\uC601\uC218\uC99D.kr").matches(); - assertTrue("Valid URL", t); - - t = Patterns.WEB_URL.matcher("ftp://www.example.com").matches(); - assertFalse("Matched invalid protocol", t); - - t = Patterns.WEB_URL.matcher("http://www.example.com:8080").matches(); - assertTrue("Didn't match valid URL with port", t); - - t = Patterns.WEB_URL.matcher("http://www.example.com:8080/?foo=bar").matches(); - assertTrue("Didn't match valid URL with port and query args", t); - - t = Patterns.WEB_URL.matcher("http://www.example.com:8080/~user/?foo=bar").matches(); - assertTrue("Didn't match valid URL with ~", t); - } - - @SmallTest - public void testIpPattern() throws Exception { - boolean t; - - t = Patterns.IP_ADDRESS.matcher("172.29.86.3").matches(); - assertTrue("Valid IP", t); - - t = Patterns.IP_ADDRESS.matcher("1234.4321.9.9").matches(); - assertFalse("Invalid IP", t); - } - - @SmallTest - public void testDomainPattern() throws Exception { - boolean t; - - t = Patterns.DOMAIN_NAME.matcher("mail.example.com").matches(); - assertTrue("Valid domain", t); - - t = Patterns.WEB_URL.matcher("google.me").matches(); - assertTrue("Valid domain", t); - - // Internationalized domains. - t = Patterns.DOMAIN_NAME.matcher("\uD604\uAE08\uC601\uC218\uC99D.kr").matches(); - assertTrue("Valid domain", t); - - t = Patterns.DOMAIN_NAME.matcher("__+&42.xer").matches(); - assertFalse("Invalid domain", t); - } - - @SmallTest - public void testPhonePattern() throws Exception { - boolean t; - - t = Patterns.PHONE.matcher("(919) 555-1212").matches(); - assertTrue("Valid phone", t); - - t = Patterns.PHONE.matcher("2334 9323/54321").matches(); - assertFalse("Invalid phone", t); - - String[] tests = { - "Me: 16505551212 this\n", - "Me: 6505551212 this\n", - "Me: 5551212 this\n", - - "Me: 1-650-555-1212 this\n", - "Me: (650) 555-1212 this\n", - "Me: +1 (650) 555-1212 this\n", - "Me: +1-650-555-1212 this\n", - "Me: 650-555-1212 this\n", - "Me: 555-1212 this\n", - - "Me: 1.650.555.1212 this\n", - "Me: (650) 555.1212 this\n", - "Me: +1 (650) 555.1212 this\n", - "Me: +1.650.555.1212 this\n", - "Me: 650.555.1212 this\n", - "Me: 555.1212 this\n", - - "Me: 1 650 555 1212 this\n", - "Me: (650) 555 1212 this\n", - "Me: +1 (650) 555 1212 this\n", - "Me: +1 650 555 1212 this\n", - "Me: 650 555 1212 this\n", - "Me: 555 1212 this\n", - }; - - for (String test : tests) { - Matcher m = Patterns.PHONE.matcher(test); - - assertTrue("Valid phone " + test, m.find()); - } - } -} |