View Javadoc
1   package org.codehaus.plexus.languages.java.jpms;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.File;
23  import java.io.IOException;
24  import java.nio.file.Path;
25  import java.util.ArrayList;
26  import java.util.LinkedHashSet;
27  import java.util.List;
28  import java.util.Set;
29  
30  import com.thoughtworks.qdox.JavaProjectBuilder;
31  import com.thoughtworks.qdox.model.JavaClass;
32  import com.thoughtworks.qdox.model.JavaModule;
33  import com.thoughtworks.qdox.model.JavaModuleDescriptor;
34  
35  /**
36   * Extract information from module with QDox
37   *
38   * @author Robert Scholte
39   * @since 1.0.0
40   */
41  class SourceModuleInfoParser {
42  
43      public org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor fromSourcePath(Path modulePath)
44              throws IOException {
45          File moduleDescriptor = modulePath.toFile();
46  
47          org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.Builder builder;
48          if (moduleDescriptor.exists()) {
49              JavaModuleDescriptor descriptor = new JavaProjectBuilder()
50                      .addSourceFolder(moduleDescriptor.getParentFile())
51                      .getDescriptor();
52  
53              builder = org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.newModule(descriptor.getName());
54  
55              for (JavaModuleDescriptor.JavaRequires requires : descriptor.getRequires()) {
56                  if (requires.isStatic() || requires.isTransitive()) {
57                      Set<org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires.JavaModifier>
58                              modifiers = new LinkedHashSet<>(2);
59                      if (requires.isStatic()) {
60                          modifiers.add(
61                                  org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires.JavaModifier
62                                          .STATIC);
63                      }
64                      if (requires.isTransitive()) {
65                          modifiers.add(
66                                  org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.JavaRequires.JavaModifier
67                                          .TRANSITIVE);
68                      }
69                      builder.requires(modifiers, requires.getModule().getName());
70                  } else {
71                      builder.requires(requires.getModule().getName());
72                  }
73              }
74  
75              for (JavaModuleDescriptor.JavaExports exports : descriptor.getExports()) {
76                  if (exports.getTargets().isEmpty()) {
77                      builder.exports(exports.getSource().getName());
78                  } else {
79                      Set<String> targets = new LinkedHashSet<>();
80                      for (JavaModule module : exports.getTargets()) {
81                          targets.add(module.getName());
82                      }
83                      builder.exports(exports.getSource().getName(), targets);
84                  }
85              }
86  
87              for (JavaModuleDescriptor.JavaUses uses : descriptor.getUses()) {
88                  builder.uses(uses.getService().getName());
89              }
90  
91              for (JavaModuleDescriptor.JavaProvides provides : descriptor.getProvides()) {
92                  List<String> providers = new ArrayList<>(provides.getProviders().size());
93                  for (JavaClass provider : provides.getProviders()) {
94                      providers.add(provider.getName());
95                  }
96  
97                  builder.provides(provides.getService().getName(), providers);
98              }
99          } else {
100             builder = org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor.newAutomaticModule(null);
101         }
102 
103         return builder.build();
104     }
105 }