View Javadoc
1   package org.argeo.osgi.a2;
2   
3   import java.io.IOException;
4   import java.nio.file.DirectoryStream;
5   import java.nio.file.Files;
6   import java.nio.file.Path;
7   import java.nio.file.Paths;
8   import java.util.SortedSet;
9   import java.util.TreeSet;
10  
11  import org.argeo.osgi.boot.OsgiBootUtils;
12  import org.osgi.framework.Version;
13  
14  /** A file system {@link AbstractProvisioningSource} in A2 format. */
15  public class FsA2Source extends AbstractProvisioningSource implements A2Source {
16  	private final Path base;
17  
18  	public FsA2Source(Path base) {
19  		super();
20  		this.base = base;
21  	}
22  
23  	void load() throws IOException {
24  		DirectoryStream<Path> contributionPaths = Files.newDirectoryStream(base);
25  		SortedSet<A2Contribution> contributions = new TreeSet<>();
26  		contributions: for (Path contributionPath : contributionPaths) {
27  			if (Files.isDirectory(contributionPath)) {
28  				String contributionId = contributionPath.getFileName().toString();
29  				if (A2Contribution.BOOT.equals(contributionId))// skip boot
30  					continue contributions;
31  				A2Contribution contribution = getOrAddContribution(contributionId);
32  				contributions.add(contribution);
33  			}
34  		}
35  
36  		for (A2Contribution contribution : contributions) {
37  			DirectoryStream<Path> modulePaths = Files.newDirectoryStream(base.resolve(contribution.getId()));
38  			modules: for (Path modulePath : modulePaths) {
39  				if (!Files.isDirectory(modulePath)) {
40  					// OsgiBootUtils.debug("Registering " + modulePath);
41  					String moduleFileName = modulePath.getFileName().toString();
42  					int lastDot = moduleFileName.lastIndexOf('.');
43  					String ext = moduleFileName.substring(lastDot + 1);
44  					if (!"jar".equals(ext))
45  						continue modules;
46  					String moduleName = moduleFileName.substring(0, lastDot);
47  					if (moduleName.endsWith("-SNAPSHOT"))
48  						moduleName = moduleName.substring(0, moduleName.length() - "-SNAPSHOT".length());
49  					int lastDash = moduleName.lastIndexOf('-');
50  					String versionStr = moduleName.substring(lastDash + 1);
51  					String componentName = moduleName.substring(0, lastDash);
52  					// if(versionStr.endsWith("-SNAPSHOT")) {
53  					// versionStr = readVersionFromModule(modulePath);
54  					// }
55  					Version version;
56  					try {
57  						version = new Version(versionStr);
58  					} catch (Exception e) {
59  						versionStr = readVersionFromModule(modulePath);
60  						if (versionStr != null) {
61  							version = new Version(versionStr);
62  						} else {
63  							OsgiBootUtils.debug("Ignore " + modulePath + " (" + e.getMessage() + ")");
64  							continue modules;
65  						}
66  					}
67  					A2Component component = contribution.getOrAddComponent(componentName);
68  					A2Module module = component.getOrAddModule(version, modulePath);
69  					if (OsgiBootUtils.isDebug())
70  						OsgiBootUtils.debug("Registered " + module);
71  				}
72  			}
73  		}
74  
75  	}
76  
77  	public static void main(String[] args) {
78  		try {
79  			FsA2Source context = new FsA2Source(Paths.get(
80  					"/home/mbaudier/dev/git/apache2/argeo-commons/dist/argeo-node/target/argeo-node-2.1.77-SNAPSHOT/share/osgi"));
81  			context.load();
82  			context.asTree();
83  		} catch (Exception e) {
84  			e.printStackTrace();
85  		}
86  	}
87  
88  }