Committed by
Gerrit Code Review
Updating buck to build OSGi JARs
Includes:
OSGiWrapper to wrap Buck JARs
- cfgdef file support
- WAR file generation support
Adding checkstyle support
Change-Id: Ia25c41f945980e4b94ad5a8bd161328fa5f79c27
Showing
11 changed files
with
515 additions
and
0 deletions
| ... | @@ -119,6 +119,7 @@ def maven_jar( | ... | @@ -119,6 +119,7 @@ def maven_jar( |
| 119 | prebuilt_jar( | 119 | prebuilt_jar( |
| 120 | name = '%s_src' % name, | 120 | name = '%s_src' % name, |
| 121 | binary_jar = ':%s__download_src' % name, | 121 | binary_jar = ':%s__download_src' % name, |
| 122 | + maven_coords = id, | ||
| 122 | deps = license, | 123 | deps = license, |
| 123 | visibility = visibility, | 124 | visibility = visibility, |
| 124 | ) | 125 | ) |
| ... | @@ -136,6 +137,7 @@ def maven_jar( | ... | @@ -136,6 +137,7 @@ def maven_jar( |
| 136 | deps = deps + license, | 137 | deps = deps + license, |
| 137 | binary_jar = ':%s__download_bin' % name, | 138 | binary_jar = ':%s__download_bin' % name, |
| 138 | source_jar = ':%s__download_src' % name if srcjar else None, | 139 | source_jar = ':%s__download_src' % name if srcjar else None, |
| 140 | + maven_coords = id, | ||
| 139 | ) | 141 | ) |
| 140 | java_library( | 142 | java_library( |
| 141 | name = name, | 143 | name = name, |
| ... | @@ -149,6 +151,7 @@ def maven_jar( | ... | @@ -149,6 +151,7 @@ def maven_jar( |
| 149 | binary_jar = ':%s__download_bin' % name, | 151 | binary_jar = ':%s__download_bin' % name, |
| 150 | source_jar = ':%s__download_src' % name if srcjar else None, | 152 | source_jar = ':%s__download_src' % name if srcjar else None, |
| 151 | visibility = visibility, | 153 | visibility = visibility, |
| 154 | + maven_coords = id, | ||
| 152 | ) | 155 | ) |
| 153 | 156 | ||
| 154 | 157 | ... | ... |
bucklets/onos.bucklet
0 → 100644
| 1 | + | ||
| 2 | +DEBUG_ARG='JAVA_TOOL_OPTIONS="-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=y"' | ||
| 3 | + | ||
| 4 | +def osgi_jar( | ||
| 5 | + name, | ||
| 6 | + srcs, | ||
| 7 | + group_id = 'org.onosproject', | ||
| 8 | + version = '1.6.0-SNAPSHOT', | ||
| 9 | + deps = [], | ||
| 10 | + visibility = ['PUBLIC'], | ||
| 11 | + license = 'NONE', | ||
| 12 | + description = '', | ||
| 13 | + debug = False, | ||
| 14 | + web_context = 'NONE', | ||
| 15 | + **kwargs | ||
| 16 | + ): | ||
| 17 | + | ||
| 18 | + bare_jar_name = name + '-jar' | ||
| 19 | + osgi_jar_name = name + '-osgi' | ||
| 20 | + mvn_coords = group_id + ':' + name + ':' + version | ||
| 21 | + | ||
| 22 | + java_library( | ||
| 23 | + name = bare_jar_name, | ||
| 24 | + srcs = srcs, | ||
| 25 | + deps = deps, | ||
| 26 | + visibility = [], #intentially, not visible | ||
| 27 | + **kwargs | ||
| 28 | + ) | ||
| 29 | + | ||
| 30 | + cp = ':'.join(['$(classpath %s)' % c for c in deps]) | ||
| 31 | + | ||
| 32 | + args = ( '$(location :%s)' % bare_jar_name, #input jar | ||
| 33 | + '$OUT', #output jar | ||
| 34 | + cp, #classpath | ||
| 35 | + name, #bundle name | ||
| 36 | + group_id, #group id | ||
| 37 | + version, #version | ||
| 38 | + license, #license url | ||
| 39 | + web_context, #web context (REST API only) | ||
| 40 | + description, #description | ||
| 41 | + ) | ||
| 42 | + | ||
| 43 | + #TODO stage_jar is a horrendous hack | ||
| 44 | + stage_jar = 'pushd $SRCDIR; mkdir bin; cd bin; jar xf $(location :%s); ls; popd; ' % bare_jar_name | ||
| 45 | + wrap_jar = '$(exe //utils/osgiwrap:osgi-jar) ' + ' '.join(args) | ||
| 46 | + bash = stage_jar + wrap_jar | ||
| 47 | + if debug: | ||
| 48 | + bash = stage_jar + DEBUG_ARG + ' ' + wrap_jar | ||
| 49 | + print bash | ||
| 50 | + # TODO this is a hack to add checkstyle as dependency before generating jar | ||
| 51 | + bash = 'ls $(location :' + name + '-checkstyle) > /dev/null; ' + bash | ||
| 52 | + | ||
| 53 | + genrule( | ||
| 54 | + name = osgi_jar_name, | ||
| 55 | + bash = bash, | ||
| 56 | + out = name + '.jar', | ||
| 57 | + visibility = [], #intentially, not visible | ||
| 58 | + ) | ||
| 59 | + | ||
| 60 | + # TODO we really should shade the jar with maven flavor | ||
| 61 | + prebuilt_jar( | ||
| 62 | + name = name, | ||
| 63 | + maven_coords = mvn_coords, | ||
| 64 | + binary_jar = ':' + osgi_jar_name, | ||
| 65 | + visibility = visibility, | ||
| 66 | + ) | ||
| 67 | + | ||
| 68 | + | ||
| 69 | + | ||
| 70 | + ### Checkstyle | ||
| 71 | + chk_cmd = ' '.join(( 'java -jar $(location //lib:checkstyle)', | ||
| 72 | + '-o $OUT', | ||
| 73 | + '-c $(location //tools/build/conf:checkstyle-xml)', | ||
| 74 | + ' '.join(srcs) )) | ||
| 75 | + error_cmd = '(touch $OUT; cat $OUT | grep "^\[ERROR\]"; exit 1)' | ||
| 76 | + cmd = ' || '.join((chk_cmd, error_cmd)) | ||
| 77 | + genrule( | ||
| 78 | + name = name + '-checkstyle', | ||
| 79 | + bash = cmd, | ||
| 80 | + srcs = srcs, | ||
| 81 | + out = 'checkstyle.log', | ||
| 82 | + ) | ||
| 83 | + | ||
| 84 | + ### .m2 Install | ||
| 85 | + mvn_cmd = ' '.join(('mvn install:install-file', | ||
| 86 | + '-Dfile=$(location :%s)' % name, | ||
| 87 | + '-DgroupId=%s' % group_id, | ||
| 88 | + '-DartifactId=%s' % name, | ||
| 89 | + '-Dversion=%s' % version, | ||
| 90 | + '-Dpackaging=jar' | ||
| 91 | + )) | ||
| 92 | + genrule( | ||
| 93 | + name = name + '-install', | ||
| 94 | + bash = mvn_cmd + ' > $OUT', | ||
| 95 | + out = 'install.log', | ||
| 96 | + visibility = visibility, | ||
| 97 | + ) | ||
| 98 | + | ||
| 99 | +def onos_app( | ||
| 100 | + name, | ||
| 101 | + **kwargs): | ||
| 102 | + | ||
| 103 | + osgi_jar( | ||
| 104 | + name = name, | ||
| 105 | + **kwargs | ||
| 106 | + ) | ||
| 107 | + |
| ... | @@ -781,3 +781,62 @@ maven_jar( | ... | @@ -781,3 +781,62 @@ maven_jar( |
| 781 | attach_source = False, | 781 | attach_source = False, |
| 782 | license = 'Apache2.0', | 782 | license = 'Apache2.0', |
| 783 | ) | 783 | ) |
| 784 | + | ||
| 785 | +# ------ needed for OSGi Wrapper ------------------ | ||
| 786 | +#TODO should these live in osgiwrap or in lib | ||
| 787 | +#FIXME replace with release version | ||
| 788 | +maven_jar( | ||
| 789 | + name = 'org.apache.felix.scr.bnd', | ||
| 790 | + id = 'org.onosproject:org.apache.felix.scr.bnd:1.4.1-SNAPSHOT', | ||
| 791 | + repository = 'https://oss.sonatype.org/content/repositories/snapshots', | ||
| 792 | + full_url = 'https://oss.sonatype.org/content/repositories/snapshots/org/onosproject/org.apache.felix.scr.bnd/1.4.1-SNAPSHOT/org.apache.felix.scr.bnd-1.4.1-20160328.235003-2', | ||
| 793 | + attach_source = False, | ||
| 794 | + license = 'Apache2.0', | ||
| 795 | +) | ||
| 796 | +#TODO update this to org.apache.felix when changes are merged upstream | ||
| 797 | +# prebuilt_jar( | ||
| 798 | +# name = 'felix-bnd', | ||
| 799 | +# binary_jar = ':org.apache.felix.scr.bnd-jar', | ||
| 800 | +# ) | ||
| 801 | +# remote_file( | ||
| 802 | +# name = 'org.apache.felix.scr.bnd-jar', | ||
| 803 | +# out = 'org.apache.felix.scr.bnd-jar-1.4.1-SNAPSHOT.jar', | ||
| 804 | +# url = 'mvn:https://oss.sonatype.org/content/repositories/snapshots:org.onosproject:org.apache.felix.scr.bnd:jar:1.4.1-SNAPSHOT', | ||
| 805 | +# sha1 = '89b5161d60dfe4138046f13c789f17a6b89e823d', | ||
| 806 | +# ) | ||
| 807 | + | ||
| 808 | +prebuilt_jar( | ||
| 809 | + name = 'bndlib', | ||
| 810 | + binary_jar = ':biz.aQute.bnd-biz.aQute.bndlib-jar', | ||
| 811 | + visibility = [ 'PUBLIC' ] #:onlab-osgiwrap and :osgi-jar | ||
| 812 | +# source_jar | ||
| 813 | +# maven_coords | ||
| 814 | +) | ||
| 815 | + | ||
| 816 | +remote_file( | ||
| 817 | + name = 'biz.aQute.bnd-biz.aQute.bndlib-jar', | ||
| 818 | + out = 'biz.aQute.bnd-biz.aQute.bndlib-jar-3.1.0.jar', | ||
| 819 | + url = 'mvn:biz.aQute.bnd:biz.aQute.bndlib:jar:3.1.0', | ||
| 820 | + sha1 = '8e45564ca80bf089276a35f916e8702e7b798cbb', | ||
| 821 | +) | ||
| 822 | + | ||
| 823 | +prebuilt_jar( | ||
| 824 | + name = 'checkstyle', | ||
| 825 | + binary_jar = ':checkstyle-jar', | ||
| 826 | + visibility = [ 'PUBLIC' ] | ||
| 827 | +) | ||
| 828 | + | ||
| 829 | +# TODO upgrade to newer version of checkstyle | ||
| 830 | +# remote_file( | ||
| 831 | +# name = 'checkstyle-jar', | ||
| 832 | +# out = 'checkstyle-6.17-all.jar', | ||
| 833 | +# url = 'http://onlab.vicci.org/onos/third-party/checkstyle-6.17-all.jar', | ||
| 834 | +# sha1 = '11a02d7b0374f8a82fbd76361a69756faa6aefa0' | ||
| 835 | +# ) | ||
| 836 | + | ||
| 837 | +remote_file( | ||
| 838 | + name = 'checkstyle-jar', | ||
| 839 | + out = 'checkstyle-6.11.2-all.jar', | ||
| 840 | + url = 'http://onlab.vicci.org/onos/third-party/checkstyle-6.11.2-all.jar', | ||
| 841 | + sha1 = 'f504187b1743e73ffe72c2eede0ff57d45536b7d' | ||
| 842 | +) | ... | ... |
tools/build/conf/BUCK
0 → 100644
| 1 | +checkstyle_source = 'src/main/resources/onos/checkstyle.xml' | ||
| 2 | +suppression_source = 'src/main/resources/onos/suppressions.xml' | ||
| 3 | + | ||
| 4 | +xml = ('<module name="SuppressionFilter">' | ||
| 5 | + '<property name="file" value="$(location :suppressions.xml)"/>' | ||
| 6 | + '</module>' ) | ||
| 7 | +cmd = "sed 's#<module name=\"Checker\">#<module name=\"Checker\">%s#' %s > $OUT" % ( xml, checkstyle_source ) | ||
| 8 | + | ||
| 9 | +genrule( | ||
| 10 | + name = 'checkstyle-xml', | ||
| 11 | + srcs = [ checkstyle_source ], | ||
| 12 | + out = 'checkstyle.xml', | ||
| 13 | + bash = cmd, | ||
| 14 | + visibility = [ 'PUBLIC' ] | ||
| 15 | +) | ||
| 16 | + | ||
| 17 | +export_file( | ||
| 18 | + name = 'suppressions.xml', | ||
| 19 | + src = suppression_source, | ||
| 20 | +) |
utils/osgiwrap/BUCK
0 → 100644
| 1 | +SRC = 'src/main/java/org/onlab/**/' | ||
| 2 | +TEST = 'src/test/java/org/onlab/**/' | ||
| 3 | +CURRENT_NAME = 'onlab-osgiwrap' | ||
| 4 | +CURRENT_TARGET = ':' + CURRENT_NAME | ||
| 5 | + | ||
| 6 | +COMPILE_DEPS = [ | ||
| 7 | + '//lib:guava', | ||
| 8 | + '//lib:bndlib', | ||
| 9 | + '//lib:org.apache.felix.scr.bnd' | ||
| 10 | +] | ||
| 11 | + | ||
| 12 | + | ||
| 13 | +java_library( | ||
| 14 | + name = CURRENT_NAME, | ||
| 15 | + #maven_coords = 'org.onosproject:' + CURRENT_NAME + ':' + '1.2.3', | ||
| 16 | + srcs = glob([SRC + '/*.java']), | ||
| 17 | + deps = COMPILE_DEPS, | ||
| 18 | + visibility = ['PUBLIC'], | ||
| 19 | +) | ||
| 20 | + | ||
| 21 | +java_binary( | ||
| 22 | + name = 'osgi-jar', | ||
| 23 | + deps = COMPILE_DEPS + [ ':' + CURRENT_NAME ], | ||
| 24 | + main_class = 'org.onlab.OSGiWrapper', | ||
| 25 | + visibility = [ 'PUBLIC' ] | ||
| 26 | +) |
utils/osgiwrap/pom.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
| 3 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
| 4 | + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
| 5 | + <parent> | ||
| 6 | + <artifactId>onlab-utils</artifactId> | ||
| 7 | + <groupId>org.onosproject</groupId> | ||
| 8 | + <version>1.6.0-SNAPSHOT</version> | ||
| 9 | + </parent> | ||
| 10 | + <modelVersion>4.0.0</modelVersion> | ||
| 11 | + | ||
| 12 | + <artifactId>osgiwrap</artifactId> | ||
| 13 | + <version>0.9-SNAPSHOT</version> | ||
| 14 | + | ||
| 15 | + <dependencies> | ||
| 16 | + <!-- TODO update this to org.apache.felix when changes are merged upstream --> | ||
| 17 | + <dependency> | ||
| 18 | + <groupId>org.onosproject</groupId> | ||
| 19 | + <artifactId>org.apache.felix.scr.bnd</artifactId> | ||
| 20 | + <version>1.4.1-SNAPSHOT</version> | ||
| 21 | + </dependency> | ||
| 22 | + | ||
| 23 | + <dependency> | ||
| 24 | + <groupId>biz.aQute.bnd</groupId> | ||
| 25 | + <artifactId>biz.aQute.bndlib</artifactId> | ||
| 26 | + <version>3.1.0</version> | ||
| 27 | + </dependency> | ||
| 28 | + <dependency> | ||
| 29 | + <groupId>com.google.guava</groupId> | ||
| 30 | + <artifactId>guava</artifactId> | ||
| 31 | + <version>19.0</version> | ||
| 32 | + </dependency> | ||
| 33 | + </dependencies> | ||
| 34 | +</project> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | +/* | ||
| 2 | + * Copyright 2016 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +package org.onlab.osgiwrap; | ||
| 18 | + | ||
| 19 | +import aQute.bnd.osgi.Analyzer; | ||
| 20 | +import aQute.bnd.osgi.Jar; | ||
| 21 | +import com.google.common.base.Joiner; | ||
| 22 | +import com.google.common.base.MoreObjects; | ||
| 23 | +import com.google.common.collect.Lists; | ||
| 24 | +import com.google.common.collect.Maps; | ||
| 25 | +import org.apache.felix.scrplugin.bnd.SCRDescriptorBndPlugin; | ||
| 26 | + | ||
| 27 | +import java.io.File; | ||
| 28 | +import java.util.Arrays; | ||
| 29 | +import java.util.HashSet; | ||
| 30 | +import java.util.List; | ||
| 31 | +import java.util.Map; | ||
| 32 | +import java.util.Objects; | ||
| 33 | +import java.util.Set; | ||
| 34 | +import java.util.jar.Manifest; | ||
| 35 | + | ||
| 36 | +/** | ||
| 37 | + * BND-based wrapper to convert Buck JARs to OSGi-compatible JARs. | ||
| 38 | + */ | ||
| 39 | +public class OSGiWrapper { | ||
| 40 | + | ||
| 41 | + private String inputJar; | ||
| 42 | + private String outputJar; | ||
| 43 | + private List<String> classpath; | ||
| 44 | + | ||
| 45 | + private String bundleName; | ||
| 46 | + private String groupId; | ||
| 47 | + private String bundleSymbolicName; | ||
| 48 | + private String bundleVersion; | ||
| 49 | + | ||
| 50 | + private String bundleDescription; | ||
| 51 | + private String bundleLicense; | ||
| 52 | + | ||
| 53 | + private String webContext; | ||
| 54 | + | ||
| 55 | + public static void main(String[] args) { | ||
| 56 | + | ||
| 57 | + if (args.length < 7) { | ||
| 58 | + System.err.println("Not enough args"); | ||
| 59 | + System.exit(1); | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + String jar = args[0]; | ||
| 63 | + String output = args[1]; | ||
| 64 | + String cp = args[2]; | ||
| 65 | + String name = args[3]; | ||
| 66 | + String group = args[4]; | ||
| 67 | + String version = args[5]; | ||
| 68 | + String license = args[6]; | ||
| 69 | + String webContext = args[7]; | ||
| 70 | + String desc = Joiner.on(' ').join(Arrays.copyOfRange(args, 8, args.length)); | ||
| 71 | + | ||
| 72 | + OSGiWrapper wrapper = new OSGiWrapper(jar, output, cp, | ||
| 73 | + name, group, | ||
| 74 | + version, license, | ||
| 75 | + webContext, desc); | ||
| 76 | + wrapper.log(wrapper + "\n"); | ||
| 77 | + if (!wrapper.execute()) { | ||
| 78 | + System.err.println("ERROR"); | ||
| 79 | + System.exit(2); | ||
| 80 | + } | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + | ||
| 84 | + public OSGiWrapper(String inputJar, | ||
| 85 | + String outputJar, | ||
| 86 | + String classpath, | ||
| 87 | + String bundleName, | ||
| 88 | + String groupId, | ||
| 89 | + String bundleVersion, | ||
| 90 | + String bundleLicense, | ||
| 91 | + String webContext, | ||
| 92 | + String bundleDescription) { | ||
| 93 | + this.inputJar = inputJar; | ||
| 94 | + this.classpath = Lists.newArrayList(classpath.split(":")); | ||
| 95 | + if (!this.classpath.contains(inputJar)) { | ||
| 96 | + this.classpath.add(0, inputJar); | ||
| 97 | + } | ||
| 98 | + this.outputJar = outputJar; | ||
| 99 | + | ||
| 100 | + this.bundleName = bundleName; | ||
| 101 | + this.groupId = groupId; | ||
| 102 | + this.bundleSymbolicName = String.format("%s.%s", groupId, bundleName); | ||
| 103 | + | ||
| 104 | + this.bundleVersion = bundleVersion; | ||
| 105 | + this.bundleLicense = bundleLicense; | ||
| 106 | + this.bundleDescription = bundleDescription; | ||
| 107 | + | ||
| 108 | + this.webContext = webContext; | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + private void setProperties(Analyzer analyzer) { | ||
| 112 | + analyzer.setProperty(Analyzer.BUNDLE_NAME, bundleName); | ||
| 113 | + analyzer.setProperty(Analyzer.BUNDLE_SYMBOLICNAME, bundleSymbolicName); | ||
| 114 | + analyzer.setProperty(Analyzer.BUNDLE_VERSION, bundleVersion.replace('-', '.')); | ||
| 115 | + | ||
| 116 | + analyzer.setProperty(Analyzer.BUNDLE_DESCRIPTION, bundleDescription); | ||
| 117 | + analyzer.setProperty(Analyzer.BUNDLE_LICENSE, bundleLicense); | ||
| 118 | + | ||
| 119 | + //TODO consider using stricter version policy | ||
| 120 | + //analyzer.setProperty("-provider-policy", "${range;[===,==+)}"); | ||
| 121 | + //analyzer.setProperty("-consumer-policy", "${range;[===,==+)}"); | ||
| 122 | + | ||
| 123 | + // There are no good defaults so make sure you set the Import-Package | ||
| 124 | + analyzer.setProperty(Analyzer.IMPORT_PACKAGE, "*,org.glassfish.jersey.servlet"); | ||
| 125 | + | ||
| 126 | + // TODO include version in export, but not in import | ||
| 127 | + analyzer.setProperty(Analyzer.EXPORT_PACKAGE, "*"); | ||
| 128 | + | ||
| 129 | + // TODO we may need INCLUDE_RESOURCE, or that might be done by Buck | ||
| 130 | + //analyzer.setProperty(analyzer.INCLUDE_RESOURCE, ...) | ||
| 131 | + if (isWab()) { | ||
| 132 | + analyzer.setProperty(Analyzer.WAB, "src/main/webapp/"); | ||
| 133 | + analyzer.setProperty("Web-ContextPath", webContext); | ||
| 134 | + } | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + public boolean execute() { | ||
| 138 | + Analyzer analyzer = new Analyzer(); | ||
| 139 | + try { | ||
| 140 | + | ||
| 141 | + Jar jar = new Jar(new File(inputJar)); // where our data is | ||
| 142 | + analyzer.setJar(jar); // give bnd the contents | ||
| 143 | + | ||
| 144 | + // You can provide additional class path entries to allow | ||
| 145 | + // bnd to pickup export version from the packageinfo file, | ||
| 146 | + // Version annotation, or their manifests. | ||
| 147 | + analyzer.addClasspath(classpath); | ||
| 148 | + | ||
| 149 | + setProperties(analyzer); | ||
| 150 | + | ||
| 151 | +// analyzer.setProperty("DESTDIR"); | ||
| 152 | +// analyzer.setBase(); | ||
| 153 | + | ||
| 154 | + // ------------- let's begin... ------------------------- | ||
| 155 | + | ||
| 156 | + // Analyze the target JAR first | ||
| 157 | + analyzer.analyze(); | ||
| 158 | + | ||
| 159 | + // Scan the JAR for Felix SCR annotations and generate XML files | ||
| 160 | + Map<String, String> properties = Maps.newHashMap(); | ||
| 161 | + SCRDescriptorBndPlugin scrDescriptorBndPlugin = new SCRDescriptorBndPlugin(); | ||
| 162 | + scrDescriptorBndPlugin.setProperties(properties); | ||
| 163 | + scrDescriptorBndPlugin.setReporter(analyzer); | ||
| 164 | + scrDescriptorBndPlugin.analyzeJar(analyzer); | ||
| 165 | + | ||
| 166 | + // Repack the JAR as a WAR | ||
| 167 | + doWabStaging(analyzer); | ||
| 168 | + | ||
| 169 | + // Calculate the manifest | ||
| 170 | + Manifest manifest = analyzer.calcManifest(); | ||
| 171 | + //OutputStream s = new FileOutputStream("/tmp/foo2.txt"); | ||
| 172 | + //manifest.write(s); | ||
| 173 | + //s.close(); | ||
| 174 | + | ||
| 175 | + if (analyzer.isOk()) { | ||
| 176 | + analyzer.getJar().setManifest(manifest); | ||
| 177 | + analyzer.save(new File(outputJar), true); | ||
| 178 | + log("Saved!\n"); | ||
| 179 | + } else { | ||
| 180 | + warn("%s\n", analyzer.getErrors()); | ||
| 181 | + return false; | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + analyzer.close(); | ||
| 185 | + | ||
| 186 | + return true; | ||
| 187 | + } catch (Exception e) { | ||
| 188 | + e.printStackTrace(); | ||
| 189 | + return false; | ||
| 190 | + } | ||
| 191 | + } | ||
| 192 | + | ||
| 193 | + private boolean isWab() { | ||
| 194 | + return !Objects.equals(webContext, "NONE"); | ||
| 195 | + } | ||
| 196 | + | ||
| 197 | + private void doWabStaging(Analyzer analyzer) throws Exception { | ||
| 198 | + if (!isWab()) { | ||
| 199 | + return; | ||
| 200 | + } | ||
| 201 | + String wab = analyzer.getProperty(analyzer.WAB); | ||
| 202 | + Jar dot = analyzer.getJar(); | ||
| 203 | + | ||
| 204 | + log("wab %s", wab); | ||
| 205 | + analyzer.setBundleClasspath("WEB-INF/classes," + | ||
| 206 | + analyzer.getProperty(analyzer.BUNDLE_CLASSPATH)); | ||
| 207 | + | ||
| 208 | + Set<String> paths = new HashSet<String>(dot.getResources().keySet()); | ||
| 209 | + | ||
| 210 | + for (String path : paths) { | ||
| 211 | + if (path.indexOf('/') > 0 && !Character.isUpperCase(path.charAt(0))) { | ||
| 212 | + log("wab: moving: %s", path); | ||
| 213 | + dot.rename(path, "WEB-INF/classes/" + path); | ||
| 214 | + } | ||
| 215 | + } | ||
| 216 | + } | ||
| 217 | + | ||
| 218 | + private void log(String format, Object... objects) { | ||
| 219 | + //System.err.printf(format, objects); | ||
| 220 | + } | ||
| 221 | + | ||
| 222 | + private void warn(String format, Object... objects) { | ||
| 223 | + System.err.printf(format, objects); | ||
| 224 | + } | ||
| 225 | + | ||
| 226 | + @Override | ||
| 227 | + public String toString() { | ||
| 228 | + return MoreObjects.toStringHelper(this) | ||
| 229 | + .add("inputJar", inputJar) | ||
| 230 | + .add("outputJar", outputJar) | ||
| 231 | + .add("classpath", classpath) | ||
| 232 | + .add("bundleName", bundleName) | ||
| 233 | + .add("groupId", groupId) | ||
| 234 | + .add("bundleSymbolicName", bundleSymbolicName) | ||
| 235 | + .add("bundleVersion", bundleVersion) | ||
| 236 | + .add("bundleDescription", bundleDescription) | ||
| 237 | + .add("bundleLicense", bundleLicense) | ||
| 238 | + .toString(); | ||
| 239 | + | ||
| 240 | + } | ||
| 241 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * OSGi-wrapper for raw JARs. | ||
| 19 | + */ | ||
| 20 | +package org.onlab.osgiwrap; |
-
Please register or login to post a comment