예제 #1
0
  /**
   * Called to prepare. If will look for any errors or inconsistencies in the setup.
   *
   * @param analyzer the analyzer to report errors and create references
   * @throws Exception
   */
  void prepare(Analyzer analyzer) throws Exception {

    prepareVersion(analyzer);

    if (implementation == null) {
      analyzer.error("No Implementation defined for component " + name);
      return;
    }

    analyzer.referTo(implementation);

    if (name == null) name = implementation.getFQN();

    if (service != null && service.length > 0) {
      for (TypeRef interfaceName : service) analyzer.referTo(interfaceName);
    } else if (scope != null && scope != ServiceScope.BUNDLE)
      analyzer.warning(
          "The servicefactory:=true directive is set but no service is provided, ignoring it");

    for (Map.Entry<String, List<String>> kvs : property.entrySet()) {
      Tag property = new Tag("property");
      String name = kvs.getKey();
      String type = propertyType.get(name);

      property.addAttribute("name", name);
      if (type != null) {
        property.addAttribute("type", type);
      }
      if (kvs.getValue().size() == 1) {
        String value = kvs.getValue().get(0);
        value = check(type, value, analyzer);
        property.addAttribute("value", value);
      } else {
        StringBuilder sb = new StringBuilder();

        String del = "";
        for (String v : kvs.getValue()) {
          if (v == MARKER) {
            continue;
          }
          sb.append(del);
          v = check(type, v, analyzer);
          sb.append(v);
          del = "\n";
        }
        property.addContent(sb.toString());
      }
      propertyTags.add(property);
    }
  }
예제 #2
0
  /**
   * Returns a tag describing the component element.
   *
   * @return a component element
   */
  Tag getTag() {
    String xmlns = this.xmlns;
    if (xmlns == null && version != AnnotationReader.V1_0) xmlns = NAMESPACE_STEM + "/v" + version;
    Tag component = new Tag(xmlns == null ? "component" : "scr:component");
    Namespaces namespaces = null;
    if (xmlns != null) {

      namespaces = new Namespaces();
      namespaces.registerNamespace("scr", xmlns);
      addNamespaces(namespaces, xmlns);
      for (ReferenceDef ref : references.values()) ref.addNamespaces(namespaces, xmlns);

      namespaces.addNamespaces(component);
    }
    component.addAttribute("name", name);

    if (configurationPolicy != null)
      component.addAttribute("configuration-policy", configurationPolicy.toString().toLowerCase());

    if (enabled != null) component.addAttribute("enabled", enabled);

    if (immediate != null) component.addAttribute("immediate", immediate);

    if (factory != null) component.addAttribute("factory", factory);

    if (activate != null && version != AnnotationReader.V1_0)
      component.addAttribute("activate", activate);

    if (deactivate != null && version != AnnotationReader.V1_0)
      component.addAttribute("deactivate", deactivate);

    if (modified != null) component.addAttribute("modified", modified);

    if (configurationPid != null) {
      StringBuilder b = new StringBuilder();
      String space = "";
      for (String pid : configurationPid) {
        if ("$".equals(pid)) pid = name;
        b.append(space).append(pid);
        space = " ";
      }
      component.addAttribute("configuration-pid", b.toString());
    }

    addAttributes(component, namespaces);

    Tag impl = new Tag(component, "implementation");
    impl.addAttribute("class", implementation.getFQN());

    if (service != null && service.length != 0) {
      Tag s = new Tag(component, "service");
      if (scope != null) { // TODO check for DEFAULT???
        if (AnnotationReader.V1_3.compareTo(version) > 0) {
          if (scope == ServiceScope.PROTOTYPE) {
            throw new IllegalStateException(
                "verification failed, pre 1.3 component with scope PROTOTYPE");
          }
          s.addAttribute("servicefactory", scope == ServiceScope.BUNDLE);
        } else {
          s.addAttribute("scope", scope.toString().toLowerCase());
        }
      }

      for (TypeRef ss : service) {
        Tag provide = new Tag(s, "provide");
        provide.addAttribute("interface", ss.getFQN());
      }
    }

    for (ReferenceDef ref : references.values()) {
      Tag refTag = ref.getTag(namespaces);
      component.addContent(refTag);
    }

    for (Tag tag : propertyTags) component.addContent(tag);

    for (String entry : properties) {
      Tag properties = new Tag(component, "properties");
      properties.addAttribute("entry", entry);
    }
    return component;
  }