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