package com.venky.swf.path; import java.util.List; import com.venky.cache.Cache; import com.venky.core.string.StringUtil; import com.venky.core.util.ObjectUtil; import com.venky.extension.Extension; import com.venky.extension.Registry; import com.venky.swf.controller.ModelController; import com.venky.swf.db.annotations.model.CONTROLLER; import com.venky.swf.db.model.Model; import com.venky.swf.db.model.reflection.ModelReflector; import com.venky.swf.routing.Config; public class ControllerCache extends Cache<String,String>{ static { Registry.instance().registerExtension("com.venky.swf.routing.Router.shutdown",new Extension(){ @Override public void invoke(Object... context) { dispose(); } }); } /** * */ private static final long serialVersionUID = -2476891313307932956L; private static ControllerCache _instance = null; public static ControllerCache instance(){ if (_instance != null) { return _instance; } synchronized (ControllerCache.class) { if (_instance == null) { _instance = new ControllerCache(); } } return _instance; } public static void dispose(){ synchronized (ControllerCache.class) { if (_instance != null){ _instance.clear(); _instance = null; } } } private static final String CONTROLLER_PACKAGE_ROOT = "swf.controller.package.root"; public List<String> getControllerPackageRoots(){ return Config.instance().getPackageRoots(CONTROLLER_PACKAGE_ROOT); } @Override protected String getValue(String k) { String clazzName = null; for (String controllerPackageRoot: getControllerPackageRoots()){ clazzName = controllerPackageRoot + "." + StringUtil.camelize(k) + "Controller"; if (Path.getClass(clazzName) != null) { break; } clazzName = null; } if (clazzName == null){ Class<? extends Model> modelClass = Path.getModelClass(k); if (modelClass != null){ ModelReflector<?> ref = ModelReflector.instance(modelClass); CONTROLLER controller = ref.getAnnotation(CONTROLLER.class); if (controller != null){ clazzName = controller.value(); } if (ObjectUtil.isVoid(clazzName)){ clazzName = ModelController.class.getName(); } } } return clazzName; } }