コード例 #1
0
  protected void injectBeanPostProcessor(
      Element element,
      ParserContext parserContext,
      String contextId,
      BeanDefinitionBuilder builder) {
    Element childElement = element.getOwnerDocument().createElement("beanPostProcessor");
    element.appendChild(childElement);

    String beanPostProcessorId = contextId + ":beanPostProcessor";
    childElement.setAttribute("id", beanPostProcessorId);
    BeanDefinition definition = beanPostProcessorParser.parse(childElement, parserContext);
    // only register to camel context id as a String. Then we can look it up later
    // otherwise we get a circular reference in spring and it will not allow custom bean post
    // processing
    // see more at CAMEL-1663
    definition.getPropertyValues().addPropertyValue("camelId", contextId);
    builder.addPropertyReference("beanPostProcessor", beanPostProcessorId);
  }
コード例 #2
0
 private void registerEndpoint(
     Element childElement, ParserContext parserContext, String contextId) {
   String id = childElement.getAttribute("id");
   // must have an id to be registered
   if (ObjectHelper.isNotEmpty(id)) {
     BeanDefinition definition = endpointParser.parse(childElement, parserContext);
     definition
         .getPropertyValues()
         .addPropertyValue("camelContext", new RuntimeBeanReference(contextId));
     // Need to add this dependency of CamelContext for Spring 3.0
     try {
       Method method = definition.getClass().getMethod("setDependsOn", String[].class);
       method.invoke(definition, (Object) new String[] {contextId});
     } catch (Exception e) {
       // Do nothing here
     }
     parserContext.registerBeanComponent(new BeanComponentDefinition(definition, id));
   }
 }
コード例 #3
0
  /** Used for auto registering producer and consumer templates if not already defined in XML. */
  protected void registerTemplates(Element element, ParserContext parserContext, String contextId) {
    boolean template = false;
    boolean consumerTemplate = false;

    NodeList list = element.getChildNodes();
    int size = list.getLength();
    for (int i = 0; i < size; i++) {
      Node child = list.item(i);
      if (child instanceof Element) {
        Element childElement = (Element) child;
        String localName = childElement.getLocalName();
        if ("template".equals(localName)) {
          template = true;
        } else if ("consumerTemplate".equals(localName)) {
          consumerTemplate = true;
        }
      }
    }

    if (!template) {
      // either we have not used template before or we have auto registered it already and therefore
      // we
      // need it to allow to do it so it can remove the existing auto registered as there is now a
      // clash id
      // since we have multiple camel contexts
      boolean existing = autoRegisterMap.get("template") != null;
      boolean inUse = false;
      try {
        inUse = parserContext.getRegistry().isBeanNameInUse("template");
      } catch (BeanCreationException e) {
        // Spring Eclipse Tooling may throw an exception when you edit the Spring XML online in
        // Eclipse
        // when the isBeanNameInUse method is invoked, so ignore this and continue (CAMEL-2739)
        LOG.debug("Error checking isBeanNameInUse(template). This exception will be ignored", e);
      }
      if (!inUse || existing) {
        String id = "template";
        // auto create a template
        Element templateElement = element.getOwnerDocument().createElement("template");
        templateElement.setAttribute("id", id);
        BeanDefinitionParser parser = parserMap.get("template");
        BeanDefinition definition = parser.parse(templateElement, parserContext);

        // auto register it
        autoRegisterBeanDefinition(id, definition, parserContext, contextId);
      }
    }

    if (!consumerTemplate) {
      // either we have not used template before or we have auto registered it already and therefore
      // we
      // need it to allow to do it so it can remove the existing auto registered as there is now a
      // clash id
      // since we have multiple camel contexts
      boolean existing = autoRegisterMap.get("consumerTemplate") != null;
      boolean inUse = false;
      try {
        inUse = parserContext.getRegistry().isBeanNameInUse("consumerTemplate");
      } catch (BeanCreationException e) {
        // Spring Eclipse Tooling may throw an exception when you edit the Spring XML online in
        // Eclipse
        // when the isBeanNameInUse method is invoked, so ignore this and continue (CAMEL-2739)
        LOG.debug(
            "Error checking isBeanNameInUse(consumerTemplate). This exception will be ignored", e);
      }
      if (!inUse || existing) {
        String id = "consumerTemplate";
        // auto create a template
        Element templateElement = element.getOwnerDocument().createElement("consumerTemplate");
        templateElement.setAttribute("id", id);
        BeanDefinitionParser parser = parserMap.get("consumerTemplate");
        BeanDefinition definition = parser.parse(templateElement, parserContext);

        // auto register it
        autoRegisterBeanDefinition(id, definition, parserContext, contextId);
      }
    }
  }
コード例 #4
0
    @Override
    protected void doParse(
        Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
      renameNamespaceRecursive(element);
      super.doParse(element, parserContext, builder);

      String contextId = element.getAttribute("id");
      boolean implicitId = false;

      // lets avoid folks having to explicitly give an ID to a camel context
      if (ObjectHelper.isEmpty(contextId)) {
        // if no explicit id was set then use a default auto generated name
        CamelContextNameStrategy strategy = new DefaultCamelContextNameStrategy();
        contextId = strategy.getName();
        element.setAttributeNS(null, "id", contextId);
        implicitId = true;
      }

      // now lets parse the routes with JAXB
      Binder<Node> binder;
      try {
        binder = getJaxbContext().createBinder();
      } catch (JAXBException e) {
        throw new BeanDefinitionStoreException("Failed to create the JAXB binder", e);
      }
      Object value = parseUsingJaxb(element, parserContext, binder);

      if (value instanceof CamelContextFactoryBean) {
        // set the property value with the JAXB parsed value
        CamelContextFactoryBean factoryBean = (CamelContextFactoryBean) value;
        builder.addPropertyValue("id", contextId);
        builder.addPropertyValue("implicitId", implicitId);
        builder.addPropertyValue("routes", factoryBean.getRoutes());
        builder.addPropertyValue("intercepts", factoryBean.getIntercepts());
        builder.addPropertyValue("interceptFroms", factoryBean.getInterceptFroms());
        builder.addPropertyValue(
            "interceptSendToEndpoints", factoryBean.getInterceptSendToEndpoints());
        builder.addPropertyValue("dataFormats", factoryBean.getDataFormats());
        builder.addPropertyValue("onCompletions", factoryBean.getOnCompletions());
        builder.addPropertyValue("onExceptions", factoryBean.getOnExceptions());
        builder.addPropertyValue("builderRefs", factoryBean.getBuilderRefs());
        builder.addPropertyValue("routeRefs", factoryBean.getRouteRefs());
        builder.addPropertyValue("properties", factoryBean.getProperties());
        builder.addPropertyValue("packageScan", factoryBean.getPackageScan());
        builder.addPropertyValue("contextScan", factoryBean.getContextScan());
        if (factoryBean.getPackages().length > 0) {
          builder.addPropertyValue("packages", factoryBean.getPackages());
        }
        builder.addPropertyValue(
            "camelPropertyPlaceholder", factoryBean.getCamelPropertyPlaceholder());
        builder.addPropertyValue("camelJMXAgent", factoryBean.getCamelJMXAgent());
        builder.addPropertyValue(
            "camelStreamCachingStrategy", factoryBean.getCamelStreamCachingStrategy());
        builder.addPropertyValue("threadPoolProfiles", factoryBean.getThreadPoolProfiles());
        // add any depends-on
        addDependsOn(factoryBean, builder);
      }

      NodeList list = element.getChildNodes();
      int size = list.getLength();
      for (int i = 0; i < size; i++) {
        Node child = list.item(i);
        if (child instanceof Element) {
          Element childElement = (Element) child;
          String localName = child.getLocalName();
          if (localName.equals("endpoint")) {
            registerEndpoint(childElement, parserContext, contextId);
          } else if (localName.equals("routeBuilder")) {
            addDependsOnToRouteBuilder(childElement, parserContext, contextId);
          } else {
            BeanDefinitionParser parser = parserMap.get(localName);
            if (parser != null) {
              BeanDefinition definition = parser.parse(childElement, parserContext);
              String id = childElement.getAttribute("id");
              if (ObjectHelper.isNotEmpty(id)) {
                parserContext.registerComponent(new BeanComponentDefinition(definition, id));
                // set the templates with the camel context
                if (localName.equals("template")
                    || localName.equals("consumerTemplate")
                    || localName.equals("proxy")
                    || localName.equals("export")) {
                  // set the camel context
                  definition
                      .getPropertyValues()
                      .addPropertyValue("camelContext", new RuntimeBeanReference(contextId));
                }
              }
            }
          }
        }
      }

      // register as endpoint defined indirectly in the routes by from/to types having id explicit
      // set
      registerEndpointsWithIdsDefinedInFromOrToTypes(element, parserContext, contextId, binder);

      // register templates if not already defined
      registerTemplates(element, parserContext, contextId);

      // lets inject the namespaces into any namespace aware POJOs
      injectNamespaces(element, binder);

      // inject bean post processor so we can support @Produce etc.
      // no bean processor element so lets create it by our self
      injectBeanPostProcessor(element, parserContext, contextId, builder);
    }