All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.feilong.lib.xstream.mapper.PackageAliasingMapper Maven / Gradle / Ivy

Go to download

feilong is a suite of core and expanded libraries that include utility classes, http, excel,cvs, io classes, and much much more.

There is a newer version: 4.0.8
Show newest version
/*
 * Copyright (C) 2008 XStream Committers.
 * All rights reserved.
 *
 * The software in this package is published under the terms of the BSD
 * style license a copy of which has been included with this distribution in
 * the LICENSE.txt file.
 * 
 * Created on 10. November 2008 by Joerg Schaible
 */
package com.feilong.lib.xstream.mapper;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

/**
 * Mapper that allows a package name to be replaced with an alias.
 * 
 * @author Jörg Schaible
 */
public class PackageAliasingMapper extends MapperWrapper implements Serializable{

    /**
     * 
     */
    private static final long       serialVersionUID = -6087702061292696487L;

    private static final Comparator REVERSE          = (o1,o2) -> ((String) o2).compareTo((String) o1);

    private Map                     packageToName    = new TreeMap(REVERSE);

    protected transient Map         nameToPackage    = new HashMap();

    public PackageAliasingMapper(final Mapper wrapped){
        super(wrapped);
    }

    public void addPackageAlias(String name,String pkg){
        if (name.length() > 0 && name.charAt(name.length() - 1) != '.'){
            name += '.';
        }
        if (pkg.length() > 0 && pkg.charAt(pkg.length() - 1) != '.'){
            pkg += '.';
        }
        nameToPackage.put(name, pkg);
        packageToName.put(pkg, name);
    }

    @Override
    public String serializedClass(final Class type){
        final String className = type.getName();
        int length = className.length();
        int dot = -1;
        do{
            dot = className.lastIndexOf('.', length);
            final String pkg = dot < 0 ? "" : className.substring(0, dot + 1);
            final String alias = (String) packageToName.get(pkg);
            if (alias != null){
                return alias + (dot < 0 ? className : className.substring(dot + 1));
            }
            length = dot - 1;
        }while (dot >= 0);
        return super.serializedClass(type);
    }

    @Override
    public Class realClass(String elementName){
        int length = elementName.length();
        int dot = -1;
        do{
            dot = elementName.lastIndexOf('.', length);
            final String name = dot < 0 ? "" : elementName.substring(0, dot) + '.';
            final String packageName = (String) nameToPackage.get(name);

            if (packageName != null){
                elementName = packageName + (dot < 0 ? elementName : elementName.substring(dot + 1));
                break;
            }
            length = dot - 1;
        }while (dot >= 0);

        return super.realClass(elementName);
    }

    private void writeObject(final ObjectOutputStream out) throws IOException{
        out.writeObject(new HashMap(packageToName));
    }

    private void readObject(final ObjectInputStream in) throws IOException,ClassNotFoundException{
        packageToName = new TreeMap(REVERSE);
        packageToName.putAll((Map) in.readObject());
        nameToPackage = new HashMap();
        for (final Iterator iter = packageToName.keySet().iterator(); iter.hasNext();){
            final Object type = iter.next();
            nameToPackage.put(packageToName.get(type), type);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy