diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/pom.xml b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/pom.xml
new file mode 100644
index 00000000000..adb72670cfa
--- /dev/null
+++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/pom.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+ apimgt-extensions
+ org.wso2.carbon.devicemgt
+ 5.0.21-SNAPSHOT
+ ../pom.xml
+
+
+ 4.0.0
+ io.entgra.devicemgt.apimgt.extension.publisher.api
+ bundle
+ Entgra - Device API Management Extension Publisher API
+ Entgra - Device API Management Extension Publisher API
+ https://entgra.io
+
+
+
+ org.apache.httpcomponents.wso2
+ httpcore
+
+
+ org.wso2.orbit.org.apache.httpcomponents
+ httpclient
+
+
+ org.wso2.carbon
+ org.wso2.carbon.logging
+
+
+ org.wso2.carbon
+ org.wso2.carbon.utils
+
+
+ org.eclipse.osgi
+ org.eclipse.osgi
+
+
+ org.eclipse.osgi
+ org.eclipse.osgi.services
+
+
+
+
+
+
+ org.apache.felix
+ maven-scr-plugin
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ 1.4.0
+ true
+
+
+ ${project.artifactId}
+ ${project.artifactId}
+ ${carbon.device.mgt.version}
+ Publisher API Management Bundle
+
+ io.entgra.devicemgt.apimgt.extension.publisher.api.*
+
+
+ javax.net.ssl,
+ javax.xml.bind,
+ org.apache.commons.logging,
+ org.apache.http;version="${httpclient.version.range}",
+ org.apache.http.client;version="${httpclient.version.range}",
+ org.apache.http.client.methods;version="${httpclient.version.range}",
+ org.apache.http.conn.socket,
+ org.apache.http.conn.ssl,
+ org.apache.http.entity,
+ org.apache.http.impl.client,
+ org.apache.http.util;version="${httpclient.version.range}",
+
+ org.osgi.framework.*;version="${imp.package.version.osgi.framework}",
+ org.osgi.service.*;version="${imp.package.version.osgi.service}",
+ com.sun.jndi.toolkit.ctx,
+ org.wso2.carbon.utils
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+
+ ${basedir}/target/coverage-reports/jacoco-unit.exec
+
+
+
+ jacoco-initialize
+
+ prepare-agent
+
+
+
+ jacoco-site
+ test
+
+ report
+
+
+ ${basedir}/target/coverage-reports/jacoco-unit.exec
+ ${basedir}/target/coverage-reports/site
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
\ No newline at end of file
diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIService.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIService.java
new file mode 100644
index 00000000000..2a377623630
--- /dev/null
+++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIService.java
@@ -0,0 +1,6 @@
+package io.entgra.devicemgt.apimgt.extension.publisher.api;
+
+public interface PublisherAPIService {
+
+ void registerApplication();
+}
diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIServiceImpl.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIServiceImpl.java
new file mode 100644
index 00000000000..9b33fe4ab18
--- /dev/null
+++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIServiceImpl.java
@@ -0,0 +1,72 @@
+package io.entgra.devicemgt.apimgt.extension.publisher.api;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContextBuilder;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.entity.StringEntity;
+
+import javax.xml.bind.DatatypeConverter;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+
+public class PublisherAPIServiceImpl implements PublisherAPIService {
+ private static final Log log = LogFactory.getLog(PublisherAPIServiceImpl.class);
+
+ @Override
+ public void registerApplication() {
+ try {
+ HttpClient httpclient;
+ SSLContextBuilder builder = new SSLContextBuilder();
+ builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
+ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());
+ httpclient = org.apache.http.impl.client.HttpClients.custom().setSSLSocketFactory(sslsf).useSystemProperties().build();
+
+ URL url =new URL("https://localhost:9443/client-registration/v0.17/register");
+ HttpPost request = new HttpPost(url.toString());
+
+ String payload = "{\n" +
+ " \"callbackUrl\":\"www.google.lk\",\n" +
+ " \"clientName\":\"rest_api_publisher_code\",\n" +
+ " \"owner\":\"admin\",\n" +
+ " \"grantType\":\"client_credentials password refresh_token\",\n" +
+ " \"saasApp\":true\n" +
+ " }";
+
+ StringEntity entity = new StringEntity(payload);
+ request.setEntity(entity);
+ String encoding = DatatypeConverter.printBase64Binary("admin:admin".getBytes("UTF-8"));
+
+ request.setHeader("Authorization", "Basic " + encoding);
+ request.setHeader("Content-Type", "application/json");
+
+ HttpResponse httpResponse = httpclient.execute(request);
+
+ if (httpResponse != null) {
+ BufferedReader br = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
+ String readLine;
+ String response = "";
+ while (((readLine = br.readLine()) != null)) {
+ response += readLine;
+ }
+ System.out.println(response);
+ }
+
+ System.out.println(httpResponse.getStatusLine().getStatusCode());
+
+ } catch (IOException | NoSuchAlgorithmException | KeyStoreException |
+ KeyManagementException e) {
+ log.error("failed to call http client.", e);
+ }
+
+ }
+}
diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/dto/AccessTokenInfo.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/dto/AccessTokenInfo.java
new file mode 100644
index 00000000000..5c1487451ed
--- /dev/null
+++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/dto/AccessTokenInfo.java
@@ -0,0 +1,50 @@
+package io.entgra.devicemgt.apimgt.extension.publisher.api.dto;
+
+public class AccessTokenInfo {
+
+ private String tokenType;
+ private long expiresIn;
+ private String refreshToken;
+ private String accessToken;
+ private String scope;
+
+ public String getTokenType() {
+ return tokenType;
+ }
+
+ public void setTokenType(String tokenType) {
+ this.tokenType = tokenType;
+ }
+
+ public long getExpiresIn() {
+ return expiresIn;
+ }
+
+ public void setExpiresIn(long expiresIn) {
+ this.expiresIn = expiresIn;
+ }
+
+ public String getRefreshToken() {
+ return refreshToken;
+ }
+
+ public void setRefreshToken(String refreshToken) {
+ this.refreshToken = refreshToken;
+ }
+
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ public void setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ }
+
+ public String getScope() {
+ return scope;
+ }
+
+ public void setScope(String scope) {
+ this.scope = scope;
+ }
+}
diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherAPIServiceComponent.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherAPIServiceComponent.java
new file mode 100644
index 00000000000..f7059ac20c7
--- /dev/null
+++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherAPIServiceComponent.java
@@ -0,0 +1,33 @@
+package io.entgra.devicemgt.apimgt.extension.publisher.api.internal;
+
+
+import com.sun.jndi.toolkit.ctx.ComponentContext;
+import io.entgra.devicemgt.apimgt.extension.publisher.api.PublisherAPIService;
+import io.entgra.devicemgt.apimgt.extension.publisher.api.PublisherAPIServiceImpl;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleContext;
+
+import java.io.IOException;
+
+/**
+ * @scr.component name="io.entgra.devicemgt.apimgt.extension.publisher.api.internal.PublisherAPIServiceComponent"
+ * immediate="true"
+ */
+public class PublisherAPIServiceComponent {
+
+ private static Log log = LogFactory.getLog(PublisherAPIServiceComponent.class);
+
+ protected void activate(ComponentContext componentContext) {
+ if (log.isDebugEnabled()) {
+ log.debug("Initializing publisher API extension bundle");
+ }
+
+ PublisherAPIService publisherAPIService = new PublisherAPIServiceImpl();
+
+ }
+
+ protected void deactivate(ComponentContext componentContext) {
+ //do nothing
+ }
+}
diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/util/PublisherAPIUtil.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/util/PublisherAPIUtil.java
new file mode 100644
index 00000000000..028d40f1900
--- /dev/null
+++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/util/PublisherAPIUtil.java
@@ -0,0 +1,72 @@
+package io.entgra.devicemgt.apimgt.extension.publisher.api.util;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContextBuilder;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.wso2.carbon.utils.CarbonUtils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+
+public class PublisherAPIUtil {
+
+ private static final Log log = LogFactory.getLog(PublisherAPIUtil.class);
+ private static final String HTTPS_PROTOCOL = "https";
+ private static final String TENANT_JWT_CONFIG_LOCATION = File.separator + "jwt-config" + File.separator + "jwt.properties";
+ private static final String JWT_CONFIG_FILE_NAME = "jwt.properties";
+ private static final String SUPERTENANT_JWT_CONFIG_LOCATION =
+ CarbonUtils.getEtcCarbonConfigDirPath() + File.separator + JWT_CONFIG_FILE_NAME;
+
+ /**
+ * Return a http client instance
+ *
+ * @param protocol- service endpoint protocol http/https
+ * @return
+ */
+ public static HttpClient getHttpClient(String protocol)
+ throws IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
+ HttpClient httpclient;
+ if (HTTPS_PROTOCOL.equals(protocol)) {
+ SSLContextBuilder builder = new SSLContextBuilder();
+ builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
+ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());
+ httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).useSystemProperties().build();
+ } else {
+ httpclient = HttpClients.createDefault();
+ }
+ return httpclient;
+ }
+
+ public static String getResponseString(HttpResponse httpResponse) throws IOException {
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
+ String readLine;
+ String response = "";
+ while (((readLine = br.readLine()) != null)) {
+ response += readLine;
+ }
+ return response;
+ } finally {
+ EntityUtils.consumeQuietly(httpResponse.getEntity());
+ if (br != null) {
+ try {
+ br.close();
+ } catch (IOException e) {
+ log.warn("Error while closing the connection! " + e.getMessage());
+ }
+ }
+ }
+ }
+}
diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml
index 25fa414b151..fce4b944960 100644
--- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml
+++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml
@@ -122,6 +122,10 @@
h2-database-engine
test
+
+ org.wso2.carbon.devicemgt
+ io.entgra.devicemgt.apimgt.extension.publisher.api
+
@@ -165,6 +169,7 @@
org.scannotation;version="1.0",
org.scannotation.archiveiterator;version="1.0",
org.w3c.dom,
+ io.entgra.devicemgt.apimgt.extension.publisher.api,
org.wso2.carbon.apimgt.annotations.api,
org.wso2.carbon.apimgt.api,
org.wso2.carbon.apimgt.api.model,
diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherStartupHandler.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherStartupHandler.java
index 949f16c3e9e..e491d35d6ec 100644
--- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherStartupHandler.java
+++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherStartupHandler.java
@@ -19,6 +19,7 @@
package org.wso2.carbon.apimgt.webapp.publisher;
+import io.entgra.devicemgt.apimgt.extension.publisher.api.ScopeServices;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.apimgt.webapp.publisher.exception.APIManagerPublisherException;
@@ -37,6 +38,7 @@ public class APIPublisherStartupHandler implements ServerStartupObserver {
private static Stack currentAPIsStack;
private APIPublisherService publisher;
+ private ScopeServices scopeServices;
@Override
public void completingServerStartup() {
@@ -55,6 +57,12 @@ public class APIPublisherStartupHandler implements ServerStartupObserver {
log.debug("Total number of unpublished APIs: "
+ APIPublisherDataHolder.getInstance().getUnpublishedApis().size());
}
+
+ try {
+ scopeServices.registerApplication();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
publisher = APIPublisherDataHolder.getInstance().getApiPublisherService();
int retryCount = 0;
while (retryCount < MAX_RETRY_COUNT && (!failedAPIsStack.isEmpty() || !currentAPIsStack.isEmpty())) {
diff --git a/components/apimgt-extensions/pom.xml b/components/apimgt-extensions/pom.xml
index c877688505d..968c5bb3d1f 100644
--- a/components/apimgt-extensions/pom.xml
+++ b/components/apimgt-extensions/pom.xml
@@ -25,6 +25,24 @@
5.0.26-SNAPSHOT
../../pom.xml
+
+
+ org.apache.httpcomponents.wso2
+ httpcore
+
+
+ org.wso2.orbit.org.apache.httpcomponents
+ httpclient
+
+
+ org.wso2.carbon
+ org.wso2.carbon.logging
+
+
+ org.wso2.carbon
+ org.wso2.carbon.utils
+
+
4.0.0
apimgt-extensions
@@ -40,6 +58,7 @@
org.wso2.carbon.apimgt.keymgt.extension
org.wso2.carbon.apimgt.keymgt.extension.api
io.entgra.device.mgt.core.apimgt.analytics.extension
+ io.entgra.devicemgt.apimgt.extension.publisher.api
diff --git a/pom.xml b/pom.xml
index b61ce5221b3..b5435d623d5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -238,6 +238,11 @@
org.wso2.carbon.apimgt.annotations
${carbon.device.mgt.version}
+
+ org.wso2.carbon.devicemgt
+ io.entgra.devicemgt.apimgt.extension.publisher.api
+ ${carbon.device.mgt.version}
+
org.wso2.carbon.devicemgt
org.wso2.carbon.device.mgt.oauth.extensions