001 /* 002 * Copyright 2002 - 2008 JEuclid, http://jeuclid.sf.net 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 /* $Id: AbstractOperatorDictionary.java,v c75d8b379394 2009/09/25 20:03:08 max $ */ 018 019 package net.sourceforge.jeuclid.elements.support.operatordict; 020 021 import java.io.IOException; 022 import java.io.InputStream; 023 import java.io.ObjectInput; 024 import java.io.ObjectInputStream; 025 import java.io.Serializable; 026 import java.util.EnumMap; 027 import java.util.Map; 028 029 /** 030 * Read default values of operators from xml file. 031 * 032 * @version $Revision: c75d8b379394 $ 033 */ 034 public abstract class AbstractOperatorDictionary implements OperatorDictionary, 035 Serializable { 036 037 /** 038 * 039 */ 040 private static final long serialVersionUID = 1L; 041 042 private final Map<OperatorAttribute, Map<String, Map<OperatorForm, String>>> dict; 043 044 /** 045 * Default constructor. 046 */ 047 protected AbstractOperatorDictionary() { 048 this.dict = new EnumMap<OperatorAttribute, Map<String, Map<OperatorForm, String>>>( 049 OperatorAttribute.class); 050 this.initializeFromXML(this.dict); 051 this.overrideStretchy(); 052 } 053 054 private void overrideStretchy() { 055 final Map<String, Map<OperatorForm, String>> opmap = this.dict 056 .get(OperatorAttribute.STRETCHY); 057 for (final Map.Entry<String, Map<OperatorForm, String>> e : opmap 058 .entrySet()) { 059 final String override = StretchOverride.getStretchOverride(e 060 .getKey()); 061 if (override != null) { 062 for (final Map.Entry<OperatorForm, String> e2 : e.getValue() 063 .entrySet()) { 064 if (Boolean.parseBoolean(e2.getValue())) { 065 e2.setValue(override); 066 } 067 } 068 } 069 } 070 } 071 072 /** 073 * Get the for singleton instance. 074 * 075 * @param path 076 * path for the serialized object. 077 * @return an instance of OperatorDictionary. 078 */ 079 protected static OperatorDictionary deserialize(final String path) { 080 OperatorDictionary newDict = null; 081 try { 082 final InputStream is = AbstractOperatorDictionary.class 083 .getResourceAsStream(path); 084 final ObjectInput oi = new ObjectInputStream(is); 085 newDict = (AbstractOperatorDictionary) oi.readObject(); 086 oi.close(); 087 } catch (final ClassNotFoundException cnfe) { 088 newDict = null; 089 } catch (final IllegalArgumentException e) { 090 newDict = null; 091 } catch (final IOException e) { 092 newDict = null; 093 } catch (final NullPointerException e) { 094 newDict = null; 095 } 096 return newDict; 097 } 098 099 /** 100 * Initializes Dictionary. 101 * 102 * @param d 103 * the dictionary to initialize. 104 */ 105 protected abstract void initializeFromXML( 106 Map<OperatorAttribute, Map<String, Map<OperatorForm, String>>> d); 107 108 /** 109 * Determines default value of the operator attribute. 110 * 111 * @param operator 112 * operator character 113 * @param form 114 * form string 115 * @param attributeName 116 * name of attribute 117 * @return VALUE_UNKOWN or value from dict. 118 * @throws UnknownAttributeException 119 * Raised, if wrong attributeName was provided. 120 */ 121 public String getDefaultAttributeValue(final String operator, 122 final String form, final String attributeName) 123 throws UnknownAttributeException { 124 final OperatorForm intForm = OperatorForm.parseOperatorForm(form); 125 return this.getDefaultAttributeValue(operator, intForm, 126 OperatorAttribute.parseOperatorAttribute(attributeName)); 127 } 128 129 /** 130 * Determines default value of the operator attribute. 131 * 132 * @param operator 133 * Operator character. 134 * @param form 135 * Form value 136 * @param attributeName 137 * Name of the attribute. 138 * @return Default value (VALUE_UNKNOWN, if default value has not been 139 * provided yet). 140 * @throws UnknownAttributeException 141 * Raised, if wrong attributeName was provided. 142 */ 143 private String getDefaultAttributeValue(final String operator, 144 final OperatorForm form, final OperatorAttribute attribute) { 145 146 final Map<String, Map<OperatorForm, String>> opForAttr = this.dict 147 .get(attribute); 148 if (opForAttr == null) { 149 return attribute.getDefaultValue(); 150 } 151 final Map<OperatorForm, String> valuesPerForm = opForAttr.get(operator); 152 String retVal; 153 if (valuesPerForm == null) { 154 retVal = attribute.getDefaultValue(); 155 } else { 156 retVal = valuesPerForm.get(form); 157 if (retVal == null) { 158 retVal = valuesPerForm.get(OperatorForm.INFIX); 159 } 160 if (retVal == null) { 161 retVal = valuesPerForm.get(OperatorForm.POSTFIX); 162 } 163 if (retVal == null) { 164 retVal = valuesPerForm.get(OperatorForm.PREFIX); 165 } 166 if (retVal == null) { 167 retVal = attribute.getDefaultValue(); 168 } 169 } 170 return retVal; 171 } 172 173 }