1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.tools.plugin.javadoc;
20  
21  import java.util.Objects;
22  import java.util.Optional;
23  import java.util.regex.Matcher;
24  import java.util.regex.Pattern;
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  public class JavadocReference {
36      private final Optional<String> moduleName;
37  
38      private final Optional<String> packageNameClassName;
39  
40      private final Optional<String> member; 
41  
42      private final Optional<String> label;
43  
44      
45  
46  
47  
48      private static final Pattern REFERENCE_VALUE_PATTERN =
49              Pattern.compile("^\\s*(?:(.+)/)??([^#\\s/]+)?(?:#([^\\s\\(]+(?:\\([^\\)]*\\))?))?(?: +(.*))?$");
50  
51      private static final int GROUP_INDEX_MODULE = 1;
52  
53      private static final int GROUP_INDEX_PACKAGECLASS = 2;
54  
55      private static final int GROUP_INDEX_MEMBER = 3;
56  
57      private static final int GROUP_INDEX_LABEL = 4;
58  
59      
60  
61  
62  
63  
64  
65      public static JavadocReference parse(String reference) {
66          Matcher matcher = REFERENCE_VALUE_PATTERN.matcher(reference);
67          if (!matcher.matches()) {
68              throw new IllegalArgumentException("Invalid format of javadoc reference: " + reference);
69          }
70          final Optional<String> moduleName = getOptionalGroup(matcher, GROUP_INDEX_MODULE);
71          final Optional<String> packageNameClassName = getOptionalGroup(matcher, GROUP_INDEX_PACKAGECLASS);
72          final Optional<String> member = getOptionalGroup(matcher, GROUP_INDEX_MEMBER);
73          final Optional<String> label = getOptionalGroup(matcher, GROUP_INDEX_LABEL);
74          return new JavadocReference(moduleName, packageNameClassName, member, label);
75      }
76  
77      private static Optional<String> getOptionalGroup(Matcher matcher, int index) {
78          String group = matcher.group(index);
79          if (group != null && !group.isEmpty()) {
80              return Optional.of(group);
81          } else {
82              return Optional.empty();
83          }
84      }
85  
86      JavadocReference(
87              Optional<String> moduleName,
88              Optional<String> packageNameClassName,
89              Optional<String> member,
90              Optional<String> label) {
91          this.moduleName = moduleName;
92          this.packageNameClassName = packageNameClassName;
93          this.member = member;
94          this.label = label;
95      }
96  
97      public Optional<String> getModuleName() {
98          return moduleName;
99      }
100 
101     
102 
103 
104 
105     public Optional<String> getPackageNameClassName() {
106         return packageNameClassName;
107     }
108 
109     public Optional<String> getMember() {
110         return member;
111     }
112 
113     public Optional<String> getLabel() {
114         return label;
115     }
116 
117     @Override
118     public String toString() {
119         return "JavadocReference [moduleName=" + moduleName + ", packageNameClassName=" + packageNameClassName
120                 + ", member=" + member + ", label=" + label + "]";
121     }
122 
123     @Override
124     public int hashCode() {
125         return Objects.hash(label, member, packageNameClassName, moduleName);
126     }
127 
128     @Override
129     public boolean equals(Object obj) {
130         if (this == obj) {
131             return true;
132         }
133         if (obj == null) {
134             return false;
135         }
136         if (getClass() != obj.getClass()) {
137             return false;
138         }
139         JavadocReference other = (JavadocReference) obj;
140         return Objects.equals(label, other.label)
141                 && Objects.equals(member, other.member)
142                 && Objects.equals(packageNameClassName, other.packageNameClassName)
143                 && Objects.equals(moduleName, other.moduleName);
144     }
145 }