/* * Created on 11.8.2003 by tryggvil in project com.project */ package com.idega.repository.data; import java.util.HashMap; import java.util.Map; import com.idega.util.StringHandler; /** * A class to hold a registry over classes that have been moved between packages or renamed (refactored) * Copyright (C) idega software 2003 * @author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a> * @version 1.0 */ public class RefactorClassRegistry implements Singleton { private static Instantiator instantiator = new Instantiator() { public Object getInstance() { return new RefactorClassRegistry(); } }; //This constructor should not be called protected RefactorClassRegistry(){ // default constructor } public static Class forName(String className) throws ClassNotFoundException { // first try to find the class try { return Class.forName(className); } catch (ClassNotFoundException ex) { return RefactorClassRegistry.getInstance().findClass(className, ex); } } public static Class forName(String className, boolean initialize, ClassLoader classLoader) throws ClassNotFoundException { // first try to find the class try { return Class.forName(className, initialize, classLoader); } catch (ClassNotFoundException ex) { return RefactorClassRegistry.getInstance().findClass(className, ex); } } public static RefactorClassRegistry getInstance(){ return (RefactorClassRegistry) SingletonRepository.getRepository().getInstance(RefactorClassRegistry.class, instantiator); } private Map refactoredClassNamesMap; private Map refactoredPackageNamesMap; /** * @return */ public Map getRefactoredClassNames() { // TODO Auto-generated method stub if(this.refactoredClassNamesMap==null){ this.refactoredClassNamesMap=new HashMap(); } return this.refactoredClassNamesMap; } public Map getRefactoredPackageNames() { if (this.refactoredPackageNamesMap == null) { this.refactoredPackageNamesMap = new HashMap(); } return this.refactoredPackageNamesMap; } /** * @return */ public String getRefactoredClassName(String oldClassName) { String result = (String)getRefactoredClassNames().get(oldClassName); if (result == null) { String[] packageClass = StringHandler.splitOffPackageFromClassName(oldClassName); String newPackage = (String) getRefactoredPackageNames().get(packageClass[0]); if (newPackage != null) { StringBuffer buffer = new StringBuffer(newPackage); buffer.append(".").append(packageClass[1]); return buffer.toString(); } } return result; } public void registerRefactoredPackage(String oldPackageName, Package validPackage) { registerRefactoredPackage(oldPackageName, validPackage.getName()); } public void registerRefactoredPackage(String oldPackageName, String validPackageName) { getRefactoredPackageNames().put(oldPackageName, validPackageName); } public void registerRefactoredClass(String oldClassName, Class validClass) { registerRefactoredClass(oldClassName, validClass.getName()); } public void registerRefactoredClass(String oldClassName,String newClassName){ getRefactoredClassNames().put(oldClassName,newClassName); } public boolean isClassRefactored(String oldClassName){ return getRefactoredClassName(oldClassName)!=null; } public Object newInstance(String className, Class callerClass) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class myClass = classForName(className); return newInstance(myClass, callerClass); } public Object newInstance(Class aClass, Class callerClass) throws ClassNotFoundException, InstantiationException, IllegalAccessException { if (aClass.isInterface()) { return ImplementorRepository.getInstance().newInstance(aClass, callerClass); } return aClass.newInstance(); } public Class classForName(String className) throws ClassNotFoundException { return RefactorClassRegistry.forName(className); } private Class findClass(String className, ClassNotFoundException classNotFoundEx) throws ClassNotFoundException { // bad luck // is the class refactored? String refactoredClassName = getRefactoredClassName(className); if (refactoredClassName == null) { // nothing found, throw exception throw classNotFoundEx; } // something was found...but does the class exist? try { return Class.forName(refactoredClassName); } catch (ClassNotFoundException refactoredClassNotFoundEx) { // that is really bad luck (and strange) throw new ClassNotFoundException("[RefactorClassRegistry] Refactored class ( "+ refactoredClassName+" ) was not found. Original class name: "+className, classNotFoundEx); } } }