/*
  * Returns all root operators contained in the set.
  */
 private Set<XMLOperator> filterRootOperators(Set<XMLOperator> flattenedOps) {
   Set<XMLOperator> rootOps = new HashSet<XMLOperator>();
   for (XMLOperator op : flattenedOps) {
     if (op.getParents().isEmpty()) rootOps.add(op);
   }
   return rootOps;
 }
 /*
  * Flattens an operator: Returns the operator and it's
  * children in a set.
  */
 private Set<XMLOperator> flatten(XMLOperator op) {
   Set<XMLOperator> ops = new HashSet<XMLOperator>();
   ops.add(op);
   for (XMLOperator child : op.getChildren()) {
     Set<XMLOperator> _ops = flatten(child);
     ops.addAll(_ops);
   }
   return ops;
 }
  public static XMLFragmentMapping getInstance(
      FragmentMapping fm, XMLElementResolverFactory resolverFac) {
    logger.debug("Resolving fragment-mapping: " + fm);

    XMLResolver<FragmentMapping, XMLFragmentMapping> fmResolver =
        resolverFac.getResolver(FragmentMapping.class, XMLFragmentMapping.class);

    if (fmResolver == null)
      throw new ReuseRuntimeException(
          "No XMLResolver found for " + FragmentMapping.class + ", " + XMLFragmentMapping.class);

    IdGenerator<XMLFragmentMapping> fmIdGenerator =
        resolverFac.getIdGenerator(XMLFragmentMapping.class);

    if (fmIdGenerator == null)
      throw new ReuseRuntimeException("No IdGenerator found for " + XMLFragmentMapping.class);

    if (fmResolver.isBound(fm)) {
      XMLFragmentMapping resolved = fmResolver.resolve(fm);
      logger.debug("Cache hit for fragment-mapping: " + fm + ", in cache: " + resolved);
      return resolved;
    }

    // TFragmentizer2.printFragmentMapping(fm);
    Set<Operator> ops = fm.getOperators();
    Set<XMLOperator> xmlOps = new HashSet<XMLOperator>();
    for (Operator op : ops) {
      XMLOperator xmlOp = XMLOperator.getInstance(op, resolverFac);
      xmlOps.add(xmlOp);
    }

    XMLFragmentMapping xmlFm = new XMLFragmentMapping();

    String id = fm.getId();
    // if no id is set -> generate one
    if (id == null) {
      id = fmIdGenerator.generateId(xmlFm);
    }
    xmlFm.setId(id);

    xmlFm.setOperators(xmlOps);

    fmResolver.bind(fm, xmlFm);

    logger.debug("Resolved fragment-mapping: " + fm + " to: " + xmlFm);
    return xmlFm;
  }