1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/**
5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 2001-2015, International Business Machines Corporation and
7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved.
8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *******************************************************************************
9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.test;
11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.io.BufferedReader;
13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.io.File;
14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.io.FileInputStream;
15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.io.IOException;
16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.io.InputStream;
17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.io.InputStreamReader;
18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale;
19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic final class TestUtil {
21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Path to test data in icu4jtest.jar
23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static final String DATA_PATH = "/android/icu/dev/data/";
25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Return an input stream on the data file at path 'name' rooted at the data path
28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static final InputStream getDataStream(String name) throws IOException {
30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        InputStream is = null;
31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            is = TestUtil.class.getResourceAsStream(DATA_PATH + name);
33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Throwable t) {
34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            IOException ex =
35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new IOException("data resource '" + name + "' not found");
36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ex.initCause(t);
37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            throw ex;
38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return is;
40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Return a buffered reader on the data file at path 'name' rooted at the data path.
44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static final BufferedReader getDataReader(String name, String charset) throws IOException {
46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        InputStream is = getDataStream(name);
47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        InputStreamReader isr =
48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            charset == null
49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ? new InputStreamReader(is)
50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                : new InputStreamReader(is, charset);
51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return new BufferedReader(isr);
52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Return a buffered reader on the data file at path 'name' rooted at the data path,
56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * using the provided encoding.
57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static final BufferedReader getDataReader(String name)
59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        throws IOException {
60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return getDataReader(name, null);
61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static final char DIGITS[] =
64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {
65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '0',
66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '1',
67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '2',
68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '3',
69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '4',
70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '5',
71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '6',
72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '7',
73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '8',
74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            '9',
75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'A',
76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'B',
77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'C',
78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'D',
79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'E',
80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'F',
81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'G',
82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'H',
83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'I',
84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'J',
85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'K',
86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'L',
87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'M',
88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'N',
89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'O',
90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'P',
91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'Q',
92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'R',
93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'S',
94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'T',
95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'U',
96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'V',
97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'W',
98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'X',
99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'Y',
100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            'Z' };
101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Return true if the character is NOT printable ASCII.  The tab,
103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * newline and linefeed characters are considered unprintable.
104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static boolean isUnprintable(int c) {
106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return !(c >= 0x20 && c <= 0x7E);
107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    /**
109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * Escape unprintable characters using <backslash>uxxxx notation
110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * for U+0000 to U+FFFF and <backslash>Uxxxxxxxx for U+10000 and
111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * above.  If the character is printable ASCII, then do nothing
112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * and return FALSE.  Otherwise, append the escaped notation and
113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     * return TRUE.
114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin     */
115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static boolean escapeUnprintable(StringBuffer result, int c) {
116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (isUnprintable(c)) {
117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result.append('\\');
118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if ((c & ~0xFFFF) != 0) {
119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.append('U');
120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.append(DIGITS[0xF & (c >> 28)]);
121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.append(DIGITS[0xF & (c >> 24)]);
122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.append(DIGITS[0xF & (c >> 20)]);
123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.append(DIGITS[0xF & (c >> 16)]);
124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } else {
125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                result.append('u');
126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result.append(DIGITS[0xF & (c >> 12)]);
128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result.append(DIGITS[0xF & (c >> 8)]);
129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result.append(DIGITS[0xF & (c >> 4)]);
130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            result.append(DIGITS[0xF & c]);
131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return true;
132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return false;
134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static class Lock {
137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        private int count;
138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        synchronized void inc() {
140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            ++count;
141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        synchronized void dec() {
144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            --count;
145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        synchronized int count() {
148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return count;
149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        void go() {
152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                while (count() > 0) {
154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    synchronized (this) {
155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        notifyAll();
156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    Thread.sleep(50);
158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (InterruptedException e) {
160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    static class TestThread extends Thread {
165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Lock lock;
166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Runnable target;
167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        TestThread(Lock lock, Runnable target) {
169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.lock = lock;
170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            this.target = target;
171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            lock.inc();
173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        public void run() {
176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                synchronized (lock) {
178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    lock.wait();
179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                target.run();
181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (InterruptedException e) {
182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            lock.dec();
185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static void runUntilDone(Runnable[] targets) {
189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (targets == null) {
190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            throw new IllegalArgumentException("targets is null");
191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (targets.length == 0) {
193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Lock lock = new Lock();
197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (int i = 0; i < targets.length; ++i) {
198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new TestThread(lock, targets[i]).start();
199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        lock.go();
202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static BufferedReader openUTF8Reader(String dir, String filename) throws IOException {
204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return openReader(dir,filename,"UTF-8");
205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static BufferedReader openReader(String dir, String filename, String encoding) throws IOException {
207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        File file = new File(dir + filename);
208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return new BufferedReader(
209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            new InputStreamReader(
210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                new FileInputStream(file),
211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                encoding),
212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            4*1024);
213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public enum JavaVendor {
216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Unknown,
217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Oracle,
218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        IBM,
219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Android
220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static JavaVendor getJavaVendor() {
223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        JavaVendor vendor = JavaVendor.Unknown;
224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String javaVendorProp = System.getProperty("java.vendor", "").toLowerCase(Locale.US).trim();
225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (javaVendorProp.startsWith("ibm")) {
226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            vendor = JavaVendor.IBM;
227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } else if (javaVendorProp.startsWith("sun") || javaVendorProp.startsWith("oracle")) {
228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            vendor = JavaVendor.Oracle;
229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } else if (javaVendorProp.contains("android")) {
230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            vendor = JavaVendor.Android;
231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return vendor;
233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public static int getJavaVersion() {
236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int ver = -1;
237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String verstr = System.getProperty("java.version");
238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (verstr != null) {
239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            String[] numbers = verstr.split("\\.");
240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ver = Integer.parseInt(numbers[1]);
242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (NumberFormatException e) {
243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ver = -1;
244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        return ver;
247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
249