2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.resolving;
11 import com.google.common.base.Optional;
12 import com.google.common.collect.Maps;
13 import org.opendaylight.controller.netconf.confignetconfconnector.util.Util;
14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory;
17 import javax.management.openmbean.SimpleType;
18 import java.lang.reflect.Method;
19 import java.math.BigInteger;
20 import java.util.Date;
23 final class SimpleAttributeResolvingStrategy extends AbstractAttributeResolvingStrategy<Object, SimpleType<?>> {
25 private static final Logger logger = LoggerFactory.getLogger(SimpleAttributeResolvingStrategy.class);
27 SimpleAttributeResolvingStrategy(SimpleType<?> simpleType) {
32 public String toString() {
33 return "ResolvedSimpleAttribute [" + getOpenType().getClassName() + "]";
37 public Optional<Object> parseAttribute(String attrName, Object value) {
39 return Optional.absent();
44 cls = Class.forName(getOpenType().getClassName());
45 } catch (ClassNotFoundException e) {
46 throw new RuntimeException("Unable to locate class for " + getOpenType().getClassName(), e);
49 Util.checkType(value, String.class);
51 Resolver prefferedPlugin = resolverPlugins.get(cls.getCanonicalName());
52 prefferedPlugin = prefferedPlugin == null ? resolverPlugins.get(DEFAULT_RESOLVERS) : prefferedPlugin;
54 Object parsedValue = prefferedPlugin.resolveObject(cls, attrName, (String) value);
55 logger.debug("Attribute {} : {} parsed to type {} with value {}", attrName, value, getOpenType(), parsedValue);
56 return Optional.of(parsedValue);
59 private static final String DEFAULT_RESOLVERS = "default";
60 private static final Map<String, Resolver> resolverPlugins = Maps.newHashMap();
63 resolverPlugins.put(DEFAULT_RESOLVERS, new DefaultResolver());
64 resolverPlugins.put(String.class.getCanonicalName(), new StringResolver());
65 resolverPlugins.put(Date.class.getCanonicalName(), new DateResolver());
66 resolverPlugins.put(Character.class.getCanonicalName(), new CharResolver());
67 resolverPlugins.put(BigInteger.class.getCanonicalName(), new BigIntegerResolver());
70 static interface Resolver {
71 Object resolveObject(Class<?> type, String attrName, String value);
74 static class DefaultResolver implements Resolver {
77 public Object resolveObject(Class<?> type, String attrName, String value) {
79 Object parsedValue = parseObject(type, value);
81 } catch (Exception e) {
82 throw new RuntimeException("Unable to resolve attribute " + attrName + " from " + value, e);
86 protected Object parseObject(Class<?> type, String value) throws Exception {
87 Method method = type.getMethod("valueOf", String.class);
88 Object parsedValue = method.invoke(null, value);
93 static class StringResolver extends DefaultResolver {
96 protected Object parseObject(Class<?> type, String value) throws Exception {
101 static class BigIntegerResolver extends DefaultResolver {
104 protected Object parseObject(Class<?> type, String value) throws Exception {
105 return new BigInteger(value);
109 static class CharResolver extends DefaultResolver {
112 protected Object parseObject(Class<?> type, String value) throws Exception {
113 return new Character(value.charAt(0));
117 static class DateResolver extends DefaultResolver {
120 protected Object parseObject(Class<?> type, String value) throws Exception {
121 return Util.readDate(value);