X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=gson%2Fcom%2Fgoogle%2Fgson%2Finternal%2FConstructorConstructor.java;fp=gson%2Fcom%2Fgoogle%2Fgson%2Finternal%2FConstructorConstructor.java;h=0000000000000000000000000000000000000000;hb=d1b96429477dd3d4b0fee33b232e3ba8925b2b19;hp=a0a3e9db303bbe7b6bafe15b557ff3df0559bc11;hpb=306c1a65e1b352740d0c55ded51902735c2f78cc;p=unical.git diff --git a/gson/com/google/gson/internal/ConstructorConstructor.java b/gson/com/google/gson/internal/ConstructorConstructor.java deleted file mode 100644 index a0a3e9d..0000000 --- a/gson/com/google/gson/internal/ConstructorConstructor.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * 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.google.gson.internal; - -import com.google.gson.InstanceCreator; -import com.google.gson.JsonIOException; -import com.google.gson.reflect.TypeToken; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.Map; -import java.util.Queue; -import java.util.Set; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.TreeMap; -import java.util.TreeSet; - -/** - * Returns a function that can construct an instance of a requested type. - */ -public final class ConstructorConstructor { - private final Map> instanceCreators; - - public ConstructorConstructor(Map> instanceCreators) { - this.instanceCreators = instanceCreators; - } - - public ObjectConstructor get(TypeToken typeToken) { - final Type type = typeToken.getType(); - final Class rawType = typeToken.getRawType(); - - // first try an instance creator - - @SuppressWarnings("unchecked") // types must agree - final InstanceCreator typeCreator = (InstanceCreator) instanceCreators.get(type); - if (typeCreator != null) { - return new ObjectConstructor() { - public T construct() { - return typeCreator.createInstance(type); - } - }; - } - - // Next try raw type match for instance creators - @SuppressWarnings("unchecked") // types must agree - final InstanceCreator rawTypeCreator = - (InstanceCreator) instanceCreators.get(rawType); - if (rawTypeCreator != null) { - return new ObjectConstructor() { - public T construct() { - return rawTypeCreator.createInstance(type); - } - }; - } - - ObjectConstructor defaultConstructor = newDefaultConstructor(rawType); - if (defaultConstructor != null) { - return defaultConstructor; - } - - ObjectConstructor defaultImplementation = newDefaultImplementationConstructor(type, rawType); - if (defaultImplementation != null) { - return defaultImplementation; - } - - // finally try unsafe - return newUnsafeAllocator(type, rawType); - } - - private ObjectConstructor newDefaultConstructor(Class rawType) { - try { - final Constructor constructor = rawType.getDeclaredConstructor(); - if (!constructor.isAccessible()) { - constructor.setAccessible(true); - } - return new ObjectConstructor() { - @SuppressWarnings("unchecked") // T is the same raw type as is requested - public T construct() { - try { - Object[] args = null; - return (T) constructor.newInstance(args); - } catch (InstantiationException e) { - // TODO: JsonParseException ? - throw new RuntimeException("Failed to invoke " + constructor + " with no args", e); - } catch (InvocationTargetException e) { - // TODO: don't wrap if cause is unchecked! - // TODO: JsonParseException ? - throw new RuntimeException("Failed to invoke " + constructor + " with no args", - e.getTargetException()); - } catch (IllegalAccessException e) { - throw new AssertionError(e); - } - } - }; - } catch (NoSuchMethodException e) { - return null; - } - } - - /** - * Constructors for common interface types like Map and List and their - * subytpes. - */ - @SuppressWarnings("unchecked") // use runtime checks to guarantee that 'T' is what it is - private ObjectConstructor newDefaultImplementationConstructor( - final Type type, Class rawType) { - if (Collection.class.isAssignableFrom(rawType)) { - if (SortedSet.class.isAssignableFrom(rawType)) { - return new ObjectConstructor() { - public T construct() { - return (T) new TreeSet(); - } - }; - } else if (EnumSet.class.isAssignableFrom(rawType)) { - return new ObjectConstructor() { - @SuppressWarnings("rawtypes") - public T construct() { - if (type instanceof ParameterizedType) { - Type elementType = ((ParameterizedType) type).getActualTypeArguments()[0]; - if (elementType instanceof Class) { - return (T) EnumSet.noneOf((Class)elementType); - } else { - throw new JsonIOException("Invalid EnumSet type: " + type.toString()); - } - } else { - throw new JsonIOException("Invalid EnumSet type: " + type.toString()); - } - } - }; - } else if (Set.class.isAssignableFrom(rawType)) { - return new ObjectConstructor() { - public T construct() { - return (T) new LinkedHashSet(); - } - }; - } else if (Queue.class.isAssignableFrom(rawType)) { - return new ObjectConstructor() { - public T construct() { - return (T) new LinkedList(); - } - }; - } else { - return new ObjectConstructor() { - public T construct() { - return (T) new ArrayList(); - } - }; - } - } - - if (Map.class.isAssignableFrom(rawType)) { - if (SortedMap.class.isAssignableFrom(rawType)) { - return new ObjectConstructor() { - public T construct() { - return (T) new TreeMap(); - } - }; - } else if (type instanceof ParameterizedType && !(String.class.isAssignableFrom( - TypeToken.get(((ParameterizedType) type).getActualTypeArguments()[0]).getRawType()))) { - return new ObjectConstructor() { - public T construct() { - return (T) new LinkedHashMap(); - } - }; - } else { - return new ObjectConstructor() { - public T construct() { - return (T) new LinkedTreeMap(); - } - }; - } - } - - return null; - } - - private ObjectConstructor newUnsafeAllocator( - final Type type, final Class rawType) { - return new ObjectConstructor() { - private final UnsafeAllocator unsafeAllocator = UnsafeAllocator.create(); - @SuppressWarnings("unchecked") - public T construct() { - try { - Object newInstance = unsafeAllocator.newInstance(rawType); - return (T) newInstance; - } catch (Exception e) { - throw new RuntimeException(("Unable to invoke no-args constructor for " + type + ". " - + "Register an InstanceCreator with Gson for this type may fix this problem."), e); - } - } - }; - } - - @Override public String toString() { - return instanceCreators.toString(); - } -}