package com.thoughtworks.xstream.core; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * A class mapper that allows aliasing entire packages. * * The aliases are used in the same order as they are registered, ie, if you register "com.thoughworks.xstream" * then "com.thoughworks.xstream.core", the ClassMapper class will be aliased as "core.ClassMapper", * while if you register "com.thoughworks.xstream.core" first, then "com.thoughworks.xstream", * the ClassMapper class will be aliased as "ClassMapper". * Primary aliases (with full class names) have priority over package aliases. * * @author greg * @author $Author: $ (last edit) * @version $Revision: $ */ public class PackageAliasClassMapper extends DefaultClassMapper { private List packages; public PackageAliasClassMapper() { super(); this.packages = new ArrayList(); } public PackageAliasClassMapper(Package pakkage) { this(); aliasPackage(pakkage); } public void aliasPackage(Package pakkage) { packages.add(pakkage.getName()); } public String lookupName(Class type) { // first get full class name or aliased name String result = super.lookupName(type); Iterator it = packages.iterator(); while (it.hasNext()) { String pakkage = (String) it.next(); if (result.startsWith(pakkage)) { return result.substring(pakkage.length() + 1); // remove trailing dot too } } return result; } protected Class loadClass(String className) throws ClassNotFoundException { try { // first try with full class name return super.loadClass(className); } catch (ClassNotFoundException e) { Iterator it = packages.iterator(); while (it.hasNext()) { String pakkage = (String) it.next(); try { return super.loadClass(pakkage + '.' + className); } catch (ClassNotFoundException e1) { // try next package alias } } } throw new ClassNotFoundException(className); } protected Class loadArrayClass(int arrayDepth, String elementName) throws ClassNotFoundException { try { return super.loadArrayClass(arrayDepth, elementName); } catch (ClassNotFoundException e) { Iterator it = packages.iterator(); while (it.hasNext()) { String pakkage = (String) it.next(); String className = pakkage + '.' + elementName; String arrayClassName = buildArrayClassName(arrayDepth, className); try { return super.loadClass(arrayClassName); } catch (ClassNotFoundException e1) { // try next package alias } } } throw new ClassNotFoundException(elementName); } }