001package io.ebean.enhance.common;
002
003import java.util.ArrayList;
004import java.util.HashMap;
005
006/**
007 * Collects the annotation information.
008 */
009public class AnnotationInfo {
010
011  private final HashMap<String,Object> valueMap = new HashMap<String,Object>();
012
013  private AnnotationInfo parent;
014        
015        /**
016         * The parent is typically the class level annotation information
017         * which could be considered to hold default values.
018         */
019        public AnnotationInfo(AnnotationInfo parent){
020                this.parent = parent;
021        }
022        
023        public String toString() {
024                return valueMap.toString();
025        }
026        
027        
028        public AnnotationInfo getParent() {
029                return parent;
030        }
031
032        public void setParent(AnnotationInfo parent) {
033                this.parent = parent;
034        }
035
036        /**
037         * Add a annotation value.
038         */
039        @SuppressWarnings("unchecked")
040        public void add(String prefix, String name, Object value){
041                if (name == null){
042                        // this is an array value...
043                        ArrayList<Object> list = (ArrayList<Object>)valueMap.get(prefix);
044                        if (list == null){
045                                list = new ArrayList<>();
046                                valueMap.put(prefix, list);
047                        }
048                        //System.out.println("addArrayValue "+prefix+" value:"+value);
049                        list.add(value);
050                        
051                } else {
052                        String key = getKey(prefix, name);
053                        //System.out.println("addValue "+key+" value:"+value);
054                        valueMap.put(key, value);
055                }
056        }
057
058        /**
059         * Add a enum annotation value.
060         */
061        public void addEnum(String prefix, String name, String desc, String value){
062                
063                add(prefix, name, value);
064        }
065        
066        private String getKey(String prefix, String name){
067                if (prefix == null){
068                        return name;
069                } else {
070                        return prefix+"."+name;
071                }
072        }
073        
074        /**
075         * Return a value out of the map.
076         */
077        public Object getValue(String key){
078                Object o = valueMap.get(key);
079                if (o == null && parent != null){
080                        // try getting value from parent
081                        o = parent.getValue(key);
082                }
083                return o;
084        }
085}