include::../description.adoc[]

=== Exceptions

This rule does not raise an issue when:

* A constant path is relative and contains at most two parts.
* A constant path is used in an annotation
* A path is annotated

== How to fix it

=== Code examples

==== Noncompliant code example

[source,java,diff-id=1,diff-type=noncompliant]
----
public class Foo {
  public static final String FRIENDS_ENDPOINT = "/user/friends"; // Compliant path is relative and has only two parts

  public Collection<User> listUsers() {
    File userList = new File("/home/mylogin/Dev/users.txt"); // Noncompliant
    Collection<User> users = parse(userList);
    return users;
  }
}
----

==== Compliant solution

[source,java,diff-id=1,diff-type=compliant]
----
public class Foo {
  // Configuration is a class that returns customizable properties: it can be mocked to be injected during tests. 
  private Configuration config;
  public Foo(Configuration myConfig) {
    this.config = myConfig;
  }
  public Collection<User> listUsers() {
    // Find here the way to get the correct folder, in this case using the Configuration object
    String listingFolder = config.getProperty("myApplication.listingFolder");
    // and use this parameter instead of the hard coded path
    File userList = new File(listingFolder, "users.txt"); // Compliant
    Collection<User> users = parse(userList);
    return users;
  }
}
----

Exceptions examples:

[source,java]
----
public class Foo {
  public static final String FRIENDS_ENDPOINT = "/user/friends"; // Compliant path is relative and has only two parts

  public static final String ACCOUNT = "/account/group/list.html"; // Compliant path is used in an annotation

  @Value("${base.url}" + ACCOUNT)
  private String groupUrl;

  @MyAnnotation()
  String path = "/default/url/for/site"; // Compliant path is annotated

}
----

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::../message.adoc[]

'''

endif::env-github,rspecator-view[]
