1 /*
2  * Copyright 2011 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.modelmapper.internal.converter;
17
18 import org.modelmapper.spi.ConditionalConverter;
19 import org.modelmapper.spi.MappingContext;
20
21 /**
22  * Converts {@link Enum} instances.
23  * 
24  * @author Jonathan Halterman
25  */

26 class EnumConverter implements ConditionalConverter<Object, Enum<?>> {
27   @SuppressWarnings({ "unchecked""rawtypes" })
28   public Enum<?> convert(MappingContext<Object, Enum<?>> context) {
29     Object source = context.getSource();
30     if (source == null)
31       return null;
32
33     String name = source.getClass() == String.class ? (String) source : ((Enum<?>) source).name();
34
35     if (name != null)
36       try {
37         return Enum.valueOf((Class) context.getDestinationType(), name);
38       } catch (IllegalArgumentException ignore) {
39       }
40
41     return null;
42   }
43
44   public MatchResult match(Class<?> sourceType, Class<?> destinationType) {
45     return isEnum(destinationType) && (isEnum(sourceType) || sourceType == String.class) ? MatchResult.FULL
46         : MatchResult.NONE;
47   }
48
49   private boolean isEnum( Class<?> type ) {
50       return type.isAnonymousClass() ? isEnum( type.getSuperclass() ) : type.isEnum();
51   }
52 }
53