Example #1
0
  private void handleEmbedding(
      String absoluteURI, HashMap map, boolean includeCSS, boolean includeScript)
      throws XFormsException {

    //        if(this.targetAttribute == null) return;
    // todo: handle multiple params
    if (absoluteURI.indexOf("?") > 0) {
      String name = absoluteURI.substring(absoluteURI.indexOf("?") + 1);
      String value = name.substring(name.indexOf("=") + 1, name.length());
      name = name.substring(0, name.indexOf("="));
      this.container.getProcessor().setContextParam(name, value);
    }
    if (this.targetAttribute == null) {
      map.put("uri", absoluteURI);
      map.put("show", this.showAttribute);

      // dispatch internal betterform event
      this.container.dispatch(this.target, BetterFormEventNames.LOAD_URI, map);
      return;
    }

    if (!("embed".equals(this.showAttribute))) {
      throw new XFormsException(
          "@show must be 'embed' if @target is given but was: '"
              + this.showAttribute
              + "' on Element "
              + DOMUtil.getCanonicalPath(this.element));
    }
    // todo: dirty dirty dirty
    String evaluatedTarget = evalAttributeValueTemplates(this.targetAttribute, this.element);
    if (LOGGER.isDebugEnabled()) {
      LOGGER.debug("targetid evaluated to: " + evaluatedTarget);
    }
    Node embed = getEmbeddedDocument(absoluteURI);

    // Check for 'ClientSide' events (DOMFocusIN / DOMFocusOUT / xforms-select)
    String utilizedEvents = this.getEventsInSubform(embed);

    // fetch CSS / JavaScript
    String inlineCssRules = "";
    String externalCssRules = "";
    String inlineJavaScript = "";
    String externalJavaScript = "";

    if (includeCSS) {
      inlineCssRules = getInlineCSS(embed);
      externalCssRules = getExternalCSS(embed);
    }
    if (includeScript) {
      inlineJavaScript = getInlineJavaScript(embed);
      externalJavaScript = getExternalJavaScript(embed);
    }
    embed = extractFragment(absoluteURI, embed);
    if (LOGGER.isDebugEnabled()) {
      DOMUtil.prettyPrintDOM(embed);
    }

    if (embed == null) {
      // todo: review: context info params containing a '-' fail during access in javascript!
      // todo: the following property should have been 'resource-uri' according to spec
      map.put("resourceUri", absoluteURI);
      this.container.dispatch(this.target, XFormsEventNames.LINK_EXCEPTION, map);
      return;
    }

    Element embeddedNode;
    Element targetElem = getTargetElement(evaluatedTarget);

    // Test if targetElem exist.
    if (targetElem != null) {
      // destroy existing embedded form within targetNode
      if (targetElem.hasChildNodes()) {
        destroyembeddedModels(targetElem);
        Initializer.disposeUIElements(targetElem);
      }

      // import referenced embedded form into host document
      embeddedNode = (Element) this.container.getDocument().importNode(embed, true);

      // import namespaces
      NamespaceResolver.applyNamespaces(
          targetElem.getOwnerDocument().getDocumentElement(), (Element) embeddedNode);

      // keep original targetElem id within hostdoc
      embeddedNode.setAttributeNS(null, "id", targetElem.getAttributeNS(null, "id"));
      // copy all Attributes that might have been on original mountPoint to embedded node
      DOMUtil.copyAttributes(targetElem, embeddedNode, null);
      targetElem.getParentNode().replaceChild(embeddedNode, targetElem);

      map.put("uri", absoluteURI);
      map.put("show", this.showAttribute);
      map.put("targetElement", embeddedNode);
      map.put("nameTarget", evaluatedTarget);
      map.put("xlinkTarget", getXFormsAttribute(targetElem, "id"));
      map.put("inlineCSS", inlineCssRules);
      map.put("externalCSS", externalCssRules);
      map.put("inlineJavascript", inlineJavaScript);
      map.put("externalJavascript", externalJavaScript);
      map.put("utilizedEvents", utilizedEvents);

      this.container.dispatch((EventTarget) embeddedNode, BetterFormEventNames.EMBED, map);
      // create model for it
      this.container.createEmbeddedForm((Element) embeddedNode);

      // dispatch internal betterform event
      this.container.dispatch((EventTarget) embeddedNode, BetterFormEventNames.EMBED_DONE, map);

      this.container.dispatch(this.target, BetterFormEventNames.LOAD_URI, map);
      //        storeInContext(absoluteURI, this.showAttribute);
    } else {
      String message =
          "Element reference for targetid: "
              + this.targetAttribute
              + " not found. "
              + DOMUtil.getCanonicalPath(this.element);
      /*
      Element div = this.element.getOwnerDocument().createElementNS("", "div");
      div.setAttribute("class", "bfException");
      div.setTextContent("Element reference for targetid: " + this.targetAttribute + "not found. " + DOMUtil.getCanonicalPath(this.element));

      Element body = (Element) this.container.getDocument().getElementsByTagName("body").item(0);
      body.insertBefore(div, DOMUtil.getFirstChildElement(body));
      */
      map.put("message", message);
      map.put("exceptionPath", DOMUtil.getCanonicalPath(this.element));
      this.container.dispatch(this.target, BetterFormEventNames.EXCEPTION, map);
      // throw new XFormsException(message);
    }
  }