Skip to content

Camel language server

Sergey Skorik edited this page Sep 10, 2018 · 7 revisions

Preconditions:

  1. Create workspace from the Java stack with web-java-spring project.
  2. Enable Apache Camel language server in the Installers tab and start the workspace.
  3. Create "camel.xml" file with content:
<!-- here we have Spring XML file with all the namespaces here in the top of the XML file -->
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:camel="http://camel.apache.org/schema/spring"
  xmlns:cxf="http://camel.apache.org/schema/cxf"
  xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
         http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd">

  <!-- this is Spring XML example of the Camel route in the ReportIncidentRoutes class -->
  <!-- this is for demonstration purpose, to show how you can use Camel with XML DSL -->

  <!-- here we define the CXF endpoint, where {{port}} refers to a placeholder so we can define the port number
          in an external .properties file -->
  <cxf:cxfEndpoint id="reportIncident"
    address="http://localhost:{{port}}/camel-example-reportincident/webservices/incident"
    wsdlURL="etc/report_incident.wsdl"
    serviceClass="org.apache.camel.example.reportincident.ReportIncidentEndpoint"/>

  <!-- We use a bean to make the response bean that CXF expects -->
  <bean id="responseBean" class="org.apache.camel.example.reportincident.MyBean"/>

  <!-- this is the bean we use to generate the dynamic file name -->
  <bean id="filenameGenerator" class="org.apache.camel.example.reportincident.FilenameGenerator"/>

  <!-- this CamelContext contains the equivalent route from the Java DSL, but in XML
       so end users can see how to implement the route in both Java and XML -->
  <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">

    <!-- property which contains port number -->
    <!-- we have file:target/custom.properties which can be optional and override existing values, we use this for testing purpose -->
    <camel:propertyPlaceholder id="properties" location="classpath:incident.properties,file:target/custom.properties"/>

    <!-- this is the first route that uses CXF as web service -->
    <route>
      <from uri="tim"/>
      <convertBodyTo type="org.apache.camel.example.reportincident.InputReportIncident"/>
      <setHeader headerName="CamelFileName">
        <method bean="filenameGenerator" method="generateFilename"/>
      </setHeader>
      <to uri="velocity:etc/MailBody.vm"/>
      <to uri="file://target/subfolder"/>
      <transform>
        <method bean="responseBean" method="getOK"/>
      </transform>
    </route>

    <!-- this is the 2nd route that pickup files and send them as emails -->
    <route>
      <from uri="file://target/subfolder"/>
      <setHeader headerName="subject">
        <constant>new incident reported</constant>
      </setHeader>
      <to uri="smtp://someone@localhost?password=secret&amp;to=incident@mycompany.com"/>
    </route>

  </camelContext>

</beans>

Testing process

  • Language server initialization
  1. From the project open "camel.xml" file.
  2. Check Finished language servers initialization, file path '/web-java-spring/camel.xml' message in the dev-machine console.
  • Autocomplete feature
  1. Open "camel.xml" file.
  2. Move to 37:21 position and invoke Ctrl + Space. Check that timer:timerName text fragment was added.
  3. Hover mouse pointer on the added fragment and check that next text The timer component is used for generating message exchanges when a timer fires. is present.
  4. Type ?. Invoke codeassistant again by Ctrl + Space and select '``fixedRate''' proposal. Make sure that fixedRate=false fragment has been pasted properly.
  5. Type &amp;. Invoke codeassistant, select exchangePatterninto proposal menu. Invoke Ctrl + Space again. Paste InOnly param.
  6. Check that content of line 37 is <from uri="timer:timer:timerName?fixedRate=false&amp;exchangePattern=InOnly"/>
  • Hover feature(depends on Autocomplete step)
  1. Open "camel.xml" file.
  2. Move mouse pointer on position 37:26.
  3. Wait hover popup is appeared with text The timer component is used for generating message exchanges when a timer fires..
  • Go To Symbol
  1. Open "camel.xml" file.
  2. Start Go To Symbol feature by Ctrl+F12 buttons or from Assistant menu.
  3. Wait for Go To Symbol form is opened with next lines:
<no id> symbols[2]
<no id>
  1. Click on any of them and check that it correctly selected in file.