From 41def8fe76512a397ea0d2a1698fef40e5d11938 Mon Sep 17 00:00:00 2001 From: sinthuja Date: Fri, 9 Jun 2017 19:04:02 +0530 Subject: [PATCH] Adding first cut of platform manager capabilities. --- .../application/mgt/common/Platform.java | 101 +++++- .../PlatformManagementException.java | 29 ++ .../mgt/common/services/PlatformManager.java | 20 ++ .../pom.xml | 7 + .../mgt/core/config/Configuration.java | 2 +- .../mgt/core/config/ConfigurationManager.java | 6 + .../application/mgt/core/dao/PlatformDAO.java | 15 + .../mgt/core/dao/common/DAOFactory.java | 11 +- .../mgt/core/dao/impl/PlatformDAOImpl.java | 295 ++++++++++++++++++ .../mgt/core/deployer/Platform.java | 88 ++++++ .../mgt/core/deployer/PlatformDeployer.java | 118 +++++++ .../mgt/core/deployer/Property.java | 57 ++++ .../PlatformManagementDAOException.java | 31 ++ .../mgt/core/impl/ApplicationManagerImpl.java | 3 +- .../mgt/core/impl/PlatformManagerImpl.java | 77 +++++ .../mgt/core/internal/DataHolder.java | 20 +- .../mgt/core/internal/ServiceComponent.java | 16 + .../mgt/core/util/ConnectionManagerUtil.java | 3 +- .../application/mgt/core/util/Constants.java | 2 + .../src/main/resources/META-INF/component.xml | 23 ++ .../src/test/resources/Platform.xml | 6 + .../src/test/resources/h2.sql | 29 ++ .../pom.xml | 141 --------- components/application-mgt/pom.xml | 2 +- 24 files changed, 945 insertions(+), 157 deletions(-) create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/PlatformManagementException.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/PlatformDAOImpl.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/Platform.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/PlatformDeployer.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/Property.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/PlatformManagementDAOException.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/resources/META-INF/component.xml create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/Platform.xml create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/h2.sql delete mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.extensions/pom.xml diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Platform.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Platform.java index 27550b9ecc..a03540ea8f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Platform.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Platform.java @@ -20,10 +20,10 @@ package org.wso2.carbon.device.application.mgt.common; import org.wso2.carbon.device.application.mgt.common.jaxrs.Exclude; +import java.util.ArrayList; import java.util.List; -import java.util.Map; -public class Platform { +public class Platform implements Cloneable { @Exclude private int id; @@ -36,9 +36,39 @@ public class Platform { private String iconName; + private boolean fileBased; + + private boolean shared; + private List tags; - private Map properties; + private List properties; + + public Platform(Platform platform) { + this.id = platform.getId(); + this.name = platform.getName(); + this.description = platform.getDescription(); + this.code = platform.getCode(); + this.iconName = platform.getIconName(); + this.fileBased = platform.isFileBased(); + this.shared = platform.isShared(); + if (platform.getProperties() != null) { + this.properties = new ArrayList<>(); + for (Property property : platform.getProperties()) { + this.properties.add(new Property(property)); + } + } + if (platform.getTags() != null) { + this.tags = new ArrayList<>(); + for (String tag : platform.getTags()) { + this.tags.add(tag); + } + } + } + + public Platform() { + + } public int getId() { return id; @@ -69,6 +99,9 @@ public class Platform { } public void setCode(String code) { + if (code != null) { + code = code.trim().toLowerCase(); + } this.code = code; } @@ -80,11 +113,11 @@ public class Platform { this.iconName = iconName; } - public Map getProperties() { + public List getProperties() { return properties; } - public void setProperties(Map properties) { + public void setProperties(List properties) { this.properties = properties; } @@ -95,4 +128,62 @@ public class Platform { public void setTags(List tags) { this.tags = tags; } + + public boolean isFileBased() { + return fileBased; + } + + public void setFileBased(boolean fileBased) { + this.fileBased = fileBased; + } + + public boolean isShared() { + return shared; + } + + public void setShared(boolean shared) { + this.shared = shared; + } + + + public static class Property implements Cloneable { + + private String name; + private boolean optional; + private String defaultValue; + + public Property(Property property) { + this.name = property.getName(); + this.optional = property.isOptional(); + this.defaultValue = property.getDefaultValue(); + } + + public Property() { + + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isOptional() { + return optional; + } + + public void setOptional(boolean optional) { + this.optional = optional; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/PlatformManagementException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/PlatformManagementException.java new file mode 100644 index 0000000000..b7daea0c29 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/PlatformManagementException.java @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2017, 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.application.mgt.common.exception; + +public class PlatformManagementException extends ApplicationManagementException { + + public PlatformManagementException(String message, Throwable ex) { + super(message, ex); + } + + public PlatformManagementException(String message) { + super(message); + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/PlatformManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/PlatformManager.java index fb57b924a3..d21b4b533a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/PlatformManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/PlatformManager.java @@ -18,5 +18,25 @@ */ package org.wso2.carbon.device.application.mgt.common.services; +import org.wso2.carbon.device.application.mgt.common.Platform; +import org.wso2.carbon.device.application.mgt.common.exception.PlatformManagementException; + +import java.util.List; + +/** + * Platform manager is responsible for handling platforms, which will be used to as a registry of platforms. + * And will be able to provide the platforms related informations to other classes which requires. + */ public interface PlatformManager { + + List getPlatforms(String tenantDomain) throws PlatformManagementException; + + void register(String tenantDomain, Platform platform) throws PlatformManagementException; + + void unregister(String tenantDomain, String platformCode, boolean isFileBased) throws PlatformManagementException; + + void addMapping(String tenantDomain, String platformCode) throws PlatformManagementException; + + void removeMapping(String tenantDomain, String platformCode) throws PlatformManagementException; + } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml index f40fb22813..a624f13cd2 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml @@ -71,11 +71,14 @@ org.wso2.carbon.device.application.mgt.common.*, org.wso2.carbon.device.mgt.core.*, org.wso2.carbon.device.mgt.common.*, + org.apache.axis2.*, + org.wso2.carbon.user.core.* !org.wso2.carbon.device.application.mgt.core.internal.*, org.wso2.carbon.device.application.mgt.core.* + PlatformDeployer @@ -152,6 +155,10 @@ org.wso2.carbon.devicemgt org.wso2.carbon.device.mgt.core + + org.wso2.carbon + org.wso2.carbon.user.core + diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/Configuration.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/Configuration.java index b41501c7a3..967a396bef 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/Configuration.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/Configuration.java @@ -18,7 +18,7 @@ */ package org.wso2.carbon.device.application.mgt.core.config; -import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException; +import org.wso2.carbon.device.application.mgt.core.deployer.Platform; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/ConfigurationManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/ConfigurationManager.java index d81240e573..cf959cb91d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/ConfigurationManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/ConfigurationManager.java @@ -22,11 +22,16 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException; +import org.wso2.carbon.device.application.mgt.core.deployer.Platform; +import org.wso2.carbon.device.application.mgt.core.deployer.Property; +import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.core.util.Constants; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import java.io.File; +import java.util.ArrayList; +import java.util.List; public class ConfigurationManager { @@ -73,6 +78,7 @@ public class ConfigurationManager { if (configPath == null) { configPath = Constants.DEFAULT_CONFIG_FILE_LOCATION; } + //TODO: Add validation for the configurations this.configuration = (Configuration) unmarshaller.unmarshal(new File(configPath)); } catch (Exception e) { log.error(e); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/PlatformDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/PlatformDAO.java index b1ff1bf97e..5540bfe0a0 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/PlatformDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/PlatformDAO.java @@ -18,6 +18,21 @@ */ package org.wso2.carbon.device.application.mgt.core.dao; +import org.wso2.carbon.device.application.mgt.common.Platform; +import org.wso2.carbon.device.application.mgt.core.exception.PlatformManagementDAOException; + +import java.util.List; + public interface PlatformDAO { + void register(String tenantDomain, Platform platform) throws PlatformManagementDAOException; + + void unregister(String tenantDomain, String platformCode) throws PlatformManagementDAOException; + + void addMapping(String tenantDomain, String platformCode) throws PlatformManagementDAOException; + + void removeMapping(String tenantDomain, String platformCode) throws PlatformManagementDAOException; + + List getPlatforms(String tenantDomain) throws PlatformManagementDAOException; + } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/DAOFactory.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/DAOFactory.java index 71c3e675fa..7f89c53575 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/DAOFactory.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/DAOFactory.java @@ -22,13 +22,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.application.mgt.common.exception.UnsupportedDatabaseEngineException; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; +import org.wso2.carbon.device.application.mgt.core.dao.PlatformDAO; +import org.wso2.carbon.device.application.mgt.core.dao.impl.PlatformDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.application.H2ApplicationDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.application.MySQLApplicationDAOImpl; import org.wso2.carbon.device.application.mgt.core.util.Constants; import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; -import javax.sql.DataSource; - /** * This class intends to act as the primary entity that hides all DAO instantiation related complexities and logic so @@ -59,4 +59,11 @@ public class DAOFactory { } throw new IllegalStateException("Database engine has not initialized properly."); } + + public static PlatformDAO getPlatformDAO(){ + if (databaseEngine != null){ + return new PlatformDAOImpl(); + } + throw new IllegalStateException("Database engine has not initialized properly."); + } } \ No newline at end of file diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/PlatformDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/PlatformDAOImpl.java new file mode 100644 index 0000000000..209788094c --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/PlatformDAOImpl.java @@ -0,0 +1,295 @@ +/* +* Copyright (c) 2017, 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.application.mgt.core.dao.impl; + + +import org.wso2.carbon.device.application.mgt.common.Platform; +import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; +import org.wso2.carbon.device.application.mgt.common.exception.TransactionManagementException; +import org.wso2.carbon.device.application.mgt.core.dao.PlatformDAO; +import org.wso2.carbon.device.application.mgt.core.exception.PlatformManagementDAOException; +import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class PlatformDAOImpl implements PlatformDAO { + + @Override + public void register(String tenantDomain, Platform platform) throws PlatformManagementDAOException { + try { + ConnectionManagerUtil.beginTransaction(); + if (getPlatformId(tenantDomain, platform.getCode()) == -1) { + Connection connection = ConnectionManagerUtil.getConnection(); + + String insertToPlatform = "INSERT INTO APPM_PLATFORM (CODE, TENANT_DOMAIN, NAME, DESCRIPTION, IS_SHARED, ICON_NAME)" + + " VALUES (?, ?, ?, ?, ?, ?)"; + PreparedStatement preparedStatement = connection.prepareStatement(insertToPlatform); + preparedStatement.setString(1, platform.getCode()); + preparedStatement.setString(2, tenantDomain); + preparedStatement.setString(3, platform.getName()); + preparedStatement.setString(4, platform.getDescription()); + preparedStatement.setBoolean(5, platform.isShared()); + preparedStatement.setString(6, platform.getIconName()); + preparedStatement.execute(); + + int platformID = getPlatformId(tenantDomain, platform.getCode()); + + String insertPlatformProps = "INSERT INTO APPM_PLATFORM_PROPERTIES (PLATFORM_ID, PROP_NAME, OPTIONAL, DEFAULT_VALUE) VALUES " + + "( ? , ?, ? , ?)"; + for (Platform.Property property : platform.getProperties()) { + preparedStatement = connection.prepareStatement(insertPlatformProps); + preparedStatement.setInt(1, platformID); + preparedStatement.setString(2, property.getName()); + preparedStatement.setBoolean(3, property.isOptional()); + preparedStatement.setString(4, property.getDefaultValue()); + preparedStatement.execute(); + } + ConnectionManagerUtil.commitTransaction(); + } else { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Platform - " + platform.getCode() + + " is already registered for tenant - " + tenantDomain); + } + } catch (TransactionManagementException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Unable to start the transaction while trying to register the platform - " + + platform.getCode() + " for tenant - " + tenantDomain, e); + } catch (DBConnectionException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Unable to obtain the connection while trying to register the platform - " + + platform.getCode() + " for tenant - " + tenantDomain, e); + } catch (SQLException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Error while executing the SQL query. ", e); + } catch (PlatformManagementDAOException ex) { + ConnectionManagerUtil.rollbackTransaction(); + throw ex; + } finally { + ConnectionManagerUtil.closeConnection(); + } + } + + private int getPlatformId(String tenantDomain, String platformCode) throws PlatformManagementDAOException { + String query = "SELECT ID FROM APPM_PLATFORM WHERE (TENANT_DOMAIN=? AND CODE=?) OR (IS_SHARED = TRUE AND CODE=?)"; + try { + Connection connection = ConnectionManagerUtil.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(query); + preparedStatement.setString(1, tenantDomain); + preparedStatement.setString(2, platformCode); + preparedStatement.setString(3, platformCode); + ResultSet resultSet = preparedStatement.executeQuery(); + if (resultSet.next()) { + return resultSet.getInt("ID"); + } + return -1; + } catch (DBConnectionException e) { + throw new PlatformManagementDAOException("Error when trying to obtaining the database connection.", e); + } catch (SQLException e) { + throw new PlatformManagementDAOException("Error in executing the query - " + query, e); + } + } + + + @Override + public void unregister(String tenantDomain, String platformCode) throws PlatformManagementDAOException { + try { + ConnectionManagerUtil.beginTransaction(); + int platformId = getPlatformId(tenantDomain, platformCode); + if (platformId != -1) { + Connection connection = ConnectionManagerUtil.getConnection(); + + String deletePlatform = "DELETE FROM APPM_PLATFORM WHERE ID = ?"; + PreparedStatement preparedStatement = connection.prepareStatement(deletePlatform); + preparedStatement.setInt(1, platformId); + preparedStatement.execute(); + + ConnectionManagerUtil.commitTransaction(); + } else { + throw new PlatformManagementDAOException("Platform - " + platformCode + + " is already unregistered registered for tenant - " + tenantDomain); + } + } catch (TransactionManagementException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Unable to start the transaction while trying to register the platform - " + + platformCode + " for tenant - " + tenantDomain, e); + } catch (DBConnectionException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Unable to obtain the connection while trying to register the platform - " + + platformCode + " for tenant - " + tenantDomain, e); + } catch (SQLException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Error while executing the SQL query. ", e); + } catch (PlatformManagementDAOException ex) { + ConnectionManagerUtil.rollbackTransaction(); + throw ex; + } finally { + ConnectionManagerUtil.closeConnection(); + } + } + + public void addMapping(String tenantDomain, String platformCode) throws PlatformManagementDAOException { + String insertMapping = "INSERT INTO APPM_PLATFORM_TENANT_MAPPING(TENANT_DOMAIN, PLATFORM_CODE) VALUES (?, ?)"; + try { + ConnectionManagerUtil.beginTransaction(); + if (getTenantPlatformMapping(tenantDomain, platformCode) != -1) { + Connection connection = ConnectionManagerUtil.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(insertMapping); + preparedStatement.execute(); + ConnectionManagerUtil.commitTransaction(); + } else { + throw new PlatformManagementDAOException("Platform - " + platformCode + " is already assigned to tenant domain - " + tenantDomain); + } + } catch (TransactionManagementException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Error occured while trying to add the mapping of platform - " + + platformCode + " for tenant - " + tenantDomain, e); + } catch (DBConnectionException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Error occurred when getting the connection for the database. ", e); + } catch (SQLException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Error occured while executing the SQL query - " + insertMapping, e); + } catch (PlatformManagementDAOException ex) { + ConnectionManagerUtil.rollbackTransaction(); + throw ex; + } finally { + ConnectionManagerUtil.closeConnection(); + } + } + + private int getTenantPlatformMapping(String tenantDomain, String platformCode) throws PlatformManagementDAOException { + String getMapping = "SELECT ID FROM APPM_PLATFORM_TENANT_MAPPING WHERE TENANT_DOMAIN=? AND PLATFORM_CODE=?"; + try { + Connection connection = ConnectionManagerUtil.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(getMapping); + preparedStatement.setString(1, tenantDomain); + preparedStatement.setString(2, platformCode); + ResultSet resultSet = preparedStatement.executeQuery(); + if (resultSet.next()) { + return resultSet.getInt("ID"); + } + return -1; + } catch (DBConnectionException e) { + throw new PlatformManagementDAOException("Error occured while obtaining the connection to get the existing " + + "Tenant - Platform Mapping.", e); + } catch (SQLException e) { + throw new PlatformManagementDAOException("Error occured while executing the SQL query - " + getMapping, e); + } + } + + public void removeMapping(String tenantDomain, String platformCode) throws PlatformManagementDAOException { + String deleteMapping = "DELETE FROM APPM_PLATFORM_TENANT_MAPPING WHERE ID = ?"; + try { + ConnectionManagerUtil.beginTransaction(); + int mappingId = getTenantPlatformMapping(tenantDomain, platformCode); + if (mappingId != -1) { + Connection connection = ConnectionManagerUtil.getConnection(); + + PreparedStatement preparedStatement = connection.prepareStatement(deleteMapping); + preparedStatement.setInt(1, mappingId); + preparedStatement.execute(); + + ConnectionManagerUtil.commitTransaction(); + } else { + throw new PlatformManagementDAOException("Platform - " + platformCode + + " is already unassigned for tenant - " + tenantDomain); + } + } catch (TransactionManagementException | DBConnectionException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Error occurred while unassigning the platform - " + platformCode + + " for tenant - " + tenantDomain); + } catch (SQLException e) { + ConnectionManagerUtil.rollbackTransaction(); + throw new PlatformManagementDAOException("Error occured while executing the query - " + deleteMapping); + } catch (PlatformManagementDAOException ex) { + ConnectionManagerUtil.rollbackTransaction(); + throw ex; + } finally { + ConnectionManagerUtil.closeConnection(); + } + } + + @Override + public List getPlatforms(String tenantDomain) throws PlatformManagementDAOException { + String selectQuery = "SELECT PLATFORM_CODE FROM APPM_PLATFORM_TENANT_MAPPING WHERE TENANT_DOMAIN=?"; + try { + Connection connection = ConnectionManagerUtil.openConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(selectQuery); + ResultSet resultSet = preparedStatement.executeQuery(); + List platforms = new ArrayList<>(); + while (resultSet.next()) { + String platformCode = resultSet.getString(1); + platforms.add(getPlatform(tenantDomain, platformCode)); + } + return platforms; + } catch (DBConnectionException e) { + throw new PlatformManagementDAOException("Error occured when loading the platforms for tenant - " + tenantDomain, e); + } catch (SQLException e) { + throw new PlatformManagementDAOException("Error occured when executing query - " + selectQuery, e); + } finally { + ConnectionManagerUtil.closeConnection(); + } + } + + private Platform getPlatform(String tenantDomain, String platformCode) throws PlatformManagementDAOException { + String platformQuery = "SELECT * FROM (SELECT * FROM APPM_PLATFORM WHERE (TENANT_DOMAIN=? AND CODE=?) PLATFORM " + + "LEFT JOIN APPM_PLATFORM_PROPERTIES PROPS ON PLATFORM.ID = PROPS.PLATFORM_ID ORDER BY PLATFORM.CODE DESC"; + try { + Connection connection = ConnectionManagerUtil.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(platformQuery); + preparedStatement.setString(1, tenantDomain); + preparedStatement.setString(2, platformCode); + ResultSet resultSet = preparedStatement.executeQuery(); + Platform platform = new Platform(); + if (resultSet.next()) { + platform.setId(resultSet.getInt("PLATFORM.ID")); + platform.setCode(platformCode); + platform.setName(resultSet.getString("PLATFORM.NAME")); + platform.setIconName(resultSet.getString("PLATFORM.DESCRIPTION")); + platform.setIconName(resultSet.getString("PLATFORM.ICON_NAME")); + platform.setShared(resultSet.getBoolean("PLATFORM.IS_SHARED")); + platform.setFileBased(false); + List properties = new ArrayList<>(); + do { + if (resultSet.getString("PROPS.PROP_NAME") != null) { + Platform.Property property = new Platform.Property(); + property.setName(resultSet.getString("PROPS.PROP_NAME")); + property.setOptional(resultSet.getBoolean("PROPS.OPTIONAL")); + property.setDefaultValue(resultSet.getString("PROPS.DEFAUL_VALUE")); + properties.add(property); + } + } while (resultSet.next()); + platform.setProperties(properties); + } else { + platform.setCode(platformCode); + platform.setFileBased(true); + } + return platform; + } catch (DBConnectionException e) { + throw new PlatformManagementDAOException("Error when loading the platform - " + platformCode, e); + } catch (SQLException e) { + throw new PlatformManagementDAOException("Error in executing the query - " + platformQuery, e); + } + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/Platform.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/Platform.java new file mode 100644 index 0000000000..0fa38308c2 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/Platform.java @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2017, 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.application.mgt.core.deployer; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement(name = "Platform") +public class Platform { + + private String id; + private String name; + private String description; + private String icon; + private boolean shared; + private List properties; + + @XmlAttribute(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlAttribute(name = "name") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @XmlElement(name = "Property") + public List getProperties() { + return properties; + } + + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + @XmlAttribute(name = "icon") + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + @XmlAttribute(name = "isShared") + public boolean isShared() { + return shared; + } + + public void setShared(boolean shared) { + this.shared = shared; + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/PlatformDeployer.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/PlatformDeployer.java new file mode 100644 index 0000000000..42c5297e2d --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/PlatformDeployer.java @@ -0,0 +1,118 @@ +/* +* Copyright (c) 2017, 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.application.mgt.core.deployer; + +import org.apache.axis2.context.ConfigurationContext; +import org.apache.axis2.deployment.AbstractDeployer; +import org.apache.axis2.deployment.DeploymentException; +import org.apache.axis2.deployment.repository.util.DeploymentFileData; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.device.application.mgt.common.exception.PlatformManagementException; +import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; +import org.wso2.carbon.device.application.mgt.core.util.Constants; +import org.wso2.carbon.utils.multitenancy.MultitenantUtils; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class PlatformDeployer extends AbstractDeployer { + + private static final Log log = LogFactory.getLog(PlatformDeployer.class); + + @Override + public void init(ConfigurationContext configurationContext) { + File deployementDir = new File(MultitenantUtils.getAxis2RepositoryPath(CarbonContext.getThreadLocalCarbonContext(). + getTenantId()) + Constants.PLATFORMS_DEPLOYMENT_DIR_NAME); + if (!deployementDir.exists()) { + if (!deployementDir.mkdir()) { + log.warn("Unable to create the deployment dir at: " + deployementDir.getPath()); + } + } + } + + public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException { + File deploymentFile = new File(deploymentFileData.getAbsolutePath()); + try { + JAXBContext jaxbContext = JAXBContext.newInstance(Platform.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + Platform platformConf = (Platform) unmarshaller.unmarshal(deploymentFile); + if (platformConf.getName().contentEquals(getPlatformID(deploymentFile.getName()))) { + org.wso2.carbon.device.application.mgt.common.Platform platform = convert(platformConf); + DataHolder.getInstance().getPlatformManager().register(CarbonContext.getThreadLocalCarbonContext().getTenantDomain(), platform); + } else { + log.error("Unable to deploy the platform - " + deploymentFile.getAbsolutePath() + "!. Platform config file name - " + + deploymentFile.getName() + " should match with the 'id' provided within the platform configuration!"); + } + } catch (JAXBException e) { + log.error("Platform configuration file - " + deploymentFile.getAbsolutePath() + " is invalid!", e); + } catch (PlatformManagementException e) { + log.error("Unable to deploy the platform - " + deploymentFile.getAbsolutePath(), e); + } + } + + public void undeploy(String fileName) throws DeploymentException { + String platformId = getPlatformID(fileName); + try { + DataHolder.getInstance().getPlatformManager().unregister(CarbonContext.getThreadLocalCarbonContext().getTenantDomain(), platformId, true); + } catch (PlatformManagementException e) { + log.error("Error occurred while undeploying the platform - " + fileName); + } + } + + private static String getPlatformID(String deploymentFileName) { + if (deploymentFileName.contains(Constants.PLATFORM_DEPLOYMENT_EXT)) { + return deploymentFileName.substring(0, deploymentFileName.length() - + Constants.PLATFORM_DEPLOYMENT_EXT.length()); + } + return deploymentFileName; + } + + private org.wso2.carbon.device.application.mgt.common.Platform convert(Platform platformConfig) { + org.wso2.carbon.device.application.mgt.common.Platform platform = new org.wso2.carbon.device.application.mgt.common.Platform(); + platform.setCode(platformConfig.getId()); + platform.setName(platformConfig.getName()); + platform.setDescription(platformConfig.getDescription()); + platform.setIconName(platformConfig.getIcon()); + platform.setFileBased(true); + platform.setShared(platformConfig.isShared()); + List properties = new ArrayList<>(); + for (Property propertyConfig : platformConfig.getProperties()) { + org.wso2.carbon.device.application.mgt.common.Platform.Property property = new org.wso2.carbon.device.application.mgt.common.Platform.Property(); + property.setName(propertyConfig.getName()); + property.setDefaultValue(propertyConfig.getDefaultValue()); + property.setOptional(propertyConfig.isOptional()); + properties.add(property); + } + platform.setProperties(properties); + return platform; + } + + @Override + public void setDirectory(String s) { + } + + @Override + public void setExtension(String s) { + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/Property.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/Property.java new file mode 100644 index 0000000000..4290253fb7 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/deployer/Property.java @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2017, 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.application.mgt.core.deployer; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlValue; + +@XmlRootElement(name = "Property") +public class Property { + + private String name; + private boolean optional; + private String defaultValue; + + @XmlValue + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @XmlAttribute(name = "optional") + public boolean isOptional() { + return optional; + } + + public void setOptional(boolean optional) { + this.optional = optional; + } + + @XmlAttribute(name = "default") + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/PlatformManagementDAOException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/PlatformManagementDAOException.java new file mode 100644 index 0000000000..413efd6626 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/PlatformManagementDAOException.java @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2017, 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.application.mgt.core.exception; + +import org.wso2.carbon.device.application.mgt.common.exception.PlatformManagementException; + +public class PlatformManagementDAOException extends PlatformManagementException { + + public PlatformManagementDAOException(String message, Throwable ex) { + super(message, ex); + } + + public PlatformManagementDAOException(String message) { + super(message); + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index baa915ee9c..5fbb970ae9 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -22,6 +22,7 @@ import org.wso2.carbon.device.application.mgt.common.Application; import org.wso2.carbon.device.application.mgt.common.ApplicationList; import org.wso2.carbon.device.application.mgt.common.Filter; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory; @@ -39,7 +40,7 @@ public class ApplicationManagerImpl implements ApplicationManager { ConnectionManagerUtil.openConnection(); ApplicationDAO applicationDAO = DAOFactory.getApplicationDAO(); return applicationDAO.getApplications(filter); - } finally { + } finally { ConnectionManagerUtil.closeConnection(); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformManagerImpl.java index 52c302fde6..98e31bca1a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformManagerImpl.java @@ -17,7 +17,84 @@ */ package org.wso2.carbon.device.application.mgt.core.impl; +import org.wso2.carbon.device.application.mgt.common.Platform; import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; +import org.wso2.carbon.device.application.mgt.common.exception.PlatformManagementException; +import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory; +import org.wso2.carbon.utils.multitenancy.MultitenantConstants; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class PlatformManagerImpl implements PlatformManager { + private Map> inMemoryStore; + + public PlatformManagerImpl() { + this.inMemoryStore = new HashMap<>(); + } + + + @Override + public List getPlatforms(String tenantDomain) throws PlatformManagementException { + List platforms = DAOFactory.getPlatformDAO().getPlatforms(tenantDomain); + int platformIndex = 0; + for (Platform platform : platforms) { + if (platform.isFileBased()) { + Map superTenantPlatforms = this.inMemoryStore.get(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME); + Platform registeredPlatform = superTenantPlatforms.get(platform.getCode()); + if (registeredPlatform != null) { + platforms.set(platformIndex, new Platform(registeredPlatform)); + } else { + platforms.remove(platformIndex); + } + } + platformIndex++; + } + return platforms; + } + + @Override + public synchronized void register(String tenantDomain, Platform platform) throws PlatformManagementException { + if (platform.isShared() && !tenantDomain.equals(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME)) { + throw new PlatformManagementException("Platform sharing is a restricted operation, therefore Platform - " + + platform.getCode() + " cannot be shared by the tenant domain - " + tenantDomain); + } + if (platform.isFileBased()) { + Map tenantPlatforms = this.inMemoryStore.get(tenantDomain); + if (tenantPlatforms == null) { + tenantPlatforms = new HashMap<>(); + this.inMemoryStore.put(tenantDomain, tenantPlatforms); + } + if (tenantPlatforms.get(platform.getCode()) == null) { + tenantPlatforms.put(platform.getCode(), platform); + } else { + throw new PlatformManagementException("Platform - " + platform.getCode() + " is already registered!"); + } + } else { + DAOFactory.getPlatformDAO().register(tenantDomain, platform); + } + } + + @Override + public void unregister(String tenantDomain, String platformCode, boolean isFileBased) throws PlatformManagementException { + if (isFileBased) { + Map tenantPlatforms = this.inMemoryStore.get(tenantDomain); + if (tenantPlatforms != null) { + this.inMemoryStore.remove(platformCode); + } + } else { + DAOFactory.getPlatformDAO().unregister(tenantDomain, platformCode); + } + } + + @Override + public void addMapping(String tenantDomain, String platformCode) throws PlatformManagementException { + DAOFactory.getPlatformDAO().addMapping(tenantDomain, platformCode); + } + + @Override + public void removeMapping(String tenantDomain, String platformCode) throws PlatformManagementException { + DAOFactory.getPlatformDAO().removeMapping(tenantDomain, platformCode); + } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java index 948c143220..3b21fa0f0c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java @@ -20,12 +20,14 @@ package org.wso2.carbon.device.application.mgt.core.internal; import org.wso2.carbon.device.application.mgt.common.services.*; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; +import org.wso2.carbon.user.core.service.RealmService; public class DataHolder { - //TODO move the osgi classes here. private DeviceManagementProviderService deviceManagementService; + private RealmService realmService; + private ApplicationManager applicationManager; private ApplicationReleaseManager releaseManager; @@ -64,10 +66,6 @@ public class DataHolder { this.deviceManagementService = deviceManagementService; } - public static DataHolder getApplicationMgtDataHolder() { - return applicationMgtDataHolder; - } - public ApplicationManager getApplicationManager() { return applicationManager; } @@ -143,4 +141,16 @@ public class DataHolder { public void setApplicationUploadManager(ApplicationUploadManager applicationUploadManager) { this.applicationUploadManager = applicationUploadManager; } + + public ApplicationUploadManager getApplicationUploadManager() { + return applicationUploadManager; + } + + public RealmService getRealmService() { + return realmService; + } + + public void setRealmService(RealmService realmService) { + this.realmService = realmService; + } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java index 11a9957aa9..5e432f067d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java @@ -28,6 +28,7 @@ import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory; import org.wso2.carbon.device.application.mgt.core.util.ApplicationManagementUtil; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; +import org.wso2.carbon.user.core.service.RealmService; import javax.naming.NamingException; @@ -39,6 +40,13 @@ import javax.naming.NamingException; * policy="dynamic" * bind="setDeviceManagementService" * unbind="unsetDeviceManagementService" + * @scr.reference name="realm.service" + * immediate="true" + * interface="org.wso2.carbon.user.core.service.RealmService" + * cardinality="1..1" + * policy="dynamic" + * bind="setRealmService" + * unbind="unsetRealmService" */ public class ServiceComponent { @@ -119,4 +127,12 @@ public class ServiceComponent { } DataHolder.getInstance().setDeviceManagementService(null); } + + protected void setRealmService(RealmService realmService) { + DataHolder.getInstance().setRealmService(realmService); + } + + protected void unsetRealmService(RealmService realmService) { + DataHolder.getInstance().setRealmService(null); + } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ConnectionManagerUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ConnectionManagerUtil.java index b7c7d4830b..566e681f92 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ConnectionManagerUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ConnectionManagerUtil.java @@ -45,7 +45,7 @@ public class ConnectionManagerUtil { return currentConnection; } - public static void openConnection() throws DBConnectionException { + public static Connection openConnection() throws DBConnectionException { Connection conn = currentConnection.get(); if (conn != null) { throw new IllegalTransactionStateException("A transaction is already active within the context of " + @@ -60,6 +60,7 @@ public class ConnectionManagerUtil { } currentConnection.set(conn); currentTxState.set(TxState.CONNECTION_BORROWED); + return conn; } public static Connection getConnection() throws DBConnectionException { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/Constants.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/Constants.java index 6ed1fe951a..ace8622010 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/Constants.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/Constants.java @@ -28,6 +28,8 @@ public class Constants { public static final String DEFAULT_CONFIG_FILE_LOCATION = CarbonUtils.getCarbonConfigDirPath() + File.separator + Constants.APPLICATION_CONFIG_XML_FILE; + public static final String PLATFORMS_DEPLOYMENT_DIR_NAME = "platforms"; + public static final String PLATFORM_DEPLOYMENT_EXT = ".xml"; public static final class DataBaseTypes { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/resources/META-INF/component.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/resources/META-INF/component.xml new file mode 100644 index 0000000000..77d2788a7a --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/resources/META-INF/component.xml @@ -0,0 +1,23 @@ + + + + + platforms + xml + org.wso2.carbon.device.application.mgt.core.deployer.PlatformDeployer + + + diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/Platform.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/Platform.xml new file mode 100644 index 0000000000..e3a1db0b92 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/Platform.xml @@ -0,0 +1,6 @@ + + + test + number + + \ No newline at end of file diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/h2.sql b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/h2.sql new file mode 100644 index 0000000000..5733fcd55b --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/h2.sql @@ -0,0 +1,29 @@ +CREATE TABLE APPM_PLATFORM ( +ID INT NOT NULL AUTO_INCREMENT, +CODE VARCHAR (100) NOT NULL, +TENANT_DOMAIN VARCHAR (100) NOT NULL , +NAME VARCHAR (255) NOT NULL, +DESCRIPTION LONGVARCHAR, +IS_SHARED BOOLEAN, +ICON_NAME VARCHAR (100), +PRIMARY KEY (ID, CODE, TENANT_DOMAIN) +); + +CREATE TABLE APPM_PLATFORM_PROPERTIES ( +ID INT NOT NULL AUTO_INCREMENT, +PLATFORM_ID INTEGER NOT NULL, +PROP_NAME VARCHAR (100) NOT NULL, +OPTIONAL BOOLEAN, +DEFAUL_VALUE VARCHAR (255), +FOREIGN KEY(PLATFORM_ID) REFERENCES APPM_PLATFORM(ID) ON DELETE CASCADE, +PRIMARY KEY (ID, PLATFORM_ID, PROP_NAME) +); + +CREATE TABLE APPM_PLATFORM_TENANT_MAPPING ( +ID INT NOT NULL AUTO_INCREMENT, +TENANT_DOMAIN VARCHAR (100) NOT NULL , +PLATFORM_CODE VARCHAR (100) NOT NULL +FOREIGN KEY(PLATFORM_CODE) REFERENCES APPM_PLATFORM(CODE) ON DELETE CASCADE, +PRIMARY KEY (ID, TENANT_DOMAIN, PLATFORM_CODE) +) + diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.extensions/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.extensions/pom.xml deleted file mode 100644 index d7895183a4..0000000000 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.extensions/pom.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - org.wso2.carbon.devicemgt - application-mgt - 2.0.63-SNAPSHOT - ../pom.xml - - - 4.0.0 - org.wso2.carbon.device.application.mgt.extensions - 2.0.63-SNAPSHOT - bundle - WSO2 Carbon - Application Management Extensions - WSO2 Carbon - Application Management Extensions - http://wso2.org - - - - - org.apache.felix - maven-scr-plugin - - - org.apache.felix - maven-bundle-plugin - 1.4.0 - true - - - ${project.artifactId} - ${project.artifactId} - ${carbon.device.mgt.version} - Application Management Extensions Bundle - - org.osgi.framework, - org.osgi.service.component, - org.apache.commons.logging, - javax.xml.*, - javax.xml.parsers;version="${javax.xml.parsers.import.pkg.version}";resolution:=optional, - org.wso2.carbon.context.*, - org.wso2.carbon.utils.*, - org.w3c.dom, - org.json, - javax.sql, - com.google.gson, - javax.naming, - javax.xml.bind.annotation, - javax.xml.bind, - org.wso2.carbon.device.application.mgt.common.*, - org.wso2.carbon.device.mgt.core.*, - org.wso2.carbon.device.mgt.common.*, - - - org.wso2.carbon.device.application.mgt.extensions.* - - - - - - - - - - org.eclipse.osgi - org.eclipse.osgi - - - org.eclipse.osgi - org.eclipse.osgi.services - - - org.eclipse.equinox - org.eclipse.equinox.common - - - org.testng - testng - - - org.wso2.carbon - org.wso2.carbon.logging - - - org.wso2.carbon - org.wso2.carbon.utils - - - commons-codec.wso2 - commons-codec - - - commons-io.wso2 - commons-io - - - org.slf4j - slf4j-simple - test - - - org.json.wso2 - json - - - com.google.code.gson - gson - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.application.mgt.common - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.common - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.core - - - - diff --git a/components/application-mgt/pom.xml b/components/application-mgt/pom.xml index 043f32a694..0feac88010 100644 --- a/components/application-mgt/pom.xml +++ b/components/application-mgt/pom.xml @@ -38,7 +38,7 @@ org.wso2.carbon.device.application.mgt.common org.wso2.carbon.device.application.mgt.api org.wso2.carbon.device.application.mgt.ui - +