From c45895685bb66a253c40dc99f351ddeea3c099de Mon Sep 17 00:00:00 2001 From: ayyoob Date: Tue, 29 Mar 2016 11:40:58 +0530 Subject: [PATCH 1/8] Added device type multi tenancy capability. --- .../mgt/common/DeviceTypeIdentifier.java | 69 ++++ .../common/spi/DeviceManagementService.java | 13 + .../DeviceManagementPluginRepository.java | 57 +++- .../device/mgt/core/dao/DeviceTypeDAO.java | 58 +++- .../mgt/core/dao/impl/DeviceTypeDAOImpl.java | 312 ++++++++++-------- .../DeviceManagementProviderServiceImpl.java | 56 ++-- .../mgt/core/util/DeviceManagerUtil.java | 59 +++- .../core/DeviceManagementRepositoryTests.java | 68 ++-- .../mgt/core/TestDeviceManagementService.java | 12 +- ...licationManagementProviderServiceTest.java | 2 +- .../mgt/core/common/TestDataHolder.java | 1 + .../mgt/core/dao/DevicePersistTests.java | 2 +- .../src/test/resources/sql/h2.sql | 6 +- .../core/mgt/impl/MonitoringManagerImpl.java | 4 +- .../mgt/core/mgt/impl/ProfileManagerImpl.java | 7 +- .../policy/mgt/core/PolicyDAOTestCase.java | 2 +- .../src/test/resources/sql/CreateH2TestDB.sql | 4 +- .../test/resources/sql/CreateMySqlTestDB.sql | 2 + .../src/main/resources/dbscripts/cdm/h2.sql | 6 +- .../main/resources/dbscripts/cdm/mssql.sql | 8 +- .../main/resources/dbscripts/cdm/mysql.sql | 2 + .../main/resources/dbscripts/cdm/oracle.sql | 2 + .../resources/dbscripts/cdm/postgresql.sql | 4 +- 23 files changed, 518 insertions(+), 238 deletions(-) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceTypeIdentifier.java diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceTypeIdentifier.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceTypeIdentifier.java new file mode 100644 index 00000000000..1eb5e28e46f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceTypeIdentifier.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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. + */ +package org.wso2.carbon.device.mgt.common; + +import java.io.Serializable; + +/** + * This class holds the information of the device type and its provider tenant. + */ +public class DeviceTypeIdentifier implements Serializable { + + private String deviceType; + private int tenantId; + private static final int DEFAULT_SHARE_WITH_ALL_TENANTS_ID = -1; + + public DeviceTypeIdentifier(String deviceType, int tenantId) { + this.deviceType = deviceType; + this.tenantId = tenantId; + } + + public DeviceTypeIdentifier(String deviceType) { + this.deviceType = deviceType; + this.tenantId = DEFAULT_SHARE_WITH_ALL_TENANTS_ID; + } + + public void setTenantId(int tenantId) { + this.tenantId = tenantId; + } + + public String getDeviceType() { + return this.deviceType; + } + + public int getTenantId() { + return this.tenantId; + } + + @Override + public int hashCode() { + int result = this.deviceType.hashCode(); + result = 31 * result + ("@" + this.tenantId).hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + return (obj instanceof DeviceTypeIdentifier) && deviceType.equals( + ((DeviceTypeIdentifier) obj).deviceType) && tenantId == ((DeviceTypeIdentifier) obj).tenantId; + } + + public boolean isSharedWithAllTenant() { + return tenantId == DEFAULT_SHARE_WITH_ALL_TENANTS_ID; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/DeviceManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/DeviceManagementService.java index bf2e44f3d83..143fd1e8dba 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/DeviceManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/DeviceManagementService.java @@ -39,6 +39,19 @@ public interface DeviceManagementService extends ApplicationManager { */ String getType(); + /** + * This returns the tenant domain of the provider. + * @return + */ + String getProviderTenantDomain(); + + /** + * returns true if the device type is shared between all tenants and false if its not. + * + * @return + */ + boolean isSharedWithAllTenants(); + void init() throws DeviceManagementException; DeviceManager getDeviceManager(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementPluginRepository.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementPluginRepository.java index afeee53c8a5..594d1be5e75 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementPluginRepository.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementPluginRepository.java @@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.core; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.DeviceTypeIdentifier; import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementServiceComponent; @@ -32,23 +33,29 @@ import java.util.Map; public class DeviceManagementPluginRepository implements DeviceManagerStartupListener { - private Map providers; + private Map providers; private boolean isInited; private static final Log log = LogFactory.getLog(DeviceManagementPluginRepository.class); public DeviceManagementPluginRepository() { - providers = Collections.synchronizedMap(new HashMap()); + providers = Collections.synchronizedMap(new HashMap()); DeviceManagementServiceComponent.registerStartupListener(this); } public void addDeviceManagementProvider(DeviceManagementService provider) throws DeviceManagementException { - String deviceType = provider.getType(); + String deviceType = provider.getType(); + String tenantDomain = provider.getProviderTenantDomain(); + boolean isSharedWithAllTenants = provider.isSharedWithAllTenants(); + int tenantId = DeviceManagerUtil.getTenantId(tenantDomain); + if (tenantId == -1) { + throw new DeviceManagementException("No tenant available for tenant domain " + tenantDomain); + } synchronized (providers) { try { if (isInited) { /* Initializing Device Management Service Provider */ provider.init(); - DeviceManagerUtil.registerDeviceType(deviceType); + DeviceManagerUtil.registerDeviceType(deviceType, tenantId, isSharedWithAllTenants); DeviceManagementDataHolder.getInstance().setRequireDeviceAuthorization(deviceType, provider.getDeviceManager().requireDeviceAuthorization()); @@ -57,20 +64,47 @@ public class DeviceManagementPluginRepository implements DeviceManagerStartupLis throw new DeviceManagementException("Error occurred while adding device management provider '" + deviceType + "'", e); } - providers.put(deviceType, provider); + if (isSharedWithAllTenants) { + DeviceTypeIdentifier deviceTypeIdentifier = new DeviceTypeIdentifier(deviceType); + providers.put(deviceTypeIdentifier, provider); + } else { + DeviceTypeIdentifier deviceTypeIdentifier = new DeviceTypeIdentifier(deviceType, tenantId); + providers.put(deviceTypeIdentifier, provider); + } } } public void removeDeviceManagementProvider(DeviceManagementService provider) throws DeviceManagementException { - providers.remove(provider.getType()); + String deviceTypeName=provider.getType(); + if(provider.isSharedWithAllTenants()){ + DeviceTypeIdentifier deviceTypeIdentifier =new DeviceTypeIdentifier(deviceTypeName); + providers.remove(deviceTypeIdentifier); + }else{ + int providerTenantId=DeviceManagerUtil.getTenantId(provider.getProviderTenantDomain()); + DeviceTypeIdentifier deviceTypeIdentifier =new DeviceTypeIdentifier(deviceTypeName, providerTenantId); + providers.remove(deviceTypeIdentifier); + } } - public DeviceManagementService getDeviceManagementService(String type) { - return providers.get(type); + public DeviceManagementService getDeviceManagementService(String type, int tenantId) { + //Priority need to be given to the tenant before public. + DeviceTypeIdentifier deviceTypeIdentifier = new DeviceTypeIdentifier(type, tenantId); + DeviceManagementService provider = providers.get(deviceTypeIdentifier); + if (provider == null) { + deviceTypeIdentifier = new DeviceTypeIdentifier(type); + provider = providers.get(deviceTypeIdentifier); + } + return provider; } - public Map getAllDeviceManagementServices() { - return providers; + public Map getAllDeviceManagementServices(int tenantId) { + Map tenantProviders = new HashMap<>(); + for (DeviceTypeIdentifier identifier : providers.keySet()) { + if (identifier.getTenantId() == tenantId || identifier.isSharedWithAllTenant()) { + tenantProviders.put(identifier, providers.get(identifier)); + } + } + return tenantProviders; } @Override @@ -79,7 +113,8 @@ public class DeviceManagementPluginRepository implements DeviceManagerStartupLis for (DeviceManagementService provider : providers.values()) { try { provider.init(); - DeviceManagerUtil.registerDeviceType(provider.getType()); + int tenantId=DeviceManagerUtil.getTenantId(provider.getProviderTenantDomain()); + DeviceManagerUtil.registerDeviceType(provider.getType(), tenantId, provider.isSharedWithAllTenants()); //TODO: //This is a temporory fix. //windows and IOS cannot resolve user info by extracting certs diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceTypeDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceTypeDAO.java index d7217c90d13..53827abd6ec 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceTypeDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceTypeDAO.java @@ -27,18 +27,64 @@ import java.util.List; */ public interface DeviceTypeDAO { - void addDeviceType(DeviceType deviceType) throws DeviceManagementDAOException; + /** + * @param deviceType device that needs to be added + * @param providerTenantId provider tenant id whom the device type is associated with. + * @param isSharedWithAllTenants is this a shared device type or not. + * @throws DeviceManagementDAOException + */ + void addDeviceType(DeviceType deviceType, int providerTenantId, boolean isSharedWithAllTenants) + throws DeviceManagementDAOException; - void updateDeviceType(DeviceType deviceType) throws DeviceManagementDAOException; + /** + * @param deviceType deviceType that needs to be updated. + * @param providerTenantId provider tenant id whom the device type is associated with. + * @throws DeviceManagementDAOException + */ + void updateDeviceType(DeviceType deviceType, int providerTenantId) throws DeviceManagementDAOException; - List getDeviceTypes() throws DeviceManagementDAOException; + /** + * @param tenantId get device type detail of a specific tenant. + * @return list of all device types that are associated with the tenant this includes the shared device types. + * @throws DeviceManagementDAOException + */ + List getDeviceTypes(int tenantId) throws DeviceManagementDAOException; - List getDeviceTypes(int tenantId) throws DeviceManagementDAOException; + /** + * @param tenandId of the device type provider. + * @return return only the device types that are associated with the provider tenant. + * @throws DeviceManagementDAOException + */ + List getDeviceTypesByProvider(int tenandId) throws DeviceManagementDAOException; + /** + * @return sharedWithAllDeviceTypes This returns public shared device types. + * @throws DeviceManagementDAOException + */ + List getSharedDeviceTypes() throws DeviceManagementDAOException; + + /** + * @param id retrieve the device type with its id. + * @return the device type associated with the id. + * @throws DeviceManagementDAOException + */ DeviceType getDeviceType(int id) throws DeviceManagementDAOException; - DeviceType getDeviceType(String name) throws DeviceManagementDAOException; + /** + * @param name retreive the device type with it name. + * @param tenantId retreive the device type with its tenant id. + * @return the device type associated with its name and tenant id. + * @throws DeviceManagementDAOException + */ + DeviceType getDeviceType(String name, int tenantId) throws DeviceManagementDAOException; - void removeDeviceType(String type) throws DeviceManagementDAOException; + /** + * remove the device type from tenant. + * + * @param name remove the device type with it name. + * @param tenantId remove the device type with its tenant id. + * @throws DeviceManagementDAOException + */ + void removeDeviceType(String name, int tenantId) throws DeviceManagementDAOException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/DeviceTypeDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/DeviceTypeDAOImpl.java index 0014e56f6f1..bccddcee408 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/DeviceTypeDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/DeviceTypeDAOImpl.java @@ -32,143 +32,179 @@ import java.util.List; public class DeviceTypeDAOImpl implements DeviceTypeDAO { - @Override - public void addDeviceType(DeviceType deviceType) throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - try { - conn = this.getConnection(); - stmt = conn.prepareStatement("INSERT INTO DM_DEVICE_TYPE (NAME) VALUES (?)"); - stmt.setString(1, deviceType.getName()); - stmt.execute(); - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while registering the device type " + - "'" + deviceType.getName() + "'", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, null); - } - } - - @Override - public void updateDeviceType(DeviceType deviceType) throws DeviceManagementDAOException { - - } - - @Override - public List getDeviceTypes() throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - List deviceTypes = new ArrayList<>(); - try { - conn = this.getConnection(); - String sql = "SELECT ID AS DEVICE_TYPE_ID, NAME AS DEVICE_TYPE FROM DM_DEVICE_TYPE"; - stmt = conn.prepareStatement(sql); - rs = stmt.executeQuery(); - - while (rs.next()) { - DeviceType deviceType = new DeviceType(); - deviceType.setId(rs.getInt("DEVICE_TYPE_ID")); - deviceType.setName(rs.getString("DEVICE_TYPE")); - deviceTypes.add(deviceType); - } - return deviceTypes; - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while fetching the registered device types", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); - } - } - - @Override - public List getDeviceTypes(int tenantId) throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - List deviceTypes = new ArrayList<>(); - try { - conn = this.getConnection(); - String sql = - "SELECT ID AS DEVICE_TYPE_ID, NAME AS DEVICE_TYPE FROM DM_DEVICE_TYPE where PROVIDER_TENANT_ID =" + - "? OR SHARED_WITH_ALL_TENANTS = TRUE"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, tenantId); - rs = stmt.executeQuery(); - - while (rs.next()) { - DeviceType deviceType = new DeviceType(); - deviceType.setId(rs.getInt("DEVICE_TYPE_ID")); - deviceType.setName(rs.getString("DEVICE_TYPE")); - deviceTypes.add(deviceType); - } - return deviceTypes; - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while fetching the registered device types", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); - } - } - - @Override - public DeviceType getDeviceType(int id) throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - try { - conn = this.getConnection(); - String sql = "SELECT ID AS DEVICE_TYPE_ID, NAME AS DEVICE_TYPE FROM DM_DEVICE_TYPE WHERE ID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, id); - - rs = stmt.executeQuery(); - DeviceType deviceType = null; - while (rs.next()) { - deviceType = new DeviceType(); - deviceType.setId(rs.getInt("DEVICE_TYPE_ID")); - deviceType.setName(rs.getString("DEVICE_TYPE")); - } - return deviceType; - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while fetching the registered device type", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); - } - } - - @Override - public DeviceType getDeviceType(String type) throws DeviceManagementDAOException { - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - DeviceType deviceType = null; - try { - conn = this.getConnection(); - String sql = "SELECT ID From DM_DEVICE_TYPE WHERE NAME = ?"; - stmt = conn.prepareStatement(sql); - stmt.setString(1, type); - rs = stmt.executeQuery(); - - if (rs.next()) { - deviceType = new DeviceType(); - deviceType.setId(rs.getInt("ID")); - deviceType.setName(type); - } - return deviceType; - } catch (SQLException e) { - throw new DeviceManagementDAOException("Error occurred while fetch device type id for device type " + - "'" + type + "'", e); - } finally { - DeviceManagementDAOUtil.cleanupResources(stmt, rs); - } - } - - @Override - public void removeDeviceType(String type) throws DeviceManagementDAOException { - - } - - private Connection getConnection() throws SQLException { - return DeviceManagementDAOFactory.getConnection(); - } + @Override + public void addDeviceType(DeviceType deviceType, int providerTenantId, boolean isSharedWithAllTenants) + throws DeviceManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + try { + conn = this.getConnection(); + stmt = conn.prepareStatement( + "INSERT INTO DM_DEVICE_TYPE (NAME,PROVIDER_TENANT_ID,SHARED_WITH_ALL_TENANTS) VALUES (?,?,?)"); + stmt.setString(1, deviceType.getName()); + stmt.setInt(2, providerTenantId); + stmt.setBoolean(3, isSharedWithAllTenants); + stmt.execute(); + } catch (SQLException e) { + throw new DeviceManagementDAOException( + "Error occurred while registering the device type '" + deviceType.getName() + "'", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, null); + } + } + + @Override + public void updateDeviceType(DeviceType deviceType, int tenantId) + throws DeviceManagementDAOException { + } + + @Override + public List getDeviceTypes(int tenantId) throws DeviceManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + List deviceTypes = new ArrayList<>(); + try { + conn = this.getConnection(); + String sql = + "SELECT ID AS DEVICE_TYPE_ID, NAME AS DEVICE_TYPE FROM DM_DEVICE_TYPE where PROVIDER_TENANT_ID =" + + "? OR SHARED_WITH_ALL_TENANTS = TRUE"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, tenantId); + rs = stmt.executeQuery(); + + while (rs.next()) { + DeviceType deviceType = new DeviceType(); + deviceType.setId(rs.getInt("DEVICE_TYPE_ID")); + deviceType.setName(rs.getString("DEVICE_TYPE")); + deviceTypes.add(deviceType); + } + return deviceTypes; + } catch (SQLException e) { + throw new DeviceManagementDAOException("Error occurred while fetching the registered device types", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, rs); + } + } + + @Override + public List getDeviceTypesByProvider(int tenantId) throws DeviceManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + List deviceTypes = new ArrayList<>(); + try { + conn = this.getConnection(); + String sql = + "SELECT ID AS DEVICE_TYPE_ID, NAME AS DEVICE_TYPE FROM DM_DEVICE_TYPE where PROVIDER_TENANT_ID =?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, tenantId); + rs = stmt.executeQuery(); + + while (rs.next()) { + DeviceType deviceType = new DeviceType(); + deviceType.setId(rs.getInt("DEVICE_TYPE_ID")); + deviceType.setName(rs.getString("DEVICE_TYPE")); + deviceTypes.add(deviceType); + } + return deviceTypes; + } catch (SQLException e) { + throw new DeviceManagementDAOException("Error occurred while fetching the registered device types", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, rs); + } + } + + @Override + public List getSharedDeviceTypes() throws DeviceManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + List deviceTypes = new ArrayList<>(); + try { + conn = this.getConnection(); + String sql = + "SELECT ID AS DEVICE_TYPE_ID, NAME AS DEVICE_TYPE FROM DM_DEVICE_TYPE where " + + "SHARED_WITH_ALL_TENANTS = TRUE"; + stmt = conn.prepareStatement(sql); + rs = stmt.executeQuery(); + + while (rs.next()) { + DeviceType deviceType = new DeviceType(); + deviceType.setId(rs.getInt("DEVICE_TYPE_ID")); + deviceType.setName(rs.getString("DEVICE_TYPE")); + deviceTypes.add(deviceType); + } + return deviceTypes; + } catch (SQLException e) { + throw new DeviceManagementDAOException("Error occurred while fetching the registered device types", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, rs); + } + } + + @Override + public DeviceType getDeviceType(int id) throws DeviceManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + try { + conn = this.getConnection(); + String sql = "SELECT ID AS DEVICE_TYPE_ID, NAME AS DEVICE_TYPE FROM DM_DEVICE_TYPE WHERE ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, id); + rs = stmt.executeQuery(); + DeviceType deviceType = null; + while (rs.next()) { + deviceType = new DeviceType(); + deviceType.setId(rs.getInt("DEVICE_TYPE_ID")); + deviceType.setName(rs.getString("DEVICE_TYPE")); + } + return deviceType; + } catch (SQLException e) { + throw new DeviceManagementDAOException( + "Error occurred while fetching the registered device type", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, rs); + } + } + + @Override + public DeviceType getDeviceType(String type, int tenantId) throws + DeviceManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + DeviceType deviceType = null; + try { + conn = this.getConnection(); + String sql = "SELECT ID AS DEVICE_TYPE_ID FROM DM_DEVICE_TYPE WHERE (PROVIDER_TENANT_ID =? OR " + + "SHARED_WITH_ALL_TENANTS = TRUE) AND NAME =?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, tenantId); + stmt.setString(2, type); + rs = stmt.executeQuery(); + if (rs.next()) { + deviceType = new DeviceType(); + deviceType.setId(rs.getInt("DEVICE_TYPE_ID")); + deviceType.setName(type); + } + return deviceType; + } catch (SQLException e) { + throw new DeviceManagementDAOException( + "Error occurred while fetch device type id for device type '" + type + "'", e); + } finally { + DeviceManagementDAOUtil.cleanupResources(stmt, rs); + } + } + + @Override + public void removeDeviceType(String type, int tenantId) throws DeviceManagementDAOException { + + } + + private Connection getConnection() throws SQLException { + return DeviceManagementDAOFactory.getConnection(); + } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index f70eb5dca5f..0e4e490fa66 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -67,7 +67,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv @Override public boolean saveConfiguration(TenantConfiguration configuration) throws DeviceManagementException { DeviceManager dms = - this.getPluginRepository().getDeviceManagementService(configuration.getType()).getDeviceManager(); + this.getPluginRepository().getDeviceManagementService(configuration.getType(), this.getTenantId()).getDeviceManager(); return dms.saveConfiguration(configuration); } @@ -79,7 +79,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv @Override public TenantConfiguration getConfiguration(String deviceType) throws DeviceManagementException { DeviceManager dms = - this.getPluginRepository().getDeviceManagementService(deviceType).getDeviceManager(); + this.getPluginRepository().getDeviceManagementService(deviceType, this.getTenantId()).getDeviceManager(); if (dms == null) { if (log.isDebugEnabled()) { log.debug("Device type '" + deviceType + "' does not have an associated device management " + @@ -185,7 +185,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv int enrolmentId = 0; try { DeviceManagementDAOFactory.beginTransaction(); - DeviceType type = deviceTypeDAO.getDeviceType(device.getType()); + DeviceType type = deviceTypeDAO.getDeviceType(device.getType(), tenantId); int deviceId = deviceDAO.addDevice(type.getId(), device, tenantId); enrolmentId = enrollmentDAO.addEnrollment(deviceId, device.getEnrolmentInfo(), tenantId); DeviceManagementDAOFactory.commitTransaction(); @@ -226,7 +226,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv try { int tenantId = this.getTenantId(); DeviceManagementDAOFactory.beginTransaction(); - DeviceType type = deviceTypeDAO.getDeviceType(device.getType()); + DeviceType type = deviceTypeDAO.getDeviceType(device.getType(), tenantId); deviceDAO.updateDevice(type.getId(), device, tenantId); enrollmentDAO.updateEnrollment(device.getEnrolmentInfo()); DeviceManagementDAOFactory.commitTransaction(); @@ -287,7 +287,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } return false; } - DeviceType deviceType = deviceTypeDAO.getDeviceType(device.getType()); + DeviceType deviceType = deviceTypeDAO.getDeviceType(device.getType(), tenantId); device.getEnrolmentInfo().setDateOfLastUpdate(new Date().getTime()); device.getEnrolmentInfo().setStatus(EnrolmentInfo.Status.REMOVED); @@ -621,22 +621,40 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv @Override public List getAvailableDeviceTypes() throws DeviceManagementException { - List deviceTypesInDatabase; + List deviceTypesProvidedByTenant; + List publicSharedDeviceTypesInDB; List deviceTypesResponse = new ArrayList<>(); try { DeviceManagementDAOFactory.openConnection(); - deviceTypesInDatabase = deviceDAO.getDeviceTypes(); - Map registeredTypes = pluginRepository.getAllDeviceManagementServices(); - DeviceType deviceType; - if (registeredTypes != null && deviceTypesInDatabase != null) { - for (DeviceType aDeviceTypesInDatabase : deviceTypesInDatabase) { - if (registeredTypes.get(aDeviceTypesInDatabase.getName()) != null) { - deviceType = new DeviceType(); - deviceType.setId(aDeviceTypesInDatabase.getId()); - deviceType.setName(aDeviceTypesInDatabase.getName()); - deviceTypesResponse.add(deviceType); + int tenantId = this.getTenantId(); + deviceTypesProvidedByTenant = deviceTypeDAO.getDeviceTypesByProvider(tenantId); + publicSharedDeviceTypesInDB = deviceTypeDAO.getSharedDeviceTypes(); + Map registeredTypes = + pluginRepository.getAllDeviceManagementServices(tenantId); + Set deviceTypeSetForTenant = new HashSet<>(); + + if (registeredTypes != null) { + if (deviceTypesProvidedByTenant != null) { + for (DeviceType deviceType : deviceTypesProvidedByTenant) { + DeviceTypeIdentifier providerKey = new DeviceTypeIdentifier(deviceType.getName(), tenantId); + if (registeredTypes.get(providerKey) != null) { + deviceTypesResponse.add(deviceType); + deviceTypeSetForTenant.add(deviceType.getName()); + } + } + } + // Get the device from the public space, however if there is another device with same name then give + // priority to that + if (publicSharedDeviceTypesInDB != null) { + for (DeviceType deviceType : publicSharedDeviceTypesInDB) { + DeviceTypeIdentifier providerKey = new DeviceTypeIdentifier(deviceType.getName()); + if (registeredTypes.get(providerKey) != null && !deviceTypeSetForTenant.contains( + deviceType.getName())) { + deviceTypesResponse.add(deviceType); + } } } + } } catch (DeviceManagementDAOException e) { throw new DeviceManagementException("Error occurred while obtaining the device types.", e); @@ -714,7 +732,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv try { for (DeviceIdentifier deviceId : deviceIds) { DeviceManagementService dms = - getPluginRepository().getDeviceManagementService(deviceId.getType()); + getPluginRepository().getDeviceManagementService(deviceId.getType(), this.getTenantId()); dms.notifyOperationToDevices(operation, deviceIds); } } catch (DeviceManagementException deviceMgtEx) { @@ -1068,7 +1086,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv public void updateDeviceEnrolmentInfo(Device device, EnrolmentInfo.Status status) throws DeviceManagementException { try { DeviceManagementDAOFactory.beginTransaction(); - DeviceType deviceType = deviceTypeDAO.getDeviceType(device.getType()); + DeviceType deviceType = deviceTypeDAO.getDeviceType(device.getType(), this.getTenantId()); device.getEnrolmentInfo().setDateOfLastUpdate(new Date().getTime()); device.getEnrolmentInfo().setStatus(status); deviceDAO.updateDevice(deviceType.getId(), device, this.getTenantId()); @@ -1171,7 +1189,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv private DeviceManager getDeviceManager(String deviceType) { DeviceManagementService deviceManagementService = - this.getPluginRepository().getDeviceManagementService(deviceType); + this.getPluginRepository().getDeviceManagementService(deviceType, this.getTenantId()); if (deviceManagementService == null) { if (log.isDebugEnabled()) { log.debug("Device type '" + deviceType + "' does not have an associated device management " + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/util/DeviceManagerUtil.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/util/DeviceManagerUtil.java index 629787f5290..ec798f2bdc1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/util/DeviceManagerUtil.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/util/DeviceManagerUtil.java @@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.core.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Document; +import org.wso2.carbon.base.MultitenantConstants; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; @@ -33,6 +34,8 @@ import org.wso2.carbon.device.mgt.core.dao.DeviceTypeDAO; import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.dto.DeviceType; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; +import org.wso2.carbon.user.api.TenantManager; +import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.utils.CarbonUtils; import org.wso2.carbon.utils.ConfigurationContextService; import org.wso2.carbon.utils.NetworkUtils; @@ -100,29 +103,32 @@ public final class DeviceManagerUtil { * Adds a new device type to the database if it does not exists. * * @param typeName device type + * @param tenantId provider tenant Id + * @param isSharedWithAllTenants is this device type shared with all tenants. * @return status of the operation */ - public static boolean registerDeviceType(String typeName) throws DeviceManagementException { + public static boolean registerDeviceType(String typeName, int tenantId, boolean isSharedWithAllTenants) + throws DeviceManagementException { boolean status; try { DeviceManagementDAOFactory.beginTransaction(); DeviceTypeDAO deviceTypeDAO = DeviceManagementDAOFactory.getDeviceTypeDAO(); - DeviceType deviceType = deviceTypeDAO.getDeviceType(typeName); + DeviceType deviceType = deviceTypeDAO.getDeviceType(typeName, tenantId); if (deviceType == null) { - DeviceType dt = new DeviceType(); - dt.setName(typeName); - deviceTypeDAO.addDeviceType(dt); + deviceType = new DeviceType(); + deviceType.setName(typeName); + deviceTypeDAO.addDeviceType(deviceType, tenantId, isSharedWithAllTenants); } DeviceManagementDAOFactory.commitTransaction(); status = true; } catch (DeviceManagementDAOException e) { DeviceManagementDAOFactory.rollbackTransaction(); - throw new DeviceManagementException("Error occurred while registering the device type '" + - typeName + "'", e); + throw new DeviceManagementException("Error occurred while registering the device type '" + + typeName + "'", e); } catch (TransactionManagementException e) { DeviceManagementDAOFactory.rollbackTransaction(); - throw new DeviceManagementException("SQL occurred while registering the device type '" + - typeName + "'", e); + throw new DeviceManagementException("SQL occurred while registering the device type '" + + typeName + "'", e); } finally { DeviceManagementDAOFactory.closeConnection(); } @@ -135,26 +141,24 @@ public final class DeviceManagerUtil { * @param typeName device type * @return status of the operation */ - public static boolean unregisterDeviceType(String typeName) throws DeviceManagementException { + public static boolean unregisterDeviceType(String typeName, int tenantId) throws DeviceManagementException { try { DeviceManagementDAOFactory.beginTransaction(); DeviceTypeDAO deviceTypeDAO = DeviceManagementDAOFactory.getDeviceTypeDAO(); - DeviceType deviceType = deviceTypeDAO.getDeviceType(typeName); + DeviceType deviceType = deviceTypeDAO.getDeviceType(typeName, tenantId); if (deviceType != null) { - DeviceType dt = new DeviceType(); - dt.setName(typeName); - deviceTypeDAO.removeDeviceType(typeName); + deviceTypeDAO.removeDeviceType(typeName, tenantId); } DeviceManagementDAOFactory.commitTransaction(); return true; } catch (DeviceManagementDAOException e) { DeviceManagementDAOFactory.rollbackTransaction(); throw new DeviceManagementException("Error occurred while registering the device type '" + - typeName + "'", e); + typeName + "'", e); } catch (TransactionManagementException e) { DeviceManagementDAOFactory.rollbackTransaction(); throw new DeviceManagementException("SQL occurred while registering the device type '" + - typeName + "'", e); + typeName + "'", e); } finally { DeviceManagementDAOFactory.closeConnection(); } @@ -217,4 +221,27 @@ public final class DeviceManagerUtil { return "http://" + hostName + ":" + port; } + /** + * returns the tenant Id of the specific tenant Domain + * + * @param tenantDomain + * @return + * @throws DeviceManagementException + */ + public static int getTenantId(String tenantDomain) throws DeviceManagementException { + try { + if (tenantDomain.equals(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME)) { + return MultitenantConstants.SUPER_TENANT_ID; + } + TenantManager tenantManager = DeviceManagementDataHolder.getInstance().getTenantManager(); + int tenantId = tenantManager.getTenantId(tenantDomain); + if (tenantId == -1) { + throw new DeviceManagementException("invalid tenant Domain :" + tenantDomain); + } + return tenantId; + } catch (UserStoreException e) { + throw new DeviceManagementException("invalid tenant Domain :" + tenantDomain); + } + } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/DeviceManagementRepositoryTests.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/DeviceManagementRepositoryTests.java index 127ee0d707e..925d8a9e8db 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/DeviceManagementRepositoryTests.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/DeviceManagementRepositoryTests.java @@ -27,41 +27,45 @@ import org.wso2.carbon.device.mgt.core.common.TestDataHolder; public class DeviceManagementRepositoryTests { - private DeviceManagementPluginRepository repository; + private DeviceManagementPluginRepository repository; - @BeforeClass - public void initRepository() { - this.repository = new DeviceManagementPluginRepository(); - } + @BeforeClass + public void initRepository() { + this.repository = new DeviceManagementPluginRepository(); + } - @Test - public void testAddDeviceManagementService() { - DeviceManagementService sourceProvider = new TestDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE); - try { - this.getRepository().addDeviceManagementProvider(sourceProvider); - } catch (DeviceManagementException e) { - Assert.fail("Unexpected error occurred while invoking addDeviceManagementProvider functionality", e); - } - DeviceManagementService targetProvider = - this.getRepository().getDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE); - Assert.assertEquals(targetProvider.getType(), sourceProvider.getType()); - } + @Test + public void testAddDeviceManagementService() { + DeviceManagementService sourceProvider = new TestDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE, + TestDataHolder.SUPER_TENANT_DOMAIN); + try { + this.getRepository().addDeviceManagementProvider(sourceProvider); + } catch (DeviceManagementException e) { + Assert.fail("Unexpected error occurred while invoking addDeviceManagementProvider functionality", e); + } + DeviceManagementService targetProvider = + this.getRepository().getDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE, + TestDataHolder.SUPER_TENANT_ID); + Assert.assertEquals(targetProvider.getType(), sourceProvider.getType()); + } - @Test(dependsOnMethods = "testAddDeviceManagementService") - public void testRemoveDeviceManagementService() { - DeviceManagementService sourceProvider = new TestDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE); - try { - this.getRepository().removeDeviceManagementProvider(sourceProvider); - } catch (DeviceManagementException e) { - Assert.fail("Unexpected error occurred while invoking removeDeviceManagementProvider functionality", e); - } - DeviceManagementService targetProvider = - this.getRepository().getDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE); - Assert.assertNull(targetProvider); - } + @Test(dependsOnMethods = "testAddDeviceManagementService") + public void testRemoveDeviceManagementService() { + DeviceManagementService sourceProvider = new TestDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE, + TestDataHolder.SUPER_TENANT_DOMAIN); + try { + this.getRepository().removeDeviceManagementProvider(sourceProvider); + } catch (DeviceManagementException e) { + Assert.fail("Unexpected error occurred while invoking removeDeviceManagementProvider functionality", e); + } + DeviceManagementService targetProvider = + this.getRepository().getDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE, + TestDataHolder.SUPER_TENANT_ID); + Assert.assertNull(targetProvider); + } - private DeviceManagementPluginRepository getRepository() { - return repository; - } + private DeviceManagementPluginRepository getRepository() { + return repository; + } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/TestDeviceManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/TestDeviceManagementService.java index 63128cbbdda..c94a00fe8dc 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/TestDeviceManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/TestDeviceManagementService.java @@ -34,15 +34,25 @@ import java.util.List; public class TestDeviceManagementService implements DeviceManagementService { private String providerType; + private String tenantDomain; - public TestDeviceManagementService(String deviceType){ + public TestDeviceManagementService(String deviceType, String tenantDomain){ providerType = deviceType; + this.tenantDomain = tenantDomain; } @Override public String getType() { return providerType; } + @Override + public String getProviderTenantDomain() { return tenantDomain;} + + @Override + public boolean isSharedWithAllTenants() { + return true; + } + @Override public void init() throws DeviceManagementException { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/app/mgt/ApplicationManagementProviderServiceTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/app/mgt/ApplicationManagementProviderServiceTest.java index b98745f8a2e..4c7996e381e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/app/mgt/ApplicationManagementProviderServiceTest.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/app/mgt/ApplicationManagementProviderServiceTest.java @@ -43,7 +43,7 @@ public class ApplicationManagementProviderServiceTest { public void init() { deviceManagementPluginRepository = new DeviceManagementPluginRepository(); TestDeviceManagementService testDeviceManagementService = - new TestDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE); + new TestDeviceManagementService(TestDataHolder.TEST_DEVICE_TYPE, TestDataHolder.SUPER_TENANT_DOMAIN); try { deviceManagementPluginRepository.addDeviceManagementProvider(testDeviceManagementService); } catch (DeviceManagementException e) { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/common/TestDataHolder.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/common/TestDataHolder.java index 1d381abf1ed..78dcab56ead 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/common/TestDataHolder.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/common/TestDataHolder.java @@ -29,6 +29,7 @@ public class TestDataHolder { public static DeviceType initialTestDeviceType; public static String TEST_DEVICE_TYPE = "Test"; public static Integer SUPER_TENANT_ID = -1234; + public static String SUPER_TENANT_DOMAIN="carbon.super"; public static String initialDeviceIdentifier = "12345"; public static Device generateDummyDeviceData(String deviceType){ diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/dao/DevicePersistTests.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/dao/DevicePersistTests.java index d7996be3a10..22914836b75 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/dao/DevicePersistTests.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/dao/DevicePersistTests.java @@ -54,7 +54,7 @@ public class DevicePersistTests extends BaseDeviceManagementTest { DeviceType deviceType = TestDataHolder.generateDeviceTypeData(TestDataHolder.TEST_DEVICE_TYPE); try { DeviceManagementDAOFactory.beginTransaction(); - deviceTypeDAO.addDeviceType(deviceType); + deviceTypeDAO.addDeviceType(deviceType, TestDataHolder.SUPER_TENANT_ID, true); } catch (DeviceManagementDAOException e) { DeviceManagementDAOFactory.rollbackTransaction(); String msg = "Error occurred while adding device type '" + deviceType.getName() + "'"; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/sql/h2.sql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/sql/h2.sql index d172e2f5d27..f112ff49a72 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/sql/h2.sql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/sql/h2.sql @@ -1,6 +1,8 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( - ID INT auto_increment NOT NULL, - NAME VARCHAR(300) DEFAULT NULL, + ID INT AUTO_INCREMENT NOT NULL, + NAME VARCHAR(300) NULL DEFAULT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (ID) ); diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java index f4c83d990fb..fa5e8ae7f31 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/MonitoringManagerImpl.java @@ -21,6 +21,7 @@ package org.wso2.carbon.policy.mgt.core.mgt.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; @@ -375,7 +376,8 @@ public class MonitoringManagerImpl implements MonitoringManager { List deviceTypes = new ArrayList<>(); try { DeviceManagementDAOFactory.openConnection(); - deviceTypes = deviceTypeDAO.getDeviceTypes(); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + deviceTypes = deviceTypeDAO.getDeviceTypes(tenantId); } catch (Exception e) { log.error("Error occurred while getting the device types.", e); } finally { diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/ProfileManagerImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/ProfileManagerImpl.java index 394124cbeb5..bdfe27c420e 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/ProfileManagerImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/mgt/impl/ProfileManagerImpl.java @@ -20,6 +20,7 @@ package org.wso2.carbon.policy.mgt.core.mgt.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.mgt.core.dao.DeviceDAO; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; @@ -184,8 +185,9 @@ public class ProfileManagerImpl implements ProfileManager { List deviceTypes; try { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); DeviceManagementDAOFactory.openConnection(); - deviceTypes = deviceTypeDAO.getDeviceTypes(); + deviceTypes = deviceTypeDAO.getDeviceTypes(tenantId); } catch (SQLException e) { throw new ProfileManagementException("Error occurred while opening a connection to the data source", e); } catch (DeviceManagementDAOException e) { @@ -236,7 +238,8 @@ public class ProfileManagerImpl implements ProfileManager { try { DeviceManagementDAOFactory.openConnection(); - deviceType = deviceTypeDAO.getDeviceType(deviceTypeName); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); + deviceType = deviceTypeDAO.getDeviceType(deviceTypeName, tenantId); } catch (DeviceManagementDAOException e) { throw new ProfileManagementException("Error occurred while retrieving device type information", e); } catch (SQLException e) { diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/java/org/wso2/carbon/policy/mgt/core/PolicyDAOTestCase.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/java/org/wso2/carbon/policy/mgt/core/PolicyDAOTestCase.java index 868931c422a..9e44132e06d 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/java/org/wso2/carbon/policy/mgt/core/PolicyDAOTestCase.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/java/org/wso2/carbon/policy/mgt/core/PolicyDAOTestCase.java @@ -60,7 +60,7 @@ public class PolicyDAOTestCase extends BasePolicyManagementDAOTest { try { DeviceManagementDAOFactory.beginTransaction(); DeviceTypeDAO deviceTypeDAO = DeviceManagementDAOFactory.getDeviceTypeDAO(); - deviceTypeDAO.addDeviceType(DeviceTypeCreator.getDeviceType()); + deviceTypeDAO.addDeviceType(DeviceTypeCreator.getDeviceType(), -1234, true); } catch (DeviceManagementDAOException e) { DeviceManagementDAOFactory.rollbackTransaction(); throw new DeviceManagementDAOException("Error occurred while adding dummy device type", e); diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/resources/sql/CreateH2TestDB.sql b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/resources/sql/CreateH2TestDB.sql index 8b101ba8c15..83c3142af48 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/resources/sql/CreateH2TestDB.sql +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/resources/sql/CreateH2TestDB.sql @@ -1,6 +1,8 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( - ID INT auto_increment NOT NULL, + ID INT AUTO_INCREMENT NOT NULL, NAME VARCHAR(300) NULL DEFAULT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (ID) ); diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/resources/sql/CreateMySqlTestDB.sql b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/resources/sql/CreateMySqlTestDB.sql index a85059fa83c..f5466feaf6e 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/resources/sql/CreateMySqlTestDB.sql +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/test/resources/sql/CreateMySqlTestDB.sql @@ -25,6 +25,8 @@ DROP TABLE IF EXISTS `WSO2CDM`.`DM_DEVICE_TYPE` ; CREATE TABLE IF NOT EXISTS `WSO2CDM`.`DM_DEVICE_TYPE` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `NAME` VARCHAR(300) NULL DEFAULT NULL, + `PROVIDER_TENANT_ID` INTEGER DEFAULT 0, + `SHARED_WITH_ALL_TENANTS` BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (`ID`)) ENGINE = InnoDB DEFAULT CHARACTER SET = latin1; diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql index 3a268960d14..f4c5357eed4 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql @@ -1,6 +1,8 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( - ID INT auto_increment NOT NULL, - NAME VARCHAR(300) DEFAULT NULL, + ID INT AUTO_INCREMENT NOT NULL, + NAME VARCHAR(300) NULL DEFAULT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (ID) ); diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql index bb55d058623..3287ebafe58 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql @@ -1,7 +1,9 @@ CREATE TABLE DM_DEVICE_TYPE ( - ID INTEGER IDENTITY NOT NULL, - NAME VARCHAR(300) DEFAULT NULL, - PRIMARY KEY (ID) + ID INTEGER IDENTITY NOT NULL, + NAME VARCHAR(300) DEFAULT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE, + PRIMARY KEY (ID) ); CREATE TABLE DM_DEVICE_CERTIFICATE ( diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql index 545f939108f..74defa7d892 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql @@ -1,6 +1,8 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( ID INTEGER AUTO_INCREMENT NOT NULL, NAME VARCHAR(300) DEFAULT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (ID) )ENGINE = InnoDB; diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql index 728233d24b3..c5032611d55 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql @@ -1,6 +1,8 @@ CREATE TABLE DM_DEVICE_TYPE ( ID NUMBER(10) NOT NULL, NAME VARCHAR2(300) DEFAULT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE, CONSTRAINT PK_DM_DEVICE_TYPE PRIMARY KEY (ID) ) / diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql index a1581e19d3f..ef531b5a2ad 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql @@ -1,6 +1,8 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( ID BIGSERIAL PRIMARY KEY, - NAME VARCHAR(300) DEFAULT NULL + NAME VARCHAR(300) DEFAULT NULL, + PROVIDER_TENANT_ID INTEGER DEFAULT 0, + SHARED_WITH_ALL_TENANTS BOOLEAN NOT NULL DEFAULT FALSE ); CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE ( From 284a6645f03f7ef3731ecb41948facc2db75440b Mon Sep 17 00:00:00 2001 From: ayyoob Date: Tue, 29 Mar 2016 12:07:58 +0530 Subject: [PATCH 2/8] import required packages --- components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml index 00640f76d4d..22682725310 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml @@ -83,7 +83,8 @@ org.apache.catalina.core, org.apache.commons.collections, org.wso2.carbon.email.sender.*, - org.wso2.carbon + org.wso2.carbon, + org.wso2.carbon.base !org.wso2.carbon.device.mgt.core.internal, From 026d4ef01860262e7c2c316f74c54280a8f25d79 Mon Sep 17 00:00:00 2001 From: ayyoob Date: Wed, 30 Mar 2016 12:17:46 +0530 Subject: [PATCH 3/8] removed analytics --- .../pom.xml | 144 ------------------ 1 file changed, 144 deletions(-) delete mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.analytics/pom.xml diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.analytics/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.analytics/pom.xml deleted file mode 100644 index f7c66fd190f..00000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.analytics/pom.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - org.wso2.carbon.devicemgt - device-mgt - 1.1.0-SNAPSHOT - ../pom.xml - - - 4.0.0 - org.wso2.carbon.device.mgt.analytics - 1.1.0-SNAPSHOT - bundle - WSO2 Carbon - Device Analytics - WSO2 Carbon - Device Analytics - http://wso2.org - - - - org.eclipse.osgi - org.eclipse.osgi - - - org.eclipse.osgi - org.eclipse.osgi.services - - - org.testng - testng - - - org.wso2.tomcat - tomcat - - - org.wso2.tomcat - tomcat-servlet-api - - - org.wso2.carbon - org.wso2.carbon.core - - - org.wso2.carbon - org.wso2.carbon.logging - - - org.wso2.carbon - org.wso2.carbon.utils - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.core - - - org.wso2.carbon.analytics-common - org.wso2.carbon.databridge.agent - - - org.wso2.carbon.analytics-common - org.wso2.carbon.databridge.commons - - - org.wso2.carbon.analytics - org.wso2.carbon.analytics.api - - - org.wso2.carbon.registry - org.wso2.carbon.registry.indexing - - - org.json.wso2 - json - - - - - - - org.apache.felix - maven-scr-plugin - - - org.apache.felix - maven-bundle-plugin - 1.4.0 - true - - - ${project.artifactId} - ${project.artifactId} - ${carbon.device.mgt.version} - Data Publisher - org.wso2.carbon.device.mgt.analytics.internal - - !org.wso2.carbon.device.mgt.analytics.internal, - org.wso2.carbon.device.mgt.analytics.*;version="${carbon.device.mgt.version}" - - - org.osgi.framework, - org.osgi.service.component, - org.apache.commons.logging.*, - org.wso2.carbon.context;version="${carbon.kernel.version.range}", - org.wso2.carbon.utils;version="${carbon.kernel.version.range}", - org.wso2.carbon.databridge.*;version="${carbon.analytics.common.version.range}", - org.wso2.carbon.analytics.*;version="${carbon.analytics.version.range}", - org.wso2.carbon.registry.core.*;resolution:=optional, - org.wso2.carbon.registry.common.*;version="${carbon.registry.imp.pkg.version.range}", - org.wso2.carbon.registry.indexing.*; version="${carbon.registry.imp.pkg.version.range}", - org.json;version="${commons-json.version}", - javax.xml.bind, - javax.xml.bind.annotation, - javax.xml.parsers, - org.w3c.dom, - org.wso2.carbon.base - - - - - - - - \ No newline at end of file From fc725fa76749432c36ce1703ab4e489a0f1ce32a Mon Sep 17 00:00:00 2001 From: ayyoob Date: Wed, 30 Mar 2016 13:45:39 +0530 Subject: [PATCH 4/8] removed analytics --- components/device-mgt/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/components/device-mgt/pom.xml b/components/device-mgt/pom.xml index 1de382fbd34..4938424351b 100644 --- a/components/device-mgt/pom.xml +++ b/components/device-mgt/pom.xml @@ -39,7 +39,6 @@ org.wso2.carbon.device.mgt.common org.wso2.carbon.device.mgt.extensions org.wso2.carbon.device.mgt.ui - org.wso2.carbon.device.mgt.analytics org.wso2.carbon.device.mgt.analytics.data.publisher org.wso2.carbon.device.mgt.etc From 562ced1be761b6b8ef56885584217141bd812d08 Mon Sep 17 00:00:00 2001 From: ayyoob Date: Thu, 31 Mar 2016 00:10:40 +0530 Subject: [PATCH 5/8] Added api application extension feature --- .../pom.xml | 134 ++++++++++++++++++ .../src/main/resources/build.properties | 1 + .../src/main/resources/p2.inf | 3 + features/apimgt-extensions/pom.xml | 1 + 4 files changed, 139 insertions(+) create mode 100644 features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/pom.xml create mode 100644 features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/src/main/resources/build.properties create mode 100644 features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/src/main/resources/p2.inf diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/pom.xml b/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/pom.xml new file mode 100644 index 00000000000..63046f0ebd5 --- /dev/null +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/pom.xml @@ -0,0 +1,134 @@ + + + + + + org.wso2.carbon.devicemgt + apimgt-extensions-feature + 1.1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.wso2.carbon.apimgt.application.extension.feature + pom + 1.1.0-SNAPSHOT + WSO2 Carbon - API Management Application Extension Feature + http://wso2.org + This feature contains an implementation of a api application registration, which takes care of subscription + and generating keys. + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.apimgt.application.extension + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-jaxrs-war + package + + copy + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.apimgt.application.extension.api + war + true + ${project.build.directory}/maven-shared-archive-resources/webapps/ + api-application-registration.war + + + + + + + + org.wso2.maven + carbon-p2-plugin + ${carbon.p2.plugin.version} + + + p2-feature-generation + package + + p2-feature-gen + + + org.wso2.carbon.apimgt.application.extension + ../../../features/etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + org.eclipse.equinox.p2.type.group:false + + + + + org.wso2.carbon.devicemgt:org.wso2.carbon.apimgt.application.extension:${carbon.device.mgt.version} + + + + org.wso2.carbon.core.server:${carbon.kernel.version} + + + + + + + + + \ No newline at end of file diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/src/main/resources/build.properties b/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/src/main/resources/build.properties new file mode 100644 index 00000000000..93c4b10701e --- /dev/null +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/src/main/resources/build.properties @@ -0,0 +1 @@ +custom = true \ No newline at end of file diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/src/main/resources/p2.inf b/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/src/main/resources/p2.inf new file mode 100644 index 00000000000..1d8124571f9 --- /dev/null +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/src/main/resources/p2.inf @@ -0,0 +1,3 @@ +instructions.configure = \ +org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ +org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.apimgt.application.extension_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\ \ No newline at end of file diff --git a/features/apimgt-extensions/pom.xml b/features/apimgt-extensions/pom.xml index 8225ffc41e2..c4a0b1bf82b 100644 --- a/features/apimgt-extensions/pom.xml +++ b/features/apimgt-extensions/pom.xml @@ -36,6 +36,7 @@ org.wso2.carbon.apimgt.webapp.publisher.feature + org.wso2.carbon.apimgt.application.extension.feature From 1b4a9227d8779a9469c95e8c3ebee727cec10600 Mon Sep 17 00:00:00 2001 From: ayyoob Date: Thu, 31 Mar 2016 04:24:30 +0530 Subject: [PATCH 6/8] merged web app publisher code and refactored jwt client extension to adhere to new artefact name --- .../pom.xml | 64 +++- .../apimgt/webapp/publisher/APIConfig.java | 61 +++- .../webapp/publisher/APIPublisherService.java | 7 +- .../publisher/APIPublisherServiceImpl.java | 96 ++++-- .../webapp/publisher/APIPublisherUtil.java | 122 +++++-- .../webapp/publisher/config/APIResource.java | 87 +++++ .../config/APIResourceConfiguration.java | 79 +++++ .../APIResourceManagementException.java | 38 +++ .../publisher/config/APIResourceManager.java | 69 ++++ .../internal/APIPublisherDataHolder.java | 37 ++ .../APIPublisherServiceComponent.java | 38 +++ .../APIPublisherLifecycleListener.java | 322 +++++++++++------- .../lifecycle/util/AnnotationUtil.java | 265 ++++++++++++++ .../pom.xml | 2 +- .../pom.xml | 6 +- .../jwt/client/extension/JWTClient.java | 12 +- .../client/extension/JWTClientManager.java | 12 +- .../extension/constant/JWTConstants.java | 2 +- .../client/extension/dto/AccessTokenInfo.java | 2 +- .../jwt/client/extension/dto/JWTConfig.java | 2 +- .../JWTClientAlreadyExistsException.java | 2 +- .../JWTClientConfigurationException.java | 2 +- .../exception/JWTClientException.java | 2 +- .../JWTClientExtensionDataHolder.java | 2 +- .../JWTClientExtensionServiceComponent.java | 6 +- .../client/extension/util/JWTClientUtil.java | 4 +- .../src/main/resources/p2.inf | 2 +- pom.xml | 5 + 28 files changed, 1137 insertions(+), 211 deletions(-) create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResource.java create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceConfiguration.java create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceManagementException.java create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceManager.java create mode 100644 components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationUtil.java 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 0102e4414ed..7da850e7a94 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 @@ -1,5 +1,25 @@ - + + + apimgt-extensions @@ -61,6 +81,30 @@ org.apache.axis2.wso2 axis2 + + com.google.code.gson + gson + + + org.wso2.orbit.org.scannotation + scannotation + + + javax.ws.rs + jsr311-api + + + org.wso2.carbon.devicemgt + org.wso2.carbon.apimgt.annotations + + + org.wso2.carbon.governance + org.wso2.carbon.governance.api + + + org.wso2.carbon.governance + org.wso2.carbon.governance.lcm + @@ -81,7 +125,8 @@ ${project.artifactId} ${carbon.device.mgt.version} API Management Webapp Publisher - org.wso2.carbon.apimgt.webapp.publisher.internal + org.wso2.carbon.apimgt.webapp.publisher.internal + !org.wso2.carbon.apimgt.webapp.publisher.internal, org.wso2.carbon.apimgt.webapp.publisher.* @@ -91,7 +136,8 @@ org.osgi.service.component, org.apache.commons.logging, javax.servlet, - javax.xml.bind.annotation, + javax.xml.*, + com.google.gson.*, org.apache.catalina, org.apache.catalina.core, org.wso2.carbon.apimgt.api, @@ -99,12 +145,20 @@ org.wso2.carbon.apimgt.impl, org.apache.axis2.*;version="${axis2.osgi.version.range}", org.wso2.carbon.core, - org.wso2.carbon.utils + org.apache.commons.lang, + org.wso2.carbon.utils, + org.wso2.carbon.apimgt.annotations.*, + org.wso2.carbon.governance.lcm.util.*, + org.wso2.carbon.registry.core.* + + scribe;scope=compile|runtime;inline=false; + + * - + \ No newline at end of file diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIConfig.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIConfig.java index 4d5c6611056..c71a0cba5b7 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIConfig.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIConfig.java @@ -20,11 +20,16 @@ package org.wso2.carbon.apimgt.webapp.publisher; import org.wso2.carbon.apimgt.api.APIManagementException; import org.wso2.carbon.apimgt.api.APIProvider; +import org.wso2.carbon.apimgt.api.model.URITemplate; +import org.wso2.carbon.apimgt.impl.APIConstants; import org.wso2.carbon.apimgt.impl.APIManagerFactory; +import org.wso2.carbon.utils.multitenancy.MultitenantUtils; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; +import java.util.List; +import java.util.Set; /** * This bean class carries the properties used by some API that needs to be published within the underlying @@ -48,20 +53,35 @@ public class APIConfig { private String name; private String owner; private String context; + private String contextTemplate; private String endpoint; private String version; private String transports; private APIProvider provider; private boolean isSecured; + private Set uriTemplates; + private List tenants; + private boolean isSharedWithAllTenants; + private String tenantDomain; + private String[] tags; public void init() throws APIManagementException { try { - this.provider = APIManagerFactory.getInstance().getAPIProvider(this.getOwner()); + this.provider = APIManagerFactory.getInstance().getAPIProvider(owner); } catch (APIManagementException e) { throw new APIManagementException("Error occurred while initializing API provider", e); } } + @XmlElement(name = "ContextTemplate", required = true) + public String getContextTemplate() { + return contextTemplate; + } + + public void setContextTemplate(String contextTemplate) { + this.contextTemplate = contextTemplate; + } + @XmlTransient public APIProvider getProvider() { return provider; @@ -136,4 +156,43 @@ public class APIConfig { isSecured = secured; } + @XmlElement(name = "UriTemplates", required = false) + public Set getUriTemplates() { + return uriTemplates; + } + + @SuppressWarnings("unused") + public void setUriTemplates(Set uriTemplates) { + this.uriTemplates = uriTemplates; + } + + @XmlElement(name = "isSharedWithAllTenants", required = false) + public boolean isSharedWithAllTenants() { + return isSharedWithAllTenants; + } + + @SuppressWarnings("unused") + public void setSharedWithAllTenants(boolean isSharedWithAllTenants) { + this.isSharedWithAllTenants = isSharedWithAllTenants; + } + + @XmlElement(name = "tenantDomain", required = false) + public String getTenantDomain() { + return tenantDomain; + } + + @SuppressWarnings("unused") + public void setTenantDomain(String tenantDomain) { + this.tenantDomain = tenantDomain; + } + + @XmlElement(name = "tags", required = false) + public String[] getTags() { + return tags; + } + + @SuppressWarnings("unused") + public void setTags(String[] tags) { + this.tags = tags; + } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherService.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherService.java index 32cb28f38d1..c41a6849685 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherService.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherService.java @@ -19,9 +19,9 @@ package org.wso2.carbon.apimgt.webapp.publisher; import org.wso2.carbon.apimgt.api.APIManagementException; +import org.wso2.carbon.apimgt.api.FaultGatewaysException; import org.wso2.carbon.apimgt.api.model.API; import org.wso2.carbon.apimgt.api.model.APIIdentifier; - import java.util.List; /** @@ -39,7 +39,7 @@ public interface APIPublisherService { * @param api An instance of the bean that passes metadata related to the API being published * @throws APIManagementException Is thrown if some unexpected event occurs while publishing the API */ - void publishAPI(API api) throws APIManagementException; + void publishAPI(API api) throws APIManagementException, FaultGatewaysException; /** * This method removes an API that's already published within the underlying API-Management infrastructure. @@ -55,6 +55,5 @@ public interface APIPublisherService { * @param apis A list of the beans that passes metadata related to the APIs being published * @throws APIManagementException Is thrown if some unexpected event occurs while publishing the APIs */ - void publishAPIs(List apis) throws APIManagementException; - + void publishAPIs(List apis) throws APIManagementException, FaultGatewaysException; } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherServiceImpl.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherServiceImpl.java index 6d1eb4c3a90..dae050d1d79 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherServiceImpl.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherServiceImpl.java @@ -18,6 +18,7 @@ */ package org.wso2.carbon.apimgt.webapp.publisher; +import com.google.gson.JsonObject; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.apimgt.api.APIManagementException; @@ -25,8 +26,17 @@ import org.wso2.carbon.apimgt.api.APIProvider; import org.wso2.carbon.apimgt.api.FaultGatewaysException; import org.wso2.carbon.apimgt.api.model.API; import org.wso2.carbon.apimgt.api.model.APIIdentifier; +import org.wso2.carbon.apimgt.api.model.URITemplate; import org.wso2.carbon.apimgt.impl.APIManagerFactory; +import org.wso2.carbon.apimgt.webapp.publisher.internal.APIPublisherDataHolder; +import org.wso2.carbon.governance.lcm.util.CommonUtil; +import org.wso2.carbon.registry.core.exceptions.RegistryException; +import org.wso2.carbon.registry.core.service.RegistryService; +import org.wso2.carbon.user.api.UserStoreException; +import org.wso2.carbon.utils.multitenancy.MultitenantUtils; +import javax.xml.stream.XMLStreamException; +import java.io.FileNotFoundException; import java.util.List; /** @@ -38,33 +48,82 @@ public class APIPublisherServiceImpl implements APIPublisherService { private static final Log log = LogFactory.getLog(APIPublisherServiceImpl.class); @Override - public void publishAPI(API api) throws APIManagementException { + public void publishAPI(API api) throws APIManagementException, FaultGatewaysException { if (log.isDebugEnabled()) { log.debug("Publishing API '" + api.getId() + "'"); } - APIProvider provider = APIManagerFactory.getInstance().getAPIProvider(api.getApiOwner()); - if (provider != null) { - if (!provider.isAPIAvailable(api.getId())) { - provider.addAPI(api); - log.info("Successfully published API '" + api.getId().getApiName() + "' with context '" + - api.getContext() + "' and version '" + api.getId().getVersion() + "'"); - } else { - try { + try { + String tenantDomain = MultitenantUtils.getTenantDomain(api.getApiOwner()); + int tenantId = + APIPublisherDataHolder.getInstance().getRealmService().getTenantManager().getTenantId(tenantDomain); + // Below code snippet is added load API Lifecycle in tenant mode, where in it does not load when tenant is loaded. + RegistryService registryService = APIPublisherDataHolder.getInstance().getRegistryService(); + CommonUtil.addDefaultLifecyclesIfNotAvailable(registryService.getConfigSystemRegistry(tenantId), + CommonUtil.getRootSystemRegistry(tenantId)); + APIProvider provider = APIManagerFactory.getInstance().getAPIProvider(api.getApiOwner()); + MultitenantUtils.getTenantDomain(api.getApiOwner()); + if (provider != null) { + if (!provider.isAPIAvailable(api.getId())) { + provider.addAPI(api); + log.info("Successfully published API '" + api.getId().getApiName() + "' with context '" + + api.getContext() + "' and version '" + api.getId().getVersion() + "'"); + } else { provider.updateAPI(api); log.info("An API already exists with the name '" + api.getId().getApiName() + "', context '" + - api.getContext() + "' and version '" + api.getId().getVersion() + - "'. Thus, the API config is updated"); - } catch (FaultGatewaysException e) { - throw new APIManagementException("Error occurred while updating API " + api.getId().getApiName() + - "' with context '" + api.getContext() + "' and version '" + api.getId().getVersion() + "'"); + api.getContext() + "' and version '" + api.getId().getVersion() + + "'. Thus, the API config is updated"); } + provider.saveSwagger20Definition(api.getId(), createSwaggerDefinition(api)); + } else { + throw new APIManagementException("API provider configured for the given API configuration is null. " + + "Thus, the API is not published"); } - } else { - throw new APIManagementException("API provider configured for the given API configuration is null. " + - "Thus, the API is not published"); + } catch (UserStoreException e) { + throw new APIManagementException("Failed to get the tenant id for the user " + api.getApiOwner(), e); + } catch (FileNotFoundException e) { + throw new APIManagementException("Failed to retrieve life cycle file ", e); + } catch (RegistryException e) { + throw new APIManagementException("Failed to access the registry ", e); + } catch (XMLStreamException e) { + throw new APIManagementException("Failed parsing the lifecycle xml.", e); } } + private String createSwaggerDefinition(API api) { + //{"paths":{"/controller/*":{"get":{"responses":{"200":{}}}},"/manager/*":{"get":{"responses":{"200":{}}}}}, + // "swagger":"2.0","info":{"title":"RaspberryPi","version":"1.0.0"}} + JsonObject swaggerDefinition = new JsonObject(); + + JsonObject paths = new JsonObject(); + for (URITemplate uriTemplate : api.getUriTemplates()) { + JsonObject response = new JsonObject(); + response.addProperty("200", ""); + + JsonObject responses = new JsonObject(); + responses.add("responses", response); + + JsonObject httpVerb = new JsonObject(); + httpVerb.add(uriTemplate.getHTTPVerb().toLowerCase(), responses); + + JsonObject path = new JsonObject(); + path.add(uriTemplate.getUriTemplate(), httpVerb); + + paths.add(uriTemplate.getUriTemplate(), httpVerb); + } + swaggerDefinition.add("paths", paths); + swaggerDefinition.addProperty("swagger", "2.0"); + + JsonObject info = new JsonObject(); + info.addProperty("title", api.getId().getApiName()); + info.addProperty("version", api.getId().getVersion()); + swaggerDefinition.add("info", info); + + return swaggerDefinition.toString(); + //return "{\"paths\":{\"/controller/*\":{\"get\":{\"responses\":{\"200\":{}}}}, + // \"/manager/*\":{\"get\":{\"responses\":{\"200\":{}}}}},\"swagger\":\"2.0\", + // \"info\":{\"title\":\"RaspberryPi\",\"version\":\"1.0.0\"}}"; + } + @Override public void removeAPI(APIIdentifier id) throws APIManagementException { if (log.isDebugEnabled()) { @@ -78,7 +137,7 @@ public class APIPublisherServiceImpl implements APIPublisherService { } @Override - public void publishAPIs(List apis) throws APIManagementException { + public void publishAPIs(List apis) throws APIManagementException, FaultGatewaysException { if (log.isDebugEnabled()) { log.debug("Publishing a batch of APIs"); } @@ -93,5 +152,4 @@ public class APIPublisherServiceImpl implements APIPublisherService { log.debug("End of publishing the batch of APIs"); } } - } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherUtil.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherUtil.java index 65ab0d46de2..2a502825adc 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherUtil.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherUtil.java @@ -1,42 +1,43 @@ /* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * - * WSO2 Inc. 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 + * WSO2 Inc. 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. + * 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. */ + package org.wso2.carbon.apimgt.webapp.publisher; import org.wso2.carbon.apimgt.api.APIManagementException; import org.wso2.carbon.apimgt.api.APIProvider; -import org.wso2.carbon.apimgt.api.model.API; -import org.wso2.carbon.apimgt.api.model.APIIdentifier; -import org.wso2.carbon.apimgt.api.model.APIStatus; -import org.wso2.carbon.apimgt.api.model.URITemplate; +import org.wso2.carbon.apimgt.api.model.*; import org.wso2.carbon.apimgt.impl.APIConstants; import org.wso2.carbon.apimgt.webapp.publisher.internal.APIPublisherDataHolder; +import org.wso2.carbon.base.MultitenantConstants; +import org.wso2.carbon.user.api.TenantManager; +import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.utils.CarbonUtils; import org.wso2.carbon.utils.ConfigurationContextService; import org.wso2.carbon.utils.NetworkUtils; +import org.wso2.carbon.utils.multitenancy.MultitenantUtils; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class APIPublisherUtil { + private static final String DEFAULT_API_VERSION = "1.0.0"; + public static final String API_VERSION_PARAM="{version}"; + enum HTTPMethod { GET, POST, DELETE, PUT, OPTIONS } @@ -54,21 +55,53 @@ public class APIPublisherUtil { public static API getAPI(APIConfig config) throws APIManagementException { APIProvider provider = config.getProvider(); - APIIdentifier id = new APIIdentifier(config.getOwner(), config.getName(), config.getVersion()); - + String apiVersion = config.getVersion(); + APIIdentifier id = new APIIdentifier(replaceEmailDomain(config.getOwner()), config.getName(), apiVersion); API api = new API(id); api.setApiOwner(config.getOwner()); - api.setContext(config.getContext()); + String context = config.getContext(); + context = context.startsWith("/") ? context : ("/" + context); + String providerDomain = config.getTenantDomain(); + if (!MultitenantConstants.SUPER_TENANT_DOMAIN_NAME.equalsIgnoreCase(providerDomain)) { + //Create tenant aware context for API + context = "/t/" + providerDomain + context; + } + // This is to support the new Pluggable version strategy + // if the context does not contain any {version} segment, we use the default version strategy. + context = checkAndSetVersionParam(context); + api.setContextTemplate(context); + context = updateContextWithVersion(config.getVersion(), context); + api.setContext(context); api.setUrl(config.getEndpoint()); - api.setUriTemplates( - getURITemplates(config.getEndpoint(), APIConstants.AUTH_APPLICATION_OR_USER_LEVEL_TOKEN)); - api.setVisibility(APIConstants.API_GLOBAL_VISIBILITY); api.addAvailableTiers(provider.getTiers()); api.setEndpointSecured(true); api.setStatus(APIStatus.PUBLISHED); api.setTransports(config.getTransports()); - api.setAsDefaultVersion(true); - api.setAsPublishedDefaultVersion(true); + api.setContextTemplate(config.getContextTemplate()); + api.setUriTemplates(config.getUriTemplates()); + Set tiers = new HashSet(); + tiers.add(new Tier(APIConstants.UNLIMITED_TIER)); + api.addAvailableTiers(tiers); + if (config.isSharedWithAllTenants()) { + api.setSubscriptionAvailability(APIConstants.SUBSCRIPTION_TO_ALL_TENANTS); + api.setVisibility(APIConstants.API_GLOBAL_VISIBILITY); + } else { + api.setSubscriptionAvailability(APIConstants.SUBSCRIPTION_TO_CURRENT_TENANT); + api.setVisibility(APIConstants.API_PRIVATE_VISIBILITY); + } + api.setResponseCache(APIConstants.DISABLED); + + String endpointConfig = "{\"production_endpoints\":{\"url\":\" " + config.getEndpoint() + "\",\"config\":null},\"endpoint_type\":\"http\"}"; + api.setEndpointConfig(endpointConfig); + + if ("".equals(id.getVersion()) || (DEFAULT_API_VERSION.equals(id.getVersion()))) { + api.setAsDefaultVersion(Boolean.TRUE); + api.setAsPublishedDefaultVersion(Boolean.TRUE); + } + if (config.getTags() != null && config.getTags().length > 0) { + Set tags = new HashSet<>(Arrays.asList(config.getTags())); + api.addTags(tags); + } return api; } @@ -125,4 +158,35 @@ public class APIPublisherUtil { return getServerBaseUrl() + context; } + /** + * When an input is having '@',replace it with '-AT-' [This is required to persist API data in registry,as registry paths don't allow '@' sign.] + * @param input inputString + * @return String modifiedString + */ + private static String replaceEmailDomain(String input){ + if(input!=null&& input.contains(APIConstants.EMAIL_DOMAIN_SEPARATOR) ){ + input=input.replace(APIConstants.EMAIL_DOMAIN_SEPARATOR,APIConstants.EMAIL_DOMAIN_SEPARATOR_REPLACEMENT); + } + return input; + } + + private static String updateContextWithVersion(String version, String context) { + // This condition should not be true for any occasion but we keep it so that there are no loopholes in + // the flow. + context = context.replace(API_VERSION_PARAM, version); + return context; + } + + private static String checkAndSetVersionParam(String context) { + // This is to support the new Pluggable version strategy + // if the context does not contain any {version} segment, we use the default version strategy. + if(!context.contains(API_VERSION_PARAM)){ + if(!context.endsWith("/")){ + context = context + "/"; + } + context = context +API_VERSION_PARAM; + } + return context; + } + } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResource.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResource.java new file mode 100644 index 00000000000..2f28fbe6a53 --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResource.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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. + */ + +package org.wso2.carbon.apimgt.webapp.publisher.config; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "Resource") +public class APIResource{ + + private String AuthType; + private String HttpVerb; + private String Uri; + private String UriTemplate; + private String consumes; + private String produces; + + public String getAuthType() { + return AuthType; + } + + @XmlElement(name = "AuthType", required = true) + public void setAuthType(String authType) { + AuthType = authType; + } + + public String getHttpVerb() { + return HttpVerb; + } + + @XmlElement(name = "HttpVerb", required = true) + public void setHttpVerb(String httpVerb) { + HttpVerb = httpVerb; + } + + public String getUri() { + return Uri; + } + + @XmlElement(name = "Uri", required = true) + public void setUri(String uri) { + Uri = uri; + } + + public String getUriTemplate() { + return UriTemplate; + } + + @XmlElement(name = "UriTemplate", required = true) + public void setUriTemplate(String uriTemplate) { + UriTemplate = uriTemplate; + } + + public String getConsumes() { + return consumes; + } + + @XmlElement(name = "Consumes", required = true) + public void setConsumes(String consumes) { + this.consumes = consumes; + } + + public String getProduces() { + return produces; + } + + @XmlElement(name = "Produces", required = true) + public void setProduces(String produces) { + this.produces = produces; + } +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceConfiguration.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceConfiguration.java new file mode 100644 index 00000000000..f25668fadbc --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceConfiguration.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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. + */ + +package org.wso2.carbon.apimgt.webapp.publisher.config; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement(name = "ResourceConfiguration") +public class APIResourceConfiguration { + + private String name; + private String context; + private String version; + private List resources; + private String[] tags; + + public List getResources() { + return resources; + } + + @XmlElement(name = "Resources", required = true) + public void setResources(List resources) { + this.resources = resources; + } + + public String getContext() { + return context; + } + + @XmlElement(name = "Context", required = true) + public void setContext(String context) { + this.context = context; + } + + public String getName() { + return name; + } + + @XmlElement(name = "Name") + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + @XmlElement(name = "Version") + public void setVersion(String version) { + this.version = version; + } + + public String[] getTags() { + return tags; + } + + @XmlElement(name = "Tags") + public void setTags(String[] tags) { + this.tags = tags; + } + +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceManagementException.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceManagementException.java new file mode 100644 index 00000000000..1007c50026e --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceManagementException.java @@ -0,0 +1,38 @@ +package org.wso2.carbon.apimgt.webapp.publisher.config; + +public class APIResourceManagementException extends Exception{ + private static final long serialVersionUID = -3151279311929070297L; + + private String errorMessage; + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public APIResourceManagementException(String msg, Exception nestedEx) { + super(msg, nestedEx); + setErrorMessage(msg); + } + + public APIResourceManagementException(String message, Throwable cause) { + super(message, cause); + setErrorMessage(message); + } + + public APIResourceManagementException(String msg) { + super(msg); + setErrorMessage(msg); + } + + public APIResourceManagementException() { + super(); + } + + public APIResourceManagementException(Throwable cause) { + super(cause); + } +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceManager.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceManager.java new file mode 100644 index 00000000000..c1f88d83abe --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/config/APIResourceManager.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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. + */ + +package org.wso2.carbon.apimgt.webapp.publisher.config; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.InputStream; +import java.util.List; +import java.util.Set; + +/** + * This class will add, update custom permissions defined in resources.xml in webapps. + */ +public class APIResourceManager { + + private static APIResourceManager resourceManager; + private List resourceList; + + private APIResourceManager(){}; + + public static APIResourceManager getInstance() { + if (resourceManager == null) { + synchronized (APIResourceManager.class) { + if (resourceManager == null) { + resourceManager = new APIResourceManager(); + } + } + } + return resourceManager; + } + + public void initializeResources(InputStream resourceStream) throws APIResourceManagementException { + try { + if(resourceStream != null){ + /* Un-marshaling Device Management configuration */ + JAXBContext cdmContext = JAXBContext.newInstance(APIResourceConfiguration.class); + Unmarshaller unmarshaller = cdmContext.createUnmarshaller(); + APIResourceConfiguration resourcesConfiguration = (APIResourceConfiguration) + unmarshaller.unmarshal(resourceStream); + if((resourcesConfiguration != null) && (resourcesConfiguration.getResources() != null)){ + this.resourceList = resourcesConfiguration.getResources(); + } + } + } catch (JAXBException e) { + throw new APIResourceManagementException("Error occurred while initializing Data Source config", e); + } + } + + public List getAPIResources(){ + return resourceList; + } +} diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/internal/APIPublisherDataHolder.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/internal/APIPublisherDataHolder.java index d5b4d5e15c8..bd291ce3be2 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/internal/APIPublisherDataHolder.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/internal/APIPublisherDataHolder.java @@ -18,13 +18,20 @@ */ package org.wso2.carbon.apimgt.webapp.publisher.internal; + import org.wso2.carbon.apimgt.webapp.publisher.APIPublisherService; +import org.wso2.carbon.registry.core.service.RegistryService; +import org.wso2.carbon.user.core.service.RealmService; +import org.wso2.carbon.user.core.tenant.TenantManager; import org.wso2.carbon.utils.ConfigurationContextService; public class APIPublisherDataHolder { private APIPublisherService apiPublisherService; private ConfigurationContextService configurationContextService; + private RealmService realmService; + private TenantManager tenantManager; + private RegistryService registryService; private static APIPublisherDataHolder thisInstance = new APIPublisherDataHolder(); @@ -57,4 +64,34 @@ public class APIPublisherDataHolder { return configurationContextService; } + public RealmService getRealmService() { + if (realmService == null) { + throw new IllegalStateException("Realm service is not initialized properly"); + } + return realmService; + } + + public void setRealmService(RealmService realmService) { + this.realmService = realmService; + this.setTenantManager(realmService); + } + + private void setTenantManager(RealmService realmService) { + if (realmService == null) { + throw new IllegalStateException("Realm service is not initialized properly"); + } + this.tenantManager = realmService.getTenantManager(); + } + + public TenantManager getTenantManager() { + return tenantManager; + } + + public RegistryService getRegistryService() { + return registryService; + } + + public void setRegistryService(RegistryService registryService) { + this.registryService = registryService; + } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/internal/APIPublisherServiceComponent.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/internal/APIPublisherServiceComponent.java index 6d2344a14f2..10a20d9a48f 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/internal/APIPublisherServiceComponent.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/internal/APIPublisherServiceComponent.java @@ -25,6 +25,8 @@ import org.osgi.service.component.ComponentContext; import org.wso2.carbon.apimgt.impl.APIManagerConfigurationService; import org.wso2.carbon.apimgt.webapp.publisher.APIPublisherService; import org.wso2.carbon.apimgt.webapp.publisher.APIPublisherServiceImpl; +import org.wso2.carbon.registry.core.service.RegistryService; +import org.wso2.carbon.user.core.service.RealmService; import org.wso2.carbon.utils.ConfigurationContextService; /** @@ -35,6 +37,18 @@ import org.wso2.carbon.utils.ConfigurationContextService; * policy="dynamic" * bind="setConfigurationContextService" * unbind="unsetConfigurationContextService" + * @scr.reference name="user.realmservice.default" + * interface="org.wso2.carbon.user.core.service.RealmService" + * cardinality="1..1" + * policy="dynamic" + * bind="setRealmService" + * unbind="unsetRealmService" + * @scr.reference name="registry.service" + * interface="org.wso2.carbon.registry.core.service.RegistryService" + * cardinality="1..1" + * policy="dynamic" + * bind="setRegistryService" + * unbind="unsetRegistryService" */ public class APIPublisherServiceComponent { @@ -95,4 +109,28 @@ public class APIPublisherServiceComponent { APIPublisherDataHolder.getInstance().setConfigurationContextService(null); } + protected void setRealmService(RealmService realmService) { + if (log.isDebugEnabled()) { + log.debug("Setting Realm Service"); + } + APIPublisherDataHolder.getInstance().setRealmService(realmService); + } + + protected void unsetRealmService(RealmService realmService) { + if (log.isDebugEnabled()) { + log.debug("Unsetting Realm Service"); + } + APIPublisherDataHolder.getInstance().setRealmService(null); + } + + protected void setRegistryService(RegistryService registryService) { + if (registryService != null && log.isDebugEnabled()) { + log.debug("Registry service initialized"); + } + APIPublisherDataHolder.getInstance().setRegistryService(registryService); + } + + protected void unsetRegistryService(RegistryService registryService) { + APIPublisherDataHolder.getInstance().setRegistryService(null); + } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/listener/APIPublisherLifecycleListener.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/listener/APIPublisherLifecycleListener.java index 1c425b3c4e2..a611a321ea3 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/listener/APIPublisherLifecycleListener.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/listener/APIPublisherLifecycleListener.java @@ -24,135 +24,209 @@ import org.apache.catalina.LifecycleListener; import org.apache.catalina.core.StandardContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.apimgt.api.model.API; -import org.wso2.carbon.apimgt.webapp.publisher.APIConfig; -import org.wso2.carbon.apimgt.webapp.publisher.APIPublisherService; -import org.wso2.carbon.apimgt.webapp.publisher.APIPublisherUtil; +import org.wso2.carbon.apimgt.api.model.*; +import org.wso2.carbon.apimgt.webapp.publisher.*; +import org.wso2.carbon.apimgt.webapp.publisher.config.APIResource; +import org.wso2.carbon.apimgt.webapp.publisher.config.APIResourceConfiguration; import org.wso2.carbon.apimgt.webapp.publisher.internal.APIPublisherDataHolder; - +import org.wso2.carbon.apimgt.webapp.publisher.lifecycle.util.AnnotationUtil; +import org.wso2.carbon.base.MultitenantConstants; import javax.servlet.ServletContext; +import java.io.IOException; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; @SuppressWarnings("unused") public class APIPublisherLifecycleListener implements LifecycleListener { - private static final String API_CONFIG_DEFAULT_VERSION = "1.0.0"; - - private static final String PARAM_MANAGED_API_ENABLED = "managed-api-enabled"; - private static final String PARAM_MANAGED_API_NAME = "managed-api-name"; - private static final String PARAM_MANAGED_API_VERSION = "managed-api-version"; - private static final String PARAM_MANAGED_API_CONTEXT = "managed-api-context"; - private static final String PARAM_MANAGED_API_ENDPOINT = "managed-api-endpoint"; - private static final String PARAM_MANAGED_API_OWNER = "managed-api-owner"; - private static final String PARAM_MANAGED_API_TRANSPORTS = "managed-api-transports"; - private static final String PARAM_MANAGED_API_IS_SECURED = "managed-api-isSecured"; - - private static final Log log = LogFactory.getLog(APIPublisherLifecycleListener.class); - - @Override - public void lifecycleEvent(LifecycleEvent lifecycleEvent) { - if (Lifecycle.AFTER_START_EVENT.equals(lifecycleEvent.getType())) { - StandardContext context = (StandardContext) lifecycleEvent.getLifecycle(); - ServletContext servletContext = context.getServletContext(); - - - String param = servletContext.getInitParameter(PARAM_MANAGED_API_ENABLED); - boolean isManagedApi = (param != null && !param.isEmpty()) && Boolean.parseBoolean(param); - - if (isManagedApi) { - APIConfig apiConfig = this.buildApiConfig(servletContext); - try { - apiConfig.init(); - API api = APIPublisherUtil.getAPI(apiConfig); - APIPublisherService apiPublisherService = - APIPublisherDataHolder.getInstance().getApiPublisherService(); - if (apiPublisherService == null) { - throw new IllegalStateException("API Publisher service is not initialized properly"); - } - apiPublisherService.publishAPI(api); - } catch (Throwable e) { - /* Throwable is caught as none of the RuntimeExceptions that can potentially occur at this point - does not seem to be logged anywhere else within the framework */ - log.error("Error occurred while publishing API '" + apiConfig.getName() + "' with the context '" + - apiConfig.getContext() + "' and version '" + apiConfig.getVersion() + "'", e); - } - } - } - } - - private APIConfig buildApiConfig(ServletContext servletContext) { - APIConfig apiConfig = new APIConfig(); - - String name = servletContext.getInitParameter(PARAM_MANAGED_API_NAME); - if (name == null || name.isEmpty()) { - if (log.isDebugEnabled()) { - log.debug("'managed-api-name' attribute is not configured. Therefore, using the default, " + - "which is the name of the web application"); - } - name = servletContext.getServletContextName(); - } - apiConfig.setName(name); - - String version = servletContext.getInitParameter(PARAM_MANAGED_API_VERSION); - if (version == null || version.isEmpty()) { - if (log.isDebugEnabled()) { - log.debug("'managed-api-version' attribute is not configured. Therefore, using the " + - "default, which is '1.0.0'"); - } - version = API_CONFIG_DEFAULT_VERSION; - } - apiConfig.setVersion(version); - - String context = servletContext.getInitParameter(PARAM_MANAGED_API_CONTEXT); - if (context == null || context.isEmpty()) { - if (log.isDebugEnabled()) { - log.debug("'managed-api-context' attribute is not configured. Therefore, using the default, " + - "which is the original context assigned to the web application"); - } - context = servletContext.getContextPath(); - } - apiConfig.setContext(context); - - String endpoint = servletContext.getInitParameter(PARAM_MANAGED_API_ENDPOINT); - if (endpoint == null || endpoint.isEmpty()) { - if (log.isDebugEnabled()) { - log.debug("'managed-api-endpoint' attribute is not configured"); - } - endpoint = APIPublisherUtil.getApiEndpointUrl(context); - } - apiConfig.setEndpoint(endpoint); - - String owner = servletContext.getInitParameter(PARAM_MANAGED_API_OWNER); - if (owner == null || owner.isEmpty()) { - if (log.isDebugEnabled()) { - log.debug("'managed-api-owner' attribute is not configured"); - } - } - apiConfig.setOwner(owner); - - String isSecuredParam = servletContext.getInitParameter(PARAM_MANAGED_API_IS_SECURED); - boolean isSecured; - if (isSecuredParam == null || isSecuredParam.isEmpty()) { - if (log.isDebugEnabled()) { - log.debug("'managed-api-isSecured' attribute is not configured. Therefore, using the default, " + - "which is 'true'"); - } - isSecured = false; - } else { - isSecured = Boolean.parseBoolean(isSecuredParam); - } - apiConfig.setSecured(isSecured); - - String transports = servletContext.getInitParameter(PARAM_MANAGED_API_TRANSPORTS); - if (transports == null || transports.isEmpty()) { - if (log.isDebugEnabled()) { - log.debug("'managed-api-transports' attribute is not configured. Therefore using the default, " + - "which is 'https'"); - } - transports = "https"; - } - apiConfig.setTransports(transports); - - return apiConfig; - } + private static final String API_CONFIG_DEFAULT_VERSION = "1.0.0"; + + private static final String PARAM_MANAGED_API_ENABLED = "managed-api-enabled"; + private static final String PARAM_MANAGED_API_NAME = "managed-api-name"; + private static final String PARAM_MANAGED_API_VERSION = "managed-api-version"; + private static final String PARAM_MANAGED_API_CONTEXT = "managed-api-context"; + private static final String PARAM_MANAGED_API_ENDPOINT = "managed-api-endpoint"; + private static final String PARAM_MANAGED_API_OWNER = "managed-api-owner"; + private static final String PARAM_MANAGED_API_TRANSPORTS = "managed-api-transports"; + private static final String PARAM_MANAGED_API_IS_SECURED = "managed-api-isSecured"; + private static final String PARAM_MANAGED_API_APPLICATION = "managed-api-application"; + private static final String PARAM_MANAGED_API_CONTEXT_TEMPLATE = "managed-api-context-template"; + private static final String PARAM_SHARED_WITH_ALL_TENANTS = "isSharedWithAllTenants"; + private static final String PARAM_PROVIDER_TENANT_DOMAIN = "providerTenantDomain"; + private static final Log log = LogFactory.getLog(APIPublisherLifecycleListener.class); + + @Override + public void lifecycleEvent(LifecycleEvent lifecycleEvent) { + if (Lifecycle.AFTER_START_EVENT.equals(lifecycleEvent.getType())) { + StandardContext context = (StandardContext) lifecycleEvent.getLifecycle(); + ServletContext servletContext = context.getServletContext(); + String param = servletContext.getInitParameter(PARAM_MANAGED_API_ENABLED); + boolean isManagedApi = (param != null && !param.isEmpty()) && Boolean.parseBoolean(param); + + if (isManagedApi) { + try { + AnnotationUtil annotationUtil = new AnnotationUtil(context); + Set annotatedAPIClasses = annotationUtil. + scanStandardContext(org.wso2.carbon.apimgt.annotations.api.API.class.getName()); + List apiDefinitions = annotationUtil.extractAPIInfo(annotatedAPIClasses); + + for (APIResourceConfiguration apiDefinition : apiDefinitions) { + APIConfig apiConfig = this.buildApiConfig(servletContext, apiDefinition); + try { + int tenantId = APIPublisherDataHolder.getInstance().getTenantManager().getTenantId(apiConfig.getTenantDomain()); + boolean isTenantActive = APIPublisherDataHolder.getInstance().getTenantManager().isTenantActive(tenantId); + if (isTenantActive) { + apiConfig.init(); + API api = APIPublisherUtil.getAPI(apiConfig); + APIPublisherService apiPublisherService = + APIPublisherDataHolder.getInstance().getApiPublisherService(); + if (apiPublisherService == null) { + throw new IllegalStateException( + "API Publisher service is not initialized properly"); + } + apiPublisherService.publishAPI(api); + } else { + log.error("No tenant [" + apiConfig.getTenantDomain() + "] found when publishing the webapp"); + } + } catch (Throwable e) { + log.error("Error occurred while publishing API '" + apiConfig.getName() + + "' with the context '" + apiConfig.getContext() + + "' and version '" + apiConfig.getVersion() + "'", e); + } + } + } catch (IOException e) { + log.error("Error enconterd while discovering annotated classes", e); + } catch (ClassNotFoundException e) { + log.error("Error while scanning class for annotations", e); + } + } + } + } + + private List mergeAPIDefinitions(List inputList) { + //TODO : Need to implemented, to merge API Definitions in cases where implementation of an API Lies in two + // classes + return null; + } + + /** + * Build the API Configuration to be passed to APIM, from a given list of URL templates + * + * @param servletContext + * @return + */ + private APIConfig buildApiConfig(ServletContext servletContext, APIResourceConfiguration apidef) { + APIConfig apiConfig = new APIConfig(); + + String name = apidef.getName(); + if (name == null || name.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("API Name not set in @API Annotation"); + } + name = servletContext.getServletContextName(); + } + apiConfig.setName(name); + + String version = apidef.getVersion(); + if (version == null || version.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("'API Version not set in @API Annotation'"); + } + version = API_CONFIG_DEFAULT_VERSION; + } + apiConfig.setVersion(version); + + + String context = apidef.getContext(); + if (context == null || context.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("'API Context not set in @API Annotation'"); + } + context = servletContext.getContextPath(); + } + apiConfig.setContext(context); + + String[] tags = apidef.getTags(); + if (tags == null || tags.length == 0) { + if (log.isDebugEnabled()) { + log.debug("'API tag not set in @API Annotation'"); + } + } else { + apiConfig.setTags(tags); + } + + String contextTemplate = servletContext.getInitParameter(PARAM_MANAGED_API_CONTEXT_TEMPLATE); + if (contextTemplate == null || contextTemplate.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-context-template' attribute is not configured. Therefore, using the default," + + " " + + "which is the original context template assigned to the web application"); + } + contextTemplate = servletContext.getContextPath(); + } + apiConfig.setContextTemplate(contextTemplate); + + String endpoint = servletContext.getInitParameter(PARAM_MANAGED_API_ENDPOINT); + if (endpoint == null || endpoint.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-endpoint' attribute is not configured"); + } + endpoint = APIPublisherUtil.getApiEndpointUrl(context); + } + apiConfig.setEndpoint(endpoint); + + String owner = servletContext.getInitParameter(PARAM_MANAGED_API_OWNER); + if (owner == null || owner.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-owner' attribute is not configured"); + } + } + apiConfig.setOwner(owner); + + String isSecuredParam = servletContext.getInitParameter(PARAM_MANAGED_API_IS_SECURED); + boolean isSecured; + if (isSecuredParam == null || isSecuredParam.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-isSecured' attribute is not configured. Therefore, using the default, " + + "which is 'true'"); + } + isSecured = false; + } else { + isSecured = Boolean.parseBoolean(isSecuredParam); + } + apiConfig.setSecured(isSecured); + + String transports = servletContext.getInitParameter(PARAM_MANAGED_API_TRANSPORTS); + if (transports == null || transports.isEmpty()) { + if (log.isDebugEnabled()) { + log.debug("'managed-api-transports' attribute is not configured. Therefore using the default, " + + "which is 'https'"); + } + transports = "https"; + } + apiConfig.setTransports(transports); + + String sharingValueParam = servletContext.getInitParameter(PARAM_SHARED_WITH_ALL_TENANTS); + boolean isSharedWithAllTenants = (sharingValueParam == null || (!sharingValueParam.isEmpty()) && Boolean.parseBoolean(sharingValueParam) ); + apiConfig.setSharedWithAllTenants(isSharedWithAllTenants); + + String tenantDomain = servletContext.getInitParameter(PARAM_PROVIDER_TENANT_DOMAIN); + tenantDomain = (tenantDomain!= null && !tenantDomain.isEmpty()) ? tenantDomain : MultitenantConstants.SUPER_TENANT_DOMAIN_NAME; + apiConfig.setTenantDomain(tenantDomain); + + Set uriTemplates = new LinkedHashSet(); + for (APIResource apiResource : apidef.getResources()) { + URITemplate template = new URITemplate(); + template.setAuthType(apiResource.getAuthType()); + template.setHTTPVerb(apiResource.getHttpVerb()); + template.setResourceURI(apiResource.getUri()); + template.setUriTemplate(apiResource.getUriTemplate()); + uriTemplates.add(template); + } + apiConfig.setUriTemplates(uriTemplates); + + return apiConfig; + } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationUtil.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationUtil.java new file mode 100644 index 00000000000..31372e70c35 --- /dev/null +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationUtil.java @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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. + */ + +package org.wso2.carbon.apimgt.webapp.publisher.lifecycle.util; + +import org.apache.catalina.core.StandardContext; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.scannotation.AnnotationDB; +import org.scannotation.WarUrlFinder; +import org.wso2.carbon.apimgt.webapp.publisher.config.APIResource; +import org.wso2.carbon.apimgt.webapp.publisher.config.APIResourceConfiguration; +import javax.servlet.ServletContext; +import javax.ws.rs.*; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.*; + +public class AnnotationUtil { + + private static final Log log = LogFactory.getLog(AnnotationUtil.class); + + private static final String PACKAGE_ORG_APACHE = "org.apache"; + private static final String PACKAGE_ORG_CODEHAUS = "org.codehaus"; + private static final String PACKAGE_ORG_SPRINGFRAMEWORK = "org.springframework"; + private static final String AUTH_TYPE = "Any"; + private static final String PROTOCOL_HTTP = "http"; + private static final String SERVER_HOST = "carbon.local.ip"; + private static final String HTTP_PORT = "httpPort"; + public static final String DIR_WEB_INF_LIB = "/WEB-INF/lib"; + public static final String STRING_ARR = "string_arr"; + public static final String STRING = "string"; + + private StandardContext context; + private Method[] pathClazzMethods; + private Class pathClazz; + private ClassLoader classLoader; + private ServletContext servletContext; + + + public AnnotationUtil(final StandardContext context) { + this.context = context; + servletContext = context.getServletContext(); + classLoader = servletContext.getClassLoader(); + } + + /** + * Scan the context for classes with annotations + * @return + * @throws IOException + */ + public Set scanStandardContext(String className) throws IOException { + AnnotationDB db = new AnnotationDB(); + db.addIgnoredPackages(PACKAGE_ORG_APACHE); + db.addIgnoredPackages(PACKAGE_ORG_CODEHAUS); + db.addIgnoredPackages(PACKAGE_ORG_SPRINGFRAMEWORK); + + URL[] libPath = WarUrlFinder.findWebInfLibClasspaths(servletContext); + URL classPath = WarUrlFinder.findWebInfClassesPath(servletContext); + URL[] urls = (URL[]) ArrayUtils.add(libPath, libPath.length, classPath); + + db.scanArchives(urls); + + //Returns a list of classes with given Annotation + return db.getAnnotationIndex().get(className); + } + + /** + * Method identifies the URL templates and context by reading the annotations of a class + * @param entityClasses + * @return + */ + public List extractAPIInfo(Set entityClasses) + throws ClassNotFoundException { + + List apiResourceConfigs = new ArrayList(); + + if (entityClasses != null && !entityClasses.isEmpty()) { + for (final String className : entityClasses) { + + APIResourceConfiguration resource = + AccessController.doPrivileged(new PrivilegedAction() { + public APIResourceConfiguration run() { + Class clazz = null; + APIResourceConfiguration apiResourceConfig = null; + try { + clazz = classLoader.loadClass(className); + Class apiClazz = (Class) + classLoader.loadClass(org.wso2.carbon.apimgt.annotations.api.API.class.getName()); + Annotation apiAnno = clazz.getAnnotation(apiClazz); + + List resourceList = null; + apiResourceConfig = new APIResourceConfiguration(); + + if (apiAnno != null) { + + Method[] apiClazzMethods = apiClazz.getMethods(); + + if (log.isDebugEnabled()) { + log.debug("Application Context root = " + servletContext.getContextPath()); + } + + try { + for(int k=0;k) classLoader.loadClass(Path.class.getName()); + pathClazzMethods = pathClazz.getMethods(); + + Annotation rootContectAnno = clazz.getAnnotation(pathClazz); + if (rootContectAnno != null) { + rootContext = invokeMethod(pathClazzMethods[0], rootContectAnno, STRING); + if (log.isDebugEnabled()) { + log.debug("API Root Context = " + rootContext); + } + } + + Method[] annotatedMethods = clazz.getDeclaredMethods(); + resourceList = getApiResources(rootContext, annotatedMethods); + apiResourceConfig.setResources(resourceList); + } catch (Throwable throwable) { + log.error("Error encountered while scanning for annotations", throwable); + } + } + } catch (ClassNotFoundException e) { + log.error("Error when passing the api annotation for device type apis."); + } + return apiResourceConfig; + } + }); + apiResourceConfigs.add(resource); + } + } + return apiResourceConfigs; + } + + private List getApiResources(String rootContext, Method[] annotatedMethods) throws Throwable { + List resourceList; + resourceList = new ArrayList(); + for (Method method : annotatedMethods) { + Annotation methodContextAnno = method.getAnnotation(pathClazz); + if (methodContextAnno != null) { + String subCtx = invokeMethod(pathClazzMethods[0], methodContextAnno, STRING); + APIResource resource = new APIResource(); + resource.setUriTemplate(makeContextURLReady(subCtx)); + + String serverIP = System.getProperty(SERVER_HOST); + String httpServerPort = System.getProperty(HTTP_PORT); + + resource.setUri(PROTOCOL_HTTP + "://" + serverIP + ":" + httpServerPort + makeContextURLReady(rootContext) + makeContextURLReady(subCtx)); + resource.setAuthType(AUTH_TYPE); + + Annotation[] annotations = method.getDeclaredAnnotations(); + for(int i=0; i consumesClass = (Class) classLoader.loadClass(Consumes.class.getName()); + Method[] consumesClassMethods = consumesClass.getMethods(); + Annotation consumesAnno = method.getAnnotation(consumesClass); + resource.setConsumes(invokeMethod(consumesClassMethods[0], consumesAnno, STRING_ARR)); + } + if(annotations[i].annotationType().getName().equals(Produces.class.getName())){ + Class producesClass = (Class) classLoader.loadClass(Produces.class.getName()); + Method[] producesClassMethods = producesClass.getMethods(); + Annotation producesAnno = method.getAnnotation(producesClass); + resource.setProduces(invokeMethod(producesClassMethods[0], producesAnno, STRING_ARR)); + } + } + resourceList.add(resource); + } + } + return resourceList; + } + + private String makeContextURLReady(String context){ + if(context != null && !context.equalsIgnoreCase("")){ + if(context.startsWith("/")){ + return context; + }else{ + return "/"+context; + } + } + return ""; + } + + /** + * When an annotation and method is passed, this method invokes that executes said method against the annotation + * @param method + * @param annotation + * @param returnType + * @return + * @throws Throwable + */ + private String invokeMethod(Method method, Annotation annotation, String returnType) throws Throwable { + InvocationHandler methodHandler = Proxy.getInvocationHandler(annotation); + switch (returnType){ + case STRING: + return (String) methodHandler.invoke(annotation, method, null); + case STRING_ARR: + return ((String[])methodHandler.invoke(annotation, method, null))[0]; + default: + return null; + } + } + + /** + * When an annotation and method is passed, this method invokes that executes said method against the annotation + */ + private String[] invokeMethod(Method method, Annotation annotation) throws Throwable { + InvocationHandler methodHandler = Proxy.getInvocationHandler(annotation); + return ((String[])methodHandler.invoke(annotation, method, null)); + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml index 2eb681d9460..d135f26832f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml @@ -125,7 +125,7 @@ javax.servlet;resolution:=optional, javax.xml.*;resolution:=optional, org.apache.commons.lang, - javax.ws.rs;resolution:=optional, + javax.ws.rs;version="0.0.0", org.scannotation diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/pom.xml b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/pom.xml index dd3fe2d9e78..0f86757cea3 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/pom.xml +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/pom.xml @@ -133,10 +133,10 @@ ${project.artifactId} ${carbon.device.mgt.version} Device Management JWT Client Bundle - org.wso2.carbon.device.mgt.jwt.client.extension.internal + org.wso2.carbon.identity.jwt.client.extension.internal - !org.wso2.carbon.device.mgt.jwt.client.extension.internal, - org.wso2.carbon.device.mgt.jwt.client.extension.* + !org.wso2.carbon.identity.jwt.client.extension.internal, + org.wso2.carbon.identity.jwt.client.extension.* org.osgi.framework, diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/JWTClient.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/JWTClient.java index 0aa903d29a4..fc50292de54 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/JWTClient.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/JWTClient.java @@ -16,7 +16,7 @@ * under the License. */ -package org.wso2.carbon.device.mgt.jwt.client.extension; +package org.wso2.carbon.identity.jwt.client.extension; import com.nimbusds.jose.JOSEException; import com.nimbusds.jose.JWSAlgorithm; @@ -39,11 +39,11 @@ import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.core.util.KeyStoreManager; -import org.wso2.carbon.device.mgt.jwt.client.extension.constant.JWTConstants; -import org.wso2.carbon.device.mgt.jwt.client.extension.dto.AccessTokenInfo; -import org.wso2.carbon.device.mgt.jwt.client.extension.dto.JWTConfig; -import org.wso2.carbon.device.mgt.jwt.client.extension.exception.JWTClientException; -import org.wso2.carbon.device.mgt.jwt.client.extension.util.JWTClientUtil; +import org.wso2.carbon.identity.jwt.client.extension.constant.JWTConstants; +import org.wso2.carbon.identity.jwt.client.extension.dto.AccessTokenInfo; +import org.wso2.carbon.identity.jwt.client.extension.dto.JWTConfig; +import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; +import org.wso2.carbon.identity.jwt.client.extension.util.JWTClientUtil; import java.io.File; import java.io.IOException; diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/JWTClientManager.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/JWTClientManager.java index cafed79cb92..bea6664a108 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/JWTClientManager.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/JWTClientManager.java @@ -16,17 +16,17 @@ * under the License. */ -package org.wso2.carbon.device.mgt.jwt.client.extension; +package org.wso2.carbon.identity.jwt.client.extension; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.mgt.jwt.client.extension.dto.JWTConfig; -import org.wso2.carbon.device.mgt.jwt.client.extension.exception.JWTClientAlreadyExistsException; -import org.wso2.carbon.device.mgt.jwt.client.extension.exception.JWTClientConfigurationException; -import org.wso2.carbon.device.mgt.jwt.client.extension.exception.JWTClientException; -import org.wso2.carbon.device.mgt.jwt.client.extension.util.JWTClientUtil; +import org.wso2.carbon.identity.jwt.client.extension.dto.JWTConfig; +import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientAlreadyExistsException; +import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientConfigurationException; +import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; +import org.wso2.carbon.identity.jwt.client.extension.util.JWTClientUtil; import org.wso2.carbon.registry.core.Resource; import org.wso2.carbon.registry.core.exceptions.RegistryException; diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/constant/JWTConstants.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/constant/JWTConstants.java index 41358fe6276..106c5228009 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/constant/JWTConstants.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/constant/JWTConstants.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.wso2.carbon.device.mgt.jwt.client.extension.constant; +package org.wso2.carbon.identity.jwt.client.extension.constant; /** * This holds the constants related JWT client component. diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/dto/AccessTokenInfo.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/dto/AccessTokenInfo.java index 9c12c653ff5..146ddf128a1 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/dto/AccessTokenInfo.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/dto/AccessTokenInfo.java @@ -16,7 +16,7 @@ * under the License. */ -package org.wso2.carbon.device.mgt.jwt.client.extension.dto; +package org.wso2.carbon.identity.jwt.client.extension.dto; /** * This holds the token information that return from the token endpoint. diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/dto/JWTConfig.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/dto/JWTConfig.java index 6c41ae8c033..ba0b7ffe9b3 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/dto/JWTConfig.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/dto/JWTConfig.java @@ -1,4 +1,4 @@ -package org.wso2.carbon.device.mgt.jwt.client.extension.dto; +package org.wso2.carbon.identity.jwt.client.extension.dto; import java.util.ArrayList; import java.util.List; diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientAlreadyExistsException.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientAlreadyExistsException.java index cdcbfb64b2b..fab6d324c1e 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientAlreadyExistsException.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientAlreadyExistsException.java @@ -17,7 +17,7 @@ * */ -package org.wso2.carbon.device.mgt.jwt.client.extension.exception; +package org.wso2.carbon.identity.jwt.client.extension.exception; public class JWTClientAlreadyExistsException extends Exception { public JWTClientAlreadyExistsException() { diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientConfigurationException.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientConfigurationException.java index a7f9d742d4d..cd7e947fe00 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientConfigurationException.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientConfigurationException.java @@ -16,7 +16,7 @@ * under the License. * */ -package org.wso2.carbon.device.mgt.jwt.client.extension.exception; +package org.wso2.carbon.identity.jwt.client.extension.exception; public class JWTClientConfigurationException extends Exception { public JWTClientConfigurationException() { diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientException.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientException.java index e434fbcb23d..0808292371b 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientException.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/exception/JWTClientException.java @@ -16,7 +16,7 @@ * under the License. * */ -package org.wso2.carbon.device.mgt.jwt.client.extension.exception; +package org.wso2.carbon.identity.jwt.client.extension.exception; public class JWTClientException extends Exception{ public JWTClientException() { diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/internal/JWTClientExtensionDataHolder.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/internal/JWTClientExtensionDataHolder.java index 39d50961a77..8e66fd49ab8 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/internal/JWTClientExtensionDataHolder.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/internal/JWTClientExtensionDataHolder.java @@ -16,7 +16,7 @@ * under the License. * */ -package org.wso2.carbon.device.mgt.jwt.client.extension.internal; +package org.wso2.carbon.identity.jwt.client.extension.internal; import org.wso2.carbon.registry.core.service.RegistryService; import org.wso2.carbon.registry.core.service.TenantRegistryLoader; diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/internal/JWTClientExtensionServiceComponent.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/internal/JWTClientExtensionServiceComponent.java index 72dd99a56d8..ff59df5fd32 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/internal/JWTClientExtensionServiceComponent.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/internal/JWTClientExtensionServiceComponent.java @@ -16,12 +16,12 @@ * under the License. * */ -package org.wso2.carbon.device.mgt.jwt.client.extension.internal; +package org.wso2.carbon.identity.jwt.client.extension.internal; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.service.component.ComponentContext; -import org.wso2.carbon.device.mgt.jwt.client.extension.util.JWTClientUtil; +import org.wso2.carbon.identity.jwt.client.extension.util.JWTClientUtil; import org.wso2.carbon.registry.core.exceptions.RegistryException; import org.wso2.carbon.registry.core.service.RegistryService; import org.wso2.carbon.registry.core.service.TenantRegistryLoader; @@ -30,7 +30,7 @@ import org.wso2.carbon.user.core.service.RealmService; import java.io.IOException; /** - * @scr.component name="org.wso2.carbon.device.mgt.jwt.client.extension.internal.JWTClientExtensionServiceComponent" + * @scr.component name="org.wso2.carbon.identity.jwt.client.extension.internal.JWTClientExtensionServiceComponent" * immediate="true" * @scr.reference name="registry.service" * interface="org.wso2.carbon.registry.core.service.RegistryService" diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/util/JWTClientUtil.java b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/util/JWTClientUtil.java index 087fd172947..9cb0792487e 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/util/JWTClientUtil.java +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/src/main/java/org/wso2/carbon/identity/jwt/client/extension/util/JWTClientUtil.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.wso2.carbon.device.mgt.jwt.client.extension.util; +package org.wso2.carbon.identity.jwt.client.extension.util; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; @@ -29,7 +29,7 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.wso2.carbon.base.MultitenantConstants; import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.mgt.jwt.client.extension.internal.JWTClientExtensionDataHolder; +import org.wso2.carbon.identity.jwt.client.extension.internal.JWTClientExtensionDataHolder; import org.wso2.carbon.registry.core.Registry; import org.wso2.carbon.registry.core.Resource; import org.wso2.carbon.registry.core.exceptions.RegistryException; diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher.feature/src/main/resources/p2.inf b/features/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher.feature/src/main/resources/p2.inf index 417de1a4ccc..70f1acd33f8 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher.feature/src/main/resources/p2.inf +++ b/features/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher.feature/src/main/resources/p2.inf @@ -1,2 +1,2 @@ instructions.configure = \ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/conf/device-analytics-config.xml,target:${installFolder}/../../conf/etc/device-analytics-config.xml,overwrite:true);\ \ No newline at end of file +org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.analytics.data.publisher_${feature.version}/conf/device-analytics-config.xml,target:${installFolder}/../../conf/etc/device-analytics-config.xml,overwrite:true);\ \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8df08f33847..74257bdcccf 100644 --- a/pom.xml +++ b/pom.xml @@ -445,6 +445,11 @@ + + org.wso2.carbon.governance + org.wso2.carbon.governance.lcm + ${carbon.governance.version} + From 3a3e9cc6492474975507dd50e9d381f17a3aaf6b Mon Sep 17 00:00:00 2001 From: ayyoob Date: Thu, 31 Mar 2016 05:55:03 +0530 Subject: [PATCH 7/8] changed analytics components to released version --- .../device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml | 2 +- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml index d135f26832f..6cb83f59746 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml @@ -125,7 +125,7 @@ javax.servlet;resolution:=optional, javax.xml.*;resolution:=optional, org.apache.commons.lang, - javax.ws.rs;version="0.0.0", + javax.ws.rs;version="0.0.0";resolution:=optional, org.scannotation diff --git a/pom.xml b/pom.xml index 74257bdcccf..3711d3cfe9c 100644 --- a/pom.xml +++ b/pom.xml @@ -1727,8 +1727,8 @@ [5.0.11,6.0.0) - 1.0.6-SNAPSHOT - [1.0.6,2.0.0] + 1.0.5 + [1.0.5,2.0.0] 4.4.8 From 733884cba7e114f1f584084e43c17797d99b7b9f Mon Sep 17 00:00:00 2001 From: ayyoob Date: Thu, 31 Mar 2016 15:10:37 +0530 Subject: [PATCH 8/8] added web app tenant authorisation for tenant for non managed api scenario --- .../framework/WebappAuthenticationValve.java | 13 +++++ .../authorizer/WebappTenantAuthorizer.java | 49 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authorizer/WebappTenantAuthorizer.java diff --git a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/WebappAuthenticationValve.java b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/WebappAuthenticationValve.java index b701b9bf966..f7211fef132 100644 --- a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/WebappAuthenticationValve.java +++ b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/WebappAuthenticationValve.java @@ -26,6 +26,7 @@ import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve; import org.wso2.carbon.tomcat.ext.valves.CompositeValve; import org.wso2.carbon.webapp.authenticator.framework.authenticator.WebappAuthenticator; +import org.wso2.carbon.webapp.authenticator.framework.authorizer.WebappTenantAuthorizer; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; @@ -44,6 +45,8 @@ public class WebappAuthenticationValve extends CarbonTomcatValve { return; } + + WebappAuthenticator authenticator = WebappAuthenticatorFactory.getAuthenticator(request); if (authenticator == null) { String msg = "Failed to load an appropriate authenticator to authenticate the request"; @@ -51,6 +54,11 @@ public class WebappAuthenticationValve extends CarbonTomcatValve { return; } AuthenticationInfo authenticationInfo = authenticator.authenticate(request, response); + if (isManagedAPI(request) && (authenticationInfo.getStatus() == WebappAuthenticator.Status.CONTINUE || + authenticationInfo.getStatus() == WebappAuthenticator.Status.SUCCESS)) { + WebappAuthenticator.Status status = WebappTenantAuthorizer.authorize(request, authenticationInfo); + authenticationInfo.setStatus(status); + } if (authenticationInfo.getTenantId() != -1) { try { PrivilegedCarbonContext.startTenantFlow(); @@ -77,6 +85,11 @@ public class WebappAuthenticationValve extends CarbonTomcatValve { return (param == null || !Boolean.parseBoolean(param) || isNonSecuredEndPoint(request)); } + private boolean isManagedAPI(Request request) { + String param = request.getContext().findParameter("managed-api-enabled"); + return (param != null && Boolean.parseBoolean(param)); + } + private boolean isContextSkipped(Request request) { String ctx = request.getContext().getPath(); if (ctx == null || "".equals(ctx)) { diff --git a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authorizer/WebappTenantAuthorizer.java b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authorizer/WebappTenantAuthorizer.java new file mode 100644 index 00000000000..e6a55eba89d --- /dev/null +++ b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/src/main/java/org/wso2/carbon/webapp/authenticator/framework/authorizer/WebappTenantAuthorizer.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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. + */ + +package org.wso2.carbon.webapp.authenticator.framework.authorizer; + +import org.apache.catalina.connector.Request; +import org.wso2.carbon.webapp.authenticator.framework.AuthenticationInfo; +import org.wso2.carbon.webapp.authenticator.framework.authenticator.WebappAuthenticator; + +/** + * This class represents the methods that are used to authorize requests based on the tenant subscription. + */ +public class WebappTenantAuthorizer { + private static final String SHARED_WITH_ALL_TENANTS_PARAM_NAME = "isSharedWithAllTenants"; + private static final String PROVIDER_TENANT_DOMAIN_PARAM_NAME = "providerTenantDomain"; + + public static WebappAuthenticator.Status authorize(Request request, AuthenticationInfo authenticationInfo) { + String tenantDomain = authenticationInfo.getTenantDomain(); + if (tenantDomain != null && isSharedWithAllTenants(request) || isProviderTenant(request, tenantDomain)) { + return WebappAuthenticator.Status.CONTINUE; + } + return WebappAuthenticator.Status.FAILURE; + } + + private static boolean isSharedWithAllTenants(Request request) { + String param = request.getContext().findParameter(SHARED_WITH_ALL_TENANTS_PARAM_NAME); + return (param == null || Boolean.parseBoolean(param)); + } + + private static boolean isProviderTenant(Request request, String requestTenantDomain) { + String param = request.getContext().findParameter(PROVIDER_TENANT_DOMAIN_PARAM_NAME); + return (param == null || requestTenantDomain.equals(param)); + } +}