Adding the search feature to device mgt plugin

revert-70aa11f8
geethkokila 9 years ago
commit 41191d6df0

@ -1,137 +0,0 @@
/*
* 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.
*/
package org.wso2.carbon.device.mgt.common;
import java.util.Arrays;
public class EmailMessageProperties {
private String messageBody;
private String[] mailTo;
private String[] ccList;
private String[] bccList;
private String subject;
private String firstName;
private String enrolmentUrl;
private String title;
private String password;
private String userName;
private String domainName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getDomainName() {
return domainName;
}
public void setDomainName(String domainName) {
this.domainName = domainName;
}
public String getMessageBody() {
return messageBody;
}
public void setMessageBody(String messageBody) {
this.messageBody = messageBody;
}
public String[] getMailTo() {
return mailTo;
}
public void setMailTo(String[] mailTo) {
this.mailTo = mailTo;
}
public String[] getCcList() {
return ccList;
}
public void setCcList(String[] ccList) {
this.ccList = ccList;
}
public String[] getBccList() {
return bccList;
}
public void setBccList(String[] bccList) {
this.bccList = bccList;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getEnrolmentUrl() {
return enrolmentUrl;
}
public void setEnrolmentUrl(String enrolmentUrl) {
this.enrolmentUrl = enrolmentUrl;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "EmailMessageProperties{" +
"messageBody='" + messageBody + '\'' +
", mailTo=" + Arrays.toString(mailTo) +
", ccList=" + Arrays.toString(ccList) +
", bccList=" + Arrays.toString(bccList) +
", subject='" + subject + '\'' +
", firstName='" + firstName + '\'' +
", enrolmentUrl='" + enrolmentUrl + '\'' +
", title='" + title + '\'' +
'}';
}
}

@ -23,6 +23,8 @@ import java.util.Properties;
public class Application implements Serializable {
private static final long serialVersionUID = 1998101711L;
private int id;
private String platform;
private String category;

@ -0,0 +1,233 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.common.device.details;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public class DeviceInfo implements Serializable{
private static final long serialVersionUID = 1998101733L;
private int deviceId;
private String deviceType;
private DeviceIdentifier deviceIdentifier;
private String IMEI;
private String IMSI;
private String deviceModel;
private String vendor;
private String osVersion;
private Double batteryLevel;
private Double internalTotalMemory;
private Double internalAvailableMemory;
private Double externalTotalMemory;
private Double externalAvailableMemory;
private String operator;
private String connectionType;
private Double mobileSignalStrength;
private String ssid;
private Double cpuUsage;
private Double totalRAMMemory;
private Double availableRAMMemory;
private boolean pluggedIn;
private Map<String, String> deviceDetailsMap = new HashMap<>();
public int getDeviceId() {
return deviceId;
}
public void setDeviceId(int deviceId) {
this.deviceId = deviceId;
}
public String getDeviceType() {
return deviceType;
}
public void setDeviceType(String deviceType) {
this.deviceType = deviceType;
}
public DeviceIdentifier getDeviceIdentifier() {
return deviceIdentifier;
}
public void setDeviceIdentifier(DeviceIdentifier deviceIdentifier) {
this.deviceIdentifier = deviceIdentifier;
}
public String getIMEI() {
return IMEI;
}
public void setIMEI(String IMEI) {
this.IMEI = IMEI;
}
public String getIMSI() {
return IMSI;
}
public void setIMSI(String IMSI) {
this.IMSI = IMSI;
}
public String getDeviceModel() {
return deviceModel;
}
public void setDeviceModel(String deviceModel) {
this.deviceModel = deviceModel;
}
public String getVendor() {
return vendor;
}
public void setVendor(String vendor) {
this.vendor = vendor;
}
public String getOsVersion() {
return osVersion;
}
public void setOsVersion(String osVersion) {
this.osVersion = osVersion;
}
public Double getBatteryLevel() {
return batteryLevel;
}
public void setBatteryLevel(Double batteryLevel) {
this.batteryLevel = batteryLevel;
}
public Double getInternalTotalMemory() {
return internalTotalMemory;
}
public void setInternalTotalMemory(Double internalTotalMemory) {
this.internalTotalMemory = internalTotalMemory;
}
public Double getInternalAvailableMemory() {
return internalAvailableMemory;
}
public void setInternalAvailableMemory(Double internalAvailableMemory) {
this.internalAvailableMemory = internalAvailableMemory;
}
public Double getExternalTotalMemory() {
return externalTotalMemory;
}
public void setExternalTotalMemory(Double externalTotalMemory) {
this.externalTotalMemory = externalTotalMemory;
}
public Double getExternalAvailableMemory() {
return externalAvailableMemory;
}
public void setExternalAvailableMemory(Double externalAvailableMemory) {
this.externalAvailableMemory = externalAvailableMemory;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
public String getConnectionType() {
return connectionType;
}
public void setConnectionType(String connectionType) {
this.connectionType = connectionType;
}
public Double getMobileSignalStrength() {
return mobileSignalStrength;
}
public void setMobileSignalStrength(Double mobileSignalStrength) {
this.mobileSignalStrength = mobileSignalStrength;
}
public String getSsid() {
return ssid;
}
public void setSsid(String ssid) {
this.ssid = ssid;
}
public Double getCpuUsage() {
return cpuUsage;
}
public void setCpuUsage(Double cpuUsage) {
this.cpuUsage = cpuUsage;
}
public Double getTotalRAMMemory() {
return totalRAMMemory;
}
public void setTotalRAMMemory(Double totalRAMMemory) {
this.totalRAMMemory = totalRAMMemory;
}
public Double getAvailableRAMMemory() {
return availableRAMMemory;
}
public void setAvailableRAMMemory(Double availableRAMMemory) {
this.availableRAMMemory = availableRAMMemory;
}
public boolean isPluggedIn() {
return pluggedIn;
}
public void setPluggedIn(boolean pluggedIn) {
this.pluggedIn = pluggedIn;
}
public void setDeviceDetailsMap(Map<String,String> deviceDetailsMap) {
this.deviceDetailsMap = deviceDetailsMap;
}
public Map<String, String> getDeviceDetailsMap() {
return deviceDetailsMap;
}
}

@ -0,0 +1,123 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.common.device.details;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import java.io.Serializable;
public class DeviceLocation implements Serializable {
private static final long serialVersionUID = 1998101722L;
private int deviceId;
private DeviceIdentifier deviceIdentifier;
private Double latitude;
private Double longitude;
private String street1;
private String street2;
private String city;
private String state;
private String zip;
private String country;
public int getDeviceId() {
return deviceId;
}
public void setDeviceId(int deviceId) {
this.deviceId = deviceId;
}
public DeviceIdentifier getDeviceIdentifier() {
return deviceIdentifier;
}
public void setDeviceIdentifier(DeviceIdentifier deviceIdentifier) {
this.deviceIdentifier = deviceIdentifier;
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public String getStreet1() {
return street1;
}
public void setStreet1(String street1) {
this.street1 = street1;
}
public String getStreet2() {
return street2;
}
public void setStreet2(String street2) {
this.street2 = street2;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}

@ -23,7 +23,7 @@ public class Condition {
private String key;
private String value;
public String mark;
public String operator;
private State state;
@ -38,5 +38,29 @@ public class Condition {
public void setState(State state){
this.state = state;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
}

@ -19,6 +19,36 @@
package org.wso2.carbon.device.mgt.common.search;
import java.util.List;
public class SearchContext {
private List<Condition> conditions;
private int start;
private int end;
public List<Condition> getConditions() {
return conditions;
}
public void setConditions(List<Condition> conditions) {
this.conditions = conditions;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
}

@ -83,9 +83,10 @@
org.wso2.carbon.ntask.core.*,
org.wso2.carbon.ntask.common,
org.wso2.carbon.ndatasource.core,
org.apache.axis2.transport.mail,
org.apache.catalina,
org.apache.catalina.core
org.apache.catalina.core,
org.apache.commons.collections,
org.wso2.carbon.email.sender.*
</Import-Package>
<Export-Package>
!org.wso2.carbon.device.mgt.core.internal,
@ -225,11 +226,23 @@
<artifactId>org.wso2.carbon.ntask.core</artifactId>
</dependency>
<!--&lt;!&ndash;Data dependencies&ndash;&gt;-->
<!--<dependency>-->
<!--<groupId>org.wso2.carbon.data</groupId>-->
<!--<artifactId>org.wso2.carbon.dataservices.sql.driver</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>commons-collections.wso2</groupId>
<artifactId>commons-collections</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.email.sender.core</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

@ -58,4 +58,21 @@ public final class DeviceManagementConstants {
public static final String MONITOR_OPERATION_CODE = "MONITOR";
public static final String POLICY_OPERATION_CODE = PolicyOperation.POLICY_OPERATION_CODE;
}
public static final class EmailAttributes {
private EmailAttributes() {
throw new AssertionError();
}
public static final String ENCODED_SCHEME = "UTF-8";
public static final String FIRST_NAME = "first-name";
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
public static final String DOMAIN = "domain-name";
public static final String SERVER_BASE_URL_HTTPS = "base-url-https";
public static final String SERVER_BASE_URL_HTTP = "base-url-http";
public static final String DOWNLOAD_URL = "download-url";
}
}

@ -21,7 +21,6 @@ package org.wso2.carbon.device.mgt.core.config;
import org.w3c.dom.Document;
import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.core.config.email.NotificationMessagesConfig;
import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil;
import org.wso2.carbon.utils.CarbonUtils;
import org.xml.sax.SAXException;
@ -35,21 +34,17 @@ import javax.xml.validation.SchemaFactory;
import java.io.File;
/**
* Class responsible for the cdm manager configuration initialization.
* Class responsible for the cdm configuration initialization.
*/
public class DeviceConfigurationManager {
private DeviceManagementConfig currentDeviceConfig;
private NotificationMessagesConfig notificationMessagesConfig;
private static DeviceConfigurationManager deviceConfigManager;
private static final String DEVICE_MGT_CONFIG_PATH =
CarbonUtils.getCarbonConfigDirPath() + File.separator +
DeviceManagementConstants.DataSourceProperties.DEVICE_CONFIG_XML_NAME;
private static final String DEVICE_MGT_CONFIG_SCHEMA_PATH = "resources/config/schema/device-mgt-config-schema.xsd";
private static final String NOTIFICATION_MSG_CONFIG_PATH =
CarbonUtils.getCarbonConfigDirPath() + File.separator +
DeviceManagementConstants.NotificationProperties.NOTIFICATION_CONFIG_FILE;
public static DeviceConfigurationManager getInstance() {
if (deviceConfigManager == null) {
@ -63,7 +58,6 @@ public class DeviceConfigurationManager {
}
public synchronized void initConfig() throws DeviceManagementException {
try {
File deviceMgtConfig = new File(DeviceConfigurationManager.DEVICE_MGT_CONFIG_PATH);
Document doc = DeviceManagerUtil.convertToDocument(deviceMgtConfig);
@ -76,18 +70,6 @@ public class DeviceConfigurationManager {
} catch (JAXBException e) {
throw new DeviceManagementException("Error occurred while initializing Data Source config", e);
}
try {
File notificationConfig = new File(DeviceConfigurationManager.NOTIFICATION_MSG_CONFIG_PATH);
Document doc = DeviceManagerUtil.convertToDocument(notificationConfig);
/* Un-marshaling Notifications Management configuration */
JAXBContext notificationContext = JAXBContext.newInstance(NotificationMessagesConfig.class);
Unmarshaller unmarshaller = notificationContext.createUnmarshaller();
this.notificationMessagesConfig = (NotificationMessagesConfig) unmarshaller.unmarshal(doc);
} catch(JAXBException e){
throw new DeviceManagementException("Error occurred while initializing Notification settings config", e);
}
}
private static Schema getSchema() throws DeviceManagementException {
@ -105,8 +87,4 @@ public class DeviceConfigurationManager {
return currentDeviceConfig;
}
public NotificationMessagesConfig getNotificationMessagesConfig() {
return notificationMessagesConfig;
}
}

@ -18,7 +18,6 @@
package org.wso2.carbon.device.mgt.core.config;
import org.wso2.carbon.device.mgt.core.config.datasource.DataSourceConfig;
import org.wso2.carbon.device.mgt.core.config.email.EmailConfigurations;
import org.wso2.carbon.device.mgt.core.config.identity.IdentityConfigurations;
import org.wso2.carbon.device.mgt.core.config.policy.PolicyConfiguration;
import org.wso2.carbon.device.mgt.core.config.task.TaskConfiguration;
@ -32,11 +31,12 @@ import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "ManagementRepository")
public class DeviceManagementConfigRepository {
private DataSourceConfig dataSourceConfig;
private EmailConfigurations emailConfigurations;
private IdentityConfigurations identityConfigurations;
private PolicyConfiguration policyConfiguration;
// private EmailConfigurations emailConfigurations;
private TaskConfiguration taskConfiguration;
private DataSourceConfig dataSourceConfig;
private IdentityConfigurations identityConfigurations;
private PolicyConfiguration policyConfiguration;
@XmlElement(name = "DataSourceConfiguration", required = true)
public DataSourceConfig getDataSourceConfig() {
@ -47,20 +47,21 @@ public class DeviceManagementConfigRepository {
this.dataSourceConfig = dataSourceConfig;
}
@XmlElement(name = "EmailClientConfiguration", required = true)
public EmailConfigurations getEmailConfigurations() {
return emailConfigurations;
}
public void setEmailConfigurations(EmailConfigurations emailConfigurations) {
this.emailConfigurations = emailConfigurations;
}
// @XmlElement(name = "EmailClientConfiguration", required = true)
// public EmailConfigurations getEmailConfigurations() {
// return emailConfigurations;
// }
//
// public void setEmailConfigurations(EmailConfigurations emailConfigurations) {
// this.emailConfigurations = emailConfigurations;
// }
@XmlElement(name = "IdentityConfiguration", required = true)
public IdentityConfigurations getIdentityConfigurations() {
return identityConfigurations;
}
public void setIdentityConfigurations(IdentityConfigurations identityConfigurations) {
this.identityConfigurations = identityConfigurations;
}

@ -1,85 +0,0 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.config.email;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "EmailClientConfiguration")
public class EmailConfigurations {
private int minNumOfThread;
private int maxNumOfThread;
private int keepAliveTime;
private int threadQueueCapacity;
private String lBHostPortPrefix;
private String enrollmentContextPath;
@XmlElement(name = "minimumThread", required = true)
public int getMinNumOfThread() {
return minNumOfThread;
}
public void setMinNumOfThread(int minNumOfThread) {
this.minNumOfThread = minNumOfThread;
}
@XmlElement(name = "maximumThread", required = true)
public int getMaxNumOfThread() {
return maxNumOfThread;
}
public void setMaxNumOfThread(int maxNumOfThread) {
this.maxNumOfThread = maxNumOfThread;
}
@XmlElement(name = "keepAliveTime", required = true)
public int getKeepAliveTime() {
return keepAliveTime;
}
public void setKeepAliveTime(int keepAliveTime) {
this.keepAliveTime = keepAliveTime;
}
@XmlElement(name = "ThreadQueueCapacity", required = true)
public int getThreadQueueCapacity() {
return threadQueueCapacity;
}
public void setThreadQueueCapacity(int threadQueueCapacity) {
this.threadQueueCapacity = threadQueueCapacity;
}
@XmlElement(name = "LBHostPortPrefix", required = true)
public String getlBHostPortPrefix() {
return lBHostPortPrefix;
}
public void setlBHostPortPrefix(String lBHostPortPrefix) {
this.lBHostPortPrefix = lBHostPortPrefix;
}
@XmlElement(name = "enrollmentContextPath", required = true)
public String getEnrollmentContextPath() {
return enrollmentContextPath;
}
public void setEnrollmentContextPath(String enrollmentContextPath) {
this.enrollmentContextPath = enrollmentContextPath;
}
}

@ -1,110 +0,0 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.config.email;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "NotificationMessage")
public class NotificationMessages {
private String header;
private String body;
private String footerLine1;
private String footerLine2;
private String footerLine3;
private String subject;
private String url;
@XmlAttribute(name = "type")
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
private String type;
@XmlElement(name = "Header", required = true)
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
@XmlElement(name = "Body", required = true)
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
@XmlElement(name = "Subject", required = true)
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@XmlElement(name = "Url", required = true)
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@XmlElement(name = "Footer1")
public String getFooterLine1() {
return footerLine1;
}
public void setFooterLine1(String footerLine1) {
this.footerLine1 = footerLine1;
}
@XmlElement(name = "Footer2")
public String getFooterLine2() {
return footerLine2;
}
public void setFooterLine2(String footerLine2) {
this.footerLine2 = footerLine2;
}
@XmlElement(name = "Footer3")
public String getFooterLine3() {
return footerLine3;
}
public void setFooterLine3(String footerLine3) {
this.footerLine3 = footerLine3;
}
}

@ -1,39 +0,0 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.config.email;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement(name = "Notifications")
public class NotificationMessagesConfig {
private List<NotificationMessages> notificationMessagesList;
@XmlElement(name = "NotificationMessage")
public List<NotificationMessages> getNotificationMessagesList() {
return notificationMessagesList;
}
public void setNotificationMessagesList(List<NotificationMessages> notificationMessagesList) {
this.notificationMessagesList = notificationMessagesList;
}
}

@ -0,0 +1,101 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* This class will read the configurations related to task. This task will be responsible for adding the operations.
*/
package org.wso2.carbon.device.mgt.core.config.task;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement(name = "TaskConfiguration")
public class TaskConfiguration {
private boolean enabled;
private int frequency;
private String taskClazz;
private List<Operation> operations;
@XmlElement(name = "Enable", required = true)
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@XmlElement(name = "Frequency", required = true)
public int getFrequency() {
return frequency;
}
public void setFrequency(int frequency) {
this.frequency = frequency;
}
@XmlElement(name = "TaskClass", required = true)
public String getTaskClazz() {
return taskClazz;
}
public void setTaskClazz(String taskClazz) {
this.taskClazz = taskClazz;
}
@XmlElementWrapper(name="Operations")
@XmlElement(name = "Operation", required = true)
public List<Operation> getOperations() {
return operations;
}
public void setOperations(List<Operation> operations) {
this.operations = operations;
}
@XmlRootElement(name = "Operation")
public static class Operation {
private String operationName;
private int recurrency;
@XmlElement(name = "Name", required = true)
public String getOperationName() {
return operationName;
}
public void setOperationName(String operationName) {
this.operationName = operationName;
}
@XmlElement(name = "RecurrentTimes", required = true)
public int getRecurrency() {
return recurrency;
}
public void setRecurrency(int recurrency) {
this.recurrency = recurrency;
}
}
}

@ -32,6 +32,10 @@ import org.wso2.carbon.device.mgt.core.dao.impl.device.OracleDeviceDAOImpl;
import org.wso2.carbon.device.mgt.core.dao.impl.device.PostgreSQLDeviceDAOImpl;
import org.wso2.carbon.device.mgt.core.dao.impl.device.SQLServerDeviceDAOImpl;
import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil;
import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.DeviceDetailsDAO;
import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.impl.DeviceDetailsDAOImpl;
import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAO;
import org.wso2.carbon.device.mgt.core.search.mgt.dao.impl.SearchDAOImpl;
import javax.sql.DataSource;
import java.sql.Connection;
@ -127,6 +131,14 @@ public class DeviceManagementDAOFactory {
return new ApplicationMappingDAOImpl();
}
public static DeviceDetailsDAO getDeviceDetailsDAO() {
return new DeviceDetailsDAOImpl();
}
public static SearchDAO getSearchDAO() {
return new SearchDAOImpl();
}
public static void init(DataSourceConfig config) {
dataSource = resolveDataSource(config);
try {

@ -19,6 +19,40 @@
package org.wso2.carbon.device.mgt.core.device.details.mgt;
public class DeviceDetailsMgtException {
public class DeviceDetailsMgtException extends Exception{
private static final long serialVersionUID = -315127931137777499L;
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public DeviceDetailsMgtException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public DeviceDetailsMgtException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public DeviceDetailsMgtException(String msg) {
super(msg);
setErrorMessage(msg);
}
public DeviceDetailsMgtException() {
super();
}
public DeviceDetailsMgtException(Throwable cause) {
super(cause);
}
}

@ -19,14 +19,16 @@
package org.wso2.carbon.device.mgt.core.device.details.mgt.dao;
import org.wso2.carbon.device.mgt.common.device.details.DeviceApplication;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation;
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceDetailsMgtDAOException;
import java.util.Map;
/**
* This class will store device details related generic information such as cpu/memory utilization, battery level,
* plugged in to a power source or operation on battery.
* In CDM framework, we only keep the snapshot of the device information. So previous details are deleted as soon as new
* data is arrived.
*/
public interface DeviceDetailsDAO {
@ -38,6 +40,13 @@ public interface DeviceDetailsDAO {
*/
void addDeviceInformation(DeviceInfo deviceInfo) throws DeviceDetailsMgtDAOException;
/**
* This method will add the device properties to the database.
* @param propertyMap - device properties.
* @throws DeviceDetailsMgtDAOException
*/
void addDeviceProperties(Map<String, String> propertyMap, int deviceId) throws DeviceDetailsMgtDAOException;
/**
* This method will return the device information when device id is provided.
* @param deviceId - device Id
@ -46,6 +55,28 @@ public interface DeviceDetailsDAO {
*/
DeviceInfo getDeviceInformation(int deviceId) throws DeviceDetailsMgtDAOException;
/**
* This method will return the device properties from database.
* @param deviceId
* @return - device properties map.
* @throws DeviceDetailsMgtDAOException
*/
Map<String, String> getDeviceProperties(int deviceId) throws DeviceDetailsMgtDAOException;
/**
* This method will delete the device information from the database.
* @param deviceId - Integer.
* @throws DeviceDetailsMgtDAOException
*/
void deleteDeviceInformation(int deviceId) throws DeviceDetailsMgtDAOException;
/**
* This method will delete the device properties from database.
* @param deviceId - Integer.
* @throws DeviceDetailsMgtDAOException
*/
void deleteDeviceProperties(int deviceId) throws DeviceDetailsMgtDAOException;
/**
* This method will add device location to database.
* @param deviceLocation - Device location with latitude and longitude.
@ -62,17 +93,31 @@ public interface DeviceDetailsDAO {
DeviceLocation getDeviceLocation(int deviceId) throws DeviceDetailsMgtDAOException;
/**
* This method will add device application to database.
* @param deviceApplication - Device application
* @throws DeviceDetailsMgtDAOException
*/
void addDeviceApplications(DeviceApplication deviceApplication) throws DeviceDetailsMgtDAOException;
/**
* This method will return the device application list once device id is provided.
* This method will delete the device location from the database.
* @param deviceId
* @return
* @throws DeviceDetailsMgtDAOException
*/
DeviceApplication getDeviceApplications(int deviceId) throws DeviceDetailsMgtDAOException;
void deleteDeviceLocation(int deviceId) throws DeviceDetailsMgtDAOException;
// /**
// * This method will add device application to database.
// * @param deviceApplication - Device application
// * @throws DeviceDetailsMgtDAOException
// */
// void addDeviceApplications(DeviceApplication deviceApplication) throws DeviceDetailsMgtDAOException;
//
// /**
// * This method will return the device application list once device id is provided.
// * @param deviceId
// * @return
// * @throws DeviceDetailsMgtDAOException
// */
// DeviceApplication getDeviceApplications(int deviceId) throws DeviceDetailsMgtDAOException;
//
// /**
// * This method will delete the application list from the database.
// * @param deviceId - Integer
// * @throws DeviceDetailsMgtDAOException
// */
// void deleteDeviceApplications(int deviceId) throws DeviceDetailsMgtDAOException;
}

@ -19,6 +19,305 @@
package org.wso2.carbon.device.mgt.core.device.details.mgt.dao.impl;
public class DeviceDetailsDAOImpl {
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation;
import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory;
import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil;
import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.DeviceDetailsDAO;
import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.DeviceDetailsMgtDAOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class DeviceDetailsDAOImpl implements DeviceDetailsDAO {
private static Log log = LogFactory.getLog(DeviceDetailsDAOImpl.class);
@Override
public void addDeviceInformation(DeviceInfo deviceInfo) throws DeviceDetailsMgtDAOException {
Connection conn;
PreparedStatement stmt = null;
try {
conn = this.getConnection();
stmt = conn.prepareStatement("INSERT INTO DM_DEVICE_DETAIL (DEVICE_ID, IMEI, IMSI, DEVICE_MODEL, " +
"VENDOR, OS_VERSION, BATTERY_LEVEL, INTERNAL_TOTAL_MEMORY, INTERNAL_AVAILABLE_MEMORY, " +
"EXTERNAL_TOTAL_MEMORY, EXTERNAL_AVAILABLE_MEMORY, OPERATOR, CONNECTION_TYPE, " +
"MOBILE_SIGNAL_STRENGTH, SSID, CPU_USAGE, TOTAL_RAM_MEMORY, AVAILABLE_RAM_MEMORY, PLUGGED_IN) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?, ?,? ); ");
stmt.setInt(1, deviceInfo.getDeviceId());
stmt.setString(2, deviceInfo.getIMEI());
stmt.setString(3, deviceInfo.getIMSI());
stmt.setString(4, deviceInfo.getDeviceModel());
stmt.setString(5, deviceInfo.getVendor());
stmt.setString(6, deviceInfo.getOsVersion());
stmt.setDouble(7, deviceInfo.getBatteryLevel());
stmt.setDouble(8, deviceInfo.getInternalTotalMemory());
stmt.setDouble(9, deviceInfo.getInternalAvailableMemory());
stmt.setDouble(10, deviceInfo.getExternalTotalMemory());
stmt.setDouble(11, deviceInfo.getExternalAvailableMemory());
stmt.setString(12, deviceInfo.getOperator());
stmt.setString(13, deviceInfo.getConnectionType());
stmt.setDouble(14, deviceInfo.getMobileSignalStrength());
stmt.setString(15, deviceInfo.getSsid());
stmt.setDouble(16, deviceInfo.getCpuUsage());
stmt.setDouble(17, deviceInfo.getTotalRAMMemory());
stmt.setDouble(18, deviceInfo.getAvailableRAMMemory());
stmt.setBoolean(19, deviceInfo.isPluggedIn());
stmt.execute();
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while inserting device details to database.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
}
}
@Override
public void addDeviceProperties(Map<String, String> propertyMap, int deviceId) throws DeviceDetailsMgtDAOException {
if(propertyMap.isEmpty()){
log.warn("Property map of device id :" + deviceId + " is empty.");
return;
}
Connection conn;
PreparedStatement stmt = null;
try {
conn = this.getConnection();
stmt = conn.prepareStatement("INSERT INTO DM_DEVICE_INFO (DEVICE_ID, KEY_FIELD, VALUE_FIELD) VALUES (?, ?, ?)");
for (Map.Entry<String, String> entry : propertyMap.entrySet()) {
stmt.setInt(1, deviceId);
stmt.setString(2, entry.getKey());
stmt.setString(3, entry.getValue());
stmt.addBatch();
}
stmt.executeBatch();
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while inserting device properties to database.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
}
}
@Override
public DeviceInfo getDeviceInformation(int deviceId) throws DeviceDetailsMgtDAOException {
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
DeviceInfo deviceInfo = new DeviceInfo();
try {
conn = this.getConnection();
String sql = "SELECT * FROM DM_DEVICE_DETAIL WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, deviceId);
rs = stmt.executeQuery();
while (rs.next()) {
deviceInfo.setDeviceId(rs.getInt("DEVICE_ID"));
deviceInfo.setIMEI(rs.getString("IMEI"));
deviceInfo.setIMSI(rs.getString("IMSI"));
deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL"));
deviceInfo.setVendor(rs.getString("VENDOR"));
deviceInfo.setOsVersion(rs.getString("OS_VERSION"));
deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL"));
deviceInfo.setInternalTotalMemory(rs.getDouble("INTERNAL_TOTAL_MEMORY"));
deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY"));
deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY"));
deviceInfo.setOperator(rs.getString("OPERATOR"));
deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE"));
deviceInfo.setMobileSignalStrength(rs.getDouble("MOBILE_SIGNAL_STRENGTH"));
deviceInfo.setSsid(rs.getString("SSID"));
deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE"));
deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY"));
deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY"));
deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN"));
}
deviceInfo.setDeviceId(deviceId);
return deviceInfo;
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while fetching the details of the registered devices.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs);
}
}
@Override
public Map<String, String> getDeviceProperties(int deviceId) throws DeviceDetailsMgtDAOException {
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
Map<String, String> map = new HashMap<>();
try {
conn = this.getConnection();
String sql = "SELECT * FROM DM_DEVICE_INFO WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, deviceId);
rs = stmt.executeQuery();
while (rs.next()) {
map.put(rs.getString("KEY_FIELD"), rs.getString("VALUE_FIELD"));
}
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while fetching the properties of the registered devices.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs);
}
return map;
}
@Override
public void deleteDeviceInformation(int deviceId) throws DeviceDetailsMgtDAOException {
Connection conn;
PreparedStatement stmt = null;
try {
conn = this.getConnection();
String query = "DELETE FROM DM_DEVICE_DETAIL WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(query);
stmt.setInt(1, deviceId);
stmt.executeUpdate();
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while deleting the device information from the data base.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
}
}
@Override
public void deleteDeviceProperties(int deviceId) throws DeviceDetailsMgtDAOException {
Connection conn;
PreparedStatement stmt = null;
try {
conn = this.getConnection();
String query = "DELETE FROM DM_DEVICE_INFO WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(query);
stmt.setInt(1, deviceId);
stmt.executeUpdate();
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while deleting the device properties from the data base.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
}
}
@Override
public void addDeviceLocation(DeviceLocation deviceLocation) throws DeviceDetailsMgtDAOException {
Connection conn;
PreparedStatement stmt = null;
try {
conn = this.getConnection();
stmt = conn.prepareStatement("INSERT INTO DM_DEVICE_LOCATION (DEVICE_ID, LATITUDE, LONGITUDE, STREET1, " +
"STREET2, CITY, ZIP, STATE, COUNTRY) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
stmt.setInt(1, deviceLocation.getDeviceId());
stmt.setDouble(2, deviceLocation.getLatitude());
stmt.setDouble(3, deviceLocation.getLongitude());
stmt.setString(4, deviceLocation.getStreet1());
stmt.setString(5, deviceLocation.getStreet2());
stmt.setString(6, deviceLocation.getCity());
stmt.setString(7, deviceLocation.getZip());
stmt.setString(8, deviceLocation.getState());
stmt.setString(9, deviceLocation.getCountry());
stmt.execute();
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while adding the device location to database.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
}
}
@Override
public DeviceLocation getDeviceLocation(int deviceId) throws DeviceDetailsMgtDAOException {
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
DeviceLocation location = new DeviceLocation();
try {
conn = this.getConnection();
String sql = "SELECT * FROM DM_DEVICE_LOCATION WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, deviceId);
rs = stmt.executeQuery();
while (rs.next()) {
location.setDeviceId(deviceId);
location.setLatitude(rs.getDouble("LATITUDE"));
location.setLongitude(rs.getDouble("LONGITUDE"));
location.setStreet1(rs.getString("STREET1"));
location.setStreet2(rs.getString("STREET2"));
location.setCity(rs.getString("CITY"));
location.setZip(rs.getString("ZIP"));
location.setState(rs.getString("STATE"));
location.setCountry(rs.getString("COUNTRY"));
}
location.setDeviceId(deviceId);
return location;
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while fetching the location of the registered devices.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, rs);
}
}
@Override
public void deleteDeviceLocation(int deviceId) throws DeviceDetailsMgtDAOException {
Connection conn;
PreparedStatement stmt = null;
try {
conn = this.getConnection();
String query = "DELETE FROM DM_DEVICE_LOCATION WHERE DEVICE_ID = ?";
stmt = conn.prepareStatement(query);
stmt.setInt(1, deviceId);
stmt.executeUpdate();
} catch (SQLException e) {
throw new DeviceDetailsMgtDAOException("Error occurred while deleting the device location from the data base.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
}
}
private Connection getConnection() throws SQLException {
return DeviceManagementDAOFactory.getConnection();
}
// @Override
// public void addDeviceApplications(DeviceApplication deviceApplication) throws DeviceDetailsMgtDAOException {
//
// }
//
// @Override
// public DeviceApplication getDeviceApplications(int deviceId) throws DeviceDetailsMgtDAOException {
// return null;
// }
//
// @Override
// public void deleteDeviceApplications(int deviceId) throws DeviceDetailsMgtDAOException {
//
// }
}

@ -28,7 +28,7 @@ import org.wso2.carbon.device.mgt.common.TransactionManagementException;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation;
import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory;
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInfomationManager;
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager;
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceDetailsMgtException;
import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.DeviceDetailsDAO;
import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.DeviceDetailsMgtDAOException;
@ -36,7 +36,7 @@ import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
import java.sql.SQLException;
public class DeviceInformationManagerImpl implements DeviceInfomationManager {
public class DeviceInformationManagerImpl implements DeviceInformationManager {
private static Log log = LogFactory.getLog(DeviceInformationManagerImpl.class);
@ -50,6 +50,10 @@ public class DeviceInformationManagerImpl implements DeviceInfomationManager {
public void addDeviceInfo(DeviceInfo deviceInfo) throws DeviceDetailsMgtException {
try {
Device device = DeviceManagementDataHolder.getInstance().
getDeviceManagementProvider().getDevice(deviceInfo.getDeviceIdentifier());
deviceInfo.setDeviceId(device.getId());
DeviceManagementDAOFactory.beginTransaction();
deviceDetailsDAO.deleteDeviceInformation(deviceInfo.getDeviceId());
deviceDetailsDAO.deleteDeviceProperties(deviceInfo.getDeviceId());
@ -62,6 +66,9 @@ public class DeviceInformationManagerImpl implements DeviceInfomationManager {
} catch (DeviceDetailsMgtDAOException e) {
DeviceManagementDAOFactory.rollbackTransaction();
throw new DeviceDetailsMgtException("Error occurred while adding the device information.");
} catch (DeviceManagementException e) {
DeviceManagementDAOFactory.rollbackTransaction();
throw new DeviceDetailsMgtException("Error occurred while retrieving the device information.");
} finally {
DeviceManagementDAOFactory.closeConnection();
}

@ -1,31 +0,0 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.email;
public final class EmailConstants {
public static final class EnrolmentEmailConstants {
public static final String DOMAIN = "domain-name";
public static final String USERNAME = "user-name";
public static final String DOWNLOAD_URL = "downloadUrl";
public static final String ENCODED_SCHEME = "UTF-8";
public static final String PASSWORD = "password";
public static final String FIRST_NAME = "first-name";
}
}

@ -1,116 +0,0 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.email.sender;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.base.BaseConstants;
import org.apache.axis2.transport.mail.MailConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.EmailMessageProperties;
import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager;
import org.wso2.carbon.device.mgt.core.config.email.EmailConfigurations;
import org.wso2.carbon.device.mgt.core.internal.EmailServiceDataHolder;
import org.wso2.carbon.device.mgt.core.service.EmailService;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class EmailServiceProviderImpl implements EmailService {
private static ThreadPoolExecutor threadPoolExecutor;
static {
EmailConfigurations emailConfig =
DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getEmailConfigurations();
threadPoolExecutor = new ThreadPoolExecutor(emailConfig.getMinNumOfThread(),
emailConfig.getMaxNumOfThread(), emailConfig.getKeepAliveTime(), TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(emailConfig.getThreadQueueCapacity()));
}
private static final String EMAIL_URI_SCHEME = "mailto:";
private static Log log = LogFactory.getLog(EmailServiceProviderImpl.class);
@Override
public void sendEmail(EmailMessageProperties emailMessageProperties) throws DeviceManagementException {
for (String toAddr : emailMessageProperties.getMailTo()) {
threadPoolExecutor
.submit(new EmailSender(toAddr, emailMessageProperties.getSubject(),
emailMessageProperties.getMessageBody()));
}
}
public static class EmailSender implements Runnable {
String to;
String subject;
String body;
EmailSender(String to, String subject, String body) {
this.to = to;
this.subject = subject;
this.body = body;
}
public void run() {
Map<String, String> headerMap = new HashMap<String, String>();
headerMap.put(MailConstants.MAIL_HEADER_SUBJECT, subject);
OMElement payload = OMAbstractFactory.getOMFactory().createOMElement(
BaseConstants.DEFAULT_TEXT_WRAPPER, null);
payload.setText(body);
try {
ServiceClient serviceClient;
ConfigurationContext configContext = EmailServiceDataHolder.getInstance().
getConfigurationContextService().getServerConfigContext();
//Set configuration service client if available, else create new service client
if (configContext != null) {
serviceClient = new ServiceClient(configContext, null);
} else {
serviceClient = new ServiceClient();
}
Options options = new Options();
options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE);
options.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap);
options.setProperty(MailConstants.TRANSPORT_MAIL_FORMAT,
MailConstants.TRANSPORT_FORMAT_TEXT);
options.setTo(new EndpointReference(EMAIL_URI_SCHEME + to));
serviceClient.setOptions(options);
serviceClient.fireAndForget(payload);
log.debug("Sending confirmation mail to " + to);
} catch (AxisFault e) {
log.error("Error in delivering the message, subject: '" + subject + "', to: '" + to + "'", e);
}
}
}
}

@ -19,13 +19,31 @@
package org.wso2.carbon.device.mgt.core.internal;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.CarbonContext;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.context.RegistryType;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.registry.api.Collection;
import org.wso2.carbon.registry.api.Registry;
import org.wso2.carbon.registry.api.RegistryException;
import org.wso2.carbon.registry.api.Resource;
import org.wso2.carbon.utils.Axis2ConfigurationContextObserver;
import org.wso2.carbon.utils.CarbonUtils;
import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
import java.io.File;
import java.io.FilenameFilter;
public class DeviceManagementAxis2ConfigContextObserver implements Axis2ConfigurationContextObserver {
private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "email-templates";
private static final Log log = LogFactory.getLog(DeviceManagementAxis2ConfigContextObserver.class);
@Override
public void creatingConfigurationContext(int tenantId) {
}
@Override

@ -47,7 +47,10 @@ public class DeviceManagementDataHolder {
private ConfigurationContextService configurationContextService;
private HashMap<String,Boolean> requireDeviceAuthorization = new HashMap<>();
private DeviceAccessAuthorizationService deviceAccessAuthorizationService;
private TaskService taskService;
//private EmailSenderService emailSenderService;
private static DeviceManagementDataHolder thisInstance = new DeviceManagementDataHolder();
@ -167,6 +170,7 @@ public class DeviceManagementDataHolder {
this.deviceAccessAuthorizationService = deviceAccessAuthorizationService;
}
public TaskService getTaskService() {
return taskService;
}
@ -174,4 +178,13 @@ public class DeviceManagementDataHolder {
public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}
//
// public EmailSenderService getEmailSenderService() {
// return emailSenderService;
// }
//
// public void setEmailSenderService(EmailSenderService emailSenderService) {
// this.emailSenderService = emailSenderService;
// }
}

@ -51,6 +51,7 @@ import org.wso2.carbon.device.mgt.core.permission.mgt.PermissionManagerServiceIm
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl;
import org.wso2.carbon.device.mgt.core.util.DeviceManagementSchemaInitializer;
import org.wso2.carbon.email.sender.core.service.EmailSenderService;
import org.wso2.carbon.ndatasource.core.DataSourceService;
import org.wso2.carbon.registry.core.service.RegistryService;
import org.wso2.carbon.user.core.service.RealmService;
@ -181,9 +182,9 @@ public class DeviceManagementServiceComponent {
bundleContext.registerService(DeviceManagementProviderService.class.getName(), deviceManagementProvider, null);
/* Registering Tenant Configuration Management Service */
TenantConfigurationManagementService
tenantConfiguration = new TenantConfigurationManagementServiceImpl();
bundleContext.registerService(TenantConfigurationManagementService.class.getName(), tenantConfiguration, null);
TenantConfigurationManagementService
tenantConfiguration = new TenantConfigurationManagementServiceImpl();
bundleContext.registerService(TenantConfigurationManagementService.class.getName(), tenantConfiguration, null);
/* Registering Notification Service */
NotificationManagementService notificationManagementService
@ -199,7 +200,7 @@ public class DeviceManagementServiceComponent {
DeviceAccessAuthorizationService deviceAccessAuthorizationService = new DeviceAccessAuthorizationServiceImpl();
DeviceManagementDataHolder.getInstance().setDeviceAccessAuthorizationService(deviceAccessAuthorizationService);
bundleContext.registerService(DeviceAccessAuthorizationService.class.getName(),
deviceAccessAuthorizationService, null);
deviceAccessAuthorizationService, null);
/* Registering App Management service */
try {

@ -0,0 +1,98 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.internal;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager;
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager;
import org.wso2.carbon.device.mgt.core.device.details.mgt.impl.DeviceInformationManagerImpl;
import org.wso2.carbon.device.mgt.core.search.mgt.SearchManagerService;
import org.wso2.carbon.device.mgt.core.search.mgt.impl.SearchManagerServiceImpl;
import org.wso2.carbon.device.mgt.core.task.DeviceTaskManagerService;
import org.wso2.carbon.device.mgt.core.task.impl.DeviceTaskManagerServiceImpl;
import org.wso2.carbon.ntask.core.service.TaskService;
/**
* @scr.component name="org.wso2.carbon.device.task.manager" immediate="true"
* @scr.reference name="device.ntask.component"
* interface="org.wso2.carbon.ntask.core.service.TaskService"
* cardinality="1..1"
* policy="dynamic"
* bind="setTaskService"
* unbind="unsetTaskService"
*/
public class DeviceTaskManagerServiceComponent {
private static Log log = LogFactory.getLog(DeviceManagementServiceComponent.class);
@SuppressWarnings("unused")
protected void activate(ComponentContext componentContext) {
try {
if (log.isDebugEnabled()) {
log.debug("Initializing device details retrieving task manager bundle.");
}
// This will start the device details retrieving task.
boolean taskEnable = DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getTaskConfiguration().isEnabled();
if (taskEnable) {
DeviceTaskManagerService taskManagerService = new DeviceTaskManagerServiceImpl();
taskManagerService.startTask();
}
componentContext.getBundleContext().registerService(DeviceInformationManager.class,
new DeviceInformationManagerImpl(), null);
componentContext.getBundleContext().registerService(SearchManagerService.class,
new SearchManagerServiceImpl(), null);
} catch (Throwable e) {
log.error("Error occurred while initializing device details retrieving task manager service.", e);
}
}
@SuppressWarnings("unused")
protected void deactivate(ComponentContext componentContext) {
try {
DeviceTaskManagerService taskManagerService = new DeviceTaskManagerServiceImpl();
taskManagerService.stopTask();
} catch (Throwable e) {
log.error("Error occurred while destroying the device details retrieving task manager service.", e);
}
}
protected void setTaskService(TaskService taskService) {
if (log.isDebugEnabled()) {
log.debug("Setting the task service.");
}
DeviceManagementDataHolder.getInstance().setTaskService(taskService);
}
protected void unsetTaskService(TaskService taskService) {
if (log.isDebugEnabled()) {
log.debug("Removing the task service.");
}
DeviceManagementDataHolder.getInstance().setTaskService(null);
}
}

@ -1,86 +0,0 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.internal;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager;
import org.wso2.carbon.device.mgt.core.config.DeviceManagementConfig;
import org.wso2.carbon.device.mgt.core.email.sender.EmailServiceProviderImpl;
import org.wso2.carbon.device.mgt.core.service.EmailService;
import org.wso2.carbon.device.mgt.core.service.EmailServiceImpl;
import org.wso2.carbon.utils.ConfigurationContextService;
/**
* @scr.component component.name="org.wso2.carbon.device.emailmanager" immediate="true"
* @scr.reference name="configurationcontext.service"
* interface="org.wso2.carbon.utils.ConfigurationContextService" cardinality="1..1"
* policy="dynamic" bind="setConfigurationContextService" unbind="unsetConfigurationContextService"
*/
public class EmailServiceComponent {
private static Log log = LogFactory.getLog(EmailServiceComponent.class);
/**
* initialize the email service here service here.
*
* @param context
*/
protected void activate(ComponentContext context) {
try {
if (log.isDebugEnabled()) {
log.debug("Initializing email service bundle");
}
DeviceConfigurationManager.getInstance().initConfig();
DeviceManagementConfig config =
DeviceConfigurationManager.getInstance().getDeviceManagementConfig();
/* Initializing Email Service Configurations */
EmailService emailServiceProvider = new EmailServiceProviderImpl();
EmailServiceDataHolder.getInstance().setEmailServiceProvider(emailServiceProvider); ;
this.registerServices(context);
if (log.isDebugEnabled()) {
log.debug("Email management core bundle has been successfully initialized");
}
} catch (Throwable e) {
log.error("Error occurred while initializing device management core bundle", e);
}
}
protected void setConfigurationContextService(ConfigurationContextService configurationContextService) {
EmailServiceDataHolder.getInstance().setConfigurationContextService(configurationContextService);
}
protected void unsetConfigurationContextService(ConfigurationContextService configurationContextService) {
EmailServiceDataHolder.getInstance().setConfigurationContextService(null);
}
private void registerServices(ComponentContext componentContext) {
if (log.isDebugEnabled()) {
log.debug("Registering OSGi service Email Service Impl");
}
/* Registering Email Service */
BundleContext bundleContext = componentContext.getBundleContext();
bundleContext.registerService(EmailService.class.getName(), new EmailServiceImpl(), null);
}
}

@ -1,61 +0,0 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.internal;
import org.wso2.carbon.device.mgt.core.service.EmailService;
import org.wso2.carbon.utils.ConfigurationContextService;
public class EmailServiceDataHolder {
private static EmailServiceDataHolder thisInstance = new EmailServiceDataHolder();
private ConfigurationContextService configurationContextService;
private EmailService emailServiceProvider;
public static EmailServiceDataHolder getThisInstance() {
return thisInstance;
}
public static void setThisInstance(EmailServiceDataHolder thisInstance) {
EmailServiceDataHolder.thisInstance = thisInstance;
}
private EmailServiceDataHolder() {
}
public static EmailServiceDataHolder getInstance() {
return thisInstance;
}
public ConfigurationContextService getConfigurationContextService() {
if (configurationContextService == null) {
throw new IllegalStateException("ConfigurationContext service is not initialized properly");
}
return configurationContextService;
}
public void setConfigurationContextService(ConfigurationContextService configurationContextService) {
this.configurationContextService = configurationContextService;
}
public EmailService getEmailServiceProvider() {
return emailServiceProvider;
}
public void setEmailServiceProvider(EmailService emailServiceProvider) {
this.emailServiceProvider = emailServiceProvider;
}
}

@ -20,5 +20,8 @@
package org.wso2.carbon.device.mgt.core.search.mgt;
public class Constants {
}
public static String GENERAL = "GENERAL";
public static String PROP_AND = "PROP_AND";
public static String PROP_OR = "PROP_OR";
}

@ -19,6 +19,41 @@
package org.wso2.carbon.device.mgt.core.search.mgt;
public class InvalidOperatorException {
public class InvalidOperatorException extends Exception {
private static final long serialVersionUID = -3151279311388888499L;
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public InvalidOperatorException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public InvalidOperatorException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public InvalidOperatorException(String msg) {
super(msg);
setErrorMessage(msg);
}
public InvalidOperatorException() {
super();
}
public InvalidOperatorException(Throwable cause) {
super(cause);
}
}

@ -0,0 +1,31 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.search.mgt;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import org.wso2.carbon.device.mgt.common.search.Condition;
import org.wso2.carbon.device.mgt.common.search.SearchContext;
import java.util.List;
public interface Processor {
List<DeviceWrapper> execute(SearchContext searchContext) throws SearchMgtException;
}

@ -20,19 +20,20 @@
package org.wso2.carbon.device.mgt.core.search.mgt;
import org.wso2.carbon.device.mgt.common.search.Condition;
import org.wso2.carbon.device.mgt.core.search.mgt.InvalidOperatorException;
import java.util.List;
import java.util.Map;
public interface QueryBuilder {
void processAND(List<Condition> conditions) throws InvalidOperatorException;
Map<String, List<String>> buildQueries(List<Condition> conditions) throws InvalidOperatorException;
void processOR(List<Condition> conditions) throws InvalidOperatorException;
String processAND(List<Condition> conditions) throws InvalidOperatorException;
void processEQUALS(List<Condition> conditions) throws InvalidOperatorException;
String processOR(List<Condition> conditions) throws InvalidOperatorException;
void processGREATERTHAN(List<Condition> conditions) throws InvalidOperatorException;
List<String> processANDProperties(List<Condition> conditions) throws InvalidOperatorException;
List<String> processORProperties(List<Condition> conditions) throws InvalidOperatorException;
void processLESSTHAN(List<Condition> conditions) throws InvalidOperatorException;
}

@ -0,0 +1,31 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.search.mgt;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import java.util.List;
import java.util.Map;
public interface ResultSetAggregator {
List<DeviceWrapper> aggregate(Map<String, List<DeviceWrapper>> deviceWrappers);
}

@ -0,0 +1,31 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.search.mgt;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import org.wso2.carbon.device.mgt.common.search.SearchContext;
import java.util.List;
public interface SearchManagerService {
List<DeviceWrapper> search(SearchContext searchContext) throws SearchMgtException;
}

@ -19,6 +19,41 @@
package org.wso2.carbon.device.mgt.core.search.mgt;
public class SearchMgtException {
public class SearchMgtException extends Exception {
private static final long serialVersionUID = -315127931137777499L;
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public SearchMgtException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public SearchMgtException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public SearchMgtException(String msg) {
super(msg);
setErrorMessage(msg);
}
public SearchMgtException() {
super();
}
public SearchMgtException(Throwable cause) {
super(cause);
}
}

@ -19,5 +19,13 @@
package org.wso2.carbon.device.mgt.core.search.mgt.dao;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import java.util.List;
public interface SearchDAO {
List<DeviceWrapper> searchDeviceDetailsTable(String query) throws SearchDAOException;
List<DeviceWrapper> searchDevicePropertyTable(String query) throws SearchDAOException;
}

@ -0,0 +1,59 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.search.mgt.dao;
public class SearchDAOException extends Exception {
private static final long serialVersionUID = -315127931139999499L;
private String errorMessage;
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public SearchDAOException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public SearchDAOException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public SearchDAOException(String msg) {
super(msg);
setErrorMessage(msg);
}
public SearchDAOException() {
super();
}
public SearchDAOException(Throwable cause) {
super(cause);
}
}

@ -19,6 +19,250 @@
package org.wso2.carbon.device.mgt.core.search.mgt.dao.impl;
public class SearchDAOImpl {
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.Device;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory;
import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil;
import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAO;
import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAOException;
import org.wso2.carbon.device.mgt.core.search.mgt.impl.Utils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class SearchDAOImpl implements SearchDAO {
private static final Log log = LogFactory.getLog(SearchDAOImpl.class);
@Override
public List<DeviceWrapper> searchDeviceDetailsTable(String query) throws SearchDAOException {
if (log.isDebugEnabled()) {
log.debug("Query : " + query);
}
Connection conn;
PreparedStatement stmt = null;
ResultSet rs;
List<DeviceWrapper> devices = new ArrayList<>();
try {
conn = this.getConnection();
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
while (rs.next()) {
Device device = new Device();
device.setId(rs.getInt("ID"));
device.setDescription(rs.getString("DESCRIPTION"));
device.setName("NAME");
device.setType(rs.getString("DEVICE_TYPE_NAME"));
device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION"));
DeviceIdentifier identifier = new DeviceIdentifier();
identifier.setType(rs.getString("DEVICE_TYPE_NAME"));
identifier.setId(rs.getString("DEVICE_IDENTIFICATION"));
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.setDeviceId(rs.getInt("ID"));
deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY"));
deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL"));
deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE"));
deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE"));
deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL"));
deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY"));
deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
deviceInfo.setIMEI(rs.getString("IMEI"));
deviceInfo.setIMSI(rs.getString("IMSI"));
deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY"));
deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
deviceInfo.setMobileSignalStrength(rs.getDouble("MOBILE_SIGNAL_STRENGTH"));
deviceInfo.setOperator(rs.getString("OPERATOR"));
deviceInfo.setOsVersion(rs.getString("OS_VERSION"));
deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN"));
deviceInfo.setSsid(rs.getString("SSID"));
deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY"));
deviceInfo.setVendor(rs.getString("VENDOR"));
DeviceLocation deviceLocation = new DeviceLocation();
deviceLocation.setLatitude(rs.getDouble("LATITUDE"));
deviceLocation.setLongitude(rs.getDouble("LONGITUDE"));
deviceLocation.setStreet1(rs.getString("STREET1"));
deviceLocation.setStreet2(rs.getString("STREET2"));
deviceLocation.setCity(rs.getString("CITY"));
deviceLocation.setState(rs.getString("STATE"));
deviceLocation.setZip(rs.getString("ZIP"));
deviceLocation.setCountry(rs.getString("COUNTRY"));
deviceLocation.setDeviceId(rs.getInt("ID"));
DeviceWrapper wrapper = new DeviceWrapper();
wrapper.setDevice(device);
wrapper.setDeviceInfo(deviceInfo);
wrapper.setDeviceLocation(deviceLocation);
wrapper.setDeviceIdentifier(identifier);
devices.add(wrapper);
}
} catch (SQLException e) {
throw new SearchDAOException("Error occurred while acquiring the device details.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
}
this.fillPropertiesOfDevices(devices);
if (log.isDebugEnabled()) {
log.debug("Number of the device returned from the query : " + devices.size());
}
return devices;
}
@Override
public List<DeviceWrapper> searchDevicePropertyTable(String query) throws SearchDAOException {
if (log.isDebugEnabled()) {
log.debug("Query : " + query);
}
Connection conn;
PreparedStatement stmt = null;
ResultSet rs;
List<DeviceWrapper> devices = new ArrayList<>();
try {
conn = this.getConnection();
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
while (rs.next()) {
Device device = new Device();
device.setId(rs.getInt("ID"));
device.setDescription(rs.getString("DESCRIPTION"));
device.setName("NAME");
device.setType(rs.getString("DEVICE_TYPE_NAME"));
device.setDeviceIdentifier(rs.getString("DEVICE_IDENTIFICATION"));
DeviceIdentifier identifier = new DeviceIdentifier();
identifier.setType(rs.getString("DEVICE_TYPE_NAME"));
identifier.setId(rs.getString("DEVICE_IDENTIFICATION"));
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.setDeviceId(rs.getInt("ID"));
deviceInfo.setAvailableRAMMemory(rs.getDouble("AVAILABLE_RAM_MEMORY"));
deviceInfo.setBatteryLevel(rs.getDouble("BATTERY_LEVEL"));
deviceInfo.setConnectionType(rs.getString("CONNECTION_TYPE"));
deviceInfo.setCpuUsage(rs.getDouble("CPU_USAGE"));
deviceInfo.setDeviceModel(rs.getString("DEVICE_MODEL"));
deviceInfo.setExternalAvailableMemory(rs.getDouble("EXTERNAL_AVAILABLE_MEMORY"));
deviceInfo.setExternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
deviceInfo.setIMEI(rs.getString("IMEI"));
deviceInfo.setIMSI(rs.getString("IMSI"));
deviceInfo.setInternalAvailableMemory(rs.getDouble("INTERNAL_AVAILABLE_MEMORY"));
deviceInfo.setInternalTotalMemory(rs.getDouble("EXTERNAL_TOTAL_MEMORY"));
deviceInfo.setMobileSignalStrength(rs.getDouble("MOBILE_SIGNAL_STRENGTH"));
deviceInfo.setOperator(rs.getString("OPERATOR"));
deviceInfo.setOsVersion(rs.getString("OS_VERSION"));
deviceInfo.setPluggedIn(rs.getBoolean("PLUGGED_IN"));
deviceInfo.setSsid(rs.getString("SSID"));
deviceInfo.setTotalRAMMemory(rs.getDouble("TOTAL_RAM_MEMORY"));
deviceInfo.setVendor(rs.getString("VENDOR"));
DeviceLocation deviceLocation = new DeviceLocation();
deviceLocation.setLatitude(rs.getDouble("LATITUDE"));
deviceLocation.setLongitude(rs.getDouble("LONGITUDE"));
deviceLocation.setStreet1(rs.getString("STREET1"));
deviceLocation.setStreet2(rs.getString("STREET2"));
deviceLocation.setCity(rs.getString("CITY"));
deviceLocation.setState(rs.getString("STATE"));
deviceLocation.setZip(rs.getString("ZIP"));
deviceLocation.setCountry(rs.getString("COUNTRY"));
deviceLocation.setDeviceId(rs.getInt("ID"));
DeviceWrapper wrapper = new DeviceWrapper();
wrapper.setDevice(device);
wrapper.setDeviceInfo(deviceInfo);
wrapper.setDeviceLocation(deviceLocation);
wrapper.setDeviceIdentifier(identifier);
devices.add(wrapper);
}
} catch (SQLException e) {
throw new SearchDAOException("Error occurred while aquiring the device details.", e);
} finally {
DeviceManagementDAOUtil.cleanupResources(stmt, null);
}
this.fillPropertiesOfDevices(devices);
if (log.isDebugEnabled()) {
log.debug("Number of the device returned from the query : " + devices.size());
}
return devices;
}
private Connection getConnection() throws SQLException {
return DeviceManagementDAOFactory.getConnection();
}
private List<DeviceWrapper> fillPropertiesOfDevices(List<DeviceWrapper> devices) throws SearchDAOException {
if (devices.isEmpty()) {
return null;
}
Connection conn;
PreparedStatement stmt;
ResultSet rs;
try {
conn = this.getConnection();
String query = "SELECT * FROM DM_DEVICE_INFO WHERE DEVICE_ID IN (?) ORDER BY DEVICE_ID ;";
stmt = conn.prepareStatement(query);
if (conn.getMetaData().getDatabaseProductName().contains("H2")) {
String inData = Utils.getDeviceIdsAsString(devices);
stmt.setString(1, inData);
} else {
Array array = conn.createArrayOf("INT", Utils.getArrayOfDeviceIds(devices));
stmt.setArray(1, array);
}
rs = stmt.executeQuery();
int deviceId = 0;
while (rs.next()) {
DeviceInfo dInfo = new DeviceInfo();
if (deviceId != rs.getInt("DEVICE_ID")) {
deviceId = rs.getInt("DEVICE_ID");
dInfo = this.getDeviceInfo(devices, deviceId);
if (dInfo != null) {
dInfo.getDeviceDetailsMap().put(rs.getString("KEY_FIELD"), rs.getString("VALUE_FIELD"));
}
} else {
dInfo.getDeviceDetailsMap().put(rs.getString("KEY_FIELD"), rs.getString("VALUE_FIELD"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return devices;
}
private DeviceInfo getDeviceInfo(List<DeviceWrapper> devices, int deviceId) {
for (DeviceWrapper dw : devices) {
if (dw.getDevice().getId() == deviceId) {
return dw.getDeviceInfo();
}
}
return null;
}
}

@ -19,6 +19,143 @@
package org.wso2.carbon.device.mgt.core.search.mgt.impl;
public class ProcessorImpl {
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import org.wso2.carbon.device.mgt.common.search.SearchContext;
import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory;
import org.wso2.carbon.device.mgt.core.search.mgt.*;
import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAO;
import org.wso2.carbon.device.mgt.core.search.mgt.dao.SearchDAOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ProcessorImpl implements Processor {
private SearchDAO searchDAO;
public ProcessorImpl() {
searchDAO = DeviceManagementDAOFactory.getSearchDAO();
}
@Override
public List<DeviceWrapper> execute(SearchContext searchContext) throws SearchMgtException {
QueryBuilder queryBuilder = new QueryBuilderImpl();
List<DeviceWrapper> generalDevices = new ArrayList<>();
List<List<DeviceWrapper>> allANDDevices = new ArrayList<>();
List<List<DeviceWrapper>> allORDevices = new ArrayList<>();
try {
Map<String, List<String>> queries = queryBuilder.buildQueries(searchContext.getConditions());
DeviceManagementDAOFactory.openConnection();
if (queries.containsKey(Constants.GENERAL)) {
generalDevices = searchDAO.searchDeviceDetailsTable(queries.get(Constants.GENERAL).get(0));
}
if (queries.containsKey(Constants.PROP_AND)) {
for (String query : queries.get(Constants.PROP_AND)) {
List<DeviceWrapper> andDevices = searchDAO.searchDevicePropertyTable(query);
allANDDevices.add(andDevices);
}
}
if (queries.containsKey(Constants.PROP_OR)) {
for (String query : queries.get(Constants.PROP_OR)) {
List<DeviceWrapper> orDevices = searchDAO.searchDevicePropertyTable(query);
allORDevices.add(orDevices);
}
}
} catch (InvalidOperatorException e) {
throw new SearchMgtException("Invalid operator was provided, so cannot execute the search.", e);
} catch (SQLException e) {
throw new SearchMgtException("Error occurred while managing database transactions.", e);
} catch (SearchDAOException e) {
throw new SearchMgtException("Error occurred while running the search operations.", e);
} finally {
DeviceManagementDAOFactory.closeConnection();
}
ResultSetAggregator aggregator = new ResultSetAggregatorImpl();
Map<String, List<DeviceWrapper>> deviceWrappers = new HashMap<>();
deviceWrappers.put(Constants.GENERAL, generalDevices);
deviceWrappers.put(Constants.PROP_AND, this.processANDSearch(allANDDevices));
deviceWrappers.put(Constants.PROP_OR, this.processORSearch(allORDevices));
return aggregator.aggregate(deviceWrappers);
}
private List<DeviceWrapper> processANDSearch(List<List<DeviceWrapper>> deLists) {
List<DeviceWrapper> devices = new ArrayList<>();
List<DeviceWrapper> smallestDeviceList = this.findListWithLowestItems(deLists);
List<Map<Integer, DeviceWrapper>> maps = this.convertDeviceListToMap(deLists);
boolean valueExist = false;
for (DeviceWrapper dw : smallestDeviceList) {
for (Map<Integer, DeviceWrapper> deviceWrapperMap : maps) {
if (deviceWrapperMap.containsKey(dw.getDevice().getId())) {
valueExist = true;
} else {
valueExist = false;
break;
}
}
if (valueExist) {
devices.add(dw);
}
}
return devices;
}
private List<DeviceWrapper> processORSearch(List<List<DeviceWrapper>> deLists) {
List<DeviceWrapper> devices = new ArrayList<>();
Map<Integer, DeviceWrapper> map = new HashMap<>();
for (List<DeviceWrapper> list : deLists) {
for (DeviceWrapper dw : list) {
if (!map.containsKey(dw.getDevice().getId())) {
map.put(dw.getDevice().getId(), dw);
devices.add(dw);
}
}
}
return devices;
}
private List<DeviceWrapper> findListWithLowestItems(List<List<DeviceWrapper>> deLists) {
int size = 0;
List<DeviceWrapper> deviceWrappers = new ArrayList<>();
for (List<DeviceWrapper> list : deLists) {
if (size == 0) {
size = list.size();
deviceWrappers = list;
continue;
} else {
if (list.size() < size) {
deviceWrappers = list;
}
}
}
return deviceWrappers;
}
private List<Map<Integer, DeviceWrapper>> convertDeviceListToMap(List<List<DeviceWrapper>> deLists) {
List<Map<Integer, DeviceWrapper>> maps = new ArrayList<>();
for (List<DeviceWrapper> deviceWrapperList : deLists) {
Map<Integer, DeviceWrapper> deviceWrapperMap = new HashMap<>();
for (DeviceWrapper dw : deviceWrapperList) {
deviceWrapperMap.put(dw.getDevice().getId(), dw);
}
maps.add(deviceWrapperMap);
}
return maps;
}
}

@ -0,0 +1,193 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.search.mgt.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.mgt.common.search.Condition;
import org.wso2.carbon.device.mgt.core.search.mgt.Constants;
import org.wso2.carbon.device.mgt.core.search.mgt.InvalidOperatorException;
import org.wso2.carbon.device.mgt.core.search.mgt.QueryBuilder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class QueryBuilderImpl implements QueryBuilder {
private static final Log log = LogFactory.getLog(QueryBuilderImpl.class);
@Override
public Map<String, List<String>> buildQueries(List<Condition> conditions) throws InvalidOperatorException {
List<Condition> andColumns = new ArrayList<>();
List<Condition> orColumns = new ArrayList<>();
List<Condition> otherANDColumns = new ArrayList<>();
List<Condition> otherORColumns = new ArrayList<>();
if (conditions.size() == 1) {
if (Utils.getDeviceDetailsColumnNames().containsKey(conditions.get(0)) ||
Utils.getDeviceLocationColumnNames().containsKey(conditions.get(0))) {
andColumns.add(conditions.get(0));
} else {
otherANDColumns.add(conditions.get(0));
}
} else {
for (Condition con : conditions) {
if (Utils.getDeviceDetailsColumnNames().containsKey(con.getKey()) ||
Utils.getDeviceLocationColumnNames().containsKey(con.getKey())) {
if (con.getState().equals(Condition.State.AND)) {
andColumns.add(con);
} else if (con.getState().equals(Condition.State.OR)) {
orColumns.add(con);
} else {
throw new InvalidOperatorException(con.getState() + " is not a valid operator.");
}
} else {
if (con.getState().equals(Condition.State.AND)) {
otherANDColumns.add(con);
} else if (con.getState().equals(Condition.State.OR)) {
otherORColumns.add(con);
} else {
throw new InvalidOperatorException(con.getState() + " is not a valid operator.");
}
}
}
}
Map<String, List<String>> queries = new HashMap<>();
queries.put(Constants.GENERAL, Utils.convertStringToList(this.getGenericQueryPart() + this.processAND(andColumns) +
this.processOR(orColumns)));
queries.put(Constants.PROP_AND, this.processANDProperties(otherANDColumns));
queries.put(Constants.PROP_OR, this.processORProperties(otherORColumns));
if (log.isDebugEnabled()) {
log.debug("General Query : " + queries.get(Constants.GENERAL));
log.debug("Property with AND Query : " + queries.get(Constants.PROP_AND));
log.debug("Property with OR Query : " + queries.get(Constants.PROP_OR));
}
return queries;
}
@Override
public String processAND(List<Condition> conditions) throws InvalidOperatorException {
String querySuffix = "";
for (Condition con : conditions) {
if (Utils.getDeviceDetailsColumnNames().containsKey(con.getKey())) {
querySuffix = querySuffix + " AND DD." + Utils.getDeviceDetailsColumnNames().get(con.getKey()) +
con.getOperator() + con.getValue();
} else if (Utils.getDeviceLocationColumnNames().containsKey(con.getKey())) {
querySuffix = querySuffix + " AND DL." + Utils.getDeviceLocationColumnNames().get(con.getKey()) +
con.getOperator() + con.getValue();
}
}
return querySuffix;
}
@Override
public String processOR(List<Condition> conditions) throws InvalidOperatorException {
String querySuffix = "";
for (Condition con : conditions) {
if (Utils.getDeviceDetailsColumnNames().containsKey(con.getKey())) {
querySuffix = querySuffix + " OR DD." + Utils.getDeviceDetailsColumnNames().get(con.getKey()) +
con.getOperator() + con.getValue();
} else if (Utils.getDeviceLocationColumnNames().containsKey(con.getKey())) {
querySuffix = querySuffix + " OR DL." + Utils.getDeviceLocationColumnNames().get(con.getKey()) +
con.getOperator() + con.getValue();
}
}
return querySuffix;
}
@Override
public List<String> processANDProperties(List<Condition> conditions) throws InvalidOperatorException {
return this.getQueryList(conditions);
}
@Override
public List<String> processORProperties(List<Condition> conditions) throws InvalidOperatorException {
return this.getQueryList(conditions);
}
private List<String> getQueryList(List<Condition> conditions) {
List<String> queryList = new ArrayList<>();
for (Condition con : conditions) {
String querySuffix = this.getPropertyQueryPart() + " AND DI.KEY_FIELD = " + "\'" + con.getKey() + "\'" +
" AND DI.VALUE_FIELD " + con.getOperator() + "\'" + con.getValue() + "\'";
queryList.add(querySuffix);
}
return queryList;
}
private String getGenericQueryPart() {
return "SELECT D.ID, D.DESCRIPTION, D.NAME, \n" +
" D.DEVICE_TYPE_ID, D.DEVICE_IDENTIFICATION, DT.ID AS DEVICE_TYPE_ID, \n" +
"DT.NAME AS DEVICE_TYPE_NAME, DD.DEVICE_ID, DD.IMEI, DD.IMSI, DD.DEVICE_MODEL, DD.VENDOR, \n" +
"DD.OS_VERSION, DD.BATTERY_LEVEL, DD.INTERNAL_TOTAL_MEMORY, DD.INTERNAL_AVAILABLE_MEMORY,\n" +
"DD.EXTERNAL_TOTAL_MEMORY, DD.EXTERNAL_AVAILABLE_MEMORY, DD.OPERATOR, DD.CONNECTION_TYPE, \n" +
"DD.MOBILE_SIGNAL_STRENGTH, DD.SSID, DD.CPU_USAGE, DD.TOTAL_RAM_MEMORY, DD.AVAILABLE_RAM_MEMORY, \n" +
"DD.PLUGGED_IN, DL.LATITUDE, DL.LONGITUDE, DL.STREET1, DL.STREET2, DL.CITY, DL.ZIP, \n" +
"DL.STATE, DL.COUNTRY FROM DM_DEVICE_DETAIL AS DD, DM_DEVICE AS D, DM_DEVICE_LOCATION AS DL, " +
"DM_DEVICE_TYPE AS DT WHERE D.TENANT_ID = " +
PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
// CREATE TABLE IF NOT EXISTS DM_DEVICE (
// ID INTEGER auto_increment NOT NULL,
// DESCRIPTION TEXT DEFAULT NULL,
// NAME VARCHAR(100) DEFAULT NULL,
// DEVICE_TYPE_ID INT(11) DEFAULT NULL,
// DEVICE_IDENTIFICATION VARCHAR(300) DEFAULT NULL,
// TENANT_ID INTEGER DEFAULT 0,
// PRIMARY KEY (ID),
// CONSTRAINT fk_DM_DEVICE_DM_DEVICE_TYPE2 FOREIGN KEY (DEVICE_TYPE_ID )
// REFERENCES DM_DEVICE_TYPE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
// );
}
private String getPropertyQueryPart() {
return "SELECT D.ID, D.DESCRIPTION, D.NAME, \n" +
" D.DEVICE_TYPE_ID, D.DEVICE_IDENTIFICATION, DT.ID AS DEVICE_TYPE_ID, \n" +
"DT.NAME AS DEVICE_TYPE_NAME, DD.DEVICE_ID, DD.IMEI, DD.IMSI, DD.DEVICE_MODEL, DD.VENDOR, \n" +
"DD.OS_VERSION, DD.BATTERY_LEVEL, DD.INTERNAL_TOTAL_MEMORY, DD.INTERNAL_AVAILABLE_MEMORY,\n" +
"DD.EXTERNAL_TOTAL_MEMORY, DD.EXTERNAL_AVAILABLE_MEMORY, DD.OPERATOR, DD.CONNECTION_TYPE, \n" +
"DD.MOBILE_SIGNAL_STRENGTH, DD.SSID, DD.CPU_USAGE, DD.TOTAL_RAM_MEMORY, DD.AVAILABLE_RAM_MEMORY, \n" +
"DD.PLUGGED_IN, DL.LATITUDE, DL.LONGITUDE, DL.STREET1, DL.STREET2, DL.CITY, DL.ZIP, \n" +
"DL.STATE, DL.COUNTRY, DI.KEY_FIELD, DI.VALUE_FIELD FROM DM_DEVICE_DETAIL AS DD, " +
"DM_DEVICE AS D, DM_DEVICE_LOCATION AS DL, \n" +
"DM_DEVICE_INFO AS DI, DM_DEVICE_TYPE AS DT WHERE D.TENANT_ID = " +
PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
}
}

@ -20,6 +20,7 @@
package org.wso2.carbon.device.mgt.core.search.mgt.impl;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import org.wso2.carbon.device.mgt.core.search.mgt.Constants;
import org.wso2.carbon.device.mgt.core.search.mgt.ResultSetAggregator;
import java.util.ArrayList;
@ -28,26 +29,22 @@ import java.util.List;
import java.util.Map;
public class ResultSetAggregatorImpl implements ResultSetAggregator {
@Override
public List<DeviceWrapper> aggregate(Map<String, List<DeviceWrapper>> deviceWrappers) {
Map<Integer, DeviceWrapper> generalQueryMap = this.convertToMap(deviceWrappers.get("GENERAL"));
Map<Integer, DeviceWrapper> andMap = this.convertToMap(deviceWrappers.get("PROP_AND"));
Map<Integer, DeviceWrapper> orMap = this.convertToMap(deviceWrappers.get("PROP_OR"));
Map<Integer, DeviceWrapper> generalQueryMap = this.convertToMap(deviceWrappers.get(Constants.GENERAL));
Map<Integer, DeviceWrapper> andMap = this.convertToMap(deviceWrappers.get(Constants.PROP_AND));
Map<Integer, DeviceWrapper> orMap = this.convertToMap(deviceWrappers.get(Constants.PROP_OR));
List<DeviceWrapper> finalResult = new ArrayList<>();
for (Integer a : andMap.keySet()) {
if(generalQueryMap.containsKey(a)) {
if (generalQueryMap.containsKey(a)) {
finalResult.add(andMap.get(a));
}
}
for (Integer a : orMap.keySet()) {
finalResult.add(orMap.get(a));
}
return finalResult;
}
@ -63,4 +60,3 @@ public class ResultSetAggregatorImpl implements ResultSetAggregator {
return deviceWrapperMap;
}
}

@ -0,0 +1,44 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.search.mgt.impl;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import org.wso2.carbon.device.mgt.common.search.SearchContext;
import org.wso2.carbon.device.mgt.core.search.mgt.Processor;
import org.wso2.carbon.device.mgt.core.search.mgt.SearchManagerService;
import org.wso2.carbon.device.mgt.core.search.mgt.SearchMgtException;
import java.util.List;
public class SearchManagerServiceImpl implements SearchManagerService {
private Processor processor;
public SearchManagerServiceImpl() {
processor = new ProcessorImpl();
}
@Override
public List<DeviceWrapper> search(SearchContext searchContext) throws SearchMgtException {
return processor.execute(searchContext);
}
}

@ -19,6 +19,86 @@
package org.wso2.carbon.device.mgt.core.search.mgt.impl;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Utils {
public static Map<String, String> getDeviceDetailsColumnNames() {
Map<String, String> colonmsMap = new HashMap<>();
colonmsMap.put("IMEI", "IMEI");
colonmsMap.put("IMSI", "IMSI");
colonmsMap.put("deviceModel", "DEVICE_MODEL");
colonmsMap.put("vendor", "VENDOR");
colonmsMap.put("osVersion", "OS_VERSION");
colonmsMap.put("batteryLevel", "BATTERY_LEVEL");
colonmsMap.put("internalTotalMemory", "INTERNAL_TOTAL_MEMORY");
colonmsMap.put("internalAvailableMemory", "INTERNAL_AVAILABLE_MEMORY");
colonmsMap.put("externalTotalMemory", "EXTERNAL_TOTAL_MEMORY");
colonmsMap.put("externalAvailableMemory", "EXTERNAL_AVAILABLE_MEMORY");
colonmsMap.put("operator", "OPERATOR");
colonmsMap.put("connectionType", "CONNECTION_TYPE");
colonmsMap.put("mobileSignalStrength", "MOBILE_SIGNAL_STRENGTH");
colonmsMap.put("ssid", "SSID");
colonmsMap.put("cpuUsage", "CPU_USAGE");
colonmsMap.put("totalRAMMemory", "TOTAL_RAM_MEMORY");
colonmsMap.put("availableRAMMemory", "AVAILABLE_RAM_MEMORY");
colonmsMap.put("pluggedIn", "PLUGGED_IN");
return colonmsMap;
}
public static Map<String, String> getDeviceLocationColumnNames() {
Map<String, String> colonmsMap = new HashMap<>();
colonmsMap.put("latitude", "LATITUDE");
colonmsMap.put("longitude", "LONGITUDE");
colonmsMap.put("street1", "STREET1");
colonmsMap.put("street2", "STREET2");
colonmsMap.put("city", "CITY");
colonmsMap.put("state", "ZIP");
colonmsMap.put("zip", "STATE");
colonmsMap.put("country", "COUNTRY");
return colonmsMap;
}
public static List<String> convertStringToList(String str) {
List<String> stList = new ArrayList<>();
stList.add(str);
return stList;
}
public static Integer[] getArrayOfDeviceIds(List<DeviceWrapper> deviceWrappers) {
Integer[] arr = new Integer[deviceWrappers.size()];
int x = 0;
for (DeviceWrapper dw : deviceWrappers) {
arr[x] = dw.getDevice().getId();
x++;
}
return arr;
}
public static String getDeviceIdsAsString(List<DeviceWrapper> deviceWrappers) {
String str = "";
for (DeviceWrapper dw : deviceWrappers) {
str += dw.getDevice().getId() + ",";
}
if (deviceWrappers.isEmpty()) {
return null;
}
return str.substring(0, str.length() - 1);
}
}

@ -18,11 +18,8 @@
package org.wso2.carbon.device.mgt.core.service;
import org.wso2.carbon.device.mgt.common.*;
import org.wso2.carbon.device.mgt.common.DeviceManager;
import org.wso2.carbon.device.mgt.common.app.mgt.Application;
import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration;
import org.wso2.carbon.device.mgt.common.license.mgt.License;
import org.wso2.carbon.device.mgt.common.license.mgt.LicenseManager;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManager;
import org.wso2.carbon.device.mgt.core.dto.DeviceType;
@ -42,94 +39,95 @@ public interface DeviceManagementProviderService extends OperationManager {
/**
* Method to retrieve all the devices with pagination support.
*
* @param request PaginationRequest object holding the data for pagination
* @param request PaginationRequest object holding the data for pagination
* @return PaginationResult - Result including the required parameters necessary to do pagination.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* devices.
* devices.
*/
PaginationResult getDevicesByType(PaginationRequest request) throws DeviceManagementException;
/**
* Method to retrieve all the devices with pagination support.
*
* @param request PaginationRequest object holding the data for pagination
* @param request PaginationRequest object holding the data for pagination
* @return PaginationResult - Result including the required parameters necessary to do pagination.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* devices.
* devices.
*/
PaginationResult getAllDevices(PaginationRequest request) throws DeviceManagementException;
void sendEnrolmentInvitation(EmailMessageProperties config) throws DeviceManagementException;
void sendEnrolmentInvitation(EmailMetaInfo metaInfo) throws DeviceManagementException;
void sendRegistrationEmail(EmailMessageProperties config) throws DeviceManagementException;
void sendRegistrationEmail(EmailMetaInfo metaInfo) throws DeviceManagementException;
FeatureManager getFeatureManager(String deviceType) throws DeviceManagementException;
/**
* Proxy method to get the tenant configuration of a given platform.
*
* @param deviceType Device platform
* @param deviceType Device platform
* @return Tenant configuration settings of the particular tenant and platform.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* configuration.
* configuration.
*/
TenantConfiguration getConfiguration(String deviceType) throws DeviceManagementException;
/**
* Method to get the list of devices owned by an user with paging information.
*
* @param request PaginationRequest object holding the data for pagination
* @param request PaginationRequest object holding the data for pagination
* @return List of devices owned by a particular user along with the required parameters necessary to do pagination.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* device list
* device list
*/
PaginationResult getDevicesOfUser(PaginationRequest request) throws DeviceManagementException;
/**
* Method to get the list of devices filtered by the ownership with paging information.
*
* @param request PaginationRequest object holding the data for pagination
* @param request PaginationRequest object holding the data for pagination
* @return List of devices owned by a particular user along with the required parameters necessary to do pagination.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* device list
* device list
*/
PaginationResult getDevicesByOwnership(PaginationRequest request) throws DeviceManagementException;
/**
* Method to get the list of devices owned by an user.
*
* @param userName Username of the user
* @param userName Username of the user
* @return List of devices owned by a particular user
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* device list
* device list
*/
List<Device> getDevicesOfUser(String userName) throws DeviceManagementException;
/**
* Method to get the list of devices owned by users of a particular user-role.
*
* @param roleName Role name of the users
* @param roleName Role name of the users
* @return List of devices owned by users of a particular role
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* device list
* device list
*/
List<Device> getAllDevicesOfRole(String roleName) throws DeviceManagementException;
/**
* Method to get the count of all types of devices.
*
* @return device count
* @throws DeviceManagementException If some unusual behaviour is observed while counting
* the devices
* the devices
*/
int getDeviceCount() throws DeviceManagementException;
/**
* Method to get the list of devices that matches with the given device name.
*
* @param deviceName name of the device
* @param deviceName name of the device
* @return List of devices that matches with the given device name.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* device list
* device list
*/
List<Device> getDevicesByName(String deviceName) throws DeviceManagementException;
@ -139,7 +137,7 @@ public interface DeviceManagementProviderService extends OperationManager {
* @param request PaginationRequest object holding the data for pagination
* @return List of devices in given status along with the required parameters necessary to do pagination.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* device list
* device list
*/
PaginationResult getDevicesByName(PaginationRequest request) throws DeviceManagementException;
@ -160,7 +158,7 @@ public interface DeviceManagementProviderService extends OperationManager {
* @param request PaginationRequest object holding the data for pagination
* @return List of devices in given status along with the required parameters necessary to do pagination.
* @throws DeviceManagementException If some unusual behaviour is observed while fetching the
* device list
* device list
*/
PaginationResult getDevicesByStatus(PaginationRequest request) throws DeviceManagementException;
@ -188,7 +186,7 @@ public interface DeviceManagementProviderService extends OperationManager {
Device getDevice(DeviceIdentifier deviceId, EnrolmentInfo.Status status) throws DeviceManagementException;
List<DeviceType> getAvailableDeviceTypes() throws DeviceManagementException;
List<DeviceType> getAvailableDeviceTypes() throws DeviceManagementException;
boolean updateDeviceInfo(DeviceIdentifier deviceIdentifier, Device device) throws DeviceManagementException;
@ -199,6 +197,6 @@ public interface DeviceManagementProviderService extends OperationManager {
boolean setStatus(DeviceIdentifier deviceId, String currentOwner,
EnrolmentInfo.Status status) throws DeviceManagementException;
void notifyOperationToDevices(Operation operation, List<DeviceIdentifier> deviceIds)throws DeviceManagementException;
void notifyOperationToDevices(Operation operation, List<DeviceIdentifier> deviceIds) throws DeviceManagementException;
}

@ -28,26 +28,17 @@ import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException;
import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService;
import org.wso2.carbon.device.mgt.core.DeviceManagementPluginRepository;
import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager;
import org.wso2.carbon.device.mgt.core.config.email.EmailConfigurations;
import org.wso2.carbon.device.mgt.core.config.email.NotificationMessages;
import org.wso2.carbon.device.mgt.core.dao.*;
import org.wso2.carbon.device.mgt.core.dto.DeviceType;
import org.wso2.carbon.device.mgt.core.email.EmailConstants;
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementServiceComponent;
import org.wso2.carbon.device.mgt.core.internal.EmailServiceDataHolder;
import org.wso2.carbon.device.mgt.core.internal.PluginInitializationListener;
import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil;
import org.wso2.carbon.email.sender.core.TypedValue;
import org.wso2.carbon.user.api.UserStoreException;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
public class DeviceManagementProviderServiceImpl implements DeviceManagementProviderService,
PluginInitializationListener {
@ -517,130 +508,47 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
}
@Override
public void sendEnrolmentInvitation(EmailMessageProperties emailMessageProperties)
throws DeviceManagementException {
List<NotificationMessages> notificationMessages =
DeviceConfigurationManager.getInstance().getNotificationMessagesConfig().getNotificationMessagesList();
String messageHeader = "";
String messageBody = "";
String messageFooter1 = "";
String messageFooter2 = "";
String messageFooter3 = "";
String url = "";
String subject = "";
for (NotificationMessages notificationMessage : notificationMessages) {
if (org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailNotifications.ENROL_NOTIFICATION_TYPE
.equals(notificationMessage.getType())) {
messageHeader = notificationMessage.getHeader();
messageBody = notificationMessage.getBody();
messageFooter1 = notificationMessage.getFooterLine1();
messageFooter2 = notificationMessage.getFooterLine2();
messageFooter3 = notificationMessage.getFooterLine3();
url = notificationMessage.getUrl();
subject = notificationMessage.getSubject();
break;
}
}
StringBuilder messageBuilder = new StringBuilder();
try {
// Reading the download url from the cdm-config.xml file
EmailConfigurations emailConfig =
DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getEmailConfigurations();
emailMessageProperties.setEnrolmentUrl(emailConfig.getlBHostPortPrefix() +
emailConfig.getEnrollmentContextPath());
messageHeader = messageHeader.replaceAll("\\{" + EmailConstants.EnrolmentEmailConstants.FIRST_NAME + "\\}",
URLEncoder.encode(emailMessageProperties.getFirstName(),
EmailConstants.EnrolmentEmailConstants.ENCODED_SCHEME));
messageBody = messageBody.trim() + System.getProperty("line.separator") + url.replaceAll("\\{"
+ EmailConstants.EnrolmentEmailConstants.DOWNLOAD_URL + "\\}",
URLDecoder.decode(emailMessageProperties.getEnrolmentUrl(),
EmailConstants.EnrolmentEmailConstants.ENCODED_SCHEME));
messageBuilder.append(messageHeader).append(System.getProperty("line.separator"))
.append(System.getProperty("line.separator"));
messageBuilder.append(messageBody);
messageBuilder.append(System.getProperty("line.separator")).append(System.getProperty("line.separator"));
messageBuilder.append(messageFooter1.trim())
.append(System.getProperty("line.separator")).append(messageFooter2.trim()).append(System
.getProperty("line.separator")).append(messageFooter3.trim());
} catch (IOException e) {
throw new DeviceManagementException("Error replacing tags in email template '" +
emailMessageProperties.getSubject() + "'", e);
}
emailMessageProperties.setMessageBody(messageBuilder.toString());
emailMessageProperties.setSubject(subject);
EmailServiceDataHolder.getInstance().getEmailServiceProvider().sendEmail(emailMessageProperties);
public void sendEnrolmentInvitation(EmailMetaInfo metaInfo) throws DeviceManagementException {
Map<String, TypedValue<Class<?>, Object>> params = new HashMap<>();
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.FIRST_NAME,
new TypedValue<Class<?>, Object>(String.class, metaInfo.getProperty("first-name")));
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.SERVER_BASE_URL_HTTPS,
new TypedValue<Class<?>, Object>(String.class, DeviceManagerUtil.getServerBaseHttpsUrl()));
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.SERVER_BASE_URL_HTTP,
new TypedValue<Class<?>, Object>(String.class, DeviceManagerUtil.getServerBaseHttpUrl()));
// try {
// EmailContext ctx =
// new EmailContext.EmailContextBuilder(new ContentProviderInfo("user-enrollment", params),
// metaInfo.getRecipients()).build();
//// DeviceManagementDataHolder.getInstance().getEmailSenderService().sendEmail(ctx);
// } catch (EmailSendingFailedException e) {
// throw new DeviceManagementException("Error occurred while sending enrollment invitation", e);
// }
}
@Override
public void sendRegistrationEmail(EmailMessageProperties emailMessageProperties) throws DeviceManagementException {
List<NotificationMessages> notificationMessages =
DeviceConfigurationManager.getInstance().getNotificationMessagesConfig().getNotificationMessagesList();
String messageHeader = "";
String messageBody = "";
String messageFooter1 = "";
String messageFooter2 = "";
String messageFooter3 = "";
String url = "";
String subject = "";
for (NotificationMessages notificationMessage : notificationMessages) {
if (org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailNotifications.
USER_REGISTRATION_NOTIFICATION_TYPE.equals(notificationMessage.getType())) {
messageHeader = notificationMessage.getHeader();
messageBody = notificationMessage.getBody();
messageFooter1 = notificationMessage.getFooterLine1();
messageFooter2 = notificationMessage.getFooterLine2();
messageFooter3 = notificationMessage.getFooterLine3();
url = notificationMessage.getUrl();
subject = notificationMessage.getSubject();
break;
}
}
StringBuilder messageBuilder = new StringBuilder();
try {
// Reading the download url from the cdm-config.xml file
EmailConfigurations emailConfig =
DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getEmailConfigurations();
emailMessageProperties.setEnrolmentUrl(emailConfig.getlBHostPortPrefix() +
emailConfig.getEnrollmentContextPath());
messageHeader = messageHeader.replaceAll("\\{" + EmailConstants.EnrolmentEmailConstants.FIRST_NAME + "\\}",
URLEncoder.encode(emailMessageProperties.getFirstName(),
EmailConstants.EnrolmentEmailConstants.ENCODED_SCHEME));
messageBody = messageBody.trim().replaceAll("\\{" + EmailConstants.EnrolmentEmailConstants
.USERNAME
+ "\\}",
URLEncoder.encode(emailMessageProperties.getUserName(), EmailConstants.EnrolmentEmailConstants
.ENCODED_SCHEME));
messageBody = messageBody.trim().replaceAll("\\{" + EmailConstants.EnrolmentEmailConstants.DOMAIN
+ "\\}",
URLEncoder.encode(emailMessageProperties.getDomainName(), EmailConstants.EnrolmentEmailConstants
.ENCODED_SCHEME));
messageBody = messageBody.replaceAll("\\{" + EmailConstants.EnrolmentEmailConstants.PASSWORD + "\\}",
URLEncoder.encode(emailMessageProperties.getPassword(), EmailConstants.EnrolmentEmailConstants
.ENCODED_SCHEME));
messageBody = messageBody + System.getProperty("line.separator") + url.replaceAll("\\{"
+ EmailConstants.EnrolmentEmailConstants.DOWNLOAD_URL + "\\}",
URLDecoder.decode(emailMessageProperties.getEnrolmentUrl(),
EmailConstants.EnrolmentEmailConstants.ENCODED_SCHEME));
messageBuilder.append(messageHeader).append(System.getProperty("line.separator"));
messageBuilder.append(messageBody).append(System.getProperty("line.separator")).append(
messageFooter1.trim());
messageBuilder.append(System.getProperty("line.separator")).append(messageFooter2.trim());
messageBuilder.append(System.getProperty("line.separator")).append(messageFooter3.trim());
} catch (IOException e) {
throw new DeviceManagementException("Error replacing tags in email template '" +
emailMessageProperties.getSubject() + "'", e);
}
emailMessageProperties.setMessageBody(messageBuilder.toString());
emailMessageProperties.setSubject(subject);
EmailServiceDataHolder.getInstance().getEmailServiceProvider().sendEmail(emailMessageProperties);
public void sendRegistrationEmail(EmailMetaInfo metaInfo) throws DeviceManagementException {
Map<String, TypedValue<Class<?>, Object>> params = new HashMap<>();
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.FIRST_NAME,
new TypedValue<Class<?>, Object>(String.class, metaInfo.getProperty("first-name")));
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.USERNAME,
new TypedValue<Class<?>, Object>(String.class, metaInfo.getProperty("username")));
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.PASSWORD,
new TypedValue<Class<?>, Object>(String.class, metaInfo.getProperty("password")));
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.DOMAIN,
new TypedValue<Class<?>, Object>(String.class, metaInfo.getProperty("domain")));
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.SERVER_BASE_URL_HTTPS,
new TypedValue<Class<?>, Object>(String.class, DeviceManagerUtil.getServerBaseHttpsUrl()));
params.put(org.wso2.carbon.device.mgt.core.DeviceManagementConstants.EmailAttributes.SERVER_BASE_URL_HTTP,
new TypedValue<Class<?>, Object>(String.class, DeviceManagerUtil.getServerBaseHttpUrl()));
// try {
// EmailContext ctx =
// new EmailContext.EmailContextBuilder(new ContentProviderInfo("user-registration", params),
// metaInfo.getRecipients()).build();
// DeviceManagementDataHolder.getInstance().getEmailSenderService().sendEmail(ctx);
// } catch (EmailSendingFailedException e) {
// throw new DeviceManagementException("Error occurred while sending user registration notification", e);
// }
}
@Override
@ -721,11 +629,11 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
Map<String, DeviceManagementService> registeredTypes = pluginRepository.getAllDeviceManagementServices();
DeviceType deviceType;
if (registeredTypes != null && deviceTypesInDatabase != null) {
for (int x = 0; x < deviceTypesInDatabase.size(); x++) {
if (registeredTypes.get(deviceTypesInDatabase.get(x).getName()) != null) {
for (DeviceType aDeviceTypesInDatabase : deviceTypesInDatabase) {
if (registeredTypes.get(aDeviceTypesInDatabase.getName()) != null) {
deviceType = new DeviceType();
deviceType.setId(deviceTypesInDatabase.get(x).getId());
deviceType.setName(deviceTypesInDatabase.get(x).getName());
deviceType.setId(aDeviceTypesInDatabase.getId());
deviceType.setName(aDeviceTypesInDatabase.getName());
deviceTypesResponse.add(deviceType);
}
}

@ -0,0 +1,75 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.device.mgt.core.service;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
public class EmailMetaInfo {
private Set<String> recipients;
private Properties properties;
public EmailMetaInfo(final Set<String> recipients, final Properties properties) {
if (recipients == null) {
throw new IllegalArgumentException("Recipient list cannot be null");
}
if (recipients.size() == 0) {
throw new IllegalArgumentException("No recipient is configured. Recipient list should carry at " +
"least one recipient");
}
this.recipients = recipients;
if (properties == null) {
throw new IllegalArgumentException("Email Context property bag cannot be null");
}
this.properties = properties;
}
public EmailMetaInfo(final String recipient, final Properties properties) {
if (recipient == null || recipient.isEmpty()) {
throw new IllegalArgumentException("Recipient can't be null or empty. Please specify a valid " +
"recipient email address");
}
this.recipients = new HashSet<String>() {{
add(recipient);
}};
if (properties == null) {
throw new IllegalArgumentException("Email Context property bag cannot be null");
}
this.properties = properties;
}
public Set<String> getRecipients() {
return recipients;
}
public Properties getProperties() {
return properties;
}
public String getProperty(String name) {
return (String) properties.get(name);
}
public void addProperty(String name, String value) {
properties.put(name, value);
}
}

@ -1,31 +0,0 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* you may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.service;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.EmailMessageProperties;
import org.wso2.carbon.device.mgt.core.internal.EmailServiceDataHolder;
public class EmailServiceImpl implements EmailService{
@Override
public void sendEmail(EmailMessageProperties emailMessageProperties) throws DeviceManagementException {
EmailServiceDataHolder.getInstance().getEmailServiceProvider().sendEmail(emailMessageProperties);
}
}

@ -24,10 +24,48 @@ import java.util.List;
public interface DeviceTaskManager {
/**
* This method will get the operation list from
* @return
* This method will get the operation list from configurations.
*
* @return - list of Task Operations.
* @throws DeviceMgtTaskException
*/
List<TaskOperation> getOperationList() throws DeviceMgtTaskException;
/**
* This method will take the monitoring frequency.
* @return - integer
* @throws DeviceMgtTaskException
*/
int getTaskFrequency() throws DeviceMgtTaskException;
/**
* This method will return the task clazz from configurations.
* @return - Fully qualified class name.
* @throws DeviceMgtTaskException
*/
String getTaskImplementedClazz() throws DeviceMgtTaskException;
/**
* This method checks wheather task is enabled in config file.
* @return - return true or false
* @throws DeviceMgtTaskException
*/
boolean isTaskEnabled() throws DeviceMgtTaskException;
/**
* This method will add the operations to devices
* @throws DeviceMgtTaskException
*/
void addOperations() throws DeviceMgtTaskException;
/**
* This method will return the operation names which should be added in each iterations.
* @return
* @throws DeviceMgtTaskException
*/
List<String> getValidOperationNames() throws DeviceMgtTaskException;
}

@ -0,0 +1,45 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.task;
public interface DeviceTaskManagerService {
/**
* This method will stop the task.
* @throws DeviceMgtTaskException
*/
void startTask() throws DeviceMgtTaskException;
/**
* This method will start the task.
* @throws DeviceMgtTaskException
*/
void stopTask() throws DeviceMgtTaskException;
/**
* This will update the task frequency which it runs.
* @param frequency - integer
* @throws DeviceMgtTaskException
*/
void updateTask(int frequency) throws DeviceMgtTaskException;
}

@ -0,0 +1,47 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.task;
/**
* This is the bean for the operations added by the task.
*/
public class TaskOperation {
private String taskName;
private int recurrentTimes;
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public int getRecurrentTimes() {
return recurrentTimes;
}
public void setRecurrentTimes(int recurrentTimes) {
this.recurrentTimes = recurrentTimes;
}
}

@ -0,0 +1,43 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.task;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import java.util.HashMap;
public class Utils {
public static HashMap<String, Long> getTenantedTaskOperationMap(HashMap<Integer, HashMap<String, Long>> map) {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
if (map.containsKey(tenantId)) {
return map.get(tenantId);
} else {
HashMap<String, Long> mp = new HashMap<>();
map.put(tenantId, mp);
return mp;
}
}
}

@ -30,7 +30,7 @@ import java.util.Map;
public class DeviceDetailsRetrieverTask implements Task {
private static Log log = LogFactory.getLog(DeviceDetailsRetrieverTask.class);
private DeviceTaskManager deviceTaskManager = new DeviceTaskManagerImpl();
// private DeviceTaskManager deviceTaskManager = new DeviceTaskManagerImpl();
@Override
public void setProperties(Map<String, String> map) {
@ -48,6 +48,9 @@ public class DeviceDetailsRetrieverTask implements Task {
if (log.isDebugEnabled()) {
log.debug("Device details retrieving task started to run.");
}
DeviceTaskManager deviceTaskManager = new DeviceTaskManagerImpl();
try {
deviceTaskManager.addOperations();
} catch (DeviceMgtTaskException e) {

@ -0,0 +1,151 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.task.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.Device;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException;
import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager;
import org.wso2.carbon.device.mgt.core.config.task.TaskConfiguration;
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.device.mgt.core.task.DeviceMgtTaskException;
import org.wso2.carbon.device.mgt.core.task.DeviceTaskManager;
import org.wso2.carbon.device.mgt.core.task.TaskOperation;
import org.wso2.carbon.device.mgt.core.task.Utils;
import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class DeviceTaskManagerImpl implements DeviceTaskManager {
private static Log log = LogFactory.getLog(DeviceTaskManagerImpl.class);
private static HashMap<Integer, HashMap<String, Long>> map = new HashMap<>();
@Override
public List<TaskOperation> getOperationList() throws DeviceMgtTaskException {
TaskConfiguration taskConfiguration = DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getTaskConfiguration();
List<TaskConfiguration.Operation> ops = taskConfiguration.getOperations();
List<TaskOperation> taskOperations = new ArrayList<>();
for (TaskConfiguration.Operation op : ops) {
TaskOperation taskOperation = new TaskOperation();
taskOperation.setTaskName(op.getOperationName());
taskOperation.setRecurrentTimes(op.getRecurrency());
taskOperations.add(taskOperation);
}
return taskOperations;
}
@Override
public int getTaskFrequency() throws DeviceMgtTaskException {
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getTaskConfiguration().getFrequency();
}
@Override
public String getTaskImplementedClazz() throws DeviceMgtTaskException {
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getTaskConfiguration().getTaskClazz();
}
@Override
public boolean isTaskEnabled() throws DeviceMgtTaskException {
return DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getTaskConfiguration().isEnabled();
}
@Override
public void addOperations() throws DeviceMgtTaskException {
DeviceManagementProviderService deviceManagementProviderService =
DeviceManagementDataHolder.getInstance().getDeviceManagementProvider();
try {
List<Device> devices = deviceManagementProviderService.getAllDevices();
List<String> operations = this.getValidOperationNames();
if(!devices.isEmpty()) {
for (String str : operations) {
CommandOperation operation = new CommandOperation();
operation.setEnabled(true);
operation.setType(Operation.Type.COMMAND);
operation.setCode(str);
deviceManagementProviderService.addOperation(operation, DeviceManagerUtil.convertDevices(devices));
}
} else {
if(log.isDebugEnabled()){
log.debug("No devices are available to perform the operations.");
}
}
} catch (DeviceManagementException e) {
throw new DeviceMgtTaskException("Error occurred while retrieving the device list.", e);
} catch (OperationManagementException e) {
throw new DeviceMgtTaskException("Error occurred while adding the operations to devices", e);
}
}
@Override
public List<String> getValidOperationNames() throws DeviceMgtTaskException {
List<TaskOperation> taskOperations = this.getOperationList();
List<String> opNames = new ArrayList<>();
Long milliseconds = System.currentTimeMillis();
int frequency = this.getTaskFrequency();
HashMap<String, Long> mp = Utils.getTenantedTaskOperationMap(map);
for (TaskOperation top : taskOperations) {
if (!mp.containsKey(top.getTaskName())) {
opNames.add(top.getTaskName());
mp.put(top.getTaskName(), milliseconds);
} else {
Long lastExecutedTime = mp.get(top.getTaskName());
Long evalTime = lastExecutedTime + (frequency * top.getRecurrentTimes());
if (evalTime <= milliseconds) {
opNames.add(top.getTaskName());
mp.put(top.getTaskName(), milliseconds);
}
}
}
if(log.isDebugEnabled()){
log.debug("Valid operation names are : " + Arrays.toString(opNames.toArray()));
}
return opNames;
}
}

@ -0,0 +1,150 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.task.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
import org.wso2.carbon.device.mgt.core.task.DeviceMgtTaskException;
import org.wso2.carbon.device.mgt.core.task.DeviceTaskManager;
import org.wso2.carbon.device.mgt.core.task.DeviceTaskManagerService;
import org.wso2.carbon.ntask.common.TaskException;
import org.wso2.carbon.ntask.core.TaskInfo;
import org.wso2.carbon.ntask.core.TaskManager;
import org.wso2.carbon.ntask.core.service.TaskService;
import java.util.HashMap;
import java.util.Map;
public class DeviceTaskManagerServiceImpl implements DeviceTaskManagerService {
public static final String TASK_TYPE = "DEVICE_DETAILS";
public static final String TASK_NAME = "DEVICE_DETAILS_TASK";
public static final String TENANT_ID = "TENANT_ID";
private DeviceTaskManager deviceTaskManager;
private static Log log = LogFactory.getLog(DeviceTaskManagerServiceImpl.class);
@Override
public void startTask() throws DeviceMgtTaskException {
deviceTaskManager = new DeviceTaskManagerImpl();
if (!deviceTaskManager.isTaskEnabled()) {
throw new DeviceMgtTaskException("Task cannot be started, Please enable the task in cdm-config.xml file.");
}
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
try {
TaskService taskService = DeviceManagementDataHolder.getInstance().getTaskService();
taskService.registerTaskType(TASK_TYPE);
if (log.isDebugEnabled()) {
log.debug("Device details retrieving task is started for the tenant id " + tenantId);
log.debug("Device details retrieving task is at frequency of : " + deviceTaskManager.getTaskFrequency());
}
TaskManager taskManager = taskService.getTaskManager(TASK_TYPE);
TaskInfo.TriggerInfo triggerInfo = new TaskInfo.TriggerInfo();
triggerInfo.setIntervalMillis(deviceTaskManager.getTaskFrequency());
triggerInfo.setRepeatCount(-1);
Map<String, String> properties = new HashMap<>();
properties.put(TENANT_ID, String.valueOf(tenantId));
if (!taskManager.isTaskScheduled(TASK_NAME)) {
TaskInfo taskInfo = new TaskInfo(TASK_NAME, deviceTaskManager.getTaskImplementedClazz(),
properties, triggerInfo);
taskManager.registerTask(taskInfo);
taskManager.rescheduleTask(taskInfo.getName());
} else {
throw new DeviceMgtTaskException("Device details retrieving task is already started for this tenant " +
tenantId);
}
} catch (TaskException e) {
throw new DeviceMgtTaskException("Error occurred while creating the task for tenant " + tenantId, e);
}
}
@Override
public void stopTask() throws DeviceMgtTaskException {
try {
TaskService taskService = DeviceManagementDataHolder.getInstance().getTaskService();
if (taskService.isServerInit()) {
TaskManager taskManager = taskService.getTaskManager(TASK_TYPE);
taskManager.deleteTask(TASK_NAME);
}
} catch (TaskException e) {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
throw new DeviceMgtTaskException("Error occurred while deleting the task for tenant " + tenantId, e);
}
}
@Override
public void updateTask(int frequency) throws DeviceMgtTaskException {
if (!deviceTaskManager.isTaskEnabled()) {
throw new DeviceMgtTaskException("Task cannot be updated, Please enable the task in cdm-config.xml file.");
}
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
deviceTaskManager = new DeviceTaskManagerImpl();
try {
TaskService taskService = DeviceManagementDataHolder.getInstance().getTaskService();
TaskManager taskManager = taskService.getTaskManager(TASK_TYPE);
if (taskManager.isTaskScheduled(TASK_NAME)) {
taskManager.deleteTask(TASK_NAME);
TaskInfo.TriggerInfo triggerInfo = new TaskInfo.TriggerInfo();
triggerInfo.setIntervalMillis(frequency);
triggerInfo.setRepeatCount(-1);
Map<String, String> properties = new HashMap<>();
properties.put(TENANT_ID, String.valueOf(tenantId));
TaskInfo taskInfo = new TaskInfo(TASK_NAME, deviceTaskManager.getTaskImplementedClazz(), properties,
triggerInfo);
taskManager.registerTask(taskInfo);
taskManager.rescheduleTask(taskInfo.getName());
} else {
throw new DeviceMgtTaskException("Device details retrieving task has not been started for this tenant " +
tenantId + ". Please start the task first.");
}
} catch (TaskException e) {
throw new DeviceMgtTaskException("Error occurred while updating the task for tenant " + tenantId, e);
}
}
}

@ -32,13 +32,21 @@ import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory;
import org.wso2.carbon.device.mgt.core.dao.DeviceTypeDAO;
import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil;
import org.wso2.carbon.device.mgt.core.dto.DeviceType;
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
import org.wso2.carbon.utils.CarbonUtils;
import org.wso2.carbon.utils.ConfigurationContextService;
import org.wso2.carbon.utils.NetworkUtils;
import javax.sql.DataSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.sql.SQLException;
import java.util.*;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
public final class DeviceManagerUtil {
@ -178,4 +186,41 @@ public final class DeviceManagerUtil {
return deviceIdentifiers;
}
public static String getServerBaseHttpsUrl() {
String hostName = "localhost";
try {
hostName = NetworkUtils.getMgtHostName();
} catch (Exception ignored) {
}
String mgtConsoleTransport = CarbonUtils.getManagementTransport();
ConfigurationContextService configContextService =
DeviceManagementDataHolder.getInstance().getConfigurationContextService();
int port = CarbonUtils.getTransportPort(configContextService, mgtConsoleTransport);
int httpsProxyPort =
CarbonUtils.getTransportProxyPort(configContextService.getServerConfigContext(),
mgtConsoleTransport);
if (httpsProxyPort > 0) {
port = httpsProxyPort;
}
return "https://" + hostName + ":" + port;
}
public static String getServerBaseHttpUrl() {
String hostName = "localhost";
try {
hostName = NetworkUtils.getMgtHostName();
} catch (Exception ignored) {
}
ConfigurationContextService configContextService =
DeviceManagementDataHolder.getInstance().getConfigurationContextService();
int port = CarbonUtils.getTransportPort(configContextService, "http");
int httpProxyPort =
CarbonUtils.getTransportProxyPort(configContextService.getServerConfigContext(),
"http");
if (httpProxyPort > 0) {
port = httpProxyPort;
}
return "http://" + hostName + ":" + port;
}
}

@ -17,8 +17,42 @@
*/
package org.wso2.carbon.device.mgt.core.Search;
package org.wso2.carbon.device.mgt.core.search;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.wso2.carbon.device.mgt.core.common.BaseDeviceManagementTest;
import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager;
import org.wso2.carbon.device.mgt.core.device.details.mgt.impl.DeviceInformationManagerImpl;
import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder;
import org.wso2.carbon.device.mgt.core.search.util.Utils;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl;
public class DeviceDetails extends BaseDeviceManagementTest {
private static final Log log = LogFactory.getLog(DeviceDetails.class);
@BeforeClass
@Override
public void init() throws Exception {
DeviceManagementProviderService deviceManagementProviderService = new DeviceManagementProviderServiceImpl();
DeviceManagementDataHolder.getInstance().setDeviceManagementProvider(deviceManagementProviderService);
}
@Test
public void addDeviceDetails() throws Exception {
log.debug("Adding the device details to database.....!");
DeviceInformationManager deviceInformationManager = new DeviceInformationManagerImpl();
deviceInformationManager.addDeviceInfo(Utils.getDeviceInfo());
deviceInformationManager.addDeviceLocation(Utils.getSampleDeviceLocation());
log.debug("Device details added to database.....!");
}
public class DeviceDetails {
}

@ -0,0 +1,70 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.search;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.wso2.carbon.device.mgt.common.device.details.DeviceWrapper;
import org.wso2.carbon.device.mgt.common.search.Condition;
import org.wso2.carbon.device.mgt.common.search.SearchContext;
import org.wso2.carbon.device.mgt.core.common.BaseDeviceManagementTest;
import org.wso2.carbon.device.mgt.core.search.mgt.SearchManagerService;
import org.wso2.carbon.device.mgt.core.search.mgt.impl.SearchManagerServiceImpl;
import java.util.ArrayList;
import java.util.List;
public class SearchDevice extends BaseDeviceManagementTest {
private static final Log log = LogFactory.getLog(DeviceDetails.class);
@BeforeClass
@Override
public void init() throws Exception {
}
@Test
public void searchDeviceDetails() throws Exception {
SearchContext context = new SearchContext();
List<Condition> conditions = new ArrayList<>();
Condition cond = new Condition();
cond.setKey("BATTERY_VOLTAGE");
cond.setOperator("=");
cond.setValue("40");
cond.setState(Condition.State.AND);
conditions.add(cond);
context.setConditions(conditions);
SearchManagerService service = new SearchManagerServiceImpl();
List<DeviceWrapper> deviceWrappers = service.search(context);
for (DeviceWrapper dw : deviceWrappers) {
log.debug(dw.getDevice().getDescription());
log.debug(dw.getDevice().getDeviceIdentifier());
}
}
}

@ -19,6 +19,88 @@
package org.wso2.carbon.device.mgt.core.search.util;
import org.wso2.carbon.device.mgt.common.Device;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.device.details.DeviceInfo;
import org.wso2.carbon.device.mgt.common.device.details.DeviceLocation;
import org.wso2.carbon.device.mgt.core.common.TestDataHolder;
import java.util.HashMap;
import java.util.Map;
public class Utils {
public static DeviceInfo getDeviceInfo() {
DeviceInfo deviceInfo = new DeviceInfo();
DeviceIdentifier deviceIdentifier = new DeviceIdentifier();
deviceIdentifier.setType(TestDataHolder.TEST_DEVICE_TYPE);
deviceIdentifier.setId("12345");
deviceInfo.setDeviceIdentifier(deviceIdentifier);
deviceInfo.setDeviceId(1);
deviceInfo.setIMSI("e6f236ac82537a8e");
deviceInfo.setSsid("FAFDA");
deviceInfo.setDeviceId(1);
deviceInfo.setAvailableRAMMemory(1.24);
deviceInfo.setBatteryLevel(27.3);
deviceInfo.setConnectionType("GSM");
deviceInfo.setCpuUsage(82.34);
deviceInfo.setDeviceModel("SM-T520");
deviceInfo.setExternalAvailableMemory(2.45);
deviceInfo.setExternalTotalMemory(16.23);
deviceInfo.setIMEI("e6f236ac82537a8e");
deviceInfo.setIMSI("GT-0WDA");
deviceInfo.setInternalAvailableMemory(3.56);
deviceInfo.setInternalTotalMemory(7.89);
deviceInfo.setMobileSignalStrength(0.67);
deviceInfo.setOperator("Dialog");
deviceInfo.setOsVersion("Lolipop");
deviceInfo.setPluggedIn(true);
deviceInfo.setSsid("SSSSSS");
deviceInfo.setTotalRAMMemory(4.00);
deviceInfo.setVendor("SAMSUNG");
Map<String, String> propertyMap = new HashMap<>();
propertyMap.put("BATTERY_VOLTAGE", "40");
propertyMap.put("BATTERY_HEALTH", "Good");
propertyMap.put("BATTERY_STATUS", "SWElLED");
propertyMap.put("LOW_MEMORY", "false");
propertyMap.put("MEMORY_THRESHOLD", "100663296");
propertyMap.put("CPU_IOW", "12");
propertyMap.put("CPU_IRQ", "1");
deviceInfo.setDeviceDetailsMap(propertyMap);
return deviceInfo;
}
public static DeviceLocation getSampleDeviceLocation(){
DeviceLocation deviceLocation = new DeviceLocation();
deviceLocation.setLatitude(76.2422);
deviceLocation.setLongitude(81.43);
deviceLocation.setStreet1("4");
deviceLocation.setStreet2("Isuru Uyana");
deviceLocation.setCity("Karanadeniya");
deviceLocation.setState("Karandeniya");
deviceLocation.setZip("80360");
deviceLocation.setCountry("Sri Lanka");
deviceLocation.setDeviceId(1);
return deviceLocation;
}
}

@ -22,4 +22,12 @@
<DriverClassName>org.h2.Driver</DriverClassName>
<User>wso2carbon</User>
<Password>wso2carbon</Password>
<!-- For MySql -->
<!--<Url>jdbc:mysql://localhost:3306/WSO2CDM</Url>-->
<!--<DriverClassName>com.mysql.jdbc.Driver</DriverClassName>-->
<!--<User>root</User>-->
<!--<Password></Password>-->
</DataSourceConfig>

@ -1,15 +1,22 @@
CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE (
ID INT AUTO_INCREMENT NOT NULL,
NAME VARCHAR(300) NULL DEFAULT NULL,
ID INT auto_increment NOT NULL,
NAME VARCHAR(300) DEFAULT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE (
ID INTEGER auto_increment NOT NULL,
SERIAL_NUMBER VARCHAR(500) DEFAULT NULL,
CERTIFICATE BLOB DEFAULT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE IF NOT EXISTS DM_DEVICE (
ID INTEGER auto_increment NOT NULL,
DESCRIPTION TEXT NULL DEFAULT NULL,
NAME VARCHAR(100) NULL DEFAULT NULL,
DEVICE_TYPE_ID INT(11) NULL DEFAULT NULL,
DEVICE_IDENTIFICATION VARCHAR(300) NULL DEFAULT NULL,
DESCRIPTION TEXT DEFAULT NULL,
NAME VARCHAR(100) DEFAULT NULL,
DEVICE_TYPE_ID INT(11) DEFAULT NULL,
DEVICE_IDENTIFICATION VARCHAR(300) DEFAULT NULL,
TENANT_ID INTEGER DEFAULT 0,
PRIMARY KEY (ID),
CONSTRAINT fk_DM_DEVICE_DM_DEVICE_TYPE2 FOREIGN KEY (DEVICE_TYPE_ID )
@ -21,13 +28,13 @@ CREATE TABLE IF NOT EXISTS DM_OPERATION (
TYPE VARCHAR(50) NOT NULL,
CREATED_TIMESTAMP TIMESTAMP NOT NULL,
RECEIVED_TIMESTAMP TIMESTAMP NULL,
STATUS VARCHAR(50) NULL,
OPERATION_CODE VARCHAR(1000) NOT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE IF NOT EXISTS DM_CONFIG_OPERATION (
OPERATION_ID INTEGER NOT NULL,
OPERATION_CONFIG BLOB DEFAULT NULL,
PRIMARY KEY (OPERATION_ID),
CONSTRAINT fk_dm_operation_config FOREIGN KEY (OPERATION_ID) REFERENCES
DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
@ -41,6 +48,15 @@ CREATE TABLE IF NOT EXISTS DM_COMMAND_OPERATION (
DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_POLICY_OPERATION (
OPERATION_ID INTEGER NOT NULL,
ENABLED INTEGER NOT NULL DEFAULT 0,
OPERATION_DETAILS BLOB DEFAULT NULL,
PRIMARY KEY (OPERATION_ID),
CONSTRAINT fk_dm_operation_policy FOREIGN KEY (OPERATION_ID) REFERENCES
DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_PROFILE_OPERATION (
OPERATION_ID INTEGER NOT NULL,
ENABLED INTEGER NOT NULL DEFAULT 0,
@ -54,10 +70,10 @@ CREATE TABLE IF NOT EXISTS DM_ENROLMENT (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INTEGER NOT NULL,
OWNER VARCHAR(50) NOT NULL,
OWNERSHIP VARCHAR(45) NULL DEFAULT NULL,
OWNERSHIP VARCHAR(45) DEFAULT NULL,
STATUS VARCHAR(50) NULL,
DATE_OF_ENROLMENT TIMESTAMP NULL DEFAULT NULL,
DATE_OF_LAST_UPDATE TIMESTAMP NULL DEFAULT NULL,
DATE_OF_ENROLMENT TIMESTAMP DEFAULT NULL,
DATE_OF_LAST_UPDATE TIMESTAMP DEFAULT NULL,
TENANT_ID INT NOT NULL,
PRIMARY KEY (ID),
CONSTRAINT fk_dm_device_enrolment FOREIGN KEY (DEVICE_ID) REFERENCES
@ -76,17 +92,273 @@ CREATE TABLE IF NOT EXISTS DM_ENROLMENT_OP_MAPPING (
DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_DEVICE_OPERATION_RESPONSE (
ID INTEGER AUTO_INCREMENT NOT NULL,
ENROLMENT_ID INTEGER NOT NULL,
OPERATION_ID INTEGER NOT NULL,
OPERATION_RESPONSE BLOB DEFAULT NULL,
PRIMARY KEY (ID),
CONSTRAINT fk_dm_device_operation_response_enrollment FOREIGN KEY (ENROLMENT_ID) REFERENCES
DM_ENROLMENT (ID) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT fk_dm_device_operation_response_operation FOREIGN KEY (OPERATION_ID) REFERENCES
DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
);
-- POLICY RELATED TABLES --
CREATE TABLE IF NOT EXISTS DM_PROFILE (
ID INT NOT NULL AUTO_INCREMENT ,
PROFILE_NAME VARCHAR(45) NOT NULL ,
TENANT_ID INT NOT NULL ,
DEVICE_TYPE_ID INT NOT NULL ,
CREATED_TIME DATETIME NOT NULL ,
UPDATED_TIME DATETIME NOT NULL ,
PRIMARY KEY (ID) ,
CONSTRAINT DM_PROFILE_DEVICE_TYPE
FOREIGN KEY (DEVICE_TYPE_ID )
REFERENCES DM_DEVICE_TYPE (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_POLICY (
ID INT(11) NOT NULL AUTO_INCREMENT ,
NAME VARCHAR(45) DEFAULT NULL ,
DESCRIPTION VARCHAR(1000) NULL,
TENANT_ID INT(11) NOT NULL ,
PROFILE_ID INT(11) NOT NULL ,
OWNERSHIP_TYPE VARCHAR(45) NULL,
COMPLIANCE VARCHAR(100) NULL,
PRIORITY INT NOT NULL,
ACTIVE INT(2) NOT NULL,
UPDATED INT(1) NULL,
PRIMARY KEY (ID) ,
CONSTRAINT FK_DM_PROFILE_DM_POLICY
FOREIGN KEY (PROFILE_ID )
REFERENCES DM_PROFILE (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_DEVICE_POLICY (
ID INT(11) NOT NULL AUTO_INCREMENT ,
DEVICE_ID INT(11) NOT NULL ,
ENROLMENT_ID INT(11) NOT NULL,
DEVICE BLOB NOT NULL,
POLICY_ID INT(11) NOT NULL ,
PRIMARY KEY (ID) ,
CONSTRAINT FK_POLICY_DEVICE_POLICY
FOREIGN KEY (POLICY_ID )
REFERENCES DM_POLICY (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT FK_DEVICE_DEVICE_POLICY
FOREIGN KEY (DEVICE_ID )
REFERENCES DM_DEVICE (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE_POLICY (
ID INT(11) NOT NULL ,
DEVICE_TYPE_ID INT(11) NOT NULL ,
POLICY_ID INT(11) NOT NULL ,
PRIMARY KEY (ID) ,
CONSTRAINT FK_DEVICE_TYPE_POLICY
FOREIGN KEY (POLICY_ID )
REFERENCES DM_POLICY (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT FK_DEVICE_TYPE_POLICY_DEVICE_TYPE
FOREIGN KEY (DEVICE_TYPE_ID )
REFERENCES DM_DEVICE_TYPE (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_PROFILE_FEATURES (
ID INT(11) NOT NULL AUTO_INCREMENT,
PROFILE_ID INT(11) NOT NULL,
FEATURE_CODE VARCHAR(30) NOT NULL,
DEVICE_TYPE_ID INT NOT NULL,
TENANT_ID INT(11) NOT NULL ,
CONTENT BLOB NULL DEFAULT NULL,
PRIMARY KEY (ID),
CONSTRAINT FK_DM_PROFILE_DM_POLICY_FEATURES
FOREIGN KEY (PROFILE_ID)
REFERENCES DM_PROFILE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_ROLE_POLICY (
ID INT(11) NOT NULL AUTO_INCREMENT ,
ROLE_NAME VARCHAR(45) NOT NULL ,
POLICY_ID INT(11) NOT NULL ,
PRIMARY KEY (ID) ,
CONSTRAINT FK_ROLE_POLICY_POLICY
FOREIGN KEY (POLICY_ID )
REFERENCES DM_POLICY (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_USER_POLICY (
ID INT NOT NULL AUTO_INCREMENT ,
POLICY_ID INT NOT NULL ,
USERNAME VARCHAR(45) NOT NULL ,
PRIMARY KEY (ID) ,
CONSTRAINT DM_POLICY_USER_POLICY
FOREIGN KEY (POLICY_ID )
REFERENCES DM_POLICY (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_DEVICE_POLICY_APPLIED (
ID INT NOT NULL AUTO_INCREMENT ,
DEVICE_ID INT NOT NULL ,
ENROLMENT_ID INT(11) NOT NULL,
POLICY_ID INT NOT NULL ,
POLICY_CONTENT BLOB NULL ,
TENANT_ID INT NOT NULL,
APPLIED TINYINT(1) NULL ,
CREATED_TIME TIMESTAMP NULL ,
UPDATED_TIME TIMESTAMP NULL ,
APPLIED_TIME TIMESTAMP NULL ,
PRIMARY KEY (ID) ,
CONSTRAINT FK_DM_POLICY_DEVCIE_APPLIED
FOREIGN KEY (DEVICE_ID )
REFERENCES DM_DEVICE (ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_CRITERIA (
ID INT NOT NULL AUTO_INCREMENT,
TENANT_ID INT NOT NULL,
NAME VARCHAR(50) NULL,
PRIMARY KEY (ID)
);
CREATE TABLE IF NOT EXISTS DM_POLICY_CRITERIA (
ID INT NOT NULL AUTO_INCREMENT,
CRITERIA_ID INT NOT NULL,
POLICY_ID INT NOT NULL,
PRIMARY KEY (ID),
CONSTRAINT FK_CRITERIA_POLICY_CRITERIA
FOREIGN KEY (CRITERIA_ID)
REFERENCES DM_CRITERIA (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT FK_POLICY_POLICY_CRITERIA
FOREIGN KEY (POLICY_ID)
REFERENCES DM_POLICY (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_POLICY_CRITERIA_PROPERTIES (
ID INT NOT NULL AUTO_INCREMENT,
POLICY_CRITERION_ID INT NOT NULL,
PROP_KEY VARCHAR(45) NULL,
PROP_VALUE VARCHAR(100) NULL,
CONTENT BLOB NULL COMMENT 'This is used to ',
PRIMARY KEY (ID),
CONSTRAINT FK_POLICY_CRITERIA_PROPERTIES
FOREIGN KEY (POLICY_CRITERION_ID)
REFERENCES DM_POLICY_CRITERIA (ID)
ON DELETE CASCADE
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_POLICY_COMPLIANCE_STATUS (
ID INT NOT NULL AUTO_INCREMENT,
DEVICE_ID INT NOT NULL,
ENROLMENT_ID INT(11) NOT NULL,
POLICY_ID INT NOT NULL,
TENANT_ID INT NOT NULL,
STATUS INT NULL,
LAST_SUCCESS_TIME TIMESTAMP NULL,
LAST_REQUESTED_TIME TIMESTAMP NULL,
LAST_FAILED_TIME TIMESTAMP NULL,
ATTEMPTS INT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE IF NOT EXISTS DM_POLICY_CHANGE_MGT (
ID INT NOT NULL AUTO_INCREMENT,
POLICY_ID INT NOT NULL,
DEVICE_TYPE_ID INT NOT NULL,
TENANT_ID INT(11) NOT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE IF NOT EXISTS DM_POLICY_COMPLIANCE_FEATURES (
ID INT NOT NULL AUTO_INCREMENT,
COMPLIANCE_STATUS_ID INT NOT NULL,
TENANT_ID INT NOT NULL,
FEATURE_CODE VARCHAR(15) NOT NULL,
STATUS INT NULL,
PRIMARY KEY (ID),
CONSTRAINT FK_COMPLIANCE_FEATURES_STATUS
FOREIGN KEY (COMPLIANCE_STATUS_ID)
REFERENCES DM_POLICY_COMPLIANCE_STATUS (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_ENROLMENT (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INTEGER NOT NULL,
OWNER VARCHAR(50) NOT NULL,
OWNERSHIP VARCHAR(45) DEFAULT NULL,
STATUS VARCHAR(50) NULL,
DATE_OF_ENROLMENT TIMESTAMP DEFAULT NULL,
DATE_OF_LAST_UPDATE TIMESTAMP DEFAULT NULL,
TENANT_ID INT NOT NULL,
PRIMARY KEY (ID),
CONSTRAINT fk_dm_device_enrolment FOREIGN KEY (DEVICE_ID) REFERENCES
DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_APPLICATION (
ID INTEGER AUTO_INCREMENT NOT NULL,
NAME VARCHAR(50) NOT NULL,
APP_IDENTIFIER VARCHAR(50) NOT NULL,
PLATFORM VARCHAR(50) NULL DEFAULT NULL,
NAME VARCHAR(150) NOT NULL,
APP_IDENTIFIER VARCHAR(150) NOT NULL,
PLATFORM VARCHAR(50) DEFAULT NULL,
CATEGORY VARCHAR(50) NULL,
VERSION VARCHAR(50) NULL,
TYPE VARCHAR(50) NULL,
LOCATION_URL VARCHAR(100) NULL DEFAULT NULL,
IMAGE_URL VARCHAR(100) NULL DEFAULT NULL,
LOCATION_URL VARCHAR(100) DEFAULT NULL,
IMAGE_URL VARCHAR(100) DEFAULT NULL,
APP_PROPERTIES BLOB NULL,
TENANT_ID INTEGER NOT NULL,
PRIMARY KEY (ID)
@ -104,3 +376,88 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_APPLICATION_MAPPING (
DM_APPLICATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
);
-- POLICY RELATED TABLES FINISHED --
-- NOTIFICATION TABLE --
CREATE TABLE IF NOT EXISTS DM_NOTIFICATION (
NOTIFICATION_ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INTEGER NOT NULL,
OPERATION_ID INTEGER NOT NULL,
TENANT_ID INTEGER NOT NULL,
STATUS VARCHAR(10) NULL,
DESCRIPTION VARCHAR(100) NULL,
PRIMARY KEY (NOTIFICATION_ID),
CONSTRAINT fk_dm_device_notification FOREIGN KEY (DEVICE_ID) REFERENCES
DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT fk_dm_operation_notification FOREIGN KEY (OPERATION_ID) REFERENCES
DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
);
-- NOTIFICATION TABLE END --
DROP TABLE IF EXISTS DM_DEVICE_INFO;
CREATE TABLE IF NOT EXISTS DM_DEVICE_INFO (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INT NULL,
KEY_FIELD VARCHAR(45) NULL,
VALUE_FIELD VARCHAR(100) NULL,
PRIMARY KEY (ID),
CONSTRAINT DM_DEVICE_INFO_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
DROP TABLE IF EXISTS DM_DEVICE_LOCATION;
CREATE TABLE IF NOT EXISTS DM_DEVICE_LOCATION (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INT NULL,
LATITUDE DOUBLE NULL,
LONGITUDE DOUBLE NULL,
STREET1 VARCHAR(45) NULL,
STREET2 VARCHAR(45) NULL,
CITY VARCHAR(45) NULL,
ZIP VARCHAR(10) NULL,
STATE VARCHAR(45) NULL,
COUNTRY VARCHAR(45) NULL,
PRIMARY KEY (ID),
CONSTRAINT DM_DEVICE_LOCATION_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_DEVICE_DETAIL (
ID INT NOT NULL AUTO_INCREMENT,
DEVICE_ID INT NOT NULL,
IMEI VARCHAR(100) NULL,
IMSI VARCHAR(100) NULL,
DEVICE_MODEL VARCHAR(45) NULL,
VENDOR VARCHAR(45) NULL,
OS_VERSION VARCHAR(45) NULL,
BATTERY_LEVEL DECIMAL(4) NULL,
INTERNAL_TOTAL_MEMORY DECIMAL(5) NULL,
INTERNAL_AVAILABLE_MEMORY DECIMAL(5) NULL,
EXTERNAL_TOTAL_MEMORY DECIMAL(5) NULL,
EXTERNAL_AVAILABLE_MEMORY DECIMAL(5) NULL,
OPERATOR VARCHAR(45) NULL,
CONNECTION_TYPE VARCHAR(10) NULL,
MOBILE_SIGNAL_STRENGTH DECIMAL(5) NULL,
SSID VARCHAR(45) NULL,
CPU_USAGE DECIMAL(5) NULL,
TOTAL_RAM_MEMORY DECIMAL(5) NULL,
AVAILABLE_RAM_MEMORY DECIMAL(5) NULL,
PLUGGED_IN INT(1) NULL,
PRIMARY KEY (ID),
CONSTRAINT FK_DM_DEVICE_DETAILS_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);

@ -23,6 +23,7 @@
<parameter name="useDefaultListeners" value="false"/>
<test name="DAO Unit Tests" preserve-order="true">
<parameter name="dbType" value="MySql"/>
<classes>
<class name="org.wso2.carbon.device.mgt.core.common.BaseDeviceManagementTest"/>
<class name="org.wso2.carbon.device.mgt.core.dao.DevicePersistTests"/>
@ -30,6 +31,8 @@
<class name="org.wso2.carbon.device.mgt.core.DeviceManagementConfigTests"/>
<class name="org.wso2.carbon.device.mgt.core.app.mgt.AppManagementConfigurationManagerTest"/>
<class name="org.wso2.carbon.device.mgt.core.dao.ApplicationPersistenceTests"/>
<class name="org.wso2.carbon.device.mgt.core.search.DeviceDetails"/>
<class name="org.wso2.carbon.device.mgt.core.search.SearchDevice"/>
</classes>
</test>
<test name="Service Unit Tests" preserve-order="true">

@ -44,7 +44,6 @@ import java.util.Locale;
@SuppressWarnings("unused")
public class RegistryBasedLicenseManager implements LicenseManager {
private Registry registry;
private GenericArtifactManager artifactManager;
private static final Log log = LogFactory.getLog(RegistryBasedLicenseManager.class);
@ -54,7 +53,6 @@ public class RegistryBasedLicenseManager implements LicenseManager {
throw new IllegalArgumentException("Registry instance retrieved is null. Hence, " +
"'Registry based license manager cannot be initialized'");
}
this.registry = registry;
try {
this.artifactManager = GenericArtifactManagerFactory.getTenantAwareGovernanceArtifactManager(registry);
} catch (LicenseManagementException e) {

@ -0,0 +1,159 @@
<?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>email-sender</artifactId>
<version>1.0.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.email.sender.core</artifactId>
<version>1.0.4-SNAPSHOT</version>
<packaging>bundle</packaging>
<name>WSO2 Carbon - Email Sender Core</name>
<description>WSO2 Carbon - Email Sender Core</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>Email Management Core Bundle</Bundle-Description>
<Private-Package>org.wso2.carbon.email.sender.core.internal</Private-Package>
<Import-Package>
org.apache.axis2.*;version="${axis2.osgi.version.range}",
org.apache.axiom.*; version="${axiom.osgi.version.range}",
org.osgi.framework,
org.osgi.service.component,
org.apache.commons.logging,
javax.xml.*,
org.wso2.carbon.context,
org.wso2.carbon.utils.*,
org.wso2.carbon.registry.api,
org.w3c.dom,
org.apache.velocity,
org.apache.velocity.app,
org.apache.velocity.context,
org.apache.velocity.exception,
org.apache.velocity.runtime.resource,
org.apache.velocity.runtime.resource.loader,
org.apache.commons.io,
org.apache.axis2.transport.mail,
org.wso2.carbon.registry.core.service,
org.wso2.carbon.registry.core.session,
org.apache.commons.collections
</Import-Package>
<Export-Package>
!org.wso2.carbon.email.sender.core.internal,
org.wso2.carbon.email.sender.core.*
</Export-Package>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18</version>
<configuration>
<systemPropertyVariables>
<log4j.configuration>file:src/test/resources/log4j.properties</log4j.configuration>
</systemPropertyVariables>
<suiteXmlFiles>
<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
</suiteXmlFiles>
</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.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>org.testng</groupId>
<artifactId>testng</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.registry.api</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.base</artifactId>
</dependency>
<dependency>
<groupId>org.apache.axis2.wso2</groupId>
<artifactId>axis2</artifactId>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
</dependency>
<dependency>
<groupId>commons-io.wso2</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.apache.axis2.transport</groupId>
<artifactId>axis2-transport-mail</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.registry.core</artifactId>
</dependency>
<dependency>
<groupId>commons-collections.wso2</groupId>
<artifactId>commons-collections</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,45 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
public class ContentProcessingInterruptedException extends Exception {
private static final long serialVersionUID = -3151279311929070298L;
public ContentProcessingInterruptedException(String msg, Exception nestedEx) {
super(msg, nestedEx);
}
public ContentProcessingInterruptedException(String message, Throwable cause) {
super(message, cause);
}
public ContentProcessingInterruptedException(String msg) {
super(msg);
}
public ContentProcessingInterruptedException() {
super();
}
public ContentProcessingInterruptedException(Throwable cause) {
super(cause);
}
}

@ -0,0 +1,55 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
import java.util.Map;
public class ContentProviderInfo {
private String template;
private Map<String, TypedValue<Class<?>, Object>> params;
public ContentProviderInfo(final String template, final Map<String, TypedValue<Class<?>, Object>> params) {
if (template == null || template.isEmpty()) {
throw new IllegalArgumentException("Template name cannot be null or empty");
}
this.template = template;
if (params == null) {
throw new IllegalArgumentException("Place-holder parameter map cannot be null");
}
this.params = params;
}
public String getTemplate() {
return template;
}
public Map<String, TypedValue<Class<?>, Object>> getParams() {
return params;
}
public void addParam(String name, TypedValue<Class<?>, Object> param) {
params.put(name, param);
}
public TypedValue<Class<?>, Object> getParam(String name) {
return params.get(name);
}
}

@ -0,0 +1,28 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
import java.util.Map;
public interface EmailContentProvider {
EmailData getContent(String path,
Map<String, TypedValue<Class<?>, Object>> params) throws ContentProcessingInterruptedException;
}

@ -0,0 +1,27 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
public class EmailContentProviderFactory {
public static EmailContentProvider getContentProvider() {
return new VelocityBasedEmailContentProvider();
}
}

@ -0,0 +1,138 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
import java.util.*;
public class EmailContext {
private Set<String> recipients;
private Properties properties;
private ContentProviderInfo contentProviderInfo;
private EmailContext(final ContentProviderInfo contentProviderInfo, final Set<String> recipients, final Properties properties) {
if (contentProviderInfo == null) {
throw new IllegalArgumentException("Content provider information cannot be null");
}
this.contentProviderInfo = contentProviderInfo;
if (recipients == null) {
throw new IllegalArgumentException("Recipient list cannot be null");
}
if (recipients.size() == 0) {
throw new IllegalArgumentException("No recipient is configured. Recipient list should carry at " +
"least one recipient");
}
this.recipients = recipients;
if (properties == null) {
throw new IllegalArgumentException("Email Context property bag cannot be null");
}
this.properties = properties;
}
private EmailContext(final ContentProviderInfo contentProviderInfo, final String recipient, final Properties properties) {
if (contentProviderInfo == null) {
throw new IllegalArgumentException("Content provider information cannot be null");
}
this.contentProviderInfo = contentProviderInfo;
if (recipient == null || recipient.isEmpty()) {
throw new IllegalArgumentException("Recipient can't be null or empty. Please specify a valid " +
"recipient email address");
}
this.recipients = new HashSet<String>() {{
add(recipient);
}};
if (properties == null) {
throw new IllegalArgumentException("Email Context property bag cannot be null");
}
this.properties = properties;
}
public Set<String> getRecipients() {
return recipients;
}
public Properties getProperties() {
return properties;
}
public String getProperty(String name) {
return (String) properties.get(name);
}
public void addProperty(String name, String value) {
properties.put(name, value);
}
public ContentProviderInfo getContentProviderInfo() {
return contentProviderInfo;
}
public static class EmailContextBuilder {
private Set<String> recipients;
private ContentProviderInfo contentProviderInfo;
private Properties properties;
public EmailContextBuilder(final ContentProviderInfo contentProviderInfo, Set<String> recipients) {
if (contentProviderInfo == null) {
throw new IllegalArgumentException("Content provider information cannot be null");
}
this.contentProviderInfo = contentProviderInfo;
if (recipients == null) {
throw new IllegalArgumentException("Recipient list cannot be null");
}
if (recipients.size() == 0) {
throw new IllegalArgumentException("No recipient is configured. Recipient list should carry at " +
"least one recipient");
}
this.recipients = recipients;
this.properties = new Properties();
}
public EmailContextBuilder(final ContentProviderInfo contentProviderInfo, final String recipient,
final Properties properties) {
if (contentProviderInfo == null) {
throw new IllegalArgumentException("Content provider information cannot be null");
}
this.contentProviderInfo = contentProviderInfo;
if (recipient == null || recipient.isEmpty()) {
throw new IllegalArgumentException("Recipient can't be null or empty. Please specify a valid " +
"recipient email address");
}
this.recipients = new HashSet<String>() {{
add(recipient);
}};
if (properties == null) {
throw new IllegalArgumentException("Email Context property bag cannot be null");
}
this.properties = properties;
}
public EmailContextBuilder addProperty(String name, String value) {
properties.setProperty(name, value);
return this;
}
public EmailContext build() {
return new EmailContext(contentProviderInfo, recipients, properties);
}
}
}

@ -0,0 +1,48 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "EmailConfig")
public class EmailData {
private String subject;
private String body;
@XmlElement(name = "Subject", required = true)
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@XmlElement(name = "Body", required = true)
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}

@ -0,0 +1,106 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
import org.w3c.dom.Document;
import org.wso2.carbon.utils.CarbonUtils;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.File;
@XmlRootElement(name = "EmailSenderConfig")
public class EmailSenderConfig {
private int minThreads;
private int maxThreads;
private int keepAliveDuration;
private int threadQueueCapacity;
private static EmailSenderConfig config;
private static final String EMAIL_SENDER_CONFIG_PATH =
CarbonUtils.getEtcCarbonConfigDirPath() + File.separator + "email-sender-config.xml";
private EmailSenderConfig() {
}
public static EmailSenderConfig getInstance() {
if (config == null) {
throw new InvalidConfigurationStateException("Webapp Authenticator Configuration is not " +
"initialized properly");
}
return config;
}
@XmlElement(name = "MinThreads", required = true)
public int getMinThreads() {
return minThreads;
}
public void setMinThreads(int minThreads) {
this.minThreads = minThreads;
}
@XmlElement(name = "MaxThreads", required = true)
public int getMaxThreads() {
return maxThreads;
}
public void setMaxThreads(int maxThreads) {
this.maxThreads = maxThreads;
}
@XmlElement(name = "KeepAliveDuration", required = true)
public int getKeepAliveDuration() {
return keepAliveDuration;
}
public void setKeepAliveDuration(int keepAliveDuration) {
this.keepAliveDuration = keepAliveDuration;
}
@XmlElement(name = "ThreadQueueCapacity", required = true)
public int getThreadQueueCapacity() {
return threadQueueCapacity;
}
public void setThreadQueueCapacity(int threadQueueCapacity) {
this.threadQueueCapacity = threadQueueCapacity;
}
public static void init() throws EmailSenderConfigurationFailedException {
try {
File emailSenderConfig = new File(EMAIL_SENDER_CONFIG_PATH);
Document doc = EmailSenderUtil.convertToDocument(emailSenderConfig);
/* Un-marshaling Email Sender configuration */
JAXBContext ctx = JAXBContext.newInstance(EmailSenderConfig.class);
Unmarshaller unmarshaller = ctx.createUnmarshaller();
//unmarshaller.setSchema(getSchema());
config = (EmailSenderConfig) unmarshaller.unmarshal(doc);
} catch (JAXBException e) {
throw new EmailSenderConfigurationFailedException("Error occurred while un-marshalling Email " +
"Sender Config", e);
}
}
}

@ -0,0 +1,45 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
public class EmailSenderConfigurationFailedException extends Exception {
private static final long serialVersionUID = -3151279312929070298L;
public EmailSenderConfigurationFailedException(String msg, Exception nestedEx) {
super(msg, nestedEx);
}
public EmailSenderConfigurationFailedException(String message, Throwable cause) {
super(message, cause);
}
public EmailSenderConfigurationFailedException(String msg) {
super(msg);
}
public EmailSenderConfigurationFailedException() {
super();
}
public EmailSenderConfigurationFailedException(Throwable cause) {
super(cause);
}
}

@ -0,0 +1,45 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
import org.w3c.dom.Document;
import org.wso2.carbon.email.sender.core.internal.EmailSenderDataHolder;
import org.wso2.carbon.utils.CarbonUtils;
import org.wso2.carbon.utils.ConfigurationContextService;
import org.wso2.carbon.utils.NetworkUtils;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class EmailSenderUtil {
public static Document convertToDocument(File file) throws EmailSenderConfigurationFailedException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try {
DocumentBuilder docBuilder = factory.newDocumentBuilder();
return docBuilder.parse(file);
} catch (Exception e) {
throw new EmailSenderConfigurationFailedException("Error occurred while parsing file, while converting " +
"to a org.w3c.dom.Document", e);
}
}
}

@ -0,0 +1,45 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
public class EmailSendingFailedException extends Exception {
private static final long serialVersionUID = -3151279311929070294L;
public EmailSendingFailedException(String msg, Exception nestedEx) {
super(msg, nestedEx);
}
public EmailSendingFailedException(String message, Throwable cause) {
super(message, cause);
}
public EmailSendingFailedException(String msg) {
super(msg);
}
public EmailSendingFailedException() {
super();
}
public EmailSendingFailedException(Throwable cause) {
super(cause);
}
}

@ -0,0 +1,74 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
public class InvalidConfigurationStateException extends RuntimeException {
private static final long serialVersionUID = -3151279311329070297L;
private String errorMessage;
private int errorCode;
public InvalidConfigurationStateException(int errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public InvalidConfigurationStateException(int errorCode, String message, Throwable cause) {
super(message, cause);
this.errorCode = errorCode;
}
public int getErrorCode() {
return errorCode;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public InvalidConfigurationStateException(String msg, Exception nestedEx) {
super(msg, nestedEx);
setErrorMessage(msg);
}
public InvalidConfigurationStateException(String message, Throwable cause) {
super(message, cause);
setErrorMessage(message);
}
public InvalidConfigurationStateException(String msg) {
super(msg);
setErrorMessage(msg);
}
public InvalidConfigurationStateException() {
super();
}
public InvalidConfigurationStateException(Throwable cause) {
super(cause);
}
}

@ -0,0 +1,71 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
import org.apache.commons.collections.ExtendedProperties;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.Resource;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;
import org.wso2.carbon.context.CarbonContext;
import org.wso2.carbon.context.RegistryType;
import org.wso2.carbon.registry.api.Registry;
import org.wso2.carbon.registry.api.RegistryException;
import java.io.*;
public class RegistryBasedResourceLoader extends ResourceLoader {
private static final String EMAIL_CONFIG_BASE_LOCATION = "email-templates";
@Override
public void init(ExtendedProperties extendedProperties) {
}
@Override
public InputStream getResourceStream(String name) throws ResourceNotFoundException {
try {
Registry registry =
CarbonContext.getThreadLocalCarbonContext().getRegistry(RegistryType.SYSTEM_CONFIGURATION);
if (registry == null) {
throw new IllegalStateException("No valid registry instance is attached to the current carbon context");
}
if (!registry.resourceExists(EMAIL_CONFIG_BASE_LOCATION + "/" + name + ".vm")) {
throw new ResourceNotFoundException("Resource '" + name + "' does not exist");
}
org.wso2.carbon.registry.api.Resource resource =
registry.get(EMAIL_CONFIG_BASE_LOCATION + "/" + name + ".vm");
return resource.getContentStream();
} catch (RegistryException e) {
throw new ResourceNotFoundException("Error occurred while retrieving resource", e);
}
}
@Override
public boolean isSourceModified(Resource resource) {
return false;
}
@Override
public long getLastModified(Resource resource) {
return 0;
}
}

@ -0,0 +1,50 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
public class TypedValue<T, V> {
private final T type;
private final V value;
public TypedValue(T type, V value) {
this.type = type;
this.value = value;
}
public T getType() {
return type;
}
public V getValue() {
return value;
}
@Override
public int hashCode() {
return (type.hashCode() ^ value.hashCode());
}
@Override
public boolean equals(Object o) {
return o instanceof TypedValue && (this.type == ((TypedValue) o).getType() &&
this.value == ((TypedValue) o).getValue());
}
}

@ -0,0 +1,87 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;
import org.wso2.carbon.context.CarbonContext;
import org.wso2.carbon.context.RegistryType;
import org.wso2.carbon.registry.api.Registry;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.Map;
public class VelocityBasedEmailContentProvider implements EmailContentProvider {
private VelocityEngine engine;
private static final Log log = LogFactory.getLog(VelocityBasedEmailContentProvider.class);
public VelocityBasedEmailContentProvider() {
engine = new VelocityEngine();
engine.setProperty("resource.loader", "registry");
engine.setProperty("velocimacro.library", "");
engine.setProperty("registry.resource.loader.class",
"org.wso2.carbon.email.sender.core.RegistryBasedResourceLoader");
engine.init();
}
@Override
public EmailData getContent(String name, Map<String,
TypedValue<Class<?>, Object>> params) throws ContentProcessingInterruptedException {
VelocityContext ctx = new VelocityContext();
for (Map.Entry<String, TypedValue<Class<?>, Object>> param : params.entrySet()) {
ctx.put(param.getKey(), param.getValue().getValue());
}
Template template = engine.getTemplate(name);
StringWriter content = new StringWriter();
template.merge(ctx, content);
InputStream is = null;
try {
JAXBContext jaxbCtx = JAXBContext.newInstance(EmailData.class);
Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
is = new ByteArrayInputStream(content.toString().getBytes());
return (EmailData) unmarshaller.unmarshal(is);
} catch (JAXBException e) {
throw new ContentProcessingInterruptedException("Error occurred while parsing email data", e);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
log.warn("Error occurred while closing input stream used to convert email configuration " +
"to an internal object model", e);
}
}
}
}
}

@ -0,0 +1,111 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.email.sender.core.internal;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.CarbonContext;
import org.wso2.carbon.context.RegistryType;
import org.wso2.carbon.email.sender.core.EmailSenderConfigurationFailedException;
import org.wso2.carbon.registry.api.Collection;
import org.wso2.carbon.registry.api.Registry;
import org.wso2.carbon.registry.api.RegistryException;
import org.wso2.carbon.registry.api.Resource;
import org.wso2.carbon.utils.Axis2ConfigurationContextObserver;
import org.wso2.carbon.utils.CarbonUtils;
import java.io.File;
import java.io.FilenameFilter;
public class EmailSenderAxis2ConfigContextObserver implements Axis2ConfigurationContextObserver {
private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "email-templates";
private static final Log log = LogFactory.getLog(EmailSenderAxis2ConfigContextObserver.class);
@Override
public void creatingConfigurationContext(int tenantId) {
}
@Override
public void createdConfigurationContext(ConfigurationContext configurationContext) {
try {
this.setupEmailTemplates();
} catch (EmailSenderConfigurationFailedException e) {
log.error("Error occurred while setting up email templates", e);
}
}
@Override
public void terminatingConfigurationContext(ConfigurationContext configurationContext) {
}
@Override
public void terminatedConfigurationContext(ConfigurationContext configurationContext) {
}
private void setupEmailTemplates() throws EmailSenderConfigurationFailedException {
File templateDir =
new File(CarbonUtils.getCarbonRepository() + "resources" + File.separator + "email-templates");
if (!templateDir.exists()) {
if (log.isDebugEnabled()) {
log.debug("The directory that is expected to use as the container for all email templates is not " +
"available. Therefore, no template is uploaded to the registry");
}
}
if (templateDir.canRead()) {
File[] templates = templateDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
name = name.toLowerCase();
return name.endsWith(".vm");
}
});
try {
Registry registry =
CarbonContext.getThreadLocalCarbonContext().getRegistry(RegistryType.SYSTEM_CONFIGURATION);
if (!registry.resourceExists(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH)) {
Collection collection = registry.newCollection();
registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH, collection);
for (File template : templates) {
Resource resource = registry.newResource();
resource.setContent(template);
registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource);
}
} else {
for (File template : templates) {
if (!registry.resourceExists(
EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName())) {
Resource resource = registry.newResource();
resource.setContent(template);
registry.put(
EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource);
}
}
}
} catch (RegistryException e) {
throw new EmailSenderConfigurationFailedException("Error occurred while setting up email templates", e);
}
}
}
}

@ -0,0 +1,69 @@
/*
* 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.
*/
package org.wso2.carbon.email.sender.core.internal;
import org.wso2.carbon.email.sender.core.service.EmailSenderService;
import org.wso2.carbon.registry.core.service.RegistryService;
import org.wso2.carbon.utils.ConfigurationContextService;
public class EmailSenderDataHolder {
private RegistryService registryService;
private ConfigurationContextService configurationContextService;
private EmailSenderService emailServiceProvider;
private static EmailSenderDataHolder thisInstance = new EmailSenderDataHolder();
private EmailSenderDataHolder() {}
public static EmailSenderDataHolder getInstance() {
return thisInstance;
}
public RegistryService getRegistryService() {
if (registryService == null) {
throw new IllegalStateException("Registry service is not initialized properly");
}
return registryService;
}
public void setRegistryService(RegistryService registryService) {
this.registryService = registryService;
}
public ConfigurationContextService getConfigurationContextService() {
if (configurationContextService == null) {
throw new IllegalStateException("ConfigurationContext service is not initialized properly");
}
return configurationContextService;
}
public void setConfigurationContextService(ConfigurationContextService configurationContextService) {
this.configurationContextService = configurationContextService;
}
public EmailSenderService getEmailServiceProvider() {
return emailServiceProvider;
}
public void setEmailServiceProvider(EmailSenderService emailServiceProvider) {
this.emailServiceProvider = emailServiceProvider;
}
}

@ -0,0 +1,195 @@
/*
* 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.
*/
package org.wso2.carbon.email.sender.core.internal;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.email.sender.core.EmailSenderConfig;
import org.wso2.carbon.email.sender.core.EmailSenderConfigurationFailedException;
import org.wso2.carbon.email.sender.core.service.EmailSenderService;
import org.wso2.carbon.email.sender.core.service.EmailSenderServiceImpl;
import org.wso2.carbon.registry.api.Collection;
import org.wso2.carbon.registry.api.Registry;
import org.wso2.carbon.registry.api.RegistryException;
import org.wso2.carbon.registry.api.Resource;
import org.wso2.carbon.registry.core.service.RegistryService;
import org.wso2.carbon.utils.CarbonUtils;
import org.wso2.carbon.utils.ConfigurationContextService;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
/**
* @scr.component name="org.wso2.carbon.email.sender.EmailSenderServiceComponent" immediate="true"
* @scr.reference name="registry.service"
* interface="org.wso2.carbon.registry.core.service.RegistryService"
* cardinality="1..1"
* policy="dynamic"
* bind="setRegistryService"
* unbind="unsetRegistryService"
* @scr.reference name="config.context.service"
* interface="org.wso2.carbon.utils.ConfigurationContextService"
* cardinality="0..1"
* policy="dynamic"
* bind="setConfigurationContextService"
* unbind="unsetConfigurationContextService"
*/
public class EmailSenderServiceComponent {
private static Log log = LogFactory.getLog(EmailSenderServiceComponent.class);
private static final String EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH = "/email-templates";
@SuppressWarnings("unused")
protected void activate(ComponentContext componentContext) {
try {
if (log.isDebugEnabled()) {
log.debug("Initializing email sender core bundle");
}
/* Initializing email sende configuration */
EmailSenderConfig.init();
/* Setting up default email templates */
this.setupEmailTemplates();
/* Registering declarative service instances exposed by EmailSenderServiceComponent */
this.registerServices(componentContext);
if (log.isDebugEnabled()) {
log.debug("Email sender core bundle has been successfully initialized");
}
} catch (Throwable e) {
log.error("Error occurred while initializing email sender core bundle", e);
}
}
@SuppressWarnings("unused")
protected void deactivate(ComponentContext componentContext) {
//do nothing
}
private void registerServices(ComponentContext componentContext) {
if (log.isDebugEnabled()) {
log.debug("Registering email sender service");
}
EmailSenderService emailServiceProvider = new EmailSenderServiceImpl();
EmailSenderDataHolder.getInstance().setEmailServiceProvider(emailServiceProvider);
componentContext.getBundleContext().registerService(EmailSenderService.class, emailServiceProvider, null);
}
private void setupEmailTemplates() throws EmailSenderConfigurationFailedException {
File templateDir =
new File(CarbonUtils.getCarbonHome() + File.separator + "repository" + File.separator +
"resources" + File.separator + "email-templates");
if (!templateDir.exists()) {
if (log.isDebugEnabled()) {
log.debug("The directory that is expected to use as the container for all email templates is not " +
"available. Therefore, no template is uploaded to the registry");
}
}
if (templateDir.canRead()) {
File[] templates = templateDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
name = name.toLowerCase();
return name.endsWith(".vm");
}
});
try {
Registry registry =
EmailSenderDataHolder.getInstance().getRegistryService().getConfigSystemRegistry();
if (!registry.resourceExists(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH)) {
Collection collection = registry.newCollection();
registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH, collection);
for (File template : templates) {
Resource resource = registry.newResource();
String contents = FileUtils.readFileToString(template);
resource.setContent(contents.getBytes());
registry.put(EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource);
}
} else {
/* Existence of a given resource is not checked consciously, before performing registry.put() below.
* The rationale is that, the only less expensive way that one can check if a resource exists is
* that through registry.resourceExists(), which only checks if 'some' resource exists at the given
* registry path. However, this does not capture scenarios where there can be updated contents to
* the same resource of which the path hasn't changed after it has been initialized for the first
* time. Therefore, whenever the server starts-up, all email templates are updated just to avoid
* the aforementioned problem */
for (File template : templates) {
Resource resource = registry.newResource();
String contents = FileUtils.readFileToString(template);
resource.setContent(contents.getBytes());
registry.put(
EMAIL_TEMPLATE_DIR_RELATIVE_REGISTRY_PATH + "/" + template.getName(), resource);
}
}
} catch (RegistryException e) {
throw new EmailSenderConfigurationFailedException("Error occurred while setting up email templates", e);
} catch (FileNotFoundException e) {
throw new EmailSenderConfigurationFailedException("Error occurred while writing template file " +
"contents as an input stream of a resource", e);
} catch (IOException e) {
throw new EmailSenderConfigurationFailedException("Error occurred while serializing file " +
"contents to a string", e);
}
}
}
/**
* Sets Registry Service.
*
* @param registryService An instance of RegistryService
*/
protected void setRegistryService(RegistryService registryService) {
if (log.isDebugEnabled()) {
log.debug("Setting Registry Service");
}
EmailSenderDataHolder.getInstance().setRegistryService(registryService);
}
/**
* Unsets Registry Service.
*
* @param registryService An instance of RegistryService
*/
protected void unsetRegistryService(RegistryService registryService) {
if (log.isDebugEnabled()) {
log.debug("Un setting Registry Service");
}
EmailSenderDataHolder.getInstance().setRegistryService(null);
}
protected void setConfigurationContextService(ConfigurationContextService configurationContextService) {
if (log.isDebugEnabled()) {
log.debug("Setting ConfigurationContextService");
}
EmailSenderDataHolder.getInstance().setConfigurationContextService(configurationContextService);
}
protected void unsetConfigurationContextService(ConfigurationContextService configurationContextService) {
if (log.isDebugEnabled()) {
log.debug("Un-setting ConfigurationContextService");
}
EmailSenderDataHolder.getInstance().setConfigurationContextService(null);
}
}

@ -15,13 +15,13 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.mgt.core.service;
package org.wso2.carbon.email.sender.core.service;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.EmailMessageProperties;
import org.wso2.carbon.email.sender.core.EmailContext;
import org.wso2.carbon.email.sender.core.EmailSendingFailedException;
public interface EmailService {
public interface EmailSenderService {
public void sendEmail(EmailMessageProperties emailMessageProperties) throws DeviceManagementException;
void sendEmail(EmailContext emailCtx) throws EmailSendingFailedException;
}

@ -0,0 +1,129 @@
/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.email.sender.core.service;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.llom.util.AXIOMUtil;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.mail.MailConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.email.sender.core.*;
import org.wso2.carbon.email.sender.core.internal.EmailSenderDataHolder;
import org.wso2.carbon.utils.ConfigurationContextService;
import javax.xml.stream.XMLStreamException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class EmailSenderServiceImpl implements EmailSenderService {
private static ThreadPoolExecutor threadPoolExecutor;
private EmailContentProvider contentProvider;
static {
EmailSenderConfig config = EmailSenderConfig.getInstance();
threadPoolExecutor = new ThreadPoolExecutor(config.getMinThreads(), config.getMaxThreads(),
config.getKeepAliveDuration(), TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(config.getThreadQueueCapacity()));
}
private static final String EMAIL_URI_SCHEME = "mailto:";
private static Log log = LogFactory.getLog(EmailSenderServiceImpl.class);
public EmailSenderServiceImpl() {
this.contentProvider = EmailContentProviderFactory.getContentProvider();
}
@Override
public void sendEmail(EmailContext emailCtx) throws EmailSendingFailedException {
for (String recipient : emailCtx.getRecipients()) {
ContentProviderInfo info = emailCtx.getContentProviderInfo();
EmailData emailData;
try {
emailData = contentProvider.getContent(info.getTemplate(), info.getParams());
} catch (ContentProcessingInterruptedException e) {
throw new EmailSendingFailedException("Error occurred while retrieving email content to be " +
"sent for recipient '" + recipient + "'", e);
}
threadPoolExecutor.submit(new EmailSender(recipient, emailData.getSubject(), emailData.getBody()));
}
}
public static class EmailSender implements Runnable {
String to;
String subject;
String body;
EmailSender(String to, String subject, String body) {
this.to = to;
this.subject = subject;
this.body = body;
}
public void run() {
OMElement payload = null;
try {
payload = AXIOMUtil.stringToOM(body);
} catch (XMLStreamException e) {
log.error("Error occurred while converting email body contents to an XML", e);
}
try {
ConfigurationContextService configCtxService =
EmailSenderDataHolder.getInstance().getConfigurationContextService();
if (configCtxService == null) {
throw new IllegalStateException("Configuration Context Service is not available");
}
ConfigurationContext configCtx = configCtxService.getServerConfigContext();
ServiceClient serviceClient = new ServiceClient(configCtx, null);
Map<String, String> headerMap = new HashMap<>();
headerMap.put(MailConstants.MAIL_HEADER_SUBJECT, subject);
Options options = new Options();
options.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap);
options.setProperty("FORCE_CONTENT_TYPE_BASED_FORMATTER", "true");
options.setProperty(Constants.Configuration.MESSAGE_TYPE, "text/html");
options.setProperty(Constants.Configuration.CONTENT_TYPE, "text/html");
options.setTo(new EndpointReference(EMAIL_URI_SCHEME + to));
serviceClient.setOptions(options);
serviceClient.fireAndForget(payload);
if (log.isDebugEnabled()) {
log.debug("Email has been successfully sent to '" + to + "'");
}
} catch (AxisFault e) {
log.error("Error occurred while delivering the message, subject: '" + subject + "', to: '" + to +
"'", e);
}
}
}
}

@ -0,0 +1,32 @@
#
# Copyright 2009 WSO2, Inc. (http://wso2.com)
#
# 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.
#
#
# This is the log4j configuration file used by WSO2 Carbon
#
# IMPORTANT : Please do not remove or change the names of any
# of the Appenders defined here. The layout pattern & log file
# can be changed using the WSO2 Carbon Management Console, and those
# settings will override the settings in this file.
#
log4j.rootLogger=INFO, STD_OUT
# Redirect log messages to console
log4j.appender.STD_OUT=org.apache.log4j.ConsoleAppender
log4j.appender.STD_OUT.Target=System.out
log4j.appender.STD_OUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STD_OUT.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

@ -0,0 +1,29 @@
<!--
~ 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.
-->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="DeviceManagementCore">
<parameter name="useDefaultListeners" value="false"/>
<test name="EmailSenderTests" preserve-order="true">
<classes>
</classes>
</test>
</suite>

@ -0,0 +1,60 @@
<?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>carbon-devicemgt</artifactId>
<version>1.0.4-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>email-sender</artifactId>
<version>1.0.4-SNAPSHOT</version>
<packaging>pom</packaging>
<name>WSO2 Carbon - Email Sender Component</name>
<url>http://wso2.org</url>
<modules>
<module>org.wso2.carbon.email.sender.core</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
<version>1.7.2</version>
<executions>
<execution>
<id>generate-scr-scrdescriptor</id>
<goals>
<goal>scr</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

@ -24,31 +24,93 @@ import org.wso2.carbon.policy.mgt.common.PolicyManagementException;
import java.util.List;
/**
* This interface for manage caching for policies. This is using the cache implementation comes in kernel, which will
* automatically sync with the cluster. So all the nodes will receive the updated policies.
*/
public interface PolicyCacheManager {
/**
* This method add policies to cache.
* @param policies - List of policies
*/
void addAllPolicies(List<Policy> policies);
/**
* This method will update the policies in the cache.
* @param policies - List of policies
*/
void updateAllPolicies(List<Policy> policies);
/**
* This method will return the all policies.
* @return - list of policies
* @throws PolicyManagementException
*/
List<Policy> getAllPolicies() throws PolicyManagementException;
/**
* This method will repopulate the cache, this will be called when there is a change of the policies.
* @throws PolicyManagementException
*/
void rePopulateCache() throws PolicyManagementException;
/**
* This will remove all the policies from the cache.
*/
void removeAllPolicies();
/**
* This method will the policy to the cache.
* @param policy - policy to add
*/
void addPolicy(Policy policy);
/**
* This method will update the policy in the cache.
* @param policy - policy to be updated.
*/
void updatePolicy(Policy policy);
/**
* This method will update the policy by reading the cache. If it is not available it will read from policy manager.
* @param policyId - integer, policy id.
* @throws PolicyManagementException
*/
void updatePolicy(int policyId) throws PolicyManagementException;
/**
* Remove policy from the cache.
* @param policyId - Id of the policy to be removed.
*/
void removePolicy(int policyId);
/**
* This will return the policy from cache. If it not available in the cache, it will get from the policy manager.
* @param policyId - Id of the policy to be returned.
* @return - Policy
* @throws PolicyManagementException
*/
Policy getPolicy(int policyId) throws PolicyManagementException;
/**
* This method will add a policy id against a device id.
* @param deviceId - Id of the device.
* @param policyId - Id of the policy
*/
void addPolicyToDevice(int deviceId, int policyId);
/**
* This method will return the device ids, a certain policy is applied.
* @param policyId - Id of the policu.
* @return - List of device ids.
*/
List<Integer> getPolicyAppliedDeviceIds(int policyId);
/**
* This method will return the applied policy id of the device.
* @param deviceId - Id of the device
* @return - Id of the policy.
*/
int getPolicyIdOfDevice(int deviceId);
}

@ -101,6 +101,20 @@ public class PolicyManagementServiceComponent {
}
}
@SuppressWarnings("unused")
protected void deactivate(ComponentContext componentContext) {
try {
PolicyConfiguration policyConfiguration = DeviceConfigurationManager.getInstance().getDeviceManagementConfig().
getDeviceManagementConfigRepository().getPolicyConfiguration();
if (policyConfiguration.getMonitoringEnable()) {
TaskScheduleService taskScheduleService = new TaskScheduleServiceImpl();
taskScheduleService.stopTask();
}
} catch (Throwable t) {
log.error("Error occurred while destroying the Policy management core.", t);
}
}
/**
* Sets Realm Service

@ -103,8 +103,10 @@ public class TaskScheduleServiceImpl implements TaskScheduleService {
try {
String taskName = PolicyManagementConstants.MONITORING_TASK_NAME + "_" + String.valueOf(tenantId);
TaskService taskService = PolicyManagementDataHolder.getInstance().getTaskService();
TaskManager taskManager = taskService.getTaskManager(PolicyManagementConstants.MONITORING_TASK_TYPE);
taskManager.deleteTask(taskName);
if (taskService.isServerInit()) {
TaskManager taskManager = taskService.getTaskManager(PolicyManagementConstants.MONITORING_TASK_TYPE);
taskManager.deleteTask(taskName);
}
} catch (TaskException e) {
throw new PolicyMonitoringTaskException("Error occurred while deleting the task for tenant " +
tenantId, e);

@ -115,6 +115,7 @@
<importFeatureDef>org.wso2.carbon.core.server:${carbon.kernel.version}</importFeatureDef>
<importFeatureDef>org.wso2.carbon.apimgt.core:${carbon.api.mgt.version}</importFeatureDef>
<importFeatureDef>org.wso2.carbon.device.mgt.extensions:${carbon.device.mgt.version}</importFeatureDef>
<importFeatureDef>org.wso2.carbon.email.sender:${carbon.device.mgt.version}</importFeatureDef>
</importFeatures>
</configuration>
</execution>

@ -24,14 +24,6 @@
<Name>jdbc/DM_DS</Name>
</JndiLookupDefinition>
</DataSourceConfiguration>
<EmailClientConfiguration>
<minimumThread>8</minimumThread>
<maximumThread>100</maximumThread>
<keepAliveTime>20</keepAliveTime>
<ThreadQueueCapacity>1000</ThreadQueueCapacity>
<LBHostPortPrefix>https://localhost:9443</LBHostPortPrefix>
<enrollmentContextPath>/emm-web-agent/enrollment</enrollmentContextPath>
</EmailClientConfiguration>
<IdentityConfiguration>
<ServerUrl>https://localhost:9443</ServerUrl>
<AdminUsername>admin</AdminUsername>

@ -1,40 +0,0 @@
<Notifications>
<NotificationMessage type="enrol">
<Subject>Enroll your Device with WSO2 MDM</Subject>
<Header>Dear {first-name},</Header>
<Body>
You have been registered to the WSO2 MDM. Below is the link to enroll.
</Body>
<Url>{downloadUrl}</Url>
<Footer1>
Best Regards,
</Footer1>
<Footer2>
WSO2 MDM Team.
</Footer2>
<Footer3>
http://www.wso2.com
</Footer3>
</NotificationMessage>
<NotificationMessage type="userRegistration">
<Subject>Enroll your Device with WSO2 MDM</Subject>
<Header>Dear {first-name},</Header>
<Body>
You have been registered to WSO2 MDM with following credentials.
Domain: {domain-name}
Username: {user-name}
Password: {password}
Below is the link to enroll.
</Body>
<Url>{downloadUrl}</Url>
<Footer1>
Best Regards,
</Footer1>
<Footer2>
WSO2 MDM Team.
</Footer2>
<Footer3>
http://www.wso2.com
</Footer3>
</NotificationMessage>
</Notifications>

@ -394,3 +394,70 @@ CREATE TABLE IF NOT EXISTS DM_NOTIFICATION (
);
-- NOTIFICATION TABLE END --
DROP TABLE IF EXISTS DM_DEVICE_INFO;
CREATE TABLE IF NOT EXISTS DM_DEVICE_INFO (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INT NULL,
KEY_FIELD VARCHAR(45) NULL,
VALUE_FIELD VARCHAR(100) NULL,
PRIMARY KEY (ID),
CONSTRAINT DM_DEVICE_INFO_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
DROP TABLE IF EXISTS DM_DEVICE_LOCATION;
CREATE TABLE IF NOT EXISTS DM_DEVICE_LOCATION (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INT NULL,
LATITUDE DOUBLE NULL,
LONGITUDE DOUBLE NULL,
STREET1 VARCHAR(45) NULL,
STREET2 VARCHAR(45) NULL,
CITY VARCHAR(45) NULL,
ZIP VARCHAR(10) NULL,
STATE VARCHAR(45) NULL,
COUNTRY VARCHAR(45) NULL,
PRIMARY KEY (ID),
CONSTRAINT DM_DEVICE_LOCATION_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE IF NOT EXISTS DM_DEVICE_DETAIL (
ID INT NOT NULL AUTO_INCREMENT,
DEVICE_ID INT NOT NULL,
IMEI VARCHAR(100) NULL,
IMSI VARCHAR(100) NULL,
DEVICE_MODEL VARCHAR(45) NULL,
VENDOR VARCHAR(45) NULL,
OS_VERSION VARCHAR(45) NULL,
BATTERY_LEVEL DECIMAL(4) NULL,
INTERNAL_TOTAL_MEMORY DECIMAL(5) NULL,
INTERNAL_AVAILABLE_MEMORY DECIMAL(5) NULL,
EXTERNAL_TOTAL_MEMORY DECIMAL(5) NULL,
EXTERNAL_AVAILABLE_MEMORY DECIMAL(5) NULL,
OPERATOR VARCHAR(45) NULL,
CONNECTION_TYPE VARCHAR(10) NULL,
MOBILE_SIGNAL_STRENGTH DECIMAL(5) NULL,
SSID VARCHAR(45) NULL,
CPU_USAGE DECIMAL(5) NULL,
TOTAL_RAM_MEMORY DECIMAL(5) NULL,
AVAILABLE_RAM_MEMORY DECIMAL(5) NULL,
PLUGGED_IN INT(1) NULL,
PRIMARY KEY (ID),
CONSTRAINT FK_DM_DEVICE_DETAILS_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);

@ -382,3 +382,78 @@ CREATE TABLE DM_NOTIFICATION (
DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
);
-- NOTIFICATION TABLE END --
DROP TABLE IF EXISTS DM_DEVICE_INFO;
CREATE TABLE IF NOT EXISTS DM_DEVICE_INFO (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INTEGER NULL,
KEY_FIELD VARCHAR(45) NULL,
VALUE_FIELD VARCHAR(100) NULL,
PRIMARY KEY (ID),
INDEX DM_DEVICE_INFO_DEVICE_idx (DEVICE_ID ASC),
CONSTRAINT DM_DEVICE_INFO_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
DROP TABLE IF EXISTS DM_DEVICE_LOCATION;
CREATE TABLE IF NOT EXISTS DM_DEVICE_LOCATION (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INTEGER NULL,
LATITUDE DOUBLE NULL,
LONGITUDE DOUBLE NULL,
STREET1 VARCHAR(45) NULL,
STREET2 VARCHAR(45) NULL,
CITY VARCHAR(45) NULL,
ZIP VARCHAR(10) NULL,
STATE VARCHAR(45) NULL,
COUNTRY VARCHAR(45) NULL,
PRIMARY KEY (ID),
INDEX DM_DEVICE_LOCATION_DEVICE_idx (DEVICE_ID ASC),
CONSTRAINT DM_DEVICE_LOCATION_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
DROP TABLE IF EXISTS DM_DEVICE_DETAIL ;
CREATE TABLE IF NOT EXISTS DM_DEVICE_DETAIL (
ID INT NOT NULL AUTO_INCREMENT,
DEVICE_ID INT NOT NULL,
IMEI VARCHAR(100) NULL,
IMSI VARCHAR(100) NULL,
DEVICE_MODEL VARCHAR(45) NULL,
VENDOR VARCHAR(45) NULL,
OS_VERSION VARCHAR(45) NULL,
BATTERY_LEVEL DECIMAL(4) NULL,
INTERNAL_TOTAL_MEMORY DECIMAL(5) NULL,
INTERNAL_AVAILABLE_MEMORY DECIMAL(5) NULL,
EXTERNAL_TOTAL_MEMORY DECIMAL(5) NULL,
EXTERNAL_AVAILABLE_MEMORY DECIMAL(5) NULL,
OPERATOR VARCHAR(45) NULL,
CONNECTION_TYPE VARCHAR(10) NULL,
MOBILE_SIGNAL_STRENGTH DECIMAL(5) NULL,
SSID VARCHAR(45) NULL,
CPU_USAGE DECIMAL(5) NULL,
TOTAL_RAM_MEMORY DECIMAL(5) NULL,
AVAILABLE_RAM_MEMORY DECIMAL(5) NULL,
PLUGGED_IN INT(1) NULL,
PRIMARY KEY (ID),
INDEX FK_DM_DEVICE_DETAILS_DEVICE_idx (DEVICE_ID ASC),
CONSTRAINT FK_DM_DEVICE_DETAILS_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);

@ -393,3 +393,80 @@ CREATE TABLE IF NOT EXISTS DM_NOTIFICATION (
-- END NOTIFICATION TABLES --
DROP TABLE IF EXISTS DM_DEVICE_INFO;
CREATE TABLE IF NOT EXISTS DM_DEVICE_INFO (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INT NULL,
KEY_FIELD VARCHAR(45) NULL,
VALUE_FIELD VARCHAR(100) NULL,
PRIMARY KEY (ID),
INDEX DM_DEVICE_INFO_DEVICE_idx (DEVICE_ID ASC),
CONSTRAINT DM_DEVICE_INFO_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
ENGINE = InnoDB;
DROP TABLE IF EXISTS DM_DEVICE_LOCATION;
CREATE TABLE IF NOT EXISTS DM_DEVICE_LOCATION (
ID INTEGER AUTO_INCREMENT NOT NULL,
DEVICE_ID INT NULL,
LATITUDE DOUBLE NULL,
LONGITUDE DOUBLE NULL,
STREET1 VARCHAR(45) NULL,
STREET2 VARCHAR(45) NULL,
CITY VARCHAR(45) NULL,
ZIP VARCHAR(10) NULL,
STATE VARCHAR(45) NULL,
COUNTRY VARCHAR(45) NULL,
PRIMARY KEY (ID),
INDEX DM_DEVICE_LOCATION_DEVICE_idx (DEVICE_ID ASC),
CONSTRAINT DM_DEVICE_LOCATION_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
ENGINE = InnoDB;
DROP TABLE IF EXISTS DM_DEVICE_DETAIL ;
CREATE TABLE IF NOT EXISTS DM_DEVICE_DETAIL (
ID INT NOT NULL AUTO_INCREMENT,
DEVICE_ID INT NOT NULL,
IMEI VARCHAR(100) NULL,
IMSI VARCHAR(100) NULL,
DEVICE_MODEL VARCHAR(45) NULL,
VENDOR VARCHAR(45) NULL,
OS_VERSION VARCHAR(45) NULL,
BATTERY_LEVEL DECIMAL(4) NULL,
INTERNAL_TOTAL_MEMORY DECIMAL(5) NULL,
INTERNAL_AVAILABLE_MEMORY DECIMAL(5) NULL,
EXTERNAL_TOTAL_MEMORY DECIMAL(5) NULL,
EXTERNAL_AVAILABLE_MEMORY DECIMAL(5) NULL,
OPERATOR VARCHAR(45) NULL,
CONNECTION_TYPE VARCHAR(10) NULL,
MOBILE_SIGNAL_STRENGTH DECIMAL(5) NULL,
SSID VARCHAR(45) NULL,
CPU_USAGE DECIMAL(5) NULL,
TOTAL_RAM_MEMORY DECIMAL(5) NULL,
AVAILABLE_RAM_MEMORY DECIMAL(5) NULL,
PLUGGED_IN INT(1) NULL,
PRIMARY KEY (ID),
INDEX FK_DM_DEVICE_DETAILS_DEVICE_idx (DEVICE_ID ASC),
CONSTRAINT FK_DM_DEVICE_DETAILS_DEVICE
FOREIGN KEY (DEVICE_ID)
REFERENCES DM_DEVICE (ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

@ -0,0 +1,72 @@
#*
Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
WSO2 Inc. licenses this file to you under the Apache License,
Version 2.0 (the "License"); you may not use this file except
in compliance with the License.
you may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*#
<EmailConfig>
<Subject>You have been invited to enroll your device in WSO2 EMM</Subject>
<Body>
<![CDATA[
<html>
<head>
<title>WSO2 Enterprise Mobility Manager</title>
</head>
<body style="color: #666666; background-color:#cdcdcd; padding: 0px; margin: 0px;">
<div style="background-color:#cdcdcd; font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; padding: 20px 0px; margin: 0px;">
<div style="width: 86%; max-width: 650px; padding: 2%; background-color: #ffffff; margin: auto; border-radius: 14px;">
<div style="background-color: #49c8f5; line-height: 0px; border-top-left-radius: 10px; border-top-right-radius: 10px; padding: 0px 10px 0px 0px;">
<div style="display: inline-block; line-height: 0px;">
<img src="http://b.content.wso2.com/sites/all/2015-june-theme/navigation/wso2-nav-logo.png"
alt="WSO2" style="margin: 0px 20px 0px 25px; width: 100%; max-width: 251px;"/>
</div>
</div>
<div style="background-color: #ffffff; line-height: 170%; color: #666666; padding: 20px 25px;">
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px 20px;">
Hi $first-name,
</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px;">
You have been invited to enrol your device in WSO2 Enterprise Mobility Manager.
Click <a href="$base-url-https/emm-web-agent/enrollment">here</a> to download the WSO2 EMM client application to begin device
enrolment.</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px;">
Should you need assistance, please contact your administrator.
</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 20px 0px 5px;">
Regards,
</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px;">
WSO2 EMM Administrator
</p>
</div>
<div style="background-color: #333333; border-bottom-left-radius: 10px; border-bottom-right-radius: 10px;">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td style="padding: 0px 20px 0px 0px;"><img
src="http://b.content.wso2.com/newsletter/images/wso2-logo-cloud-footer.png" alt="WSO2"
style="margin: 15px 0px 15px 25px; width: 100%; max-width: 258px;"/></td>
</tr>
</table>
</div>
</div>
</div>
</body>
</html>
]]>
</Body>
</EmailConfig>

@ -0,0 +1,82 @@
#*
Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
WSO2 Inc. licenses this file to you under the Apache License,
Version 2.0 (the "License"); you may not use this file except
in compliance with the License.
you may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*#
<EmailConfig>
<Subject>You have successfully been registered in WSO2 EMM</Subject>
<Body>
<![CDATA[
<html>
<head>
<title>WSO2 Enterprise Mobility Manager</title>
</head>
<body style="color: #666666; background-color:#cdcdcd; padding: 0px; margin: 0px;">
<div style="background-color:#cdcdcd; font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; padding: 20px 0px; margin: 0px;">
<div style="width: 86%; max-width: 650px; padding: 2%; background-color: #ffffff; margin: auto; border-radius: 14px;">
<div style="background-color: #49c8f5; line-height: 0px; border-top-left-radius: 10px; border-top-right-radius: 10px; padding: 0px 10px 0px 0px;">
<div style="display: inline-block; line-height: 0px;">
<img src="http://b.content.wso2.com/sites/all/2015-june-theme/navigation/wso2-nav-logo.png"
alt="WSO2" style="margin: 0px 20px 0px 25px; width: 100%; max-width: 251px;"/>
</div>
</div>
<div style="background-color: #ffffff; line-height: 170%; color: #666666; padding: 20px 25px;">
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px 20px;">
Hi $first-name,
</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px;">
You have been registered in WSO2 Enterprise Mobility Manager and invited to enrol your device.
Click <a href="$base-url-https/emm-web-agent/enrollment">here</a> to download the WSO2 EMM client application to begin device
enrolment.</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px;">
Use following credentials to log in to WSO2 EMM client application.
</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px;">
<b>Username:</b> $username
<br/>
<b>Password:</b> $password
</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px;">
Should you need assistance, please contact your administrator.
</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 20px 0px 5px;">
Regards,
</p>
<p style="font-size: 1em; font-family: Arial, Helvetica; line-height: 170%; color: #666666; margin: 5px 0px;">
WSO2 EMM Administrator
</p>
</div>
<div style="background-color: #333333; border-bottom-left-radius: 10px; border-bottom-right-radius: 10px;">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td style="padding: 0px 20px 0px 0px;"><img
src="http://b.content.wso2.com/newsletter/images/wso2-logo-cloud-footer.png" alt="WSO2"
style="margin: 15px 0px 15px 25px; width: 100%; max-width: 258px;"/></td>
</tr>
</table>
</div>
</div>
</div>
</body>
</html>
]]>
</Body>
</EmailConfig>

@ -1,7 +1,7 @@
instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/conf/cdm-config.xml,target:${installFolder}/../../conf/cdm-config.xml,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/conf/notification-messages.xml,target:${installFolder}/../../conf/notification-messages.xml,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/conf/license-config.xml,target:${installFolder}/../../conf/etc/license-config.xml,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/conf/remote-appmanager-config.xml,target:${installFolder}/../../conf/etc/remote-appmanager-config.xml,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/dbscripts/cdm,target:${installFolder}/../../../dbscripts/cdm,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/rxts/license.rxt,target:${installFolder}/../../../repository/resources/rxts/license.rxt,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/rxts/license.rxt,target:${installFolder}/../../../repository/resources/rxts/license.rxt,overwrite:true);\
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.server_${feature.version}/email/templates,target:${installFolder}/../../../repository/resources/email-templates,overwrite:true);\

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
~
~ WSO2 Inc. licenses this file to you under the Apache License,
~ Version 2.0 (the "License"); you may not use this file except
~ in compliance with the License.
~ you may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing,
~ software distributed under the License is distributed on an
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~ KIND, either express or implied. See the License for the
~ specific language governing permissions and limitations
~ under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>email-sender-feature</artifactId>
<version>1.0.4-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.email.sender.feature</artifactId>
<packaging>pom</packaging>
<version>1.0.4-SNAPSHOT</version>
<name>WSO2 Carbon - Email Sender Feature</name>
<url>http://wso2.org</url>
<description>This feature contains the core bundles required for email sender related functionality
</description>
<dependencies>
<dependency>
<groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.email.sender.core</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>generate-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>src/main/resources</outputDirectory>
<resources>
<resource>
<directory>resources</directory>
<includes>
<include>build.properties</include>
<include>p2.inf</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.wso2.maven</groupId>
<artifactId>carbon-p2-plugin</artifactId>
<version>${carbon.p2.plugin.version}</version>
<executions>
<execution>
<id>p2-feature-generation</id>
<phase>package</phase>
<goals>
<goal>p2-feature-gen</goal>
</goals>
<configuration>
<id>org.wso2.carbon.email.sender</id>
<propertiesFile>../../../features/etc/feature.properties</propertiesFile>
<adviceFile>
<properties>
<propertyDef>org.wso2.carbon.p2.category.type:server</propertyDef>
<propertyDef>org.eclipse.equinox.p2.type.group:false</propertyDef>
</properties>
</adviceFile>
<bundles>
<bundleDef>
org.wso2.carbon.devicemgt:org.wso2.carbon.email.sender.core:${carbon.device.mgt.version}
</bundleDef>
</bundles>
<importFeatures>
<importFeatureDef>org.wso2.carbon.core.server:${carbon.kernel.version}</importFeatureDef>
</importFeatures>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
~
~ WSO2 Inc. licenses this file to you under the Apache License,
~ Version 2.0 (the "License"); you may not use this file except
~ in compliance with the License.
~ you may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing,
~ software distributed under the License is distributed on an
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~ KIND, either express or implied. See the License for the
~ specific language governing permissions and limitations
~ under the License.
-->
<EmailSenderConfig>
<MinThreads>8</MinThreads>
<MaxThreads>100</MaxThreads>
<KeepAliveDuration>20</KeepAliveDuration>
<ThreadQueueCapacity>1000</ThreadQueueCapacity>
</EmailSenderConfig>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save