1 package org.apache.maven.index;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import javax.inject.Inject;
23 import javax.inject.Named;
24 import javax.inject.Singleton;
25 import java.io.File;
26 import java.util.Arrays;
27 import java.util.Comparator;
28 import java.util.Set;
29 import java.util.TreeSet;
30
31 import org.apache.maven.index.context.IndexingContext;
32
33
34
35
36
37
38
39 @Singleton
40 @Named
41 public class DefaultScanner
42 implements Scanner
43 {
44
45 private final ArtifactContextProducer artifactContextProducer;
46
47
48 @Inject
49 public DefaultScanner( ArtifactContextProducer artifactContextProducer )
50 {
51 this.artifactContextProducer = artifactContextProducer;
52 }
53
54 public ScanningResult scan( ScanningRequest request )
55 {
56 request.getArtifactScanningListener().scanningStarted( request.getIndexingContext() );
57
58 ScanningResult result = new ScanningResult( request );
59
60 scanDirectory( request.getStartingDirectory(), request );
61
62 request.getArtifactScanningListener().scanningFinished( request.getIndexingContext(), result );
63
64 return result;
65 }
66
67 private void scanDirectory( File dir, ScanningRequest request )
68 {
69 if ( dir == null )
70 {
71 return;
72 }
73
74 File[] fileArray = dir.listFiles();
75
76 if ( fileArray != null )
77 {
78 Set<File> files = new TreeSet<>( new ScannerFileComparator() );
79
80 files.addAll( Arrays.asList( fileArray ) );
81
82 for ( File f : files )
83 {
84 if ( f.getName().startsWith( "." ) )
85 {
86 continue;
87 }
88
89 if ( f.isDirectory() )
90 {
91 scanDirectory( f, request );
92 }
93
94
95
96
97 else
98 {
99 processFile( f, request );
100 }
101 }
102 }
103 }
104
105 private void processFile( File file, ScanningRequest request )
106 {
107 IndexingContext context = request.getIndexingContext();
108
109 ArtifactContext ac = artifactContextProducer.getArtifactContext( context, file );
110
111 if ( ac != null )
112 {
113 request.getArtifactScanningListener().artifactDiscovered( ac );
114 }
115 }
116
117
118
119
120
121
122
123
124
125
126 private static class ScannerFileComparator
127 implements Comparator<File>
128 {
129 public int compare( File o1, File o2 )
130 {
131 if ( o1.getName().endsWith( ".pom" ) && !o2.getName().endsWith( ".pom" ) )
132 {
133
134 return 1;
135 }
136 else if ( !o1.getName().endsWith( ".pom" ) && o2.getName().endsWith( ".pom" ) )
137 {
138
139 return -1;
140 }
141 else
142 {
143
144
145
146 return o2.getName().compareTo( o1.getName() );
147
148 }
149 }
150 }
151 }