Add OSGi exports to jclouds-gson (#38)

* Add OSGi exports to jclouds-gson

* Proper generation of OSGi directives in the manifest file

* Fixes

* Remove commented bits
diff --git a/gson/gson-bundle/pom.xml b/gson/gson-bundle/pom.xml
new file mode 100644
index 0000000..6fc7b77
--- /dev/null
+++ b/gson/gson-bundle/pom.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>jclouds-project</artifactId>
+    <groupId>org.apache.jclouds</groupId>
+    <version>2.2.0-SNAPSHOT</version>
+    <relativePath>../../project/pom.xml</relativePath>
+  </parent>
+
+  <artifactId>jclouds-gson</artifactId>
+  <name>jclouds-gson OSGi bundle</name>
+  <description>jclouds-gson OSGi bundle with gson internal packages relocated</description>
+  <packaging>bundle</packaging>
+
+  <properties>
+    <jclouds.osgi.export>
+      org.jclouds.json.gson.internal*;version=${project.version};-noimport:=true,
+      !com.google.gson.internal*,
+      com.google.gson*;version=${project.version};-noimport:=true,
+    </jclouds.osgi.export>
+    <jclouds.osgi.import>*</jclouds.osgi.import>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.jclouds</groupId>
+      <artifactId>jclouds-gson-shaded</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/gson/gson-shaded/pom.xml b/gson/gson-shaded/pom.xml
new file mode 100644
index 0000000..47ebd21
--- /dev/null
+++ b/gson/gson-shaded/pom.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>jclouds-project</artifactId>
+    <groupId>org.apache.jclouds</groupId>
+    <version>2.2.0-SNAPSHOT</version>
+    <relativePath>../../project/pom.xml</relativePath>
+  </parent>
+
+  <!-- 
+    JCLOUDS-1166: This project relocates the 'com.google.gson.internal' package
+    so we can keep using its contents in OSGi environments.
+    This is a temporal solution and we should try to remove the usages of the classes in
+    there and remove this once that is done.
+  -->
+  <artifactId>jclouds-gson-shaded</artifactId>
+  <name>jclouds-gson shaded library</name>
+  <description>jclouds-gson library with gson internal packages relocated</description>
+  <packaging>jar</packaging>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.5</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.2</version>
+        <executions>
+          <execution>
+            <id>shade</id>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <artifactSet>
+            <includes>
+              <include>com.google.code.gson:gson</include>
+            </includes>
+          </artifactSet>
+          <relocations>
+            <relocation>
+              <pattern>com.google.gson.internal</pattern>
+              <shadedPattern>org.jclouds.json.gson.internal</shadedPattern>
+            </relocation>
+          </relocations>
+          <transformers>
+            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
+          </transformers>
+          <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/gson/pom.xml b/gson/pom.xml
index 949fb15..51ba975 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -26,56 +26,21 @@
     <relativePath>../project/pom.xml</relativePath>
   </parent>
 
-  <!-- 
-    JCLOUDS-1166: This project relocates the 'com.google.gson.internal' package
-    so we can keep using its contents in OSGi environments.
-    This is a temporal solution and we should try to remove the usages of the classes in
-    there and remove this once that is done.
+  <artifactId>jclouds-gson-modules</artifactId>
+  <name>jclouds gson modules</name>
+  <packaging>pom</packaging>
+
+  <!--
+    The maven-bundle-plugin computes the manifest based on the classes that actually exist in
+    the classpath, but the maven-shade-plugin, runs after the bundle plugin. This results in the generated
+    manifest file not having the exports for the packages that have been relocated.
+    There are several threads on stackoverflow and others trying to make both plugins work together nicely but
+    none of the combinations work in our use case.
+    To overcome this, we generate both separately; first the shaded jar, then the bundle based on that jar. 
   -->
-  <artifactId>jclouds-gson</artifactId>
-  <name>jclouds gson copy without internal packages</name>
-  <packaging>bundle</packaging>
+  <modules>
+    <module>gson-shaded</module>
+    <module>gson-bundle</module>
+  </modules>
 
-  <dependencies>
-    <dependency>
-      <groupId>com.google.code.gson</groupId>
-      <artifactId>gson</artifactId>
-      <version>2.5</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-shade-plugin</artifactId>
-        <version>2.2</version>
-        <executions>
-          <execution>
-            <id>shade</id>
-            <phase>package</phase>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <artifactSet>
-            <includes>
-              <include>com.google.code.gson:gson</include>
-            </includes>
-          </artifactSet>
-          <relocations>
-            <relocation>
-              <pattern>com.google.gson.internal</pattern>
-              <shadedPattern>org.jclouds.json.gson.internal</shadedPattern>
-            </relocation>
-          </relocations>
-          <transformers>
-            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
-          </transformers>
-          <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
 </project>
diff --git a/project/pom.xml b/project/pom.xml
index 525cdac..f773132 100644
--- a/project/pom.xml
+++ b/project/pom.xml
@@ -270,8 +270,8 @@
             gson dependency as well. 
           -->
           <exclusion>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-gson-shaded</artifactId>
           </exclusion>
         </exclusions>
       </dependency>