001 // This file is part of AceWiki. 002 // Copyright 2008-2012, AceWiki developers. 003 // 004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU 005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of 006 // the License, or (at your option) any later version. 007 // 008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 010 // Lesser General Public License for more details. 011 // 012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If 013 // not, see http://www.gnu.org/licenses/. 014 015 package ch.uzh.ifi.attempto.chartparser; 016 017 import java.util.HashMap; 018 import java.util.Map; 019 020 /** 021 * This class represents a grammar annotation object. 022 * 023 * @author Tobias Kuhn 024 */ 025 public class Annotation { 026 027 private Map<String, Object> items = new HashMap<String, Object>(); 028 029 /** 030 * Creates a new annotation object. 031 */ 032 public Annotation() { 033 } 034 035 /** 036 * Sets an annotation item. 037 * 038 * @param name The name of the annotation item. 039 * @param value The value of the annotation item. 040 */ 041 public void setItem(String name, Object value) { 042 items.put(name, value); 043 } 044 045 /** 046 * Returns the value of an annotation item. 047 * 048 * @param name The name of the annotation item. 049 * @return The value. 050 */ 051 public Object getItem(String name) { 052 return items.get(name); 053 } 054 055 /** 056 * Creates a deep copy of this annotation object. 057 * 058 * @return A deep copy. 059 */ 060 public Annotation deepCopy() { 061 return deepCopy(new HashMap<Integer, StringObject>()); 062 } 063 064 /** 065 * Creates a deep copy of this annotation object using the given string objects. This method is 066 * usually called form another deepCopy-method. 067 * 068 * @param stringObjs The string objects to be used. 069 * @return A deep copy. 070 */ 071 Annotation deepCopy(HashMap<Integer, StringObject> stringObjs) { 072 Annotation a = new Annotation(); 073 for (String n : items.keySet()) { 074 a.setItem(n, copyStructure(items.get(n), stringObjs)); 075 } 076 return a; 077 } 078 079 private Object copyStructure(Object structure, HashMap<Integer, StringObject> stringObjs) { 080 if (structure instanceof Object[]) { 081 Object[] array = (Object[]) structure; 082 Object[] arrayC = new Object[array.length]; 083 for (int i=0 ; i < array.length ; i++) { 084 Object o = array[i]; 085 arrayC[i] = copyStructure(o, stringObjs); 086 } 087 return arrayC; 088 } else if (structure instanceof String) { 089 return structure; 090 } else if (structure instanceof StringRef) { 091 StringRef s = (StringRef) structure; 092 StringObject so = stringObjs.get(s.getID()); 093 if (so == null) { 094 StringRef sr = new StringRef(s.getString()); 095 stringObjs.put(s.getID(), sr.getStringObject()); 096 return sr; 097 } else { 098 return so.newStringRef(); 099 } 100 } 101 return null; 102 } 103 104 }