element

<value>content</value>

An XML element

Configuration options

tagname

Checks the name of the tag.

search:
  element:
    tagName:
      is: value-of
      namespace: http://www.w3.org/1999/XSL/Transform
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
    <h1>
        <xsl:value-of select="path/of/element"/>
    </h1>
</xsl:template>

attribute

Checks if the element has a matching attribute. See attribute for options on attributes.

search:
  element:
    attribute:
      name:
        is: lang
        namespace: http://www.w3.org/XML/1998/namespace
<?xml version="1.0"?>
<root xmlns:xml="http://www.w3.org/XML/1998/namespace">
    <data xml:lang="thevalue"/>
</root>

text

Checks the text value of the element.

search:
  element:
    text: true
<root xmlns:xml="http://www.w3.org/XML/1998/namespace">
    <enableSearch>true</enableSearch>
</root>

child

Checks if the element has a matching child element.

search:
  element:
    child:
      tagName: value-of
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
    <h1>
        <xsl:value-of select="path/of/element"/>
    </h1>
</xsl:template>

Generic Configuration options

The following options are generic and available for every target.

anyOf

Similar to the logical operator OR: one or more descendant options should match.

search:
  <target>:
    anyOf:
    - name: "illegal"
    - name: "alsoIllegal"

allOf

Similar to the logical operator AND: all descendant options must match.

search:
  <target>:
    allOf:
    - annotation: "HttpPost"
    - annotation: "AllowUnAuthorized"

with

The only purpose to use this field is to make the recipe easier to read. It provides no additional functionality.

search:
  <target>:
    with:
      annotation: "HttpPost"

not, without

Works as the logical operator NOT. It will negate the result of the descendant options. Sensei presents the user with both options. They display the same behavior, but certain scenarios tend to read better using without.

search:
  <target>:
    not:
      annotation: "HttpPost"
search:
  <target>:
    without:
      annotation: "HttpPost"

in

Performs a structural search, this option is mainly used to narrow down recipes. Examples of this would be to only analyze and mark code inside a certain class or method that has a specific annotation. However, we haven't limited this option to only support these two scenarios. More advanced configuration can be achieved.

search:
  <target>:
    in:
      class:
        name:
          contains: "Controller"
search:
  <target>:
    in:
      method:
        annotation:
          type: "HttpPost"

label

Labels do not modify the behavior of searching elements, but they allow addressing a specific element in a quick fix.

search:
  element:
    tagName: inner
    attribute:
      name: data
    in:
      element:
        label: outerelement

availableFixes:
- name: add the 'type' attribute on the outer element
  actions:
  - add:
      attribute:
        name: type
        value: '"unsafe"'
      target: label:outerelement
- <outer>
+ <outer type="unsafe">
      <inner data="test"/>
  </outer>