content: // This file is part of AceWiki.
  // Copyright 2008-2013, AceWiki developers.
  // 
  // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
  // Lesser General Public License as published by the Free Software Foundation, either version 3 of
  // the License, or (at your option) any later version.
  // 
  // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
  // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  // Lesser General Public License for more details.
  // 
  // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
  // not, see http://www.gnu.org/licenses/.
  
  package ch.uzh.ifi.attempto.chartparser;
  
  import java.util.HashMap;
  import java.util.Map;
  
  /**
   * This class represents a grammar annotation object.
   * 
   * @author Tobias Kuhn
   */
  public class Annotation {
  	
  	private Map<String, Object> items = new HashMap<String, Object>();
  	
  	/**
  	 * Creates a new annotation object.
  	 */
  	public Annotation() {
  	}
  	
  	/**
  	 * Sets an annotation item.
  	 * 
  	 * @param name The name of the annotation item.
  	 * @param value The value of the annotation item.
  	 */
  	public void setItem(String name, Object value) {
  		items.put(name, value);
  	}
  	
  	/**
  	 * Returns the value of an annotation item.
  	 * 
  	 * @param name The name of the annotation item.
  	 * @return The value.
  	 */
  	public Object getItem(String name) {
  		return items.get(name);
  	}
  	
  	/**
  	 * Creates a deep copy of this annotation object.
  	 * 
  	 * @return A deep copy.
  	 */
  	public Annotation deepCopy() {
  		return deepCopy(new HashMap<Integer, StringObject>());
  	}
  	
  	/**
  	 * Creates a deep copy of this annotation object using the given string objects. This method is
  	 * usually called form another deepCopy-method.
  	 * 
  	 * @param stringObjs The string objects to be used.
  	 * @return A deep copy.
  	 */
  	Annotation deepCopy(HashMap<Integer, StringObject> stringObjs) {
  		Annotation a = new Annotation();
  		for (String n : items.keySet()) {
  			a.setItem(n, copyStructure(items.get(n), stringObjs));
  		}
  		return a;
  	}
  	
  	private Object copyStructure(Object structure, HashMap<Integer, StringObject> stringObjs) {
  		if (structure instanceof Object[]) {
  			Object[] array = (Object[]) structure;
  			Object[] arrayC = new Object[array.length];
  			for (int i=0 ; i < array.length ; i++) {
  				Object o = array[i];
  				arrayC[i] = copyStructure(o, stringObjs);
  			}
  			return arrayC;
  		} else if (structure instanceof String) {
  			return structure;
  		} else if (structure instanceof StringRef) {
  			StringRef s = (StringRef) structure;
  			StringObject so = stringObjs.get(s.getID());
  			if (so == null) {
  				StringRef sr = new StringRef(s.getString());
  				stringObjs.put(s.getID(), sr.getStringObject());
  				return sr;
  			} else {
  				return so.newStringRef();
  			}
  		}
  		return null;
  	}
  
  }
  