001/* 002 GRANITE DATA SERVICES 003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S. 004 005 This file is part of Granite Data Services. 006 007 Granite Data Services is free software; you can redistribute it and/or modify 008 it under the terms of the GNU Library General Public License as published by 009 the Free Software Foundation; either version 2 of the License, or (at your 010 option) any later version. 011 012 Granite Data Services is distributed in the hope that it will be useful, but 013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License 015 for more details. 016 017 You should have received a copy of the GNU Library General Public License 018 along with this library; if not, see <http://www.gnu.org/licenses/>. 019*/ 020 021package org.granite.messaging.amf.io.convert.impl; 022 023import java.lang.reflect.Method; 024import java.lang.reflect.Type; 025import java.util.Locale; 026 027import org.granite.messaging.amf.io.convert.Converter; 028import org.granite.messaging.amf.io.convert.Converters; 029import org.granite.util.TypeUtil; 030 031/** 032 * @author Franck WOLFF 033 */ 034public class String2Enum extends Converter { 035 036 public String2Enum(Converters converters) { 037 super(converters); 038 } 039 040 @Override 041 protected boolean internalCanConvert(Object value, Type targetType) { 042 return Enum.class.isAssignableFrom(TypeUtil.classOfType(targetType)) && (value == null || value instanceof String || value instanceof Enum); 043 } 044 045 @Override 046 protected Object internalConvert(Object value, Type targetType) { 047 if (value == null) 048 return null; 049 Class<?> enumType = TypeUtil.classOfType(targetType); 050 String enumValue = value instanceof String ? (String)value : ((Enum<?>)value).name(); 051 try { 052 Method m = enumType.getClass().getMethod("valueOf", enumType, String.class); 053 return m.invoke(enumType, enumValue); 054 } 055 catch (Exception e) { 056 throw new RuntimeException("Cound not convert " + value + " to enum of type " + targetType, e); 057 } 058 } 059 060 public boolean canRevert(Object value) { 061 return (value == null) || (value instanceof Locale); 062 } 063 064 public Object revert(Object value) { 065 if (value != null) 066 value = value.toString(); 067 return value; 068 } 069}