--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.northbound.commons.query;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import javax.xml.bind.annotation.XmlElement;
+
+public class WrapperTypeInfo extends TypeInfo {
+
+ protected WrapperTypeInfo(String name, Accessor accessor) {
+ super(name, accessor.getType(), accessor);
+ }
+
+ @Override
+ public Object retrieve(Object target, String[] query, int index) throws QueryException {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("retrieve collection: {}/{}", index, query.length);
+ }
+ if (index >= query.length) return null;
+ explore();
+ TypeInfo child = getChild(query[index]);
+ if (child == null) return null;
+ if (query.length == index+1) { // skipping this node
+ return target;
+ }else { // if list of list go to next node to get value
+ return child.retrieve(target, query, index+1);
+ }
+ }
+
+ @Override
+ public synchronized void explore() {
+ if (_explored) return;
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("exploring wrapper type: {} gtype: {}", _class,
+ _accessor.getGenericType());
+ }
+ String tn = null;
+ AccessibleObject accessibleObject = _accessor.getAccessibleObject();
+ XmlElement xmlElement = accessibleObject.getAnnotation(XmlElement.class);
+ if (accessibleObject instanceof Field) {
+ Field f = (Field) accessibleObject;
+ tn = DEFAULT_NAME.equals(xmlElement.name())?f.getName() : xmlElement.name();
+ }else if (accessibleObject instanceof Method) {
+ Method m = (Method) accessibleObject;
+ tn = DEFAULT_NAME.equals(xmlElement.name())?m.getName() : xmlElement.name();
+ }
+ this._types.put(tn, new IteratableTypeInfo(tn, this._accessor));
+ _explored = true;
+ }
+
+}