Grails Groovy Java

X-Mas Musings #15 – Too Many Paths. One Path Spec?

Within a typical (Java) project there a lots of places where some kind of "path" needs to be specified. I think it's time for a standardized "Path specification" :-)

December is for many people a period of reflection or thought. So I decided to reflect upon last year’s things and thoughts — each day until Christmas. This is day 15.

Ted-Vinke-X-Mas-Musings-Banner-Too

Within a typical (Java) project there a lots of places where some kind of “path” needs to be specified.

Gradle

For starters, in any build configuration quite a few paths to directories or files need to be described.

sonarqube {
  properties {
    property 'sonar.sources', 'src'
    property 'sonar.exclusions', '**/*.spec.js'
    property 'sonar.tests', 'src'
    property 'sonar.test.inclusions', '**/*.spec.js'
  }
}

task test(type: YarnTask, dependsOn: 'yarn') {
  description = 'Run the client tests'

  inputs.files(fileTree('config'))
  inputs.files(fileTree('src'))
  inputs.file('package.json')
  outputs.dir('build')
  args = ['run', 'unit']
}

war {
  dependsOn asciidoctor
  from ("${asciidoctor.outputDir}/html5") {
    into 'static/docs'
  }
}

UrlMappings Grails

Mappings of urls to the appropriate controller and action on the server-side.

"/"(controller: "dashboard")
"500"(view: "/error")
"/api/v1/person/$id"(
  controller: "person", 
  action: "details")

Spring Security

Securing urls with permissions.

http
  .authorizeRequests()
  .antMatchers("/assets/**").permitAll()
  .antMatchers("/admin").hasRole("ADMIN")
  .anyRequest().authenticated()

Vue routing

Mappings of paths. Same project, but for the JavaScript client.

routes: [
  { path: '/', redirect: '/dashboard' },
  { path: '/staff/person/:id?', component: Person },
  { path: '*', redirect: '/notfound' }
]

Spring REST Docs

Describing the path of JSON fields to generate documentation for API requests and responses.

given(this.spec)
  .accept("application/json")
  .filter(document("user", responseFields(
    fieldWithPath("name").description("The user's name"),
    fieldWithPath("email.primary").description("The primary email address"),
    fieldWithPath("roles[]").description("List of roles"),
    fieldWithPath("subscription[].type.*.name").description("Any subscription type"))))
   .when().get("/user/5")
   .then().assertThat().statusCode(is(200));

And more…

That’s just in one project!

I sometimes even forget what the right syntax is 🙂 Some docs clearly state they’re using Ant-style path patterns (**/*.?) or just use a home-grown system ([].*).

I think it’s time for a standardized “Path specification” — where all paths can be described in a uniform way and are treated equally! 🙂

Does your own project contains other surprising, path examples? I’d love to hear about them in the comments section.