/* * Copyright 2013, Arondor * * 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.arondor.common.reflection.noreflect.runtime; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; import com.arondor.common.reflection.api.instantiator.InstantiationCallback; import com.arondor.common.reflection.noreflect.model.FieldSetter; import com.arondor.common.reflection.noreflect.model.ObjectConstructor; import com.arondor.common.reflection.noreflect.model.ObjectConstructorAsync; import com.arondor.common.reflection.noreflect.model.PackageInstantiatorAsync; import com.arondor.common.reflection.noreflect.model.ReflectionInstantiatorCatalog; public class SimpleReflectionInstantiatorCatalog implements ReflectionInstantiatorCatalog { private final static Logger LOG = Logger.getLogger(SimpleReflectionInstantiatorCatalog.class.getName()); private final Map<String, String[]> inheritanceMap = new HashMap<String, String[]>(); private final Map<String, ObjectConstructor> objectConstructorMap = new HashMap<String, ObjectConstructor>(); private final Map<String, ObjectConstructorAsync> objectConstructorAsyncMap = new HashMap<String, ObjectConstructorAsync>(); private final Map<String, FieldSetter> fieldSetterMap = new HashMap<String, FieldSetter>(); private final Map<String, PackageInstantiatorAsync> packageInstantiatorMap = new HashMap<String, PackageInstantiatorAsync>(); private final Map<String, String> class2package = new HashMap<String, String>(); @Override public void registerObjectInheritance(String className, String inheritance[]) { inheritanceMap.put(className, inheritance); } @Override public void registerObjectConstructor(String name, ObjectConstructor objectConstructor) { LOG.finest("registerObjectConstructor(" + name + ", ...)"); objectConstructorMap.put(name, objectConstructor); } @Override public void registerObjectConstructor(String name, ObjectConstructorAsync objectConstructor) { LOG.finest("registerObjectConstructor(" + name + ", ...)"); objectConstructorAsyncMap.put(name, objectConstructor); } @Override public void registerFieldSetter(String className, String fieldName, FieldSetter fieldSetter) { fieldSetterMap.put(getFieldSetterName(className, fieldName), fieldSetter); } private String getFieldSetterName(String className, String fieldName) { return className + "." + fieldName; } @Override public ObjectConstructor getObjectConstructor(String className) { return objectConstructorMap.get(className); } @Override public void getObjectConstructorAsync(String className, InstantiationCallback<ObjectConstructor> callback) { ObjectConstructor sync = objectConstructorMap.get(className); if (sync != null) { callback.onSuccess(sync); return; } ObjectConstructorAsync async = objectConstructorAsyncMap.get(className); if (async == null) { callback.onFailure(new IllegalArgumentException("No async callback for :" + className)); } async.getObjectConstructor(callback); } @Override public FieldSetter getFieldSetter(String className, String fieldName) { FieldSetter fieldSetter = fieldSetterMap.get(getFieldSetterName(className, fieldName)); if (fieldSetter != null) { return fieldSetter; } String inheritance[] = inheritanceMap.get(className); if (inheritance != null) { for (String parent : inheritance) { fieldSetter = getFieldSetter(parent, fieldName); if (fieldSetter != null) { return fieldSetter; } } } return null; } @Override public void registerPackageInstantiator(String packageName, PackageInstantiatorAsync instantiator) { packageInstantiatorMap.put(packageName, instantiator); } @Override public PackageInstantiatorAsync getPackageInstantiator(String packageName) { return packageInstantiatorMap.get(packageName); } @Override public void registerClassInPackage(String packageName, String className) { class2package.put(className, packageName); } @Override public String getPackageForClass(String className) { return class2package.get(className); } }