1eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin/**
2eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * Copyright 2006-2017 the original author or authors.
3eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin *
4eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
5eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * you may not use this file except in compliance with the License.
6eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * You may obtain a copy of the License at
7eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin *
8eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin *     http://www.apache.org/licenses/LICENSE-2.0
9eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin *
10eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * Unless required by applicable law or agreed to in writing, software
11eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
12eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * See the License for the specific language governing permissions and
14eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * limitations under the License.
15eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin */
16eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinpackage org.objenesis.tck.search;
17eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
18eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinimport org.objenesis.instantiator.ObjectInstantiator;
19eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinimport org.objenesis.strategy.PlatformDescription;
20eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinimport org.objenesis.tck.candidates.SerializableNoConstructor;
21eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
22eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinimport java.io.Serializable;
23eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinimport java.lang.reflect.Constructor;
24eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinimport java.lang.reflect.InvocationTargetException;
25eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinimport java.util.Iterator;
26eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinimport java.util.SortedSet;
27eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
28eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin/**
29eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * This class will try every available instantiator on the platform to see which works.
30eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin *
31eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin * @author Henri Tremblay
32eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin */
33eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffinpublic class SearchWorkingInstantiator implements Serializable { // implements Serializable just for the test
34eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
35eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin    private SearchWorkingInstantiatorListener listener;
36eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
37eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin    public static void main(String[] args) throws Exception {
38eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        System.out.println();
39eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        System.out.println(PlatformDescription.describePlatform());
40eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        System.out.println();
41eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
42eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        SearchWorkingInstantiator searchWorkingInstantiator = new SearchWorkingInstantiator(new SystemOutListener());
43eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        searchWorkingInstantiator.searchForInstantiator(SerializableNoConstructor.class);
44eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin    }
45eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
46eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin    public SearchWorkingInstantiator(SearchWorkingInstantiatorListener listener) {
47eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        this.listener = listener;
48eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin    }
49eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
50eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin    public void searchForInstantiator(Class<?> toInstantiate) {
51eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        SortedSet<String> classes = ClassEnumerator.getClassesForPackage(ObjectInstantiator.class.getPackage());
52eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
53eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        for (Iterator<String> it = classes.iterator(); it.hasNext();) {
54eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            String className = it.next();
55eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
56eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            // Skip if inner class of isn't named like a instantiator
57eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            if(className.contains("$") || !className.endsWith("Instantiator")) {
58eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin               continue;
59eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            }
60eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
61eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin           Class<?> c = null;
62eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin           try {
63eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin              c = Class.forName(className);
64eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin           }
65eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin           catch(Exception e) {
66eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin              listener.instantiatorUnsupported(c, e);
67eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin              continue;
68eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin           }
69eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
70eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin           if(c.isInterface() || !ObjectInstantiator.class.isAssignableFrom(c)) {
71eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                continue;
72eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin           }
73eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
74eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            Constructor<?> constructor;
75eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            try {
76eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                constructor = c.getConstructor(Class.class);
77eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            } catch (NoSuchMethodException e) {
78eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                throw new RuntimeException(e);
79eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            }
80eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin
81eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            try {
82eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                ObjectInstantiator<?> instantiator =
83eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                        (ObjectInstantiator<?>) constructor.newInstance(toInstantiate);
84eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                instantiator.newInstance();
85eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                listener.instantiatorSupported(c);
86eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            }
87eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            catch(Exception e) {
88eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                Throwable t = (e instanceof InvocationTargetException) ? e.getCause() : e;
89eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin                listener.instantiatorUnsupported(c, t);
90eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin            }
91eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin        }
92eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin    }
93eebfcaffb2d52b214abfdb1c0102395c88c9db54Paul Duffin}
94