class TagMap extends HashMap<String, XmlPeer> {

    private static final long serialVersionUID = -6809383366554350820L;

    /**
     * Constructs a TagMap
     *
     * @param tagfile the path to an XML file with the tagmap
     */
    public TagMap(String tagfile) {
        try {
            init(TagMap.class.getClassLoader().getResourceAsStream(tagfile));
        } catch (Exception e) {
            try {
                init(new FileInputStream(tagfile));
            } catch (FileNotFoundException fnfe) {
                throw new ExceptionConverter(fnfe);
            }
        }
    }

    /**
     * Constructs a TagMap.
     *
     * @param in An InputStream with the tagmap xml
     */
    public TagMap(InputStream in) {
        init(in);
    }

    protected void init(InputStream in) {<FILL_FUNCTION_BODY>}

    class AttributeHandler extends DefaultHandler {

        /**
         * This is a tag
         */
        public static final String TAG = "tag";

        /**
         * This is a tag
         */
        public static final String ATTRIBUTE = "attribute";

        /**
         * This is an attribute
         */
        public static final String NAME = "name";

        /**
         * This is an attribute
         */
        public static final String ALIAS = "alias";

        /**
         * This is an attribute
         */
        public static final String VALUE = "value";

        /**
         * This is an attribute
         */
        public static final String CONTENT = "content";

        /**
         * This is the tagmap using the AttributeHandler
         */
        private Map<String, XmlPeer> tagMap;

        /**
         * This is the current peer.
         */
        private XmlPeer currentPeer;

        public AttributeHandler(Map<String, XmlPeer> tagMap) {
            this.tagMap = tagMap;
        }

        /**
         * This method gets called when a start tag is encountered.
         *
         * @param uri   the Uniform Resource Identifier
         * @param lname the local name (without prefix), or the empty string if Namespace processing is not being
         *              performed.
         * @param tag   the name of the tag that is encountered
         * @param attrs the list of attributes
         */

        public void startElement(String uri, String lname, String tag, Attributes attrs) {
            String name = attrs.getValue(NAME);
            String alias = attrs.getValue(ALIAS);
            String value = attrs.getValue(VALUE);
            if (name != null) {
                if (TAG.equals(tag)) {
                    currentPeer = new XmlPeer(name, alias);
                } else if (ATTRIBUTE.equals(tag)) {
                    if (alias != null) {
                        currentPeer.addAlias(name, alias);
                    }
                    if (value != null) {
                        currentPeer.addValue(name, value);
                    }
                }
            }
            value = attrs.getValue(CONTENT);
            if (value != null) {
                currentPeer.setContent(value);
            }
        }

        /**
         * This method gets called when ignorable white space encountered.
         *
         * @param ch     an array of characters
         * @param start  the start position in the array
         * @param length the number of characters to read from the array
         */

        public void ignorableWhitespace(char[] ch, int start, int length) {
            // do nothing
        }

        /**
         * This method gets called when characters are encountered.
         *
         * @param ch     an array of characters
         * @param start  the start position in the array
         * @param length the number of characters to read from the array
         */

        public void characters(char[] ch, int start, int length) {
            // do nothing
        }

        /**
         * This method gets called when an end tag is encountered.
         *
         * @param uri   the Uniform Resource Identifier
         * @param lname the local name (without prefix), or the empty string if Namespace processing is not being
         *              performed.
         * @param tag   the name of the tag that ends
         */

        public void endElement(String uri, String lname, String tag) {
            if (TAG.equals(tag)) {
                tagMap.put(currentPeer.getAlias(), currentPeer);
            }
        }
    }


}

        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
            factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
            SAXParser parser = factory.newSAXParser();
            parser.parse(new InputSource(in), new AttributeHandler((Map<String, XmlPeer>) this));
        } catch (Exception e) {
            throw new ExceptionConverter(e);
        }
    
<methods>public void <init>() ,public void <init>(int) ,public void <init>(Map<? extends java.lang.String,? extends com.lowagie.text.xml.XmlPeer>) ,public void <init>(int, float) ,public void clear() ,public java.lang.Object clone() ,public com.lowagie.text.xml.XmlPeer compute(java.lang.String, BiFunction<? super java.lang.String,? super com.lowagie.text.xml.XmlPeer,? extends com.lowagie.text.xml.XmlPeer>) ,public com.lowagie.text.xml.XmlPeer computeIfAbsent(java.lang.String, Function<? super java.lang.String,? extends com.lowagie.text.xml.XmlPeer>) ,public com.lowagie.text.xml.XmlPeer computeIfPresent(java.lang.String, BiFunction<? super java.lang.String,? super com.lowagie.text.xml.XmlPeer,? extends com.lowagie.text.xml.XmlPeer>) ,public boolean containsKey(java.lang.Object) ,public boolean containsValue(java.lang.Object) ,public Set<Entry<java.lang.String,com.lowagie.text.xml.XmlPeer>> entrySet() ,public void forEach(BiConsumer<? super java.lang.String,? super com.lowagie.text.xml.XmlPeer>) ,public com.lowagie.text.xml.XmlPeer get(java.lang.Object) ,public com.lowagie.text.xml.XmlPeer getOrDefault(java.lang.Object, com.lowagie.text.xml.XmlPeer) ,public boolean isEmpty() ,public Set<java.lang.String> keySet() ,public com.lowagie.text.xml.XmlPeer merge(java.lang.String, com.lowagie.text.xml.XmlPeer, BiFunction<? super com.lowagie.text.xml.XmlPeer,? super com.lowagie.text.xml.XmlPeer,? extends com.lowagie.text.xml.XmlPeer>) ,public com.lowagie.text.xml.XmlPeer put(java.lang.String, com.lowagie.text.xml.XmlPeer) ,public void putAll(Map<? extends java.lang.String,? extends com.lowagie.text.xml.XmlPeer>) ,public com.lowagie.text.xml.XmlPeer putIfAbsent(java.lang.String, com.lowagie.text.xml.XmlPeer) ,public com.lowagie.text.xml.XmlPeer remove(java.lang.Object) ,public boolean remove(java.lang.Object, java.lang.Object) ,public com.lowagie.text.xml.XmlPeer replace(java.lang.String, com.lowagie.text.xml.XmlPeer) ,public boolean replace(java.lang.String, com.lowagie.text.xml.XmlPeer, com.lowagie.text.xml.XmlPeer) ,public void replaceAll(BiFunction<? super java.lang.String,? super com.lowagie.text.xml.XmlPeer,? extends com.lowagie.text.xml.XmlPeer>) ,public int size() ,public Collection<com.lowagie.text.xml.XmlPeer> values() <variables>static final int DEFAULT_INITIAL_CAPACITY,static final float DEFAULT_LOAD_FACTOR,static final int MAXIMUM_CAPACITY,static final int MIN_TREEIFY_CAPACITY,static final int TREEIFY_THRESHOLD,static final int UNTREEIFY_THRESHOLD,transient Set<Entry<java.lang.String,com.lowagie.text.xml.XmlPeer>> entrySet,final float loadFactor,transient int modCount,private static final long serialVersionUID,transient int size,transient Node<java.lang.String,com.lowagie.text.xml.XmlPeer>[] table,int threshold