001 // Copyright 2004, 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.hivemind.schema.rules; 016 017 import java.lang.reflect.Field; 018 import java.util.Map; 019 020 import org.apache.hivemind.ApplicationRuntimeException; 021 import org.apache.hivemind.HiveMind; 022 import org.apache.hivemind.Location; 023 import org.apache.hivemind.internal.Module; 024 import org.apache.hivemind.schema.Translator; 025 026 /** 027 * Used to translate a set of strings to one of a number of constant values. 028 * Each input string is matched against the name of a public static field 029 * of a class. The name of the class, and the mappings, are provided 030 * in the initializer. 031 * 032 * @author Howard Lewis Ship 033 */ 034 public class EnumerationTranslator implements Translator 035 { 036 private Map _mappings; 037 private String _className; 038 private Class _class; 039 040 /** 041 * Initialized the translator; the intitializer is the name of the class, a comma, 042 * and a series of key=value mappings from the input values to the names 043 * of the public static fields of the class. 044 */ 045 public EnumerationTranslator(String initializer) 046 { 047 int commax = initializer.indexOf(','); 048 049 _className = initializer.substring(0, commax); 050 051 _mappings = RuleUtils.convertInitializer(initializer.substring(commax + 1)); 052 } 053 054 private synchronized Class getClass(Module contributingModule) 055 { 056 if (_class == null) 057 _class = contributingModule.resolveType(_className); 058 059 return _class; 060 } 061 062 public Object translate( 063 Module contributingModule, 064 Class propertyType, 065 String inputValue, 066 Location location) 067 { 068 if (HiveMind.isBlank(inputValue)) 069 return null; 070 071 Class c = getClass(contributingModule); 072 073 String fieldName = (String) _mappings.get(inputValue); 074 075 if (fieldName == null) 076 throw new ApplicationRuntimeException( 077 RulesMessages.enumNotRecognized(inputValue), 078 location, 079 null); 080 081 try 082 { 083 Field f = c.getField(fieldName); 084 085 return f.get(null); 086 } 087 catch (Exception ex) 088 { 089 throw new ApplicationRuntimeException( 090 RulesMessages.enumError(c, fieldName, ex), 091 location, 092 ex); 093 } 094 } 095 096 }