View Javadoc

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.model;
20  
21  import java.util.Collection;
22  import java.util.TreeSet;
23  
24  import org.apache.commons.lang3.tuple.ImmutablePair;
25  import org.apache.commons.lang3.tuple.Pair;
26  
27  /**
28   * Collates resources within directories, flattening the
29   * model.
30   */
31  public class ResourceNamesCollator extends Visitor {
32  
33      /** Resources collected. */
34      private final Collection<Pair<WithinDirectory, Resource>> resources 
35          = new TreeSet<Pair<WithinDirectory, Resource>>();
36      /** Duplicate resources discovered. */
37      private final Collection<Pair<WithinDirectory, Resource>> duplicates 
38          = new TreeSet<Pair<WithinDirectory, Resource>>();
39      /** Last directory visited. */
40      private WithinDirectory lastDirectory;
41  
42      /**
43       * Gets the names of the resources collected.
44       * @return not null
45       */
46      public Collection<String> getNames() {
47          final Collection<String> names = new TreeSet<String>();
48          for (final Pair<WithinDirectory, Resource> pair : this.resources) {
49              names.add(pair.getRight().getName());
50          }
51          return names;
52      }
53  
54      /**
55       * Gets the duplicate resources discovered.
56       * @return not null
57       */
58      public Collection<Pair<WithinDirectory, Resource>> getDuplicates() {
59          return this.duplicates;
60      }
61  
62      /**
63       * Sets the last directory visited.
64       * @see Visitor#visit(WithinDirectory)
65       * @param directory not null
66       */
67      @Override
68      public void visit(final WithinDirectory directory) {
69          this.lastDirectory = directory;
70      }
71  
72      /**
73       * Collects this resource.
74       * @see Visitor#visit(Resource)
75       * @param resource not null
76       */
77      @Override
78      @SuppressWarnings("PMD.EmptyIfStmt")
79      public void visit(final Resource resource) {
80          if (this.resources.add(new ImmutablePair<WithinDirectory, Resource>(
81                  this.lastDirectory, resource))) {
82              // Fine
83          } else {
84              // Already added
85              if (this.lastDirectory == null) {
86                  // Issue with logic which will result in a null pointer later
87                  throw new IllegalArgumentException(
88                          "Expected directory to be present");
89              }
90              this.duplicates.add(new ImmutablePair<WithinDirectory, Resource>(
91                      this.lastDirectory, resource));
92          }
93      }
94  }