/** * Create an EmitterDescriptor for the given methodName. This conmstructor creates a descriptor * that represents explicitly the types and size of the operands of the given emit* method. This * constructor encapsulate the logic to parse the given method name into the appropriate * explicit representation. */ EmitterDescriptor(String methodName, Class<?>[] argTypes) { StringTokenizer toks = new StringTokenizer(methodName, "_"); toks.nextElement(); // first element is emitXXX; args = new ArgumentType[toks.countTokens()]; ArgumentType size = null; int count = 0; int argTypeNum = 0; for (int i = 0; i < args.length; i++) { String cs = toks.nextToken(); ArgumentType code; if (argTypeNum < argTypes.length) { code = getEncoding(cs, argTypes[argTypeNum]); } else { code = getEncoding(cs, null); } argTypeNum += code.getParameters(); if (DEBUG) { System.err.println(methodName + "[" + i + "] is " + code + " for " + cs); } args[count] = code; count++; if (code.isSize()) { size = code; count--; } } this.size = size; this.count = count; }
private static Object parseValue(String value, Prop p, Class type) { Object v = value; if (type.isArray()) { StringTokenizer st = new StringTokenizer(value, ","); Class ctype = type.getComponentType(); v = Array.newInstance(ctype, st.countTokens()); for (int i = 0; st.hasMoreTokens(); i++) Array.set(v, i, parseValue(st.nextToken(), p, ctype)); } else if (type == boolean.class) { v = Boolean.valueOf(value); } else if (type == double.class) { v = Double.valueOf(value); } else if (type == int.class) { v = Integer.valueOf(value); } else if (p.field.isAnnotationPresent(TimeIntervalProp.class)) { if (value.endsWith("s")) { v = (long) (Double.parseDouble(value.substring(0, value.length() - 1)) * SEC); } else if (value.endsWith("m")) { v = (long) (Double.parseDouble(value.substring(0, value.length() - 1)) * MIN); } else { v = Long.valueOf(value); } } return v; }
static int command(JopSession session, String cmd) { boolean local_cmd = false; Object root = session.getRoot(); Gdh gdh = session.getEngine().gdh; System.out.println("JopSpider command : " + cmd); if (root instanceof JopApplet) { if (((JopApplet) root).engine.isInstance()) cmd = RtUtilities.strReplace(cmd, "$object", ((JopApplet) root).engine.getInstance()); } Cli cli = new Cli(cliTable); String command = cli.parse(cmd); if (cli.oddSts()) { System.out.println("JopSpider1 : " + command); if (command.equals("OPEN")) { if (cli.qualifierFound("cli_arg1")) { String jgraph = "JGRAPH"; String graph = "GRAPH"; String url = "URL"; String trend = "TREND"; String fast = "FAST"; String cli_arg1 = cli.getQualValue("cli_arg1").toUpperCase(); if (jgraph.length() >= cli_arg1.length() && jgraph.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "OPEN JGRAPH" boolean newFrame = cli.qualifierFound("/NEW"); boolean scrollbar = cli.qualifierFound("/SCROLLBAR"); if (!cli.qualifierFound("cli_arg2")) { System.out.println("Syntax error"); return 0; } String frameName = cli.getQualValue("cli_arg2"); String instance = cli.getQualValue("/INSTANCE"); if (session.isOpWindowApplet()) { frameName = frameName.substring(0, 1).toUpperCase() + frameName.substring(1); System.out.println("Open frame " + frameName); session.openGraphFrame(frameName, instance, scrollbar, false); } else if (session.isApplet()) { System.out.println("Loading applet \"" + frameName + "\""); openURL(session, frameName, newFrame, null, null); local_cmd = true; } else { System.out.println("Loading frame \"" + frameName + "\""); try { loadFrame(session, frameName, instance, scrollbar); } catch (ClassNotFoundException e) { } local_cmd = true; } } else if (graph.length() >= cli_arg1.length() && graph.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "OPEN GRAPH" if (root instanceof JopApplet) { System.out.println("open graph for JopApplet"); boolean newFrame = cli.qualifierFound("/NEW"); boolean scrollbar = cli.qualifierFound("/SCROLLBAR"); if (cli.qualifierFound("/OBJECT")) { String objectValue = cli.getQualValue("/OBJECT"); String objectName; String appletName; String instance = null; // Replace * by node object if (objectValue.charAt(0) == '*') { CdhrObjid cdhr_node = gdh.getNodeObject(0); if (cdhr_node.evenSts()) return 0; CdhrString cdhr_nodestr = gdh.objidToName(cdhr_node.objid, Cdh.mName_volumeStrict); objectName = cdhr_nodestr.str + objectValue.substring(1); } else objectName = objectValue; String attrName = objectName + ".Action"; CdhrString cdhr = gdh.getObjectInfoString(attrName); if (cdhr.evenSts()) { System.out.println("Object name error"); return 0; } int idx = cdhr.str.lastIndexOf(".pwg"); if (idx != -1) { // appletName = cdhr.str.substring(0, idx); appletName = cdhr.str; // atest } else { idx = cdhr.str.lastIndexOf(".class"); if (idx != -1) appletName = cdhr.str.substring(0, idx); else { // This is a command return command(session, cdhr.str); } } attrName = objectName + ".Object"; cdhr = gdh.getObjectInfoString(attrName); if (cdhr.oddSts() && !cdhr.str.equals("")) instance = cdhr.str; if (session.isOpWindowApplet()) { // atest appletName = appletName.substring(0,1).toUpperCase() + // appletName.substring(1); System.out.println("Open frame " + appletName); session.openGraphFrame(appletName, instance, false, false); } else { System.out.println("Loading applet \"" + appletName + "\""); openURL(session, appletName, newFrame, null, null); } local_cmd = true; } else { if (true /* session.isOpWindowApplet() */) { String frameName = null; String instanceValue = null; boolean classGraph = false; if (cli.qualifierFound("/INSTANCE")) { instanceValue = cli.getQualValue("/INSTANCE"); classGraph = cli.qualifierFound("/CLASSGRAPH"); boolean parent = cli.qualifierFound("/PARENT"); if (parent) { int idx = instanceValue.lastIndexOf('.'); if (idx != -1 && idx != 0) instanceValue = instanceValue.substring(0, idx); System.out.println("open graph /parent: " + instanceValue); } } if (!classGraph) { if (!cli.qualifierFound("cli_arg2")) { System.out.println("Syntax error"); return 0; } frameName = cli.getQualValue("cli_arg2").toLowerCase(); frameName = frameName.substring(0, 1).toUpperCase() + frameName.substring(1); System.out.println("Open frame " + frameName); } session.openGraphFrame(frameName, instanceValue, scrollbar, classGraph); } /** * *********** else { String frameName = null; if ( ! * cli.qualifierFound("cli_arg2")) { System.out.println("Syntax error"); return 0; } * frameName = cli.getQualValue("cli_arg2").toLowerCase(); * * <p>if ( cli.qualifierFound("/INSTANCE")) { String instanceValue = * cli.getQualValue("/INSTANCE").toLowerCase(); * * <p>boolean parent = cli.qualifierFound("/PARENT"); if ( parent) { int idx = * instanceValue.lastIndexOf( '.'); if ( idx != -1 && idx != 0) instanceValue = * instanceValue.substring( 0, idx); System.out.println( "open graph /parent: " + * instanceValue); } * * <p>String tempFile = frameName + "_" + * instanceValue.replace('å','a').replace('ä','a').replace('ö','o'); PwrtStatus psts * = gdh.createInstanceFile( "$pwrp_websrv/"+frameName+".html", tempFile+".html", * instanceValue); if ( psts.evenSts()) { System.out.println("createInstanceFile * error"); return 0; } frameName = tempFile; } * * <p>System.out.println( "Loading applet \"" + frameName + "\""); * * <p>openURL( session, frameName, newFrame, null, null); local_cmd = true; } * */ } } else { // Application boolean newFrame = cli.qualifierFound("/NEW"); boolean scrollbar = cli.qualifierFound("/SCROLLBAR"); String frameName = null; String instanceValue = null; boolean classGraph = false; if (cli.qualifierFound("/INSTANCE")) { instanceValue = cli.getQualValue("/INSTANCE"); classGraph = cli.qualifierFound("/CLASSGRAPH"); boolean parent = cli.qualifierFound("/PARENT"); if (parent) { int idx = instanceValue.lastIndexOf('.'); if (idx != -1 && idx != 0) instanceValue = instanceValue.substring(0, idx); System.out.println("open graph /parent: " + instanceValue); } } if (cli.qualifierFound("/OBJECT")) { String objectValue = cli.getQualValue("/OBJECT"); String objectName; String appletName; String instance = null; // Replace * by node object if (objectValue.charAt(0) == '*') { CdhrObjid cdhr_node = gdh.getNodeObject(0); if (cdhr_node.evenSts()) return 0; CdhrString cdhr_nodestr = gdh.objidToName(cdhr_node.objid, Cdh.mName_volumeStrict); objectName = cdhr_nodestr.str + objectValue.substring(1); } else objectName = objectValue; String attrName = objectName + ".Action"; CdhrString cdhr = gdh.getObjectInfoString(attrName); if (cdhr.evenSts()) { System.out.println("Object name error"); return 0; } int idx = cdhr.str.lastIndexOf(".pwg"); if (idx != -1) { // appletName = cdhr.str.substring(0, idx); appletName = cdhr.str; // atest } else { idx = cdhr.str.lastIndexOf(".class"); if (idx != -1) appletName = cdhr.str.substring(0, idx); else { // This is a command return command(session, cdhr.str); } } attrName = objectName + ".Object"; cdhr = gdh.getObjectInfoString(attrName); if (cdhr.oddSts() && !cdhr.str.equals("")) instance = cdhr.str; System.out.println("Open frame " + appletName); session.openGraphFrame(appletName, instance, false, false); local_cmd = true; } if (!classGraph) { if (cli.qualifierFound("/FILE")) { frameName = cli.getQualValue("/FILE"); if (frameName.indexOf(".pwg") == -1) frameName = frameName + ".pwg"; } else if (cli.qualifierFound("cli_arg2")) { frameName = cli.getQualValue("cli_arg2").toLowerCase(); frameName = frameName.substring(0, 1).toUpperCase() + frameName.substring(1); } else { System.out.println("Syntax error"); return 0; } System.out.println("Open frame " + frameName); } session.openGraphFrame(frameName, instanceValue, scrollbar, classGraph); } } else if (url.length() >= cli_arg1.length() && url.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "OPEN URL" if (root instanceof JopApplet) { if (cli.qualifierFound("cli_arg2")) { Boolean newFrame = true; String frameName = null; String urlValue = cli.getQualValue("cli_arg2"); System.out.println("open url " + urlValue); if (urlValue.startsWith("pwrb_") || urlValue.startsWith("pwrs_") || urlValue.startsWith("nmps_") || urlValue.startsWith("profibus_") || urlValue.startsWith("otherio_") || urlValue.startsWith("opc_") || urlValue.startsWith("basecomponent_") || urlValue.startsWith("abb_") || urlValue.startsWith("siemens_") || urlValue.startsWith("ssabox_")) // Object reference manual urlValue = "$pwr_doc/" + session.getLang() + "/orm/" + urlValue; if (cli.qualifierFound("/NAME")) { frameName = cli.getQualValue("/NAME"); newFrame = false; } openURL(session, urlValue, newFrame, frameName, null); } } } else if (trend.length() >= cli_arg1.length() && trend.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "OPEN TREND" String name; if (cli.qualifierFound("cli_arg2")) name = cli.getQualValue("cli_arg2"); else name = cli.getQualValue("/NAME"); StringTokenizer tokens = new StringTokenizer(name, ","); int cnt = tokens.countTokens(); String[] trendList = new String[cnt]; for (int i = 0; i < cnt; i++) trendList[i] = tokens.nextToken(); session.openTrend(trendList); } else if (fast.length() >= cli_arg1.length() && fast.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "OPEN FAST" String name; if (cli.qualifierFound("cli_arg2")) name = cli.getQualValue("cli_arg2"); else name = cli.getQualValue("/NAME"); session.openFast(name); } else { System.out.println("Unknown command"); } } } else if (command.equals("HELP")) { if (root instanceof JopApplet) { String fileName = "xtt_help_"; String bookmarkValue = null; if (cli.qualifierFound("/VERSION")) { openURL(session, "$pwr_doc/xtt_version_help_version.html", true, null, null); } else { if (cli.qualifierFound("/BASE")) // Not language dependent !! TODO fileName = "$pwr_doc/help/xtt_help_"; if (cli.qualifierFound("cli_arg1")) fileName += cli.getQualValue("cli_arg1").toLowerCase(); if (cli.qualifierFound("cli_arg2")) fileName += "_" + cli.getQualValue("cli_arg2").toLowerCase(); if (cli.qualifierFound("cli_arg3")) fileName += "_" + cli.getQualValue("cli_arg3").toLowerCase(); if (cli.qualifierFound("cli_arg4")) fileName += "_" + cli.getQualValue("cli_arg4").toLowerCase(); if (fileName.startsWith("pwrb_") || fileName.startsWith("pwrs_") || fileName.startsWith("nmps_") || fileName.startsWith("profibus_") || fileName.startsWith("otherio_") || fileName.startsWith("opc_") || fileName.startsWith("basecomponent_") || fileName.startsWith("abb_") || fileName.startsWith("siemens_") || fileName.startsWith("ssabox_")) // Object reference manual fileName = "$pwr_doc/orm/" + fileName; if (cli.qualifierFound("/BOOKMARK")) bookmarkValue = cli.getQualValue("/BOOKMARK"); System.out.println("Loading helpfile \"" + fileName + "\""); openURL(session, fileName, true, null, bookmarkValue); } local_cmd = true; } } else if (command.equals("SET")) { if (cli.qualifierFound("cli_arg1")) { String parameter = "PARAMETER"; String cli_arg1 = cli.getQualValue("cli_arg1").toUpperCase(); if (parameter.length() >= cli_arg1.length() && parameter.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "SET PARAMETER" if (root instanceof JopApplet) { String name; String value; PwrtStatus sts; local_cmd = true; if (cli.qualifierFound("/NAME")) name = cli.getQualValue("/NAME"); else { System.out.println("Cmd: name is missing\n"); return 0; } if (cli.qualifierFound("/VALUE")) value = cli.getQualValue("/VALUE"); else { System.out.println("Cmd: value is missing\n"); return 0; } boolean bypass = cli.qualifierFound("/BYPASS"); if (!bypass) { // Need RtWrite or System to set attribute if (!gdh.isAuthorized(Pwr.mPrv_RtWrite | Pwr.mPrv_System)) { System.out.println("No authorized"); return 0; } } // Get type of attribute GdhrGetAttributeChar ret = gdh.getAttributeChar(name); if (ret.evenSts()) return 0; if (ret.typeId == Pwr.eType_Float32) { float setValue = Float.parseFloat(value); sts = gdh.setObjectInfo(name, setValue); } else if (ret.typeId == Pwr.eType_Boolean) { boolean setValue = (Integer.parseInt(value, 10) != 0); sts = gdh.setObjectInfo(name, setValue); } else if (ret.typeId == Pwr.eType_Int32 || ret.typeId == Pwr.eType_UInt32 || ret.typeId == Pwr.eType_Int16 || ret.typeId == Pwr.eType_UInt16 || ret.typeId == Pwr.eType_Int8 || ret.typeId == Pwr.eType_UInt8 || ret.typeId == Pwr.eType_Mask || ret.typeId == Pwr.eType_Enum) { int setValue = Integer.parseInt(value, 10); sts = gdh.setObjectInfo(name, setValue); } else if (ret.typeId == Pwr.eType_String) { sts = gdh.setObjectInfo(name, value); } else return 0; if (sts.evenSts()) System.out.println("setObjectInfoError " + sts); } } } } else if (command.equals("CHECK")) { if (cli.qualifierFound("cli_arg1")) { String methodstr = "METHOD"; String isattributestr = "ISATTRIBUTE"; String cli_arg1 = cli.getQualValue("cli_arg1").toUpperCase(); if (methodstr.length() >= cli_arg1.length() && methodstr.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "CHECK METHOD" String method; String object; if (cli.qualifierFound("/METHOD")) method = cli.getQualValue("/METHOD"); else { System.out.println("Cmd: Method is missing\n"); return 0; } if (cli.qualifierFound("/OBJECT")) object = cli.getQualValue("/OBJECT"); else { System.out.println("Cmd: Object is missing\n"); return 0; } if (methObject == null || object.compareToIgnoreCase(methObject) != 0) { CdhrAttrRef oret = gdh.nameToAttrRef(object); if (oret.evenSts()) return 0; CdhrTypeId cret = gdh.getAttrRefTid(oret.aref); if (cret.evenSts()) return 0; methObject = object; methAref = oret.aref; methClassId = cret.typeId; } JopMethods methods = new JopMethods(session, methAref, methObject, methClassId, JopUtility.NO); boolean b = methods.callFilterMethod(method); System.out.println( "Cmd check method: " + method + " , Object: " + object + ", value: " + b); if (b) return 1; else return 0; } else if (isattributestr.length() >= cli_arg1.length() && isattributestr.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "CHECK ISATTRIBUTE" String method; String object; if (cli.qualifierFound("/OBJECT")) object = cli.getQualValue("/OBJECT"); else { System.out.println("Cmd: Object is missing\n"); return 0; } if (methObject == null || object.compareToIgnoreCase(methObject) != 0) { CdhrAttrRef oret = gdh.nameToAttrRef(object); if (oret.evenSts()) return 0; CdhrTypeId cret = gdh.getAttrRefTid(oret.aref); if (cret.evenSts()) return 0; methObject = object; methAref = oret.aref; methClassId = cret.typeId; } if ((methAref.flags & PwrtAttrRef.OBJECTATTR) != 0) return 1; else return 0; } } } else if (command.equals("CALL")) { if (cli.qualifierFound("cli_arg1")) { String parameter = "METHOD"; String cli_arg1 = cli.getQualValue("cli_arg1").toUpperCase(); if (parameter.length() >= cli_arg1.length() && parameter.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "CHECK METHOD" String method; String object; if (cli.qualifierFound("/METHOD")) method = cli.getQualValue("/METHOD"); else { System.out.println("Cmd: Method is missing\n"); return 0; } if (cli.qualifierFound("/OBJECT")) object = cli.getQualValue("/OBJECT"); else { System.out.println("Cmd: Object is missing\n"); return 0; } if (methObject == null || object.compareToIgnoreCase(methObject) != 0) { CdhrAttrRef oret = gdh.nameToAttrRef(object); if (oret.evenSts()) return 0; CdhrTypeId cret = gdh.getAttrRefTid(oret.aref); if (cret.evenSts()) return 0; methObject = object; methAref = oret.aref; methClassId = cret.typeId; } JopMethods methods = new JopMethods(session, methAref, methObject, methClassId, JopUtility.NO); methods.callMethod(method); System.out.println("Cmd call method: " + method + " , Object: " + object); return 1; } } } else if (command.equals("SET")) { if (cli.qualifierFound("cli_arg1")) { String parameter = "LANGUAGE"; String cli_arg1 = cli.getQualValue("cli_arg1").toUpperCase(); if (parameter.length() >= cli_arg1.length() && parameter.substring(0, cli_arg1.length()).equals(cli_arg1)) { // Command is "SET LANGUAGE" String cli_arg2; if (cli.qualifierFound("cli_arg2")) cli_arg2 = cli.getQualValue("cli_arg2"); else { System.out.println("Cmd: Language is missing\n"); return 0; } JopLang lng = new JopLang(session); lng.set(cli_arg2); JopLang.setDefault(lng); return 1; } } } } else { System.out.println("JopSpider: Parse error " + cli.getStsString()); return 0; } if (!local_cmd) { // Send to xtt if (qcom != null) { PwrtStatus sts = qcom.put(op_qcom_qix, op_qcom_nid, cmd); System.out.println("Send " + cmd + " sts: " + sts.getSts()); if (sts.evenSts()) System.out.println("Qcom put error: " + sts.getSts()); } } return 1; }
/** * convert an array of strings of the form "package.Class.method(Class, Class, ...)" to * an array of Method objects */ public static Method[] stringsToMethods(String[] strings) { int len = strings.length; Method[] methods = new Method[len]; for (int j = 0; j < len; j++) { // remove spaces StringTokenizer t = new StringTokenizer(strings[j], " ", false); String s = ""; while (t.hasMoreTokens()) s = s + t.nextToken(); // separate into two strings t = new StringTokenizer(s, "(", false); String pre = t.nextToken(); String post = t.nextToken(); // separate first string into class and method strings t = new StringTokenizer(pre, ".", false); String c = t.nextToken(); int count = t.countTokens(); for (int i = 0; i < count - 1; i++) c = c + "." + t.nextToken(); String m = t.nextToken(); // get argument array of strings t = new StringTokenizer(post, ",)", false); count = t.countTokens(); String[] a; if (count == 0) a = null; else a = new String[count]; int x = 0; while (t.hasMoreTokens()) a[x++] = t.nextToken(); // convert result to Method object Class clas = null; try { clas = Class.forName(c); } catch (ClassNotFoundException exc) { if (FormulaVar.DEBUG) { System.out.println("ERROR: Class " + c + " does not exist!"); } methods[j] = null; continue; } Class[] param; if (a == null) param = null; else param = new Class[a.length]; for (int i = 0; i < count; i++) { // hack to convert array arguments to correct form if (a[i].endsWith("[]")) { a[i] = "[L" + a[i].substring(0, a[i].length() - 2); while (a[i].endsWith("[]")) { a[i] = "[" + a[i].substring(0, a[i].length() - 2); } a[i] = a[i] + ";"; } try { param[i] = Class.forName(a[i]); } catch (ClassNotFoundException exc) { if (FormulaVar.DEBUG) { System.out.println("ERROR: Class " + a[i] + " (" + i + ") does not exist!"); } methods[j] = null; continue; } } Method method = null; try { method = clas.getMethod(m, param); } catch (NoSuchMethodException exc) { if (FormulaVar.DEBUG) { System.out.println("ERROR: Method " + m + " does not exist!"); } methods[j] = null; continue; } methods[j] = method; } return methods; }
public static DeepHierarchyElement[] getDeepFieldHierarchy( Class<?> parentClass, String field, HintContainer deepIndexHintContainer) { if (!MappingUtils.isDeepMapping(field)) { MappingUtils.throwMappingException("Field does not contain deep field delimitor"); } StringTokenizer toks = new StringTokenizer(field, DozerConstants.DEEP_FIELD_DELIMITER); Class<?> latestClass = parentClass; DeepHierarchyElement[] hierarchy = new DeepHierarchyElement[toks.countTokens()]; int index = 0; int hintIndex = 0; while (toks.hasMoreTokens()) { String aFieldName = toks.nextToken(); String theFieldName = aFieldName; int collectionIndex = -1; if (aFieldName.contains("[")) { theFieldName = aFieldName.substring(0, aFieldName.indexOf("[")); collectionIndex = Integer.parseInt( aFieldName.substring(aFieldName.indexOf("[") + 1, aFieldName.indexOf("]"))); } PropertyDescriptor propDescriptor = findPropertyDescriptor(latestClass, theFieldName, deepIndexHintContainer); DeepHierarchyElement r = new DeepHierarchyElement(propDescriptor, collectionIndex); if (propDescriptor == null) { MappingUtils.throwMappingException( "Exception occurred determining deep field hierarchy for Class --> " + parentClass.getName() + ", Field --> " + field + ". Unable to determine property descriptor for Class --> " + latestClass.getName() + ", Field Name: " + aFieldName); } latestClass = propDescriptor.getPropertyType(); if (toks.hasMoreTokens()) { if (latestClass.isArray()) { latestClass = latestClass.getComponentType(); } else if (Collection.class.isAssignableFrom(latestClass)) { Class<?> genericType = determineGenericsType(propDescriptor); if (genericType == null && deepIndexHintContainer == null) { MappingUtils.throwMappingException( "Hint(s) or Generics not specified. Hint(s) or Generics must be specified for deep mapping with indexed field(s). Exception occurred determining deep field hierarchy for Class --> " + parentClass.getName() + ", Field --> " + field + ". Unable to determine property descriptor for Class --> " + latestClass.getName() + ", Field Name: " + aFieldName); } if (genericType != null) { latestClass = genericType; } else { latestClass = deepIndexHintContainer.getHint(hintIndex); hintIndex += 1; } } } hierarchy[index++] = r; } return hierarchy; }