/**
   * @param provider
   * @param properties
   */
  public GMLFileResource(GMLCRSProvider provider, Properties properties) {
    super(provider, properties, "Dictionary", CommonNamespaces.GML3_2_NS.toASCIIString());
    try {
      transformations = XMLTools.getElements(getRootElement(), TRANSFORM_XPATH, nsContext);

    } catch (XMLParsingException e) {
      LOG.logError(e.getLocalizedMessage(), e);
    }
    cachedWGS84Transformations = new HashMap<CoordinateSystem, Helmert>();
  }
  public Transformation getTransformation(CoordinateSystem sourceCRS, CoordinateSystem targetCRS) {
    if (sourceCRS == null) {
      return null;
    }
    List<Element> toBeRemoved = new ArrayList<Element>(transformations.size());
    List<String> sourceIDs = Arrays.asList(sourceCRS.getIdentifiers());
    List<String> targetIDs = null;
    if (targetCRS != null) {
      targetIDs = Arrays.asList(targetCRS.getIdentifiers());
    } else {
      targetIDs = new ArrayList<String>();
    }
    Transformation result = null;
    for (int i = 0; i < transformations.size() && result == null; ++i) {
      Element transElem = transformations.get(i);
      if (transElem != null) {
        try {
          Element sourceCRSProp =
              XMLTools.getRequiredElement(transElem, PRE + "sourceCRS", nsContext);
          String transformSourceID = null;
          String transformTargetID = null;
          if (sourceCRSProp != null) {
            transformSourceID =
                sourceCRSProp.getAttributeNS(CommonNamespaces.XLNNS.toASCIIString(), "href");
            if ("".equals(transformSourceID)) {
              transformSourceID =
                  XMLTools.getRequiredNodeAsString(
                      sourceCRSProp, "*[1]/" + PRE + "identifier", nsContext);
            }
          }
          if (targetCRS != null) {
            Element targetCRSProp =
                XMLTools.getRequiredElement(transElem, PRE + "targetCRS", nsContext);
            if (targetCRSProp != null) {

              transformTargetID =
                  targetCRSProp.getAttributeNS(CommonNamespaces.XLNNS.toASCIIString(), "href");
              if ("".equals(transformTargetID)) {
                transformTargetID =
                    XMLTools.getRequiredNodeAsString(
                        targetCRSProp, "*[1]/" + PRE + "identifier", nsContext);
              }
            }
          }

          if (sourceIDs.contains(transformSourceID)) {
            result = getProvider().parseTransformation(transElem);
            if (targetCRS == null) {
              // Trying to find a helmert transformation
              LOG.logDebug("Resolving a possible transformation.");
              if (result != null && !(result instanceof Helmert)) {
                result = getTransformation(result.getTargetCRS(), null);
              }
            } else {
              if (!targetIDs.contains(transformTargetID)) {
                LOG.logDebug(
                    "Found a transformation with gml:id: "
                        + transElem.getAttributeNS(CommonNamespaces.GML3_2_NS.toASCIIString(), "id")
                        + ", but the target does not match the source crs, trying to build transformation chain.");
                Transformation second = getTransformation(result.getTargetCRS(), targetCRS);
                if (second != null) {
                  result = new ConcatenatedTransform(result, second);
                } else {
                  LOG.logDebug(
                      "The transformation with gml:id: "
                          + transElem.getAttributeNS(
                              CommonNamespaces.GML3_2_NS.toASCIIString(), "id")
                          + " is not the start of transformation chain, discarding it. ");
                  result = null;
                }
              }
            }
          }

        } catch (XMLParsingException e) {
          toBeRemoved.add(transElem);
          LOG.logWarning(
              "No source CRS id could be found in this transformation(gml:id): "
                  + transElem.getAttributeNS(CommonNamespaces.GML3_2_NS.toASCIIString(), "id")
                  + " this is not correct, removing transformation from cache.");
          LOG.logWarning(e.getMessage());
        }
      }
      if (toBeRemoved.size() > 0) {
        transformations.removeAll(toBeRemoved);
      }
    }
    return result;
  }