/** * When a new metadata object is parsed, try to link it with some monitoring metadata objects that * are waiting here. * * @param repository * @param parsedMetadata * @return If the linking happens. */ public boolean tryLink(MetaMetadataRepository repository, Metadata parsedMetadata) { if (parsedMetadata == null) { return false; } MetaMetadataCompositeField composite = parsedMetadata.getMetaMetadata(); if (composite == null) { return false; } MetaMetadata mmd; String mmdName; if (composite instanceof MetaMetadata) { mmd = (MetaMetadata) composite; mmdName = mmd.getName(); } else { mmdName = composite.getTypeName(); mmd = repository.getMMByName(mmdName); } if (mmd == null) { // maybe it's defined inline -- we need a solution for this kind of inline definition thing! // currently you can't do metadata linking on inline-defined meta_metadata classes return false; } while (!monitorRecords.containsKey(mmdName)) { if (mmdName == null || "metadata".equals(mmdName)) return false; mmdName = mmd.getSuperMmdTypeName(); mmd = repository.getMMByName(mmdName); } Map<Metadata, LinkWith> records = monitorRecords.get(mmdName); for (Metadata object : records.keySet()) { LinkWith lw = records.get(object); if (lw.tryLink(parsedMetadata, object)) { SemanticActionHandler handler = object.pendingSemanticActionHandler; handler.takeSemanticActions(); return true; } } return false; }