/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojava.bio; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.biojava.bio.program.tagvalue.PropertyChanger; /** * AnnotationRenamer remaps the keys of an * Annotation to new keys specified by a * TagMapper. This will rename properties, but not alter their * values. * For writing light-weigth adaptors to project one type of * Annotation to another using a TagMapper. * @since 1.3 * @author Matthew Pocock * @author Keith James (docs) * */ public class AnnotationRenamer extends AbstractAnnotation { private final Annotation wrapped; private final PropertyChanger mapper; private final Map properties; /** * Creates a new AnnotationRenamer using the * specified TagMapper to remap its keys. * * @param wrapped an Annotation. * @param mapper a TagMapper. */ public AnnotationRenamer(Annotation wrapped, PropertyChanger mapper) { this.wrapped = wrapped; this.mapper = mapper; this.properties = new MappedHash(); } /** * getWrapped returns the Annotation * being remapped. * * @return an Annotation. */ public Annotation getWrapped() { return wrapped; } /** * getMapper returns the TagMapper being * used to remap the Annotation. * * @return a TagMapper. */ public PropertyChanger getMapper() { return mapper; } /** * getProperties returns the mapped contents of the * underlying Annotation as a Map. * * @return a Map. */ public Map getProperties() { return properties; } /** * propertiesAllocated Javadoc FIXME - this overrides * a protected method and I'm not sure why (KJ). * * @return a boolean. */ public boolean propertiesAllocated() { return true; } private class MappedHash extends AbstractMap { public int size() { return wrapped.asMap().size(); } public Set entrySet() { return new WrappedSet(wrapped.asMap().entrySet()); } } private class WrappedSet extends AbstractSet { private Set entrySet; public WrappedSet(Set entrySet) { this.entrySet = entrySet; } public int size() { return entrySet.size(); } public Iterator iterator() { return new Iterator() { Iterator i = entrySet.iterator(); public boolean hasNext() { return i.hasNext(); } public Object next() { final Map.Entry entry = (Map.Entry) i.next(); return new Map.Entry() { public Object getKey() { return mapper.getNewTag(entry.getKey()); } public Object getValue() { return entry.getValue(); } public Object setValue(Object value) { return entry.setValue(value); } }; } public void remove() { i.remove(); } }; } } }