hibernate.dialect=org.hibernate.dialect.PostgreSQL82Dialect
hibernate.show_sql=true
-hibernate.hbm2ddl.auto=create
+hibernate.hbm2ddl.auto=update
hibernate.hbm2ddl.import_files=sql/init.sql
hibernate.temp.use_jdbc_metadata_defaults=false
*/
package com.samsung.dsm.controller;
+import static com.samsung.dsm.policy.parser.PolicyParserFactory.Type.JSON;
+import static org.springframework.http.HttpStatus.BAD_REQUEST;
+import static org.springframework.http.HttpStatus.OK;
+import static org.springframework.web.bind.annotation.RequestMethod.POST;
+
+import java.security.Principal;
+import java.util.List;
+
+import javax.validation.Valid;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.samsung.commons.domain.Device;
import com.samsung.commons.domain.Report;
import com.samsung.commons.domain.ReportType;
import com.samsung.commons.domain.User;
import com.samsung.commons.model.MQPolicy;
-import com.samsung.commons.service.*;
+import com.samsung.commons.service.AgentService;
+import com.samsung.commons.service.DeviceService;
+import com.samsung.commons.service.PolicyService;
+import com.samsung.commons.service.ReportService;
+import com.samsung.commons.service.ReportTypeService;
+import com.samsung.commons.service.UserService;
import com.samsung.dsm.model.request.ApplyPolicy;
import com.samsung.dsm.model.view.DeviceOverview;
import com.samsung.dsm.model.view.ViewDevice;
import com.samsung.dsm.utils.alive.AliveApi;
import com.samsung.dsm.utils.alive.AliveApiSenderException;
import com.samsung.dsm.utils.mq.MQApi;
-import org.apache.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.validation.Valid;
-import java.security.Principal;
-import java.util.List;
-
-import static com.samsung.dsm.policy.parser.PolicyParserFactory.Type.JSON;
-import static org.springframework.http.HttpStatus.BAD_REQUEST;
-import static org.springframework.http.HttpStatus.OK;
-import static org.springframework.web.bind.annotation.RequestMethod.POST;
/**
* <h1>Dashboard Devices controller</h1>
@RequestMapping(value = "")
public String iotDevices(Principal principal, Model model) {
User currentUser = userService.getUserByEmail(principal.getName());
+ model.addAttribute("devices", ViewDevice.getViewDevicesList(deviceService.findByUser(currentUser)));
+
+ return "devices";
+ }
+
+ /**
+ * (Async) Get IoT devices status.
+ *
+ * @param principal the principal
+ * @return devices list with updated status
+ */
+ @ResponseBody
+ @RequestMapping(value = "/status", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE })
+ public ResponseEntity<String> getIotDevicesStatus(Principal principal) {
+ User currentUser = userService.getUserByEmail(principal.getName());
try {
boolean alive = aliveApi.alive(currentUser.getUsername());
LOG.debug(alive ?
message + "states updated" :
message + "Nothing changed");
-
} catch (AliveApiSenderException e) {
LOG.warn("Couldn't actualize devices states", e);
}
- model.addAttribute("devices", ViewDevice.getViewDevicesList(deviceService.findByUser(currentUser)));
-
- return "devices";
+ return new ResponseEntity<>(new Gson().toJson(ViewDevice.getViewDevicesList(deviceService.findByUser(currentUser))), HttpStatus.OK);
}
/**
/**
* Instantiates a new View device.
+ * With policies parsing and setting.
*
* @param device the device
* @param policyType the policy type
*/
-// With policies parsing and setting
public ViewDevice(Device device, PolicyParserFactory.Type policyType) {
reports = new ArrayList<>();
this.id = device.getId();
/**
* Instantiates a new View device.
+ * Without policies parsing and setting
*
* @param device the device
*/
-// Without policies parsing and setting
public ViewDevice(Device device) {
reports = new ArrayList<>();
this.id = device.getId();
+++ /dev/null
-106.125.46.74:1389
-cn=Directory Manager
-qazqwe123
\ No newline at end of file
valueNames: [ "name" ]
};
var smackList = new List("devices-tab", options);
+
+ Devices.updateStatus("<c:url value='/dashboard/devices/status'/>");
});
</script>
<div class="list">
<c:forEach items="${devices}" var="device">
<c:if test="${fn:length(device.parentUuid) == 0 }">
- <div class="row device ${device.type}" data-id="${device.id}" data-url="<c:url value='/dashboard/devices/overview'/>">
+ <div class="row device loading ${device.type}" data-id="${device.id}" data-url="<c:url value='/dashboard/devices/overview'/>">
<div class="col-sm-5 col-md-5 col-xs-5">
<div class="icon"></div>
<div class="info">
</div>
</div>
<div class="col-sm-4 col-md-4 col-xs-4">
- <div class="status ${device.status}"></div>
- <div class="status-name">${device.statusText}</div>
+ <div class="status"></div>
+ <div class="status-name"></div>
</div>
<div class="col-sm-3 col-md-3 col-xs-3 actions">
- <button class="btn btn-primary" data-id="${device.id}" data-url="<c:url value='/dashboard/devices/policies'/>">Policies</button>
- <button class="btn btn-primary" data-id="${device.id}" data-url="<c:url value='/dashboard/devices/reports'/>">Reports</button>
- <button class="btn btn-primary" data-id="${device.id}" data-url="<c:url value='/dashboard/devices/agents'/>">Agents</button>
+ <button class="btn btn-primary" disabled="disabled" data-id="${device.id}" data-url="<c:url value='/dashboard/devices/policies'/>">Policies</button>
+ <button class="btn btn-primary" disabled="disabled" data-id="${device.id}" data-url="<c:url value='/dashboard/devices/reports'/>">Reports</button>
+ <button class="btn btn-primary" disabled="disabled" data-id="${device.id}" data-url="<c:url value='/dashboard/devices/agents'/>">Agents</button>
</div>
</div>
<div class="simple-list simple-${device.uuid}">
<c:forEach items="${devices}" var="simpleDevice">
<c:if test="${fn:length(simpleDevice.parentUuid) > 0 && simpleDevice.parentUuid == device.uuid}">
- <div class="row device simple ${simpleDevice.type}" data-id="${simpleDevice.id}" data-url="<c:url value='/dashboard/devices/overview'/>">
+ <div class="row device simple loading ${simpleDevice.type}" data-id="${simpleDevice.id}" data-url="<c:url value='/dashboard/devices/overview'/>">
<div class="col-sm-5 col-md-5 col-xs-5">
<div class="tree"></div>
<div class="icon"></div>
</div>
</div>
<div class="col-sm-4 col-md-4 col-xs-4">
- <div class="status ${simpleDevice.status}"></div>
- <div class="status-name">${simpleDevice.statusText}</div>
+ <div class="status"></div>
+ <div class="status-name"></div>
</div>
<div class="col-sm-3 col-md-3 col-xs-3 actions">
- <button class="btn btn-primary" data-id="${simpleDevice.id}" data-url="<c:url value='/dashboard/devices/policies'/>">Policies</button>
- <button class="btn btn-primary" data-id="${simpleDevice.id}" data-url="<c:url value='/dashboard/devices/reports'/>">Reports</button>
- <button class="btn btn-primary" data-id="${simpleDevice.id}" data-url="<c:url value='/dashboard/devices/agents'/>">Agents</button>
+ <button class="btn btn-primary" disabled="disabled" data-id="${simpleDevice.id}" data-url="<c:url value='/dashboard/devices/policies'/>">Policies</button>
+ <button class="btn btn-primary" disabled="disabled" data-id="${simpleDevice.id}" data-url="<c:url value='/dashboard/devices/reports'/>">Reports</button>
+ <button class="btn btn-primary" disabled="disabled" data-id="${simpleDevice.id}" data-url="<c:url value='/dashboard/devices/agents'/>">Agents</button>
</div>
</div>
</c:if>
<script type="text/javascript" src="<c:url value="/resources/thirdparty/search/list.min.js" />"></script>
<script type="text/javascript" src="<c:url value="/resources/js/devices/policies.js" />"></script>
<script type="text/javascript" src="<c:url value="/resources/js/devices/agents.js" />"></script>
+ <script type="text/javascript" src="<c:url value="/resources/js/devices/devices.js" />"></script>
<script type="text/javascript" src="<c:url value="/resources/js/tools/tools.js" />"></script>
<script type="text/javascript" src="<c:url value="/resources/js/controls.js" />"></script>
</head>
>.logo {
float: left;
- width: 14%;
font-size: 16pt;
>div {
background-size: 2em;
height: 3em;
width: 3em;
+ background-image: url("../images/device/status/loader.gif");
&.on {
background-image: url("../images/device/status/on.png");
margin: 0.5em 0;
}
+ &.loading {
+ &:hover {
+ background-color: $hover-bg-color;
+ cursor: not-allowed;
+ }
+
+ .status {
+ margin-left: 1em;
+ }
+ }
+
&:hover {
background-color: $hover-bg-color;
cursor: pointer;
* Device container click handler.
*/
function deviceClick(e) {
- if ($(e.target).hasClass("btn")) {
+ if ($(e.target).hasClass("btn") ||
+ $(e.target).closest(".device").hasClass("loading")) {
return;
}
--- /dev/null
+/**
+ @file devices.js
+ @brief Script for Devices View.
+ @author Artem Motchanyi (a.motchanyi@samsung.com)
+ @date Created Nov 03, 2017
+ @par In Samsung Ukraine R&D Center (SRK) under a contract between
+ @par LLC "Samsung Electronics Ukraine Company" (Kyiv, Ukraine)
+ @par and "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
+ @par Copyright: (c) 2017 Samsung Electronics Co, Ltd. All rights reserved.
+**/
+function Devices() {}
+
+/**
+ * Agent list container selector.
+ */
+Devices.list = "#devices>.list";
+
+/**
+ * Asynchronously update devices status.
+ */
+Devices.updateStatus = function(url) {
+ $.get(url).done(
+ function(data) {
+ console.log(data);
+
+ data.forEach(function(item) {
+ console.log(item);
+ $(Devices.list).find(".device[data-id='" + item.id + "']").removeClass("loading").find(".actions .btn").removeAttr("disabled");
+ $(Devices.list).find(".device[data-id='" + item.id + "']").find(".status").addClass(item.status);
+ $(Devices.list).find(".device[data-id='" + item.id + "']").find(".status-name").text(item.statusText);
+ });
+ }
+ );
+};
*/
package com.samsung.dsm.controller;
-import com.samsung.commons.domain.Role;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
+
+import java.security.Principal;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
-import java.security.Principal;
-
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+import com.samsung.commons.domain.Role;
/**
* The type Dashboard controller test.
import static com.samsung.dsm.policy.parser.PolicyParserFactory.Type.JSON;
import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.ResultMatcher;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.transaction.annotation.Transactional;
}
/**
+ * IoT devices negative test. Devices don't exist.
+ *
+ * @throws Exception the exception
+ */
+ @Test
+ @SuppressWarnings("PMD.SignatureDeclareThrowsException")
+ public void dashboardDevicesStatus() throws Exception {
+ ResultActions result = mockMvc.perform(get("/dashboard/devices/status/").principal(principalMock)).andExpect(status().isOk());
+ String content = result.andReturn().getResponse().getContentAsString();
+ assertEquals("[]", content);
+ }
+
+ /**
* Dashboard devices overview.
*
* @throws Exception the exception