@Override
  public boolean visit(final CFGNode node, final Element element) {
    final LinkedList<Pair<XMLPattern, SimpleAutomatonID>> matchings =
        new LinkedList<Pair<XMLPattern, SimpleAutomatonID>>();
    for (XMLPattern pattern : getXMLAutomatonDefinition().getXMLpatterns()) {
      final Pair<Boolean, XMLPatternVariablesAssignment> matchResult =
          pattern.matchesNode(node, aliasResolver);
      if (matchResult.getFirst()) {
        final XMLPatternVariablesAssignment assign = matchResult.getSecond();
        final boolean isGlobal = isGlobalAssignement(assign);
        matchings.add(Pair.make(pattern, new SimpleAutomatonID(assign, isGlobal)));
      }
    }

    if (matchings.size() > 1) checkMatchingConflict(element, matchings);

    if (!matchings.isEmpty()) {
      final PatternLocation newLocation = createCommonPatternLocation(node, matchings);
      getNodeLocationDictionary().put(node, Pair.make(newLocation, newLocation));
      if (matchings.getFirst().getFirst().isConstructive())
        getAutomataIDs().add(matchings.getFirst().getSecond());
    } else if (getNavigator().isCallNode(node)) {
      final PatternLocation callLocation = createRuleLessPatternLocation(node);
      final PatternLocation returnLocation = createRuleLessPatternLocation(node);
      getNodeLocationDictionary().put(node, Pair.make(callLocation, returnLocation));
      callLocation.setLocationForCallNotPassedStates(returnLocation);
    }

    return true;
  }
  private void checkMatchingConflict(
      final Element element, final LinkedList<Pair<XMLPattern, SimpleAutomatonID>> matchings) {
    if (!logger.isDebugEnabled()) return;

    boolean same = true;
    final Set<String> names = new HashSet<String>();
    names.add(matchings.getFirst().getFirst().getName());
    for (final Pair<XMLPattern, SimpleAutomatonID> match : matchings)
      if (names.add(match.getFirst().getName())) {
        same = false;
        break;
      }
    if (!same) {
      logger.debug("This code:");
      logger.debug(element.asXML());
      logger.debug("can be matched by more than one " + "distinct rule:");
      for (final Pair<XMLPattern, SimpleAutomatonID> match : matchings) {
        final XMLPattern pat = match.getFirst();
        logger.debug(pat.getName() + ": " + pat.getPatternXMLelement().asXML());
      }
    }
  }