1 /**
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.creadur.whisker.app.analysis;
20
21 import java.util.ArrayList;
22 import java.util.Collection;
23 import java.util.TreeSet;
24
25 import org.apache.commons.lang3.tuple.ImmutablePair;
26 import org.apache.commons.lang3.tuple.Pair;
27 import org.apache.creadur.whisker.model.Resource;
28 import org.apache.creadur.whisker.model.Visitor;
29 import org.apache.creadur.whisker.model.WithLicense;
30 import org.apache.creadur.whisker.model.WithinDirectory;
31
32 /**
33 * Collects resource source details.
34 */
35 public final class ResourceSourceAuditor extends Visitor {
36 /** Last license visited. */
37 private WithLicense lastLicense;
38 /** Last directory visited. */
39 private WithinDirectory lastDirectory;
40 /** Collects resources that are missing source. */
41 private final Collection<
42 Pair<WithinDirectory, Resource>> resourcesMissingSource
43 = new TreeSet<Pair<WithinDirectory, Resource>>();
44 /** Collects resources that match a source. */
45 private final Collection<
46 Pair<WithinDirectory, Resource>> resourcesWithSource
47 = new TreeSet<Pair<WithinDirectory, Resource>>();
48
49 /**
50 * Hook for public domain.
51 * @return false (no need to traverse public domain)
52 * @see Visitor#traversePublicDomain()
53 */
54 @Override
55 public boolean traversePublicDomain() {
56 // no need to traverse public domain
57 return false;
58 }
59
60
61 /**
62 * Gets the resources with source collected during visits.
63 * @return the resourcesWithSource, not null
64 */
65 public Collection<
66 Pair<WithinDirectory, Resource>> getResourcesWithSource() {
67 return resourcesWithSource;
68 }
69
70 /**
71 * Gets the resources missing source collected during visits.
72 * @return the resourcesMissingSource not null
73 */
74 public Collection<
75 Pair<WithinDirectory, Resource>> getResourcesMissingSource() {
76 return resourcesMissingSource;
77 }
78
79 /**
80 * Accepts a directory visit.
81 * @param directory not null
82 * @see Visitor#visit(WithinDirectory)
83 */
84 @Override
85 public void visit(final WithinDirectory directory) {
86 this.lastDirectory = directory;
87 }
88
89
90
91 /**
92 * Accepts a license visit.
93 * @param license not null
94 * @see Visitor#visit(WithLicense)
95 */
96 @Override
97 public void visit(final WithLicense license) {
98 this.lastLicense = license;
99 }
100
101 /**
102 * Accepts a visit to a resource.
103 * @param resource not null
104 * @see Visitor#visit(Resource)
105 */
106 @Override
107 public void visit(final Resource resource) {
108 if (lastLicense == null) {
109 throw new IllegalArgumentException(
110 "Last license unexpectedly null for resource "
111 + resource);
112 } else if (lastLicense.isSourceRequired()) {
113 final ImmutablePair<WithinDirectory, Resource> pair =
114 new ImmutablePair<
115 WithinDirectory,
116 Resource>(lastDirectory, resource);
117 if (resource.hasSource()) {
118 resourcesWithSource.add(pair);
119 } else {
120 resourcesMissingSource.add(pair);
121 }
122 }
123 }
124
125
126 /**
127 * Gets those resources visited which require source links.
128 * @return not null, possibly empty
129 */
130 public Collection<Resource> getResourcesRequiringSourceLinks() {
131 final Collection<Resource> results = new ArrayList<Resource>();
132 for (Pair<WithinDirectory, Resource> pair: resourcesWithSource) {
133 results.add(pair.getRight());
134 }
135 return results;
136 }
137
138 }