diff --git a/.gitignore b/.gitignore index dca84b42..63fbc681 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,7 @@ target *.iml .idea .DS_Store + +# Ignore .car and Database files +*.car +*.h2.db diff --git a/modules/samples/connectedcup/component/controller/pom.xml b/modules/samples/connectedcup/component/controller/pom.xml new file mode 100644 index 00000000..82102873 --- /dev/null +++ b/modules/samples/connectedcup/component/controller/pom.xml @@ -0,0 +1,251 @@ + + + + + + device-mgt-iot-connectedcup + org.wso2.carbon.devicemgt-plugins + 1.9.2-SNAPSHOT + ../pom.xml + + + + 4.0.0 + org.coffeeking.controller.service + 1.9.2-SNAPSHOT + war + WSO2 IoTS(Device Types) - Connected Cup Controller Service + WSO2 IoTS(Device Types) - Connected Cup Controller Service + http://wso2.org + + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.core + + + org.apache.axis2.wso2 + axis2-client + + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.analytics + + + org.apache.axis2.wso2 + axis2-client + + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.certificate.mgt.core + + + + + + org.apache.cxf + cxf-rt-frontend-jaxws + + + org.apache.cxf + cxf-rt-frontend-jaxrs + + + org.apache.cxf + cxf-rt-transports-http + + + + + org.eclipse.paho + mqtt-client + + + + + org.apache.httpcomponents + httpasyncclient + 4.1 + + + org.wso2.carbon.devicemgt-plugins + org.wso2.carbon.device.mgt.iot + + + + + + org.codehaus.jackson + jackson-core-asl + + + org.codehaus.jackson + jackson-jaxrs + + + javax + javaee-web-api + + + javax.ws.rs + jsr311-api + + + commons-httpclient.wso2 + commons-httpclient + + + + org.wso2.carbon + org.wso2.carbon.utils + + + org.bouncycastle.wso2 + bcprov-jdk15on + + + org.wso2.carbon + org.wso2.carbon.user.api + + + org.wso2.carbon + org.wso2.carbon.queuing + + + org.wso2.carbon + org.wso2.carbon.base + + + org.apache.axis2.wso2 + axis2 + + + org.igniterealtime.smack.wso2 + smack + + + org.igniterealtime.smack.wso2 + smackx + + + jaxen + jaxen + + + commons-fileupload.wso2 + commons-fileupload + + + org.apache.ant.wso2 + ant + + + org.apache.ant.wso2 + ant + + + commons-httpclient.wso2 + commons-httpclient + + + org.eclipse.equinox + javax.servlet + + + org.wso2.carbon + org.wso2.carbon.registry.api + + + + + + org.igniterealtime.smack.wso2 + smack + + + org.igniterealtime.smack.wso2 + smackx + + + org.wso2.carbon.devicemgt + org.wso2.carbon.apimgt.annotations + + + org.wso2.carbon.devicemgt-plugins + org.coffeeking.connectedcup.plugin + + + + org.json.wso2 + json + + + + + + + ${basedir}/src/main/java + + + + + maven-compiler-plugin + + 1.7 + 1.7 + + 2.3.2 + + + maven-war-plugin + + connectedcup + + + + + + \ No newline at end of file diff --git a/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/ConnectedCupControllerService.java b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/ConnectedCupControllerService.java new file mode 100644 index 00000000..b9365f4d --- /dev/null +++ b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/ConnectedCupControllerService.java @@ -0,0 +1,179 @@ +/* + * 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.coffeeking.controller.service; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.coffeeking.connectedcup.plugin.constants.ConnectedCupConstants; +import org.coffeeking.controller.service.dto.DeviceJSON; +import org.coffeeking.controller.service.transport.ConnectedCupMQTTConnector; +import org.coffeeking.controller.service.util.ConnectedCupServiceUtils; +import org.json.JSONObject; +import org.wso2.carbon.apimgt.annotations.api.API; +import org.wso2.carbon.apimgt.annotations.device.DeviceType; +import org.wso2.carbon.apimgt.annotations.device.feature.Feature; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.iot.DeviceValidator; +import org.wso2.carbon.device.mgt.iot.exception.DeviceControllerException; +import org.wso2.carbon.device.mgt.iot.sensormgt.SensorDataManager; +import org.wso2.carbon.device.mgt.iot.sensormgt.SensorRecord; +import org.wso2.carbon.device.mgt.iot.transport.TransportHandlerException; + +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.Calendar; + +@API( name="connectedcup", version="1.0.0", context="/connectedcup") +@DeviceType( value = "connectedcup") +public class ConnectedCupControllerService { + + private static Log log = LogFactory.getLog(ConnectedCupControllerService.class); + private static final String SUPER_TENANT = "carbon.super"; + private ConnectedCupMQTTConnector connectedCupMQTTConnector; + + + /** + * @param deviceId + * @param owner + */ + @Path("controller/cup/coffeelevel") + @GET + public SensorRecord readCoffeeLevel(@HeaderParam("owner") String owner, + @HeaderParam("deviceId") String deviceId, + @Context HttpServletResponse response) { + SensorRecord sensorRecord = null; + DeviceValidator deviceValidator = new DeviceValidator(); + try { + if (!deviceValidator.isExist(owner, SUPER_TENANT, new DeviceIdentifier( + deviceId, ConnectedCupConstants.DEVICE_TYPE))) { + response.setStatus(Response.Status.UNAUTHORIZED.getStatusCode()); + } + } catch (DeviceManagementException e) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + } + + + if (log.isDebugEnabled()) { + log.debug("Sending request to read liquid level value of device [" + deviceId + "] via MQTT"); + } + + try { + String mqttResource = ConnectedCupConstants.LEVEL_CONTEXT.replace("/", ""); + connectedCupMQTTConnector.publishDeviceData(owner, deviceId, mqttResource, ""); + + sensorRecord = SensorDataManager.getInstance().getSensorRecord(deviceId, + ConnectedCupConstants.SENSOR_LEVEL); + } catch ( DeviceControllerException | TransportHandlerException e ) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + } + + response.setStatus(Response.Status.OK.getStatusCode()); + return sensorRecord; + } + + + + @Path("controller/cup/temperature") + @GET + public SensorRecord readTemperature(@HeaderParam("owner") String owner, + @HeaderParam("deviceId") String deviceId, + @Context HttpServletResponse response) { + SensorRecord sensorRecord = null; + + DeviceValidator deviceValidator = new DeviceValidator(); + try { + if (!deviceValidator.isExist(owner, SUPER_TENANT, + new DeviceIdentifier(deviceId, ConnectedCupConstants.DEVICE_TYPE))) { + response.setStatus(Response.Status.UNAUTHORIZED.getStatusCode()); + } + } catch (DeviceManagementException e) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + } + + if (log.isDebugEnabled()) { + log.debug("Sending request to read connected cup temperature of device " + + "[" + deviceId + "] via MQTT"); + } + + try { + String mqttResource = ConnectedCupConstants.TEMPERATURE_CONTEXT.replace("/", ""); + connectedCupMQTTConnector.publishDeviceData(owner, deviceId, mqttResource, ""); + + sensorRecord = SensorDataManager.getInstance().getSensorRecord(deviceId, + ConnectedCupConstants.SENSOR_TEMPERATURE); + } catch ( DeviceControllerException | TransportHandlerException e) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + } + + response.setStatus(Response.Status.OK.getStatusCode()); + return sensorRecord; + } + /** + * @param dataMsg + * @param response + */ + @Path("controller/push_temperature") + @POST + @Consumes(MediaType.APPLICATION_JSON) + public void pushTemperatureData(final DeviceJSON dataMsg, + @Context HttpServletResponse response) { + String deviceId = dataMsg.deviceId; + float temperature = dataMsg.value; + + SensorDataManager.getInstance().setSensorRecord(deviceId, ConnectedCupConstants.SENSOR_TEMPERATURE, + String.valueOf(temperature), + Calendar.getInstance().getTimeInMillis()); + + if (!ConnectedCupServiceUtils.publishToDAS(dataMsg.owner, dataMsg.deviceId, dataMsg.value)) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + } + + } + + /** + * @param dataMsg + * @param response + */ + @Path("controller/push_level") + @POST + @Consumes(MediaType.APPLICATION_JSON) + public void pushLevelData(final DeviceJSON dataMsg, + @Context HttpServletResponse response) { + String deviceId = dataMsg.deviceId; + float temperature = dataMsg.value; + + SensorDataManager.getInstance().setSensorRecord(deviceId, ConnectedCupConstants.SENSOR_LEVEL, + String.valueOf(temperature), + Calendar.getInstance().getTimeInMillis()); + + if (!ConnectedCupServiceUtils.publishToDAS(dataMsg.owner, dataMsg.deviceId, dataMsg.value)) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + } + + } +} \ No newline at end of file diff --git a/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/dto/DeviceJSON.java b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/dto/DeviceJSON.java new file mode 100644 index 00000000..806de48d --- /dev/null +++ b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/dto/DeviceJSON.java @@ -0,0 +1,35 @@ +/* + * 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.coffeeking.controller.service.dto; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +@JsonIgnoreProperties(ignoreUnknown = true) +public class DeviceJSON { + @XmlElement(required = true) public String owner; + @XmlElement(required = true) public String deviceId; + @XmlElement(required = true) public String reply; + @XmlElement public Long time; + @XmlElement public String key; + @XmlElement public float value; +} diff --git a/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/exception/ConnectedCupException.java b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/exception/ConnectedCupException.java new file mode 100644 index 00000000..1c6caf78 --- /dev/null +++ b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/exception/ConnectedCupException.java @@ -0,0 +1,31 @@ +/* + * 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.coffeeking.controller.service.exception; + +public class ConnectedCupException extends Exception { + private static final long serialVersionUID = 118512086957330189L; + + public ConnectedCupException(String errorMessage) { + super(errorMessage); + } + + public ConnectedCupException(String errorMessage, Throwable throwable) { + super(errorMessage, throwable); + } +} diff --git a/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/transport/ConnectedCupMQTTConnector.java b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/transport/ConnectedCupMQTTConnector.java new file mode 100644 index 00000000..a4d0abcb --- /dev/null +++ b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/transport/ConnectedCupMQTTConnector.java @@ -0,0 +1,187 @@ +/* + * 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.coffeeking.controller.service.transport; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.coffeeking.connectedcup.plugin.constants.ConnectedCupConstants; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.wso2.carbon.device.mgt.iot.config.server.DeviceManagementConfigurationManager; +import org.wso2.carbon.device.mgt.iot.controlqueue.mqtt.MqttConfig; +import org.wso2.carbon.device.mgt.iot.transport.TransportHandlerException; +import org.wso2.carbon.device.mgt.iot.transport.mqtt.MQTTTransportHandler; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +@SuppressWarnings("no JAX-WS annotation") +public class ConnectedCupMQTTConnector extends MQTTTransportHandler { + private static Log log = LogFactory.getLog(ConnectedCupMQTTConnector.class); + + private static String serverName = DeviceManagementConfigurationManager.getInstance(). + getDeviceManagementServerInfo().getName(); + + private static String subscribeTopic = serverName + File.separator + "+" + File.separator + + ConnectedCupConstants.DEVICE_TYPE + File.separator + "+" + File.separator + + "connected_publisher"; + + private static String iotServerSubscriber = UUID.randomUUID().toString().substring(0, 5); + + private ConnectedCupMQTTConnector() { + super(iotServerSubscriber, ConnectedCupConstants.DEVICE_TYPE, + MqttConfig.getInstance().getMqttQueueEndpoint(), subscribeTopic); + } + + @Override + public void connect() { + Runnable connector = new Runnable() { + public void run() { + while (!isConnected()) { + try { + connectToQueue(); + subscribeToQueue(); + } catch (TransportHandlerException e) { + log.warn("Connection/Subscription to MQTT Broker at: " + mqttBrokerEndPoint + " failed"); + try { + Thread.sleep(timeoutInterval); + } catch (InterruptedException ex) { + log.error("MQTT-Subscriber: Thread Sleep Interrupt Exception.", ex); + } + } + } + } + }; + + Thread connectorThread = new Thread(connector); + connectorThread.setDaemon(true); + connectorThread.start(); + } + + + + @Override + public void publishDeviceData(String... publishData) throws TransportHandlerException { + if (publishData.length != 4) { + String errorMsg = "Incorrect number of arguments received to SEND-MQTT Message. " + + "Need to be [owner, deviceId, resource{BULB/TEMP}, state{ON/OFF or null}]"; + log.error(errorMsg); + throw new TransportHandlerException(errorMsg); + } + + String deviceOwner = publishData[0]; + String deviceId = publishData[1]; + String resource = publishData[2]; + String state = publishData[3]; + + MqttMessage pushMessage = new MqttMessage(); + String publishTopic = + serverName + File.separator + deviceOwner + File.separator + + ConnectedCupConstants.DEVICE_TYPE + File.separator + deviceId; + + try { + + String actualMessage = resource + ":" + state; + + pushMessage.setPayload(actualMessage.getBytes(StandardCharsets.UTF_8)); + pushMessage.setQos(DEFAULT_MQTT_QUALITY_OF_SERVICE); + pushMessage.setRetained(false); + + publishToQueue(publishTopic, pushMessage); + + } catch (Exception e) { + String errorMsg = "Preparing Secure payload failed for device - [" + deviceId + "] of owner - " + + "[" + deviceOwner + "]."; + log.error(errorMsg); + throw new TransportHandlerException(errorMsg, e); + } + } + + + @Override + public void processIncomingMessage(MqttMessage mqttMessage, String... strings) throws TransportHandlerException { + String topic = strings[0]; + + String ownerAndId = topic.replace("wso2" + File.separator + "iot" + File.separator, ""); + ownerAndId = ownerAndId.replace(File.separator + ConnectedCupConstants.DEVICE_TYPE + File.separator, ":"); + ownerAndId = ownerAndId.replace(File.separator + "connectedcup_publisher", ""); + + String owner = ownerAndId.split(":")[0]; + String deviceId = ownerAndId.split(":")[1]; + + String[] messageData = mqttMessage.toString().split(":"); + + log.info("Received MQTT message for OWNER: " + owner + " DEVICE.ID: " + deviceId + " | Command: " + + messageData[0] +" " + messageData[1] ); + + + } + + + @Override + public void disconnect() { + Runnable stopConnection = new Runnable() { + public void run() { + while (isConnected()) { + try { + closeConnection(); + } catch (MqttException e) { + if (log.isDebugEnabled()) { + log.warn("Unable to 'STOP' MQTT connection at broker at: " + mqttBrokerEndPoint + + " for device-type - " + ConnectedCupConstants.DEVICE_TYPE, e); + } + + try { + Thread.sleep(timeoutInterval); + } catch (InterruptedException e1) { + log.error("MQTT-Terminator: Thread Sleep Interrupt Exception at device-type - " + + ConnectedCupConstants.DEVICE_TYPE, e1); + } + } + } + } + }; + + Thread terminatorThread = new Thread(stopConnection); + terminatorThread.setDaemon(true); + terminatorThread.start(); + } + + @Override + public void publishDeviceData() { + // nothing to do + } + + + @Override + public void publishDeviceData(MqttMessage publishData) throws TransportHandlerException { + // nothing to do + } + + @Override + public void processIncomingMessage() { + // nothing to do + } + + @Override + public void processIncomingMessage(MqttMessage message) throws TransportHandlerException { + // nothing to do + } +} diff --git a/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/util/ConnectedCupServiceUtils.java b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/util/ConnectedCupServiceUtils.java new file mode 100644 index 00000000..fd72356c --- /dev/null +++ b/modules/samples/connectedcup/component/controller/src/main/java/org/coffeeking/controller/service/util/ConnectedCupServiceUtils.java @@ -0,0 +1,216 @@ +/* + * 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.coffeeking.controller.service.util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.concurrent.FutureCallback; +import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; +import org.apache.http.impl.nio.client.HttpAsyncClients; +import org.coffeeking.connectedcup.plugin.constants.ConnectedCupConstants; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.device.mgt.analytics.exception.DataPublisherConfigurationException; +import org.wso2.carbon.device.mgt.analytics.service.DeviceAnalyticsService; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import javax.ws.rs.HttpMethod; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Future; + +public class ConnectedCupServiceUtils { + private static final Log log = LogFactory.getLog(ConnectedCupServiceUtils.class); + + //TODO; replace this tenant domain + private static final String SUPER_TENANT = "carbon.super"; + private static final String TEMPERATURE_STREAM_DEFINITION = "org.wso2.iot.devices.temperature"; + + public static String sendCommandViaHTTP(final String deviceHTTPEndpoint, String urlContext, + boolean fireAndForgot) throws DeviceManagementException { + + String responseMsg = ""; + String urlString = ConnectedCupConstants.URL_PREFIX + deviceHTTPEndpoint + urlContext; + + if (log.isDebugEnabled()) { + log.debug(urlString); + } + + if (!fireAndForgot) { + HttpURLConnection httpConnection = getHttpConnection(urlString); + + try { + httpConnection.setRequestMethod(HttpMethod.GET); + } catch (ProtocolException e) { + String errorMsg = + "Protocol specific error occurred when trying to set method to GET" + + " for:" + urlString; + log.error(errorMsg); + throw new DeviceManagementException(errorMsg, e); + } + + responseMsg = readResponseFromGetRequest(httpConnection); + + } else { + CloseableHttpAsyncClient httpclient = null; + try { + + httpclient = HttpAsyncClients.createDefault(); + httpclient.start(); + HttpGet request = new HttpGet(urlString); + final CountDownLatch latch = new CountDownLatch(1); + Future future = httpclient.execute( + request, new FutureCallback() { + @Override + public void completed(HttpResponse httpResponse) { + latch.countDown(); + } + + @Override + public void failed(Exception e) { + latch.countDown(); + } + + @Override + public void cancelled() { + latch.countDown(); + } + }); + + latch.await(); + + } catch (InterruptedException e) { + if (log.isDebugEnabled()) { + log.debug("Sync Interrupted"); + } + } finally { + try { + if (httpclient != null) { + httpclient.close(); + + } + } catch (IOException e) { + if (log.isDebugEnabled()) { + log.debug("Failed on close"); + } + } + } + } + + return responseMsg; + } + + /* --------------------------------------------------------------------------------------- + Utility methods relevant to creating and sending http requests + --------------------------------------------------------------------------------------- */ + + /* This methods creates and returns a http connection object */ + + public static HttpURLConnection getHttpConnection(String urlString) throws + DeviceManagementException { + + URL connectionUrl = null; + HttpURLConnection httpConnection; + + try { + connectionUrl = new URL(urlString); + httpConnection = (HttpURLConnection) connectionUrl.openConnection(); + } catch (MalformedURLException e) { + String errorMsg = + "Error occured whilst trying to form HTTP-URL from string: " + urlString; + log.error(errorMsg); + throw new DeviceManagementException(errorMsg, e); + } catch (IOException e) { + String errorMsg = "Error occured whilst trying to open a connection to: " + + connectionUrl.toString(); + log.error(errorMsg); + throw new DeviceManagementException(errorMsg, e); + } + + return httpConnection; + } + + /* This methods reads and returns the response from the connection */ + + public static String readResponseFromGetRequest(HttpURLConnection httpConnection) + throws DeviceManagementException { + BufferedReader bufferedReader; + try { + bufferedReader = new BufferedReader(new InputStreamReader( + httpConnection.getInputStream())); + } catch (IOException e) { + String errorMsg = + "There is an issue with connecting the reader to the input stream at: " + + httpConnection.getURL(); + log.error(errorMsg); + throw new DeviceManagementException(errorMsg, e); + } + + String responseLine; + StringBuilder completeResponse = new StringBuilder(); + + try { + while ((responseLine = bufferedReader.readLine()) != null) { + completeResponse.append(responseLine); + } + } catch (IOException e) { + String errorMsg = + "Error occured whilst trying read from the connection stream at: " + + httpConnection.getURL(); + log.error(errorMsg); + throw new DeviceManagementException(errorMsg, e); + } + try { + bufferedReader.close(); + } catch (IOException e) { + log.error( + "Could not succesfully close the bufferedReader to the connection at: " + + httpConnection.getURL()); + } + + return completeResponse.toString(); + } + + public static boolean publishToDAS(String owner, String deviceId, float temperature) { + PrivilegedCarbonContext.startTenantFlow(); + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + ctx.setTenantDomain(SUPER_TENANT, true); + DeviceAnalyticsService deviceAnalyticsService = (DeviceAnalyticsService) ctx.getOSGiService( + DeviceAnalyticsService.class, null); + Object metdaData[] = {owner, ConnectedCupConstants.DEVICE_TYPE, deviceId, + System.currentTimeMillis()}; + Object payloadData[] = {temperature}; + + try { + deviceAnalyticsService.publishEvent(TEMPERATURE_STREAM_DEFINITION, "1.0.0", metdaData, + new Object[0], payloadData); + } catch (DataPublisherConfigurationException e) { + return false; + } finally { + PrivilegedCarbonContext.endTenantFlow(); + } + return true; + } +} diff --git a/modules/samples/connectedcup/component/controller/src/main/webapp/META-INF/webapp-classloading.xml b/modules/samples/connectedcup/component/controller/src/main/webapp/META-INF/webapp-classloading.xml new file mode 100644 index 00000000..ac70a8ca --- /dev/null +++ b/modules/samples/connectedcup/component/controller/src/main/webapp/META-INF/webapp-classloading.xml @@ -0,0 +1,34 @@ + + + + + + + + false + + + CXF,Carbon + diff --git a/modules/samples/connectedcup/component/controller/src/main/webapp/WEB-INF/cxf-servlet.xml b/modules/samples/connectedcup/component/controller/src/main/webapp/WEB-INF/cxf-servlet.xml new file mode 100644 index 00000000..70e1e9f9 --- /dev/null +++ b/modules/samples/connectedcup/component/controller/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/samples/connectedcup/component/controller/src/main/webapp/WEB-INF/web.xml b/modules/samples/connectedcup/component/controller/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..be105f99 --- /dev/null +++ b/modules/samples/connectedcup/component/controller/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,69 @@ + + + + ConnectedCup-Webapp + + JAX-WS/JAX-RS Endpoint + JAX-WS/JAX-RS Servlet + CXFServlet + + org.apache.cxf.transport.servlet.CXFServlet + + 1 + + + CXFServlet + /* + + + + isAdminService + false + + + doAuthentication + false + + + + + managed-api-enabled + true + + + managed-api-owner + admin + + + managed-api-context-template + /connectedcup/{version} + + + managed-api-application + connectedcup + + + managed-api-isSecured + true + + + diff --git a/modules/samples/connectedcup/component/manager/pom.xml b/modules/samples/connectedcup/component/manager/pom.xml new file mode 100644 index 00000000..7916f097 --- /dev/null +++ b/modules/samples/connectedcup/component/manager/pom.xml @@ -0,0 +1,261 @@ + + + + + + device-mgt-iot-connectedcup + org.wso2.carbon.devicemgt-plugins + 1.9.2-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.coffeeking.manager.service + 1.9.2-SNAPSHOT + war + WSO2 IoTS(Device Types) - Connected Cup Manager Service + WSO2 IoTS(Device Types) - Connected Cup Manager Service + http://wso2.org + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.common + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.core + + + org.apache.axis2.wso2 + axis2-client + + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.device.mgt.analytics + + + org.apache.axis2.wso2 + axis2-client + + + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.certificate.mgt.core + + + commons-codec.wso2 + commons-codec + + + + + + + + org.apache.cxf + cxf-rt-frontend-jaxws + + + org.apache.cxf + cxf-rt-frontend-jaxrs + + + org.apache.cxf + cxf-rt-transports-http + + + + + org.eclipse.paho + mqtt-client + + + + + org.apache.httpcomponents + httpasyncclient + + + org.wso2.carbon.devicemgt-plugins + org.wso2.carbon.device.mgt.iot + + + + + + org.codehaus.jackson + jackson-core-asl + + + org.codehaus.jackson + jackson-jaxrs + + + javax + javaee-web-api + + + javax.ws.rs + jsr311-api + + + commons-httpclient.wso2 + commons-httpclient + + + + org.wso2.carbon + org.wso2.carbon.utils + + + org.bouncycastle.wso2 + bcprov-jdk15on + + + org.wso2.carbon + org.wso2.carbon.user.api + + + org.wso2.carbon + org.wso2.carbon.queuing + + + org.wso2.carbon + org.wso2.carbon.base + + + org.apache.axis2.wso2 + axis2 + + + org.igniterealtime.smack.wso2 + smack + + + org.igniterealtime.smack.wso2 + smackx + + + jaxen + jaxen + + + commons-fileupload.wso2 + commons-fileupload + + + org.apache.ant.wso2 + ant + + + org.apache.ant.wso2 + ant + + + commons-httpclient.wso2 + commons-httpclient + + + org.eclipse.equinox + javax.servlet + + + org.wso2.carbon + org.wso2.carbon.registry.api + + + + + + commons-codec + commons-codec + + + + org.igniterealtime.smack.wso2 + smack + + + org.igniterealtime.smack.wso2 + smackx + + + org.wso2.carbon.devicemgt + org.wso2.carbon.apimgt.annotations + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.apimgt.webapp.publisher + + + + + org.wso2.carbon.devicemgt-plugins + org.coffeeking.connectedcup.plugin + + + + + + + ${basedir}/src/main/java + + + + + maven-compiler-plugin + + 1.7 + 1.7 + + 2.3.2 + + + maven-war-plugin + + connectedcup + + + + + + \ No newline at end of file diff --git a/modules/samples/connectedcup/component/manager/src/main/java/org/coffeeking/manager/service/ConnectedCupManagerService.java b/modules/samples/connectedcup/component/manager/src/main/java/org/coffeeking/manager/service/ConnectedCupManagerService.java new file mode 100644 index 00000000..3e722ffa --- /dev/null +++ b/modules/samples/connectedcup/component/manager/src/main/java/org/coffeeking/manager/service/ConnectedCupManagerService.java @@ -0,0 +1,243 @@ +/* + * 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.coffeeking.manager.service; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.coffeeking.connectedcup.plugin.constants.ConnectedCupConstants; +import org.wso2.carbon.apimgt.annotations.api.API; +import org.wso2.carbon.apimgt.annotations.device.DeviceType; +import org.wso2.carbon.apimgt.webapp.publisher.KeyGenerationUtil; +import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.DeviceManagementException; +import org.wso2.carbon.device.mgt.common.EnrolmentInfo; +import org.wso2.carbon.device.mgt.iot.DeviceManagement; +import org.wso2.carbon.device.mgt.iot.apimgt.AccessTokenInfo; +import org.wso2.carbon.device.mgt.iot.apimgt.TokenClient; +import org.wso2.carbon.device.mgt.iot.exception.AccessTokenException; + +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +@API( name="connectedcup_mgt", version="1.0.0", context="/connectedcup_mgt") +public class ConnectedCupManagerService { + private static Log log = LogFactory.getLog(ConnectedCupManagerService.class); + private static final String SUPER_TENANT = "carbon.super"; + + @Context + private HttpServletResponse response; + /** + * @param name + * @param owner + * @return + */ + @Path("cup/register") + @POST + public boolean register(@QueryParam("name") String name, @QueryParam("owner") String owner) { + + + DeviceManagement deviceManagement = new DeviceManagement(SUPER_TENANT); + String deviceId = shortUUID(); + + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(deviceId); + deviceIdentifier.setType(ConnectedCupConstants.DEVICE_TYPE); + + try { + if (deviceManagement.getDeviceManagementService().isEnrolled(deviceIdentifier)) { + response.setStatus(Response.Status.CONFLICT.getStatusCode()); + return false; + } + + Device device = new Device(); + device.setDeviceIdentifier(deviceId); + EnrolmentInfo enrolmentInfo = new EnrolmentInfo(); + enrolmentInfo.setDateOfEnrolment(new Date().getTime()); + enrolmentInfo.setDateOfLastUpdate(new Date().getTime()); + enrolmentInfo.setStatus(EnrolmentInfo.Status.ACTIVE); + enrolmentInfo.setOwnership(EnrolmentInfo.OwnerShip.BYOD); + device.setName(name); + device.setType(ConnectedCupConstants.DEVICE_TYPE); + enrolmentInfo.setOwner(owner); + device.setEnrolmentInfo(enrolmentInfo); + + KeyGenerationUtil.createApplicationKeys(ConnectedCupConstants.DEVICE_TYPE); + + TokenClient accessTokenClient = new TokenClient(ConnectedCupConstants.DEVICE_TYPE); + AccessTokenInfo accessTokenInfo = accessTokenClient.getAccessToken(owner, deviceId); + + //create token + String accessToken = accessTokenInfo.getAccess_token(); + String refreshToken = accessTokenInfo.getRefresh_token(); + List properties = new ArrayList<>(); + + Device.Property accessTokenProperty = new Device.Property(); + accessTokenProperty.setName("accessToken"); + accessTokenProperty.setValue(accessToken); + + Device.Property refreshTokenProperty = new Device.Property(); + refreshTokenProperty.setName("refreshToken"); + refreshTokenProperty.setValue(refreshToken); + + properties.add(accessTokenProperty); + properties.add(refreshTokenProperty); + device.setProperties(properties); + + boolean added = deviceManagement.getDeviceManagementService().enrollDevice(device); + if (added) { + response.setStatus(Response.Status.OK.getStatusCode()); + } else { + response.setStatus(Response.Status.NOT_ACCEPTABLE.getStatusCode()); + } + + return added; + } catch (DeviceManagementException e) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + return false; + } catch (AccessTokenException e) { + e.printStackTrace(); + } finally { + deviceManagement.endTenantFlow(); + } + return true; + + } + + @Path("/device/remove/{device_id}") + @DELETE + public void removeDevice(@PathParam("device_id") String deviceId, + @Context HttpServletResponse response) { + + DeviceManagement deviceManagement = new DeviceManagement(SUPER_TENANT); + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(deviceId); + deviceIdentifier.setType(ConnectedCupConstants.DEVICE_TYPE); + + try { + boolean removed = deviceManagement.getDeviceManagementService().disenrollDevice( + deviceIdentifier); + if (removed) { + response.setStatus(Response.Status.OK.getStatusCode()); + + } else { + response.setStatus(Response.Status.NOT_ACCEPTABLE.getStatusCode()); + + } + } catch (DeviceManagementException e) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + } finally { + deviceManagement.endTenantFlow(); + } + + + } + + @Path("/device/update/{device_id}") + @POST + public boolean updateDevice(@PathParam("device_id") String deviceId, + @QueryParam("name") String name, + @Context HttpServletResponse response) { + + DeviceManagement deviceManagement = new DeviceManagement(SUPER_TENANT); + + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(deviceId); + deviceIdentifier.setType(ConnectedCupConstants.DEVICE_TYPE); + + try { + Device device = deviceManagement.getDeviceManagementService().getDevice( + deviceIdentifier); + device.setDeviceIdentifier(deviceId); + + // device.setDeviceTypeId(deviceTypeId); + device.getEnrolmentInfo().setDateOfLastUpdate(new Date().getTime()); + + device.setName(name); + device.setType(ConnectedCupConstants.DEVICE_TYPE); + + boolean updated = deviceManagement.getDeviceManagementService().modifyEnrollment( + device); + + + if (updated) { + response.setStatus(Response.Status.OK.getStatusCode()); + + } else { + response.setStatus(Response.Status.NOT_ACCEPTABLE.getStatusCode()); + + } + return updated; + } catch (DeviceManagementException e) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + return false; + } finally { + deviceManagement.endTenantFlow(); + } + + } + + @Path("/device/{device_id}") + @GET + @Consumes("application/json") + @Produces("application/json") + public Device getDevice(@PathParam("device_id") String deviceId) { + + DeviceManagement deviceManagement = new DeviceManagement(SUPER_TENANT); + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId(deviceId); + deviceIdentifier.setType(ConnectedCupConstants.DEVICE_TYPE); + + try { + Device device = deviceManagement.getDeviceManagementService().getDevice( + deviceIdentifier); + + return device; + } catch (DeviceManagementException e) { + response.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); + return null; + } finally { + deviceManagement.endTenantFlow(); + } + + } + + private static String shortUUID() { + UUID uuid = UUID.randomUUID(); + long l = ByteBuffer.wrap(uuid.toString().getBytes(StandardCharsets.UTF_8)).getLong(); + return Long.toString(l, Character.MAX_RADIX); + } + +} \ No newline at end of file diff --git a/modules/samples/connectedcup/component/manager/src/main/webapp/META-INF/webapp-classloading.xml b/modules/samples/connectedcup/component/manager/src/main/webapp/META-INF/webapp-classloading.xml new file mode 100644 index 00000000..ac70a8ca --- /dev/null +++ b/modules/samples/connectedcup/component/manager/src/main/webapp/META-INF/webapp-classloading.xml @@ -0,0 +1,34 @@ + + + + + + + + false + + + CXF,Carbon + diff --git a/modules/samples/connectedcup/component/manager/src/main/webapp/WEB-INF/cxf-servlet.xml b/modules/samples/connectedcup/component/manager/src/main/webapp/WEB-INF/cxf-servlet.xml new file mode 100644 index 00000000..afbc4afc --- /dev/null +++ b/modules/samples/connectedcup/component/manager/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/samples/connectedcup/component/manager/src/main/webapp/WEB-INF/web.xml b/modules/samples/connectedcup/component/manager/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..f197abfa --- /dev/null +++ b/modules/samples/connectedcup/component/manager/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,69 @@ + + + + ConnectedCup-Webapp + + JAX-WS/JAX-RS Endpoint + JAX-WS/JAX-RS Servlet + CXFServlet + + org.apache.cxf.transport.servlet.CXFServlet + + 1 + + + CXFServlet + /* + + + + isAdminService + false + + + doAuthentication + false + + + + + managed-api-enabled + false + + + managed-api-owner + admin + + + managed-api-context-template + /connectedcup/{version} + + + managed-api-application + connectedcup + + + managed-api-isSecured + true + + + diff --git a/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/constants/ConnectedCupConstants.java b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/constants/ConnectedCupConstants.java new file mode 100644 index 00000000..988ed238 --- /dev/null +++ b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/constants/ConnectedCupConstants.java @@ -0,0 +1,20 @@ +package org.coffeeking.connectedcup.plugin.constants; + +/** + * Created by menaka on 1/11/16. + */ +public class ConnectedCupConstants { + public final static String DEVICE_TYPE = "connectedcup"; + public final static String DEVICE_PLUGIN_DEVICE_NAME = "DEVICE_NAME"; + public final static String DEVICE_PLUGIN_DEVICE_ID = "CONNECTED_CUP_DEVICE_ID"; + public final static String ORDER_ON = "YES"; + public final static String ORDER_OFF = "NO"; + + public static final String URL_PREFIX = "http://"; + public static final String LEVEL_CONTEXT = "/LEVEL/"; + public static final String TEMPERATURE_CONTEXT = "/TEMPERATURE/"; + + public static final String SENSOR_TEMPERATURE = "temperature"; + public static final String SENSOR_LEVEL = "level"; + +} diff --git a/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/ConnectedCupManager.java b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/ConnectedCupManager.java index 221ebf3a..4168ba66 100644 --- a/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/ConnectedCupManager.java +++ b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/ConnectedCupManager.java @@ -21,6 +21,7 @@ package org.coffeeking.connectedcup.plugin.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.coffeeking.connectedcup.plugin.impl.dao.ConnectedCupDAO; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; @@ -30,6 +31,12 @@ import org.wso2.carbon.device.mgt.common.FeatureManager; 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.LicenseManagementException; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.IotDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.IotDeviceManagementDAOFactory; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dto.IotDevice; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.util.IotDeviceManagementUtil; + +import java.util.ArrayList; import java.util.List; @@ -40,6 +47,7 @@ public class ConnectedCupManager implements DeviceManager { private static final Log log = LogFactory.getLog(ConnectedCupManager.class); + private static final IotDeviceManagementDAOFactory iotDeviceManagementDAOFactory = new ConnectedCupDAO(); @Override public FeatureManager getFeatureManager() { @@ -61,25 +69,101 @@ public class ConnectedCupManager implements DeviceManager { @Override public boolean enrollDevice(Device device) throws DeviceManagementException { - boolean status = false; + boolean status; + IotDevice iotDevice = IotDeviceManagementUtil.convertToIotDevice(device); + try { + if (log.isDebugEnabled()) { + log.debug("Enrolling a new Connected Cup device : " + device.getDeviceIdentifier()); + } + ConnectedCupDAO.beginTransaction(); + status = iotDeviceManagementDAOFactory.getIotDeviceDAO().addIotDevice( + iotDevice); + ConnectedCupDAO.commitTransaction(); + } catch (IotDeviceManagementDAOException e) { + try { + ConnectedCupDAO.rollbackTransaction(); + } catch (IotDeviceManagementDAOException iotDAOEx) { + String msg = "Error occurred while roll back the device enrol transaction :" + device.toString(); + log.warn(msg, iotDAOEx); + } + String msg = "Error while enrolling the Connected Cup device : " + device.getDeviceIdentifier(); + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } return status; } @Override public boolean modifyEnrollment(Device device) throws DeviceManagementException { - boolean status = false; + boolean status; + IotDevice iotDevice = IotDeviceManagementUtil.convertToIotDevice(device); + try { + if (log.isDebugEnabled()) { + log.debug("Modifying the Connected Cup device enrollment data"); + } + ConnectedCupDAO.beginTransaction(); + status = iotDeviceManagementDAOFactory.getIotDeviceDAO() + .updateIotDevice(iotDevice); + ConnectedCupDAO.commitTransaction(); + } catch (IotDeviceManagementDAOException e) { + try { + ConnectedCupDAO.rollbackTransaction(); + } catch (IotDeviceManagementDAOException iotDAOEx) { + String msg = "Error occurred while roll back the update device transaction :" + device.toString(); + log.warn(msg, iotDAOEx); + } + String msg = "Error while updating the enrollment of the Connected Cup device : " + + device.getDeviceIdentifier(); + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } return status; } @Override public boolean disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException { - boolean status = false; + boolean status; + try { + if (log.isDebugEnabled()) { + log.debug("Dis-enrolling Connected Cup device : " + deviceId); + } + ConnectedCupDAO.beginTransaction(); + status = iotDeviceManagementDAOFactory.getIotDeviceDAO() + .deleteIotDevice(deviceId.getId()); + ConnectedCupDAO.commitTransaction(); + } catch (IotDeviceManagementDAOException e) { + try { + ConnectedCupDAO.rollbackTransaction(); + } catch (IotDeviceManagementDAOException iotDAOEx) { + String msg = "Error occurred while roll back the device dis enrol transaction :" + deviceId.toString(); + log.warn(msg, iotDAOEx); + } + String msg = "Error while removing the Connected Cup device : " + deviceId.getId(); + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } return status; } @Override public boolean isEnrolled(DeviceIdentifier deviceId) throws DeviceManagementException { boolean isEnrolled = false; + try { + if (log.isDebugEnabled()) { + log.debug("Checking the enrollment of Connected Cup device : " + deviceId.getId()); + } + IotDevice iotDevice = + iotDeviceManagementDAOFactory.getIotDeviceDAO().getIotDevice( + deviceId.getId()); + if (iotDevice != null) { + isEnrolled = true; + } + } catch (IotDeviceManagementDAOException e) { + String msg = "Error while checking the enrollment status of Connected Cup device : " + + deviceId.getId(); + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } return isEnrolled; } @@ -96,7 +180,19 @@ public class ConnectedCupManager implements DeviceManager { @Override public Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException { - Device device = null; + Device device; + try { + if (log.isDebugEnabled()) { + log.debug("Getting the details of Connected Cup device : " + deviceId.getId()); + } + IotDevice iotDevice = iotDeviceManagementDAOFactory.getIotDeviceDAO(). + getIotDevice(deviceId.getId()); + device = IotDeviceManagementUtil.convertToDevice(iotDevice); + } catch (IotDeviceManagementDAOException e) { + String msg = "Error while fetching the Connected Cup device : " + deviceId.getId(); + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } return device; } @@ -133,13 +229,52 @@ public class ConnectedCupManager implements DeviceManager { @Override public boolean updateDeviceInfo(DeviceIdentifier deviceIdentifier, Device device) throws DeviceManagementException { - boolean status = false; + boolean status; + IotDevice iotDevice = IotDeviceManagementUtil.convertToIotDevice(device); + try { + if (log.isDebugEnabled()) { + log.debug( + "updating the details of Connected Cup device : " + deviceIdentifier); + } + ConnectedCupDAO.beginTransaction(); + status = iotDeviceManagementDAOFactory.getIotDeviceDAO() + .updateIotDevice(iotDevice); + ConnectedCupDAO.commitTransaction(); + } catch (IotDeviceManagementDAOException e) { + try { + ConnectedCupDAO.rollbackTransaction(); + } catch (IotDeviceManagementDAOException iotDAOEx) { + String msg = "Error occurred while roll back the update device info transaction :" + device.toString(); + log.warn(msg, iotDAOEx); + } + String msg = + "Error while updating the Connected Cup device : " + deviceIdentifier; + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } return status; } @Override public List getAllDevices() throws DeviceManagementException { List devices = null; + try { + if (log.isDebugEnabled()) { + log.debug("Fetching the details of all Connected Cup devices"); + } + List iotDevices = + iotDeviceManagementDAOFactory.getIotDeviceDAO().getAllIotDevices(); + if (iotDevices != null) { + devices = new ArrayList(); + for (IotDevice iotDevice : iotDevices) { + devices.add(IotDeviceManagementUtil.convertToDevice(iotDevice)); + } + } + } catch (IotDeviceManagementDAOException e) { + String msg = "Error while fetching all Connected Cup devices."; + log.error(msg, e); + throw new DeviceManagementException(msg, e); + } return devices; } diff --git a/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/ConnectedCupDAO.java b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/ConnectedCupDAO.java new file mode 100644 index 00000000..a4d782dc --- /dev/null +++ b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/ConnectedCupDAO.java @@ -0,0 +1,122 @@ +/* + * 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.coffeeking.connectedcup.plugin.impl.dao; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.coffeeking.connectedcup.plugin.constants.ConnectedCupConstants; +import org.coffeeking.connectedcup.plugin.impl.dao.impl.ConnectedCupDAOImpl; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.IotDeviceDAO; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.IotDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.IotDeviceManagementDAOFactory; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.IotDeviceManagementDAOFactoryInterface; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; + +public class ConnectedCupDAO extends IotDeviceManagementDAOFactory + implements IotDeviceManagementDAOFactoryInterface { + + private static final Log log = LogFactory.getLog(ConnectedCupDAO.class); + static DataSource dataSource; + private static ThreadLocal currentConnection = new ThreadLocal(); + + public ConnectedCupDAO() { + initFireAlarmDAO(); + } + + public static void initFireAlarmDAO() { + dataSource = getDataSourceMap().get(ConnectedCupConstants.DEVICE_TYPE); + } + + @Override public IotDeviceDAO getIotDeviceDAO() { + return new ConnectedCupDAOImpl(); + } + + public static void beginTransaction() throws IotDeviceManagementDAOException { + try { + Connection conn = dataSource.getConnection(); + conn.setAutoCommit(false); + currentConnection.set(conn); + } catch (SQLException e) { + throw new IotDeviceManagementDAOException("Error occurred while retrieving datasource connection", e); + } + } + + public static Connection getConnection() throws IotDeviceManagementDAOException { + if (currentConnection.get() == null) { + try { + currentConnection.set(dataSource.getConnection()); + } catch (SQLException e) { + throw new IotDeviceManagementDAOException("Error occurred while retrieving data source connection", e); + } + } + return currentConnection.get(); + } + + public static void commitTransaction() throws IotDeviceManagementDAOException { + try { + Connection conn = currentConnection.get(); + if (conn != null) { + conn.commit(); + } else { + if (log.isDebugEnabled()) { + log.debug("Datasource connection associated with the current thread is null, hence commit " + + "has not been attempted"); + } + } + } catch (SQLException e) { + throw new IotDeviceManagementDAOException("Error occurred while committing the transaction", e); + } finally { + closeConnection(); + } + } + + public static void closeConnection() throws IotDeviceManagementDAOException { + + Connection con = currentConnection.get(); + if (con != null) { + try { + con.close(); + } catch (SQLException e) { + log.error("Error occurred while close the connection"); + } + } + currentConnection.remove(); + } + + public static void rollbackTransaction() throws IotDeviceManagementDAOException { + try { + Connection conn = currentConnection.get(); + if (conn != null) { + conn.rollback(); + } else { + if (log.isDebugEnabled()) { + log.debug("Datasource connection associated with the current thread is null, hence rollback " + + "has not been attempted"); + } + } + } catch (SQLException e) { + throw new IotDeviceManagementDAOException("Error occurred while rollback the transaction", e); + } finally { + closeConnection(); + } + } +} \ No newline at end of file diff --git a/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/impl/ConnectedCupDAOImpl.java b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/impl/ConnectedCupDAOImpl.java new file mode 100644 index 00000000..2de02ac3 --- /dev/null +++ b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/impl/ConnectedCupDAOImpl.java @@ -0,0 +1,237 @@ +/* + * 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.coffeeking.connectedcup.plugin.impl.dao.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.coffeeking.connectedcup.plugin.constants.ConnectedCupConstants; +import org.coffeeking.connectedcup.plugin.impl.dao.ConnectedCupDAO; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.IotDeviceDAO; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.IotDeviceManagementDAOException; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dao.util.IotDeviceManagementDAOUtil; +import org.wso2.carbon.device.mgt.iot.util.iotdevice.dto.IotDevice; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Implements IotDeviceDAO for virtual firealarm Devices. + */ +public class ConnectedCupDAOImpl implements IotDeviceDAO { + + + private static final Log log = LogFactory.getLog(ConnectedCupDAOImpl.class); + + @Override + public IotDevice getIotDevice(String iotDeviceId) + throws IotDeviceManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + IotDevice iotDevice = null; + ResultSet resultSet = null; + try { + conn = ConnectedCupDAO.getConnection(); + String selectDBQuery = + "SELECT CONNECTED_CUP_DEVICE_ID, DEVICE_NAME" + + " FROM CONNECTED_CUP_DEVICE WHERE CONNECTED_CUP_DEVICE_ID = ?"; + stmt = conn.prepareStatement(selectDBQuery); + stmt.setString(1, iotDeviceId); + resultSet = stmt.executeQuery(); + + if (resultSet.next()) { + iotDevice = new IotDevice(); + iotDevice.setIotDeviceName(resultSet.getString( + ConnectedCupConstants.DEVICE_PLUGIN_DEVICE_NAME)); + Map propertyMap = new HashMap(); + + + + iotDevice.setDeviceProperties(propertyMap); + + if (log.isDebugEnabled()) { + log.debug("Connected Cup service " + iotDeviceId + " data has been fetched from " + + "Connected Cup database."); + } + } + } catch (SQLException e) { + String msg = "Error occurred while fetching Connected Cup device : '" + iotDeviceId + "'"; + log.error(msg, e); + throw new IotDeviceManagementDAOException(msg, e); + } finally { + IotDeviceManagementDAOUtil.cleanupResources(stmt, resultSet); + ConnectedCupDAO.closeConnection(); + } + + return iotDevice; + } + + @Override + public boolean addIotDevice(IotDevice iotDevice) + throws IotDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = ConnectedCupDAO.getConnection(); + String createDBQuery = + "INSERT INTO CONNECTED_CUP_DEVICE(CONNECTED_CUP_DEVICE_ID, DEVICE_NAME, ACCESS_TOKEN, REFRESH_TOKEN) VALUES (?, ?, ?, ?)"; + + stmt = conn.prepareStatement(createDBQuery); + stmt.setString(1, iotDevice.getIotDeviceId()); + stmt.setString(2, iotDevice.getIotDeviceName()); + stmt.setString(3, iotDevice.getDeviceProperties().get("accessToken")); + stmt.setString(4, iotDevice.getDeviceProperties().get("refreshToken")); + + + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + if (log.isDebugEnabled()) { + log.debug("Connected Cup device " + iotDevice.getIotDeviceId() + " data has been" + + " added to the Connected Cup database."); + } + } + } catch (SQLException e) { + String msg = "Error occurred while adding the Connected Cup device '" + + iotDevice.getIotDeviceId() + "' to the Connected Cup db."; + log.error(msg, e); + throw new IotDeviceManagementDAOException(msg, e); + } finally { + IotDeviceManagementDAOUtil.cleanupResources(stmt, null); + } + return status; + } + + @Override + public boolean updateIotDevice(IotDevice iotDevice) + throws IotDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = ConnectedCupDAO.getConnection(); + String updateDBQuery = + "UPDATE CONNECTED_CUP_DEVICE SET DEVICE_NAME = ? WHERE CONNECTED_CUP_DEVICE_ID = ?"; + + stmt = conn.prepareStatement(updateDBQuery); + + if (iotDevice.getDeviceProperties() == null) { + iotDevice.setDeviceProperties(new HashMap()); + } + stmt.setString(1, iotDevice.getIotDeviceName()); + + stmt.setString(2, iotDevice.getIotDeviceId()); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + if (log.isDebugEnabled()) { + log.debug("Connected Cup device " + iotDevice.getIotDeviceId() + " data has been" + + " modified."); + } + } + } catch (SQLException e) { + String msg = "Error occurred while modifying the Connected Cup device '" + + iotDevice.getIotDeviceId() + "' data."; + log.error(msg, e); + throw new IotDeviceManagementDAOException(msg, e); + } finally { + IotDeviceManagementDAOUtil.cleanupResources(stmt, null); + } + return status; + } + + @Override + public boolean deleteIotDevice(String iotDeviceId) + throws IotDeviceManagementDAOException { + boolean status = false; + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = ConnectedCupDAO.getConnection(); + String deleteDBQuery = + "DELETE FROM CONNECTED_CUP_DEVICE WHERE CONNECTED_CUP_DEVICE_ID = ?"; + stmt = conn.prepareStatement(deleteDBQuery); + stmt.setString(1, iotDeviceId); + int rows = stmt.executeUpdate(); + if (rows > 0) { + status = true; + if (log.isDebugEnabled()) { + log.debug("Connected Cup device " + iotDeviceId + " data has deleted" + + " from the Connected Cup database."); + } + } + } catch (SQLException e) { + String msg = "Error occurred while deleting Connected Cup device " + iotDeviceId; + log.error(msg, e); + throw new IotDeviceManagementDAOException(msg, e); + } finally { + IotDeviceManagementDAOUtil.cleanupResources(stmt, null); + } + return status; + } + + @Override + public List getAllIotDevices() + throws IotDeviceManagementDAOException { + + Connection conn = null; + PreparedStatement stmt = null; + ResultSet resultSet = null; + IotDevice iotDevice; + List iotDevices = new ArrayList<>(); + + try { + conn = ConnectedCupDAO.getConnection(); + String selectDBQuery = + "SELECT CONNECTED_CUP_DEVICE_ID, DEVICE_NAME " + + "FROM CONNECTED_CUP_DEVICE"; + stmt = conn.prepareStatement(selectDBQuery); + resultSet = stmt.executeQuery(); + while (resultSet.next()) { + iotDevice = new IotDevice(); + iotDevice.setIotDeviceId(resultSet.getString(ConnectedCupConstants.DEVICE_PLUGIN_DEVICE_ID)); + iotDevice.setIotDeviceName(resultSet.getString(ConnectedCupConstants.DEVICE_PLUGIN_DEVICE_NAME)); + + Map propertyMap = new HashMap<>(); + + iotDevice.setDeviceProperties(propertyMap); + iotDevices.add(iotDevice); + } + if (log.isDebugEnabled()) { + log.debug("All Connected Cup device details have fetched from Connected Cup database."); + } + return iotDevices; + } catch (SQLException e) { + String msg = "Error occurred while fetching all Connected Cup device data'"; + log.error(msg, e); + throw new IotDeviceManagementDAOException(msg, e); + } finally { + IotDeviceManagementDAOUtil.cleanupResources(stmt, resultSet); + ConnectedCupDAO.closeConnection(); + } + + } + + } \ No newline at end of file diff --git a/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/util/ConnectedCupUtils.java b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/util/ConnectedCupUtils.java new file mode 100644 index 00000000..a2e298cb --- /dev/null +++ b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/impl/dao/util/ConnectedCupUtils.java @@ -0,0 +1,45 @@ +/* + * 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.coffeeking.connectedcup.plugin.impl.dao.util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Map; + +/** + * Contains utility methods used by FireAlarm plugin. + */ +public class ConnectedCupUtils { + + private static Log log = LogFactory.getLog(ConnectedCupUtils.class); + + public static String getDeviceProperty(Map deviceProperties, String property) { + + String deviceProperty = deviceProperties.get(property); + + if (deviceProperty == null) { + return ""; + } + + return deviceProperty; + } + + +} diff --git a/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/internal/ConnectedCupServiceComponent.java b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/internal/ConnectedCupServiceComponent.java index 4a5b8823..f14f3300 100644 --- a/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/internal/ConnectedCupServiceComponent.java +++ b/modules/samples/connectedcup/component/plugin/src/main/java/org/coffeeking/connectedcup/plugin/internal/ConnectedCupServiceComponent.java @@ -20,12 +20,13 @@ package org.coffeeking.connectedcup.plugin.internal; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.coffeeking.connectedcup.plugin.impl.ConnectedCupManagerService; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import org.osgi.service.component.ComponentContext; import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService; import org.wso2.carbon.device.mgt.iot.service.DeviceTypeService; -import org.coffeeking.connectedcup.plugin.impl.ConnectedCupManagerService; + /** * @scr.component name="org.coffeeking.connectedcup.plugin.internal * .ConnectedCupServiceComponent" diff --git a/modules/samples/connectedcup/component/pom.xml b/modules/samples/connectedcup/component/pom.xml index 83531d4f..cf219c8b 100644 --- a/modules/samples/connectedcup/component/pom.xml +++ b/modules/samples/connectedcup/component/pom.xml @@ -38,7 +38,8 @@ plugin - service + controller + manager agent @@ -64,6 +65,24 @@ + + + org.wso2.carbon.devicemgt-plugins + org.coffeeking.connectedcup.plugin + 1.9.2-SNAPSHOT + provided + + + + org.wso2.carbon.devicemgt + org.wso2.carbon.apimgt.webapp.publisher + ${carbon.device.mgt.version} + system + + ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.apimgt.webapp.publisher_0.9.2.SNAPSHOT.jar + + + org.wso2.carbon org.wso2.carbon.ndatasource.core diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventreceiver_coffeelevel_1.0.0/EventReceiver_coffeelevel.xml b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventreceiver_coffeelevel_1.0.0/EventReceiver_coffeelevel.xml new file mode 100644 index 00000000..8e4a875a --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventreceiver_coffeelevel_1.0.0/EventReceiver_coffeelevel.xml @@ -0,0 +1,9 @@ + + + + false + + + + diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventreceiver_coffeelevel_1.0.0/artifact.xml b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventreceiver_coffeelevel_1.0.0/artifact.xml new file mode 100644 index 00000000..3ba63806 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventreceiver_coffeelevel_1.0.0/artifact.xml @@ -0,0 +1,4 @@ + + + Eventreceiver_coffeelevel.xml + diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstore_coffeelevel_1.0.0/artifact.xml b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstore_coffeelevel_1.0.0/artifact.xml new file mode 100644 index 00000000..7d5beecd --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstore_coffeelevel_1.0.0/artifact.xml @@ -0,0 +1,4 @@ + + + org_wso2_iot_devices_coffeelevel.xml + diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstore_coffeelevel_1.0.0/org_wso2_iot_devices_coffeelevel.xml b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstore_coffeelevel_1.0.0/org_wso2_iot_devices_coffeelevel.xml new file mode 100644 index 00000000..580b17a3 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstore_coffeelevel_1.0.0/org_wso2_iot_devices_coffeelevel.xml @@ -0,0 +1,44 @@ + + + + org.wso2.iot.devices.coffeelevel:1.0.0 + + EVENT_STORE + + + meta_owner + true + true + false + STRING + + + meta_deviceType + true + true + false + STRING + + + meta_deviceId + true + true + false + STRING + + + meta_time + true + true + false + LONG + + + coffeelevel + false + false + false + FLOAT + + + \ No newline at end of file diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstream_coffeelevel_1.0.0/artifact.xml b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstream_coffeelevel_1.0.0/artifact.xml new file mode 100644 index 00000000..6cd0244f --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstream_coffeelevel_1.0.0/artifact.xml @@ -0,0 +1,5 @@ + + + org.wso2.iot.devices.coffeelevel_1.0.0.json + + diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstream_coffeelevel_1.0.0/org.wso2.iot.devices.coffeelevel_1.0.0.json b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstream_coffeelevel_1.0.0/org.wso2.iot.devices.coffeelevel_1.0.0.json new file mode 100644 index 00000000..f9058d22 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Eventstream_coffeelevel_1.0.0/org.wso2.iot.devices.coffeelevel_1.0.0.json @@ -0,0 +1,20 @@ +{ + "name": "org.wso2.iot.devices.coffeelevel", + "version": "1.0.0", + "nickName": "Coffee Level Data", + "description": "Coffee Level data received from the Device", + "metaData": [ + {"name":"owner","type":"STRING"}, + {"name":"deviceType","type":"STRING"}, + {"name":"deviceId","type":"STRING"}, + {"name":"time","type":"LONG"} + ], + "payloadData": [ + { + "name": "coffeelevel","type": "FLOAT" + } + ] +} + + + diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Sparkscripts_1.0.0/CoffeeLevel_Sensor_Script.xml b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Sparkscripts_1.0.0/CoffeeLevel_Sensor_Script.xml new file mode 100644 index 00000000..cb22dc0a --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Sparkscripts_1.0.0/CoffeeLevel_Sensor_Script.xml @@ -0,0 +1,20 @@ + + + IoTServer_Sensor_Script + + 0 * * * * ? + diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Sparkscripts_1.0.0/artifact.xml b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Sparkscripts_1.0.0/artifact.xml new file mode 100644 index 00000000..2ed05598 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/Sparkscripts_1.0.0/artifact.xml @@ -0,0 +1,4 @@ + + + CoffeeLevel_Sensor_Script.xml + diff --git a/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/artifacts.xml b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/artifacts.xml new file mode 100644 index 00000000..08a03ac0 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/CoffeeLevel_Sensor/artifacts.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventreceiver_temperature_1.0.0/EventReceiver_temperature.xml b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventreceiver_temperature_1.0.0/EventReceiver_temperature.xml new file mode 100644 index 00000000..6786696c --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventreceiver_temperature_1.0.0/EventReceiver_temperature.xml @@ -0,0 +1,8 @@ + + + + false + + + + diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventreceiver_temperature_1.0.0/artifact.xml b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventreceiver_temperature_1.0.0/artifact.xml new file mode 100644 index 00000000..b72e1ff7 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventreceiver_temperature_1.0.0/artifact.xml @@ -0,0 +1,4 @@ + + + EventReceiver_temperature.xml + diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstore_temperature_1.0.0/artifact.xml b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstore_temperature_1.0.0/artifact.xml new file mode 100644 index 00000000..90b14c11 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstore_temperature_1.0.0/artifact.xml @@ -0,0 +1,4 @@ + + + org_wso2_iot_devices_temperature.xml + diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstore_temperature_1.0.0/org_wso2_iot_devices_temperature.xml b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstore_temperature_1.0.0/org_wso2_iot_devices_temperature.xml new file mode 100644 index 00000000..13a625bd --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstore_temperature_1.0.0/org_wso2_iot_devices_temperature.xml @@ -0,0 +1,44 @@ + + + + org.wso2.iot.devices.temperature:1.0.0 + + EVENT_STORE + + + meta_owner + true + true + false + STRING + + + meta_deviceType + true + true + false + STRING + + + meta_deviceId + true + true + false + STRING + + + meta_time + true + true + false + LONG + + + temperature + false + false + false + FLOAT + + + \ No newline at end of file diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstream_temperature_1.0.0/artifact.xml b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstream_temperature_1.0.0/artifact.xml new file mode 100644 index 00000000..61e7903b --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstream_temperature_1.0.0/artifact.xml @@ -0,0 +1,5 @@ + + + org.wso2.iot.devices.temperature_1.0.0.json + + diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstream_temperature_1.0.0/org.wso2.iot.devices.temperature_1.0.0.json b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstream_temperature_1.0.0/org.wso2.iot.devices.temperature_1.0.0.json new file mode 100644 index 00000000..5d94b982 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Eventstream_temperature_1.0.0/org.wso2.iot.devices.temperature_1.0.0.json @@ -0,0 +1,20 @@ +{ + "name": "org.wso2.iot.devices.temperature", + "version": "1.0.0", + "nickName": "Temperature Data", + "description": "Temperature data received from the Device", + "metaData": [ + {"name":"owner","type":"STRING"}, + {"name":"deviceType","type":"STRING"}, + {"name":"deviceId","type":"STRING"}, + {"name":"time","type":"LONG"} + ], + "payloadData": [ + { + "name": "temperature","type": "FLOAT" + } + ] +} + + + diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Sparkscripts_1.0.0/Temperature_Sensor_Script.xml b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Sparkscripts_1.0.0/Temperature_Sensor_Script.xml new file mode 100644 index 00000000..ee6a7195 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Sparkscripts_1.0.0/Temperature_Sensor_Script.xml @@ -0,0 +1,13 @@ + + + IoTServer_Sensor_Script + + 0 * * * * ? + diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Sparkscripts_1.0.0/artifact.xml b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Sparkscripts_1.0.0/artifact.xml new file mode 100644 index 00000000..58c2dcc1 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/Sparkscripts_1.0.0/artifact.xml @@ -0,0 +1,4 @@ + + + Temperature_Sensor_Script.xml + diff --git a/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/artifacts.xml b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/artifacts.xml new file mode 100644 index 00000000..b5350763 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/Temperature_Sensor/artifacts.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/modules/samples/connectedcup/feature/analytics/build.xml b/modules/samples/connectedcup/feature/analytics/build.xml new file mode 100644 index 00000000..df25af53 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/build.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/samples/connectedcup/feature/analytics/pom.xml b/modules/samples/connectedcup/feature/analytics/pom.xml new file mode 100644 index 00000000..b60fafe2 --- /dev/null +++ b/modules/samples/connectedcup/feature/analytics/pom.xml @@ -0,0 +1,72 @@ + + + + + + org.wso2.carbon.devicemgt-plugins + connected-cup-feature-parent + 1.9.2-SNAPSHOT + ../pom.xml + + + + 4.0.0 + org.coffeeking.connectedcup.analytics + pom + 1.9.2-SNAPSHOT + WSO2 IoTS(Device Types) - Connected Cup Analytics + WSO2 IoTS(Device Types) - Connected Cup Analytics + http://wso2.org + + + + + maven-clean-plugin + 2.4.1 + + + auto-clean + initialize + + clean + + + + + + maven-antrun-plugin + 1.7 + + + process-resources + + + + + + + run + + + + + + + + \ No newline at end of file diff --git a/modules/samples/connectedcup/feature/connectedcup-feature/pom.xml b/modules/samples/connectedcup/feature/connectedcup-feature/pom.xml new file mode 100644 index 00000000..5b10415f --- /dev/null +++ b/modules/samples/connectedcup/feature/connectedcup-feature/pom.xml @@ -0,0 +1,221 @@ + + + + + + org.wso2.carbon.devicemgt-plugins + connected-cup-feature-parent + 1.9.2-SNAPSHOT + ../pom.xml + + + 4.0.0 + org.coffeeking.connectedcup.feature + pom + 1.9.2-SNAPSHOT + WSO2 IoTS(Device Types) - Connected Cup Feature + WSO2 IoTS(Device Types) - Connected Cup Feature + http://wso2.org + + + + org.wso2.carbon.devicemgt-plugins + org.coffeeking.connectedcup.plugin + 1.9.2-SNAPSHOT + + + + org.wso2.carbon.devicemgt-plugins + org.coffeeking.manager.service + 1.9.2-SNAPSHOT + war + + + + org.wso2.carbon.devicemgt-plugins + org.coffeeking.controller.service + 1.9.2-SNAPSHOT + war + + + + com.h2database.wso2 + h2-database-engine + 1.2.140.wso2v3 + + + + + + + + maven-resources-plugin + + + copy-resources + generate-resources + + copy-resources + + + src/main/resources + + + resources + + build.properties + p2.inf + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-jaxrs-manager-war + package + + copy + + + + + org.wso2.carbon.devicemgt-plugins + org.coffeeking.manager.service + war + true + ${basedir}/src/main/resources/webapps/ + connectedcup_mgt.war + + + + + + + copy-jaxrs-controller-war + package + + copy + + + + + org.wso2.carbon.devicemgt-plugins + org.coffeeking.controller.service + war + true + ${basedir}/src/main/resources/webapps/ + connectedcup.war + + + + + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + create-connected-cup-plugin-mgt-schema + package + + run + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.wso2.maven + carbon-p2-plugin + + + p2-feature-generation + package + + p2-feature-gen + + + org.coffeeking.connectedcup + ../../../features/etc/feature.properties + + + org.wso2.carbon.p2.category.type:server + org.eclipse.equinox.p2.type.group:false + + + + + org.wso2.carbon.devicemgt-plugins:org.coffeeking.connectedcup.plugin:${carbon.iot.device.mgt.version} + + + + org.wso2.carbon.core.server:${carbon.kernel.version} + + org.wso2.carbon.device.mgt.server:${carbon.device.mgt.version} + + + + + + + + + + diff --git a/modules/samples/connectedcup/feature/src/main/resources/agent/deviceConfig.properties b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/agent/deviceConfig.properties similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/agent/deviceConfig.properties rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/agent/deviceConfig.properties diff --git a/modules/samples/connectedcup/feature/src/main/resources/agent/sketch.properties b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/agent/sketch.properties similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/agent/sketch.properties rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/agent/sketch.properties diff --git a/modules/samples/connectedcup/feature/src/main/resources/agent/start-device.sh b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/agent/start-device.sh similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/agent/start-device.sh rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/agent/start-device.sh diff --git a/modules/samples/connectedcup/feature/src/main/resources/build.properties b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/build.properties similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/build.properties rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/build.properties diff --git a/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/configs/connectedcup.json b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/configs/connectedcup.json new file mode 100644 index 00000000..b8fe6ff1 --- /dev/null +++ b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/configs/connectedcup.json @@ -0,0 +1,30 @@ +{ + "deviceType": { + "label": "Connected Cup", + "category": "virtual", + }, + "analyticStreams": [ + { + "name": "Temperature", + "table": "DEVICE_TEMPERATURE_SUMMARY", + "ui_unit": { + "name": "cdmf.unit.analytics.line-chart", + "data":[ + {"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}}, + {"column": {"name":"TEMPERATURE", "label":"Temperature", "ui-mapping":"y-axis"}} + ] + } + }, + { + "name": "Coffee Level", + "table": "DEVICE_COFFEELEVEL_SUMMARY", + "ui_unit": { + "name": "cdmf.unit.analytics.line-chart", + "data":[ + {"column": {"name":"TIME", "label":"time", "ui-mapping":"x-axis"}}, + {"column": {"name":"COFFEELEVEL", "label":"Coffeelevel", "ui-mapping":"y-axis"}} + ] + } + } + ] +} \ No newline at end of file diff --git a/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/configs/connectedcup.xml b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/configs/connectedcup.xml new file mode 100644 index 00000000..8d70e4d0 --- /dev/null +++ b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/configs/connectedcup.xml @@ -0,0 +1,25 @@ + + + + + + jdbc/ConnectedCupDM_DB + + + diff --git a/modules/samples/connectedcup/feature/src/main/resources/datasources/connectedcup-datasources.xml b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/datasources/connectedcup-datasources.xml similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/datasources/connectedcup-datasources.xml rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/datasources/connectedcup-datasources.xml diff --git a/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/dbscripts/h2.sql b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/dbscripts/h2.sql new file mode 100644 index 00000000..0d188547 --- /dev/null +++ b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/dbscripts/h2.sql @@ -0,0 +1,13 @@ + +-- ----------------------------------------------------- +-- Table `CONNECTED_CUP_DEVICE` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `CONNECTED_CUP_DEVICE` ( + `CONNECTED_CUP_DEVICE_ID` VARCHAR(45) NOT NULL , + `DEVICE_NAME` VARCHAR(100) NULL DEFAULT NULL, + `ACCESS_TOKEN` VARCHAR(50) NOT NULL, + `REFRESH_TOKEN` VARCHAR(50) NOT NULL, + PRIMARY KEY (`CONNECTED_CUP_DEVICE_ID`) ); + + + diff --git a/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/dbscripts/mysql.sql b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/dbscripts/mysql.sql new file mode 100644 index 00000000..ca39ff82 --- /dev/null +++ b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/dbscripts/mysql.sql @@ -0,0 +1,14 @@ +-- ----------------------------------------------------- +-- Table `CONNECTED_CUP_DEVICE` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `CONNECTED_CUP_DEVICE` ( + `CONNECTED_CUP_DEVICE_ID` VARCHAR(45) NOT NULL , + `DEVICE_NAME` VARCHAR(100) NULL DEFAULT NULL, + `ACCESS_TOKEN` VARCHAR(50) NOT NULL, + `REFRESH_TOKEN` VARCHAR(50) NOT NULL, + PRIMARY KEY (`CONNECTED_CUP_DEVICE_ID`) ) +ENGINE = InnoDB; + + + + diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.hbs b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.hbs similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.hbs rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.hbs diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.js b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.js similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.js rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.js diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.json b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.json similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.json rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.json diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/public/images/thumb.png b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/public/images/thumb.png similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/public/images/thumb.png rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/public/images/thumb.png diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/private/conf/device-type.json b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/private/conf/device-type.json similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/private/conf/device-type.json rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/private/conf/device-type.json diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/coffeecup.png b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/coffeecup.png similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/coffeecup.png rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/coffeecup.png diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/schematicsGuide.png b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/schematicsGuide.png similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/schematicsGuide.png rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/schematicsGuide.png diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/thumb.png b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/thumb.png similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/thumb.png rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/images/thumb.png diff --git a/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/download.js b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/download.js new file mode 100644 index 00000000..d5645280 --- /dev/null +++ b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/download.js @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +var modalPopup = ".wr-modalpopup"; +var modalPopupContainer = modalPopup + " .modalpopup-container"; +var modalPopupContent = modalPopup + " .modalpopup-content"; +var body = "body"; + +/* + * set popup maximum height function. + */ +function setPopupMaxHeight() { + $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); + $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); +} + +/* + * show popup function. + */ +function showPopup() { + $(modalPopup).show(); + setPopupMaxHeight(); + $('#downloadForm').validate({ + rules: { + deviceName: { + minlength: 4, + required: true + } + }, + highlight: function (element) { + $(element).closest('.control-group').removeClass('success').addClass('error'); + }, + success: function (element) { + $(element).closest('.control-group').removeClass('error').addClass('success'); + $('label[for=deviceName]').remove(); + } + }); + var deviceType = ""; + $('.deviceType').each(function () { + if (this.value != "") { + deviceType = this.value; + } + }); + if (deviceType == 'digitaldisplay') { + $('.sketchType').remove(); + $('input[name="sketchType"][value="digitaldisplay"]').prop('checked', true); + $("label[for='digitaldisplay']").text("Simple Agent"); + } else { + $('.sketchTypes').remove(); + } +} + +/* + * hide popup function. + */ +function hidePopup() { + $('label[for=deviceName]').remove(); + $('.control-group').removeClass('success').removeClass('error'); + $(modalPopupContent).html(''); + $(modalPopup).hide(); +} + +/* + * DOM ready functions. + */ +$(document).ready(function () { + attachEvents(); +}); + +function attachEvents() { + /** + * Following click function would execute + * when a user clicks on "Download" link + * on Device Management page in WSO2 DC Console. + */ + $("a.download-link").click(function () { + var sketchType = $(this).data("sketchtype"); + var deviceType = $(this).data("devicetype"); + var downloadDeviceAPI = "/devicemgt/api/devices/sketch/generate_link"; + var payload = {"sketchType": sketchType, "deviceType": deviceType}; + $(modalPopupContent).html($('#download-device-modal-content').html()); + showPopup(); + var deviceName; + $("a#download-device-download-link").click(function () { + $('.new-device-name').each(function () { + if (this.value != "") { + deviceName = this.value; + } + }); + $('label[for=deviceName]').remove(); + if (deviceName && deviceName.length >= 4) { + payload.deviceName = deviceName; + invokerUtil.post( + downloadDeviceAPI, + payload, + function (data, textStatus, jqxhr) { + doAction(data); + }, + function (data) { + doAction(data); + } + ); + } else if (deviceName) { + $('.controls').append(''); + $('.control-group').removeClass('success').addClass('error'); + } else { + $('.controls').append(''); + $('.control-group').removeClass('success').addClass('error'); + } + }); + + $("a#download-device-cancel-link").click(function () { + hidePopup(); + }); + + }); +} + +function downloadAgent() { + //$('#downloadForm').submit(); + + var $inputs = $('#downloadForm :input'); + + var values = {}; + $inputs.each(function () { + values[this.name] = $(this).val(); + }); + + var payload = {} + payload.name = $inputs[0].value; + payload.owner = $inputs[1].value; + + var coffeeCupRegisterEndpoint = "/connectedcup_mgt/connectedcup/cup/register" + + "?name=" + payload.name + "&owner=" + payload.owner; + + invokerUtil.post( + coffeeCupRegisterEndpoint, + payload, + function (data, textStatus, jqxhr) { + //doAction(data); + alert("Added a CoffeeCup"); + hidePopup(); + }, + function (data) { + //doAction(data); + alert("Added a CoffeeCup"); + hidePopup(); + } + ); + + var deviceName; + $('.new-device-name').each(function () { + if (this.value != "") { + deviceName = this.value; + } + }); + if (deviceName && deviceName.length >= 4) { + setTimeout(function () { + hidePopup(); + }, 1000); + } +} + +function doAction(data) { + //if it is saml redirection response + if (data.status == null) { + document.write(data); + } + + if (data.status == "200") { + $(modalPopupContent).html($('#download-device-modal-content-links').html()); + $("input#download-device-url").val(data.responseText); + $("input#download-device-url").focus(function () { + $(this).select(); + }); + showPopup(); + } else if (data.status == "401") { + $(modalPopupContent).html($('#device-401-content').html()); + $("#device-401-link").click(function () { + window.location = "/devicemgt/login"; + }); + showPopup(); + } else if (data == "403") { + $(modalPopupContent).html($('#device-403-content').html()); + $("#device-403-link").click(function () { + window.location = "/devicemgt/login"; + }); + showPopup(); + } else { + $(modalPopupContent).html($('#device-unexpected-error-content').html()); + $("a#device-unexpected-error-link").click(function () { + hidePopup(); + }); + } +} \ No newline at end of file diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/jquery.validate.js b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/jquery.validate.js similarity index 100% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/jquery.validate.js rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/jquery.validate.js diff --git a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs similarity index 60% rename from modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs rename to modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs index 81ed9ce5..06c89db3 100644 --- a/modules/samples/connectedcup/feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs +++ b/modules/samples/connectedcup/feature/connectedcup-feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs @@ -7,17 +7,17 @@
-

Ingredients

-
-

Hardware Requirements

-
-
    +

    Ingredients

    +
    +

    Hardware Requirements

    +
    +
      Coffee Cup
      -
    -
    +
+
View API   @@ -29,29 +29,21 @@

Name your device and download the agent from following link.


-
+ +
- +
- - +

+
@@ -161,65 +153,64 @@

-
-

Prepare


-

Get your device ready

-
-
    -

    01 Set up your RaspberryPi device as shown in the schematic below and get the Digital Display setup.

    -

    02 Connect a monitor to your RaspberryPi via the HDMI cable to get a UI view of the device.

    -

    03 Get the RaspberryPi to connect to the internet (via Ethernet or Wifi) and note its IP_ADDRESS

    -
-
-
+
+

Prepare

+
+

Get your device ready

+
+
    +

    01 Set up your RaspberryPi device as shown in the + schematic below and get the Digital Display setup. +

    -
    -

    Schematic Diagram


    -

    Click on the image to zoom

    -
    - - - -
    -
    -
    +

    02 Connect a monitor to your RaspberryPi via the HDMI + cable to get a UI view of the device.

    -
    -

    Connect (Quick Start)


    -

    Internet of Things Foundation Quickstart connection

    -
    -
      -

      01 Click on the 'Create DEB' button above to get the download link for the Digital Display setup files

      -

      02 (The following commands can be issued by directly typing into the terminal of the device or by an 'ssh' login from a remote PC)

      -

      03 Download the Digital Display setup files using the following command: 'curl -k < url_link_received_from_the_above_step >> Agent.zip'
      This will download a zip file named 'Agent.zip'

      -
    -
    -
    +

    03 Get the RaspberryPi to connect to the internet (via + Ethernet or Wifi) and note its IP_ADDRESS

    +
+
+
+
+

Schematic Diagram

+
+

Click on the image to zoom

+
+ + + +
+
-