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.util.instantiator; 022 023import java.util.ArrayList; 024import java.util.Collections; 025import java.util.List; 026 027import org.granite.messaging.service.ServiceException; 028import org.granite.util.TypeUtil; 029 030/** 031 * @author Igor SAZHNEV 032 */ 033public class EnumInstantiator extends AbstractInstantiator<Enum<?>> { 034 035 private static final long serialVersionUID = -6116814787518316453L; 036 037 private final String type; 038 039 private static final List<String> orderedFields; 040 static { 041 List<String> of = new ArrayList<String>(1); 042 of.add("value"); 043 orderedFields = Collections.unmodifiableList(of); 044 } 045 046 public EnumInstantiator(String type) { 047 this.type = type; 048 } 049 050 @Override 051 public List<String> getOrderedFieldNames() { 052 return orderedFields; 053 } 054 055 @SuppressWarnings({ "unchecked", "rawtypes" }) 056 @Override 057 public Enum<?> newInstance() { 058 Enum<?> enumInstance = null; 059 060 String enumValue = null; 061 try { 062 Class<? extends Enum> enumClass = (Class<? extends Enum>)TypeUtil.forName(type); 063 enumValue = (String)get("value"); 064 if (enumValue == null) { 065 Object[] enumConstants = enumClass.getEnumConstants(); 066 if (enumConstants == null || enumConstants.length == 0) 067 throw new ServiceException("Invalid Enum type: " + type); 068 enumValue = ((Enum<?>)enumConstants[0]).name(); 069 } 070 enumInstance = Enum.valueOf(enumClass, enumValue); 071 } catch (ClassNotFoundException e) { 072 throw new ServiceException("Could not find Enum type for: " + type, e); 073 } catch (IllegalArgumentException e) { 074 throw new ServiceException("Could not find Enum constant for: " + type + '.' + enumValue, e); 075 } 076 077 return enumInstance; 078 } 079}