Adding first cut of platform manager capabilities.

feature/appm-store/pbac
sinthuja 8 years ago
parent b25f14668e
commit 41def8fe76

@ -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<String> tags;
private Map<String, String> properties;
private List<Property> 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<String, String> getProperties() {
public List<Property> getProperties() {
return properties;
}
public void setProperties(Map<String, String> properties) {
public void setProperties(List<Property> properties) {
this.properties = properties;
}
@ -95,4 +128,62 @@ public class Platform {
public void setTags(List<String> 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;
}
}
}

@ -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);
}
}

@ -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<Platform> 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;
}

@ -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.*
</Import-Package>
<Export-Package>
!org.wso2.carbon.device.application.mgt.core.internal.*,
org.wso2.carbon.device.application.mgt.core.*
</Export-Package>
<Axis2Deployer>PlatformDeployer</Axis2Deployer>
</instructions>
</configuration>
</plugin>
@ -152,6 +155,10 @@
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.device.mgt.core</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.user.core</artifactId>
</dependency>
</dependencies>
</project>

@ -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;

@ -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);

@ -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<Platform> getPlatforms(String tenantDomain) throws PlatformManagementDAOException;
}

@ -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.");
}
}

@ -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<Platform> 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<Platform> 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<Platform.Property> 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);
}
}
}

@ -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<Property> 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<Property> getProperties() {
return properties;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public void setProperties(List<Property> 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;
}
}

@ -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<org.wso2.carbon.device.application.mgt.common.Platform.Property> 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) {
}
}

@ -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;
}
}

@ -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);
}
}

@ -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;

@ -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<String, Map<String, Platform>> inMemoryStore;
public PlatformManagerImpl() {
this.inMemoryStore = new HashMap<>();
}
@Override
public List<Platform> getPlatforms(String tenantDomain) throws PlatformManagementException {
List<Platform> platforms = DAOFactory.getPlatformDAO().getPlatforms(tenantDomain);
int platformIndex = 0;
for (Platform platform : platforms) {
if (platform.isFileBased()) {
Map<String, Platform> 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<String, Platform> 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<String, Platform> 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);
}
}

@ -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;
}
}

@ -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);
}
}

@ -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 {

@ -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 {

@ -0,0 +1,23 @@
<!--
~ Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
~
~ Licensed 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.
-->
<component xmlns="http://products.wso2.org/carbon">
<deployers>
<deployer>
<directory>platforms</directory>
<extension>xml</extension>
<class>org.wso2.carbon.device.application.mgt.core.deployer.PlatformDeployer</class>
</deployer>
</deployers>
</component>

@ -0,0 +1,6 @@
<Platforms>
<Platform id="android" name="Android" description="something...." icon="" isShared="true">
<Property optional="true">test</Property>
<Property optional="false" default="xxxxx">number</Property>
</Platform>
</Platforms>

@ -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)
)

@ -1,141 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (c) 2014, 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>application-mgt</artifactId>
<version>2.0.63-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.device.application.mgt.extensions</artifactId>
<version>2.0.63-SNAPSHOT</version>
<packaging>bundle</packaging>
<name>WSO2 Carbon - Application Management Extensions</name>
<description>WSO2 Carbon - Application Management Extensions</description>
<url>http://wso2.org</url>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>1.4.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${project.artifactId}</Bundle-Name>
<Bundle-Version>${carbon.device.mgt.version}</Bundle-Version>
<Bundle-Description>Application Management Extensions Bundle</Bundle-Description>
<Import-Package>
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.*,
</Import-Package>
<Export-Package>
org.wso2.carbon.device.application.mgt.extensions.*
</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.eclipse.osgi</groupId>
<artifactId>org.eclipse.osgi</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.osgi</groupId>
<artifactId>org.eclipse.osgi.services</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.common</artifactId>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.logging</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.utils</artifactId>
</dependency>
<dependency>
<groupId>commons-codec.wso2</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>commons-io.wso2</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.json.wso2</groupId>
<artifactId>json</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.device.application.mgt.common</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.device.mgt.common</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.device.mgt.core</artifactId>
</dependency>
</dependencies>
</project>

@ -38,7 +38,7 @@
<module>org.wso2.carbon.device.application.mgt.common</module>
<module>org.wso2.carbon.device.application.mgt.api</module>
<module>org.wso2.carbon.device.application.mgt.ui</module>
<!--<module>org.wso2.carbon.device.application.mgt.extensions</module>-->
<!--<module>org.wso2.carbon.device.application.mgt.android.platform</module>-->
</modules>

Loading…
Cancel
Save