private Value buildDerefValue( Element fieldEl, String valueExpr, boolean extractContent, String formatter) throws IndexerConfException, InterruptedException, RepositoryException { final String[] derefParts = parseDerefParts(fieldEl, valueExpr); final FieldType fieldType = constructDerefFieldType(fieldEl, valueExpr, derefParts); final DerefValue deref = new DerefValue(fieldType, extractContent, formatter); // // Run over all children except the last // boolean lastFollowIsRecord = false; for (int i = 0; i < derefParts.length - 1; i++) { String derefPart = derefParts[i]; // A deref expression can navigate through 5 kinds of 'links': // - a link stored in a link field (detected based on presence of a colon) // - a nested record // - a link to the master variant (if it's the literal string 'master') // - a link to a less-dimensioned variant // - a link to a more-dimensioned variant if (derefPart.contains(":")) { // It's a field name lastFollowIsRecord = processFieldDeref(fieldEl, valueExpr, deref, derefPart); } else if (derefPart.equals("master")) { // Link to master variant if (lastFollowIsRecord) { throw new IndexerConfException( "In dereferencing, master cannot follow on record-type field." + " Deref expression: '" + valueExpr + "' at " + LocationAttributes.getLocation(fieldEl)); } lastFollowIsRecord = false; deref.addMasterFollow(); } else if (derefPart.trim().startsWith("-")) { // Link to less dimensioned variant if (lastFollowIsRecord) { throw new IndexerConfException( "In dereferencing, variant cannot follow on record-type field." + " Deref expression: '" + valueExpr + "' at " + LocationAttributes.getLocation(fieldEl)); } lastFollowIsRecord = false; processLessDimensionedVariantsDeref(fieldEl, valueExpr, deref, derefPart); } else if (derefPart.trim().startsWith("+")) { // Link to more dimensioned variant if (lastFollowIsRecord) { throw new IndexerConfException( "In dereferencing, variant cannot follow on record-type field." + " Deref expression: '" + valueExpr + "' at " + LocationAttributes.getLocation(fieldEl)); } lastFollowIsRecord = false; processMoreDimensionedVariantsDeref(fieldEl, valueExpr, deref, derefPart); } } deref.init(typeManager); return deref; }