Merge pull request #365 from rasika/iots-ga

Merge iot-ga branch
revert-70aa11f8
Rasika Perera 8 years ago committed by GitHub
commit 3b68ccb4ba

@ -21,6 +21,7 @@ package org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import org.wso2.carbon.device.mgt.common.push.notification.NotificationContext; import org.wso2.carbon.device.mgt.common.push.notification.NotificationContext;
import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy; import org.wso2.carbon.device.mgt.common.push.notification.NotificationStrategy;
import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig; import org.wso2.carbon.device.mgt.common.push.notification.PushNotificationConfig;
@ -77,17 +78,22 @@ public class MQTTNotificationStrategy implements NotificationStrategy {
@Override @Override
public void execute(NotificationContext ctx) throws PushNotificationExecutionFailedException { public void execute(NotificationContext ctx) throws PushNotificationExecutionFailedException {
Map<String, String> dynamicProperties = new HashMap<>(); Map<String, String> dynamicProperties = new HashMap<>();
Properties properties = ctx.getOperation().getProperties(); Operation operation = ctx.getOperation();
Properties properties = operation.getProperties();
if (properties != null && properties.get(MQTT_ADAPTER_TOPIC) != null) { if (properties != null && properties.get(MQTT_ADAPTER_TOPIC) != null) {
dynamicProperties.put("topic", (String) properties.get(MQTT_ADAPTER_TOPIC)); dynamicProperties.put("topic", (String) properties.get(MQTT_ADAPTER_TOPIC));
} else { } else {
String topic = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(true) + "/" String topic = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(true) + "/"
+ ctx.getDeviceId().getType() + "/" + ctx.getDeviceId().getId() + "/" + ctx.getOperation().getType(); + ctx.getDeviceId().getType() + "/" + ctx.getDeviceId().getId() + "/" + operation.getType()
+ "/" + operation.getCode();
dynamicProperties.put("topic", topic); dynamicProperties.put("topic", topic);
if (operation.getPayLoad() == null) {
operation.setPayLoad("");
}
} }
MQTTDataHolder.getInstance().getOutputEventAdapterService().publish(mqttAdapterName, dynamicProperties, MQTTDataHolder.getInstance().getOutputEventAdapterService().publish(mqttAdapterName, dynamicProperties,
ctx.getOperation().getPayLoad()); operation.getPayLoad());
} }
@Override @Override

@ -18,17 +18,29 @@
*/ */
package org.wso2.carbon.device.mgt.jaxrs.service.api; package org.wso2.carbon.device.mgt.jaxrs.service.api;
import io.swagger.annotations.*; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.ResponseHeader;
import org.wso2.carbon.apimgt.annotations.api.API; import org.wso2.carbon.apimgt.annotations.api.API;
import org.wso2.carbon.apimgt.annotations.api.Permission; import org.wso2.carbon.apimgt.annotations.api.Permission;
import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceTypeList; import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceTypeList;
import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse; import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse;
import javax.ws.rs.*; import javax.validation.constraints.Size;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
@API(name = "Device Type Management", version = "1.0.0", context = "/api/device-mgt/v1.0/admin/device-types", tags = {"devicemgt_admin"}) @API(name = "Device Type Management", version = "1.0.0", context = "/api/device-mgt/v1.0/admin/device-types",
tags = {"devicemgt_admin"})
@Path("/device-types") @Path("/device-types")
@Api(value = "Device Type Management", description = "This API corresponds to all tasks related to device " + @Api(value = "Device Type Management", description = "This API corresponds to all tasks related to device " +
@ -60,13 +72,16 @@ public interface DeviceTypeManagementService {
"Used by caches, or in conditional requests."), "Used by caches, or in conditional requests."),
@ResponseHeader( @ResponseHeader(
name = "Last-Modified", name = "Last-Modified",
description = "Date and time the resource has been modified the last time.\n" + description =
"Date and time the resource has been modified the last time.\n" +
"Used by caches, or in conditional requests."), "Used by caches, or in conditional requests."),
} }
), ),
@ApiResponse( @ApiResponse(
code = 304, code = 304,
message = "Not Modified. \n Empty body because the client has already the latest version of " + message =
"Not Modified. \n Empty body because the client has already the latest version of" +
" " +
"the requested resource."), "the requested resource."),
@ApiResponse( @ApiResponse(
code = 406, code = 406,
@ -87,4 +102,64 @@ public interface DeviceTypeManagementService {
@HeaderParam("If-Modified-Since") @HeaderParam("If-Modified-Since")
String ifModifiedSince); String ifModifiedSince);
@GET
@ApiOperation(
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "Get the list of features for a give device type.",
notes = "Retrieves the list of features of a given device type.",
tags = "Device Type Management")
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK. \n Successfully fetched the list of supported features.",
response = DeviceTypeList.class,
responseHeaders = {
@ResponseHeader(
name = "Content-Type",
description = "The content type of the body"),
@ResponseHeader(
name = "ETag",
description = "Entity Tag of the response resource.\n" +
"Used by caches, or in conditional requests."),
@ResponseHeader(
name = "Last-Modified",
description =
"Date and time the resource has been modified the last time.\n" +
"Used by caches, or in conditional requests."),
}
),
@ApiResponse(
code = 304,
message =
"Not Modified. \n Empty body because the client has already the latest version of" +
" " +
"the requested resource."),
@ApiResponse(
code = 406,
message = "Not Acceptable.\n The requested media type is not supported"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Server error occurred while fetching the " +
"list of supported device types.",
response = ErrorResponse.class)
}
)
@Permission(name = "View Device Types", permission = "/device-mgt/devices/owning-device/view")
Response getFeatures(
@ApiParam(
name = "type",
value = "The device type, such as ios, android or windows.",
required = true)
@PathParam("type")
@Size(max = 45)
String type,
@ApiParam(
name = "If-Modified-Since",
value = "Validates if the requested variant has not been modified since the time specified",
required = false)
@HeaderParam("If-Modified-Since")
String ifModifiedSince);
} }

@ -18,85 +18,96 @@
*/ */
package org.wso2.carbon.device.mgt.jaxrs.service.api; package org.wso2.carbon.device.mgt.jaxrs.service.api;
import org.wso2.carbon.apimgt.annotations.api.Scope; import org.wso2.carbon.apimgt.annotations.api.API;
import org.wso2.carbon.apimgt.annotations.api.Permission;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup;
import javax.ws.rs.*; 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.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
//@Path("/groups") @API(name = "Group Management", version = "1.0.0", context = "/api/device-mgt/v1.0/groups", tags = {"devicemgt_admin"})
//@Produces(MediaType.APPLICATION_JSON)
//@Consumes(MediaType.APPLICATION_JSON) @Path("/groups")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface GroupManagementService { public interface GroupManagementService {
// @GET @GET
// @Permission(scope = "group-view", permissions = {"/permission/admin/device-mgt/user/groups/list"}) @Permission(name = "View Group", permission = "/permission/admin/device-mgt/user/groups/list")
// Response getGroups(@QueryParam("user") String user, @QueryParam("offset") int offset, Response getGroups(@QueryParam("user") String user, @QueryParam("offset") int offset,
// @QueryParam("limit") int limit); @QueryParam("limit") int limit);
//
// @POST @POST
// @Permission(scope = "group-add", permissions = {"/permission/admin/device-mgt/user/groups/add"}) @Permission(name = "Add Group", permission = "/permission/admin/device-mgt/user/groups/add")
// Response createGroup(DeviceGroup group); Response createGroup(DeviceGroup group);
//
// @Path("/{groupName}") @Path("/{groupName}")
// @GET @GET
// @Permission(scope = "group-view", permissions = {"/permission/admin/device-mgt/user/groups/view"}) @Permission(name = "View Group", permission = "/permission/admin/device-mgt/user/groups/view")
// Response getGroup(@PathParam("groupName") String groupName); Response getGroup(@PathParam("groupName") String groupName);
//
// @Path("/{groupName}") @Path("/{groupName}")
// @PUT @PUT
// @Permission(scope = "group-modify", permissions = {"/permission/admin/device-mgt/user/groups/update"}) @Permission(name = "Update Group", permission = "/permission/admin/device-mgt/user/groups/update")
// Response updateGroup(@PathParam("groupName") String groupName, DeviceGroup deviceGroup); Response updateGroup(@PathParam("groupName") String groupName, DeviceGroup deviceGroup);
//
// @Path("/{groupName}") @Path("/{groupName}")
// @DELETE @DELETE
// @Permission(scope = "group-remove", permissions = {"/permission/admin/device-mgt/user/groups/remove"}) @Permission(name = "Remove Groups", permission = "/permission/admin/device-mgt/user/groups/remove")
// Response deleteGroup(@PathParam("groupName") String groupName); Response deleteGroup(@PathParam("groupName") String groupName);
//
// @Path("/{groupName}/share-with-user") @Path("/{groupName}/share-with-user")
// @POST @POST
// @Permission(scope = "group-share", permissions = {"/permission/admin/device-mgt/user/groups/share"}) @Permission(name = "Share Group to a User", permission = "/permission/admin/device-mgt/user/groups/share")
// Response shareGroupWithUser(@PathParam("groupName") String groupName, String targetUser); Response shareGroupWithUser(@PathParam("groupName") String groupName, String targetUser);
//
// @Path("/{groupName}/share-with-role") @Path("/{groupName}/share-with-role")
// @POST @POST
// @Permission(scope = "group-share", permissions = {"/permission/admin/device-mgt/user/groups/share"}) @Permission(name = "Share Group to a Role", permission = "/permission/admin/device-mgt/user/groups/share")
// Response shareGroupWithRole(@PathParam("groupName") String groupName, String targetRole); Response shareGroupWithRole(@PathParam("groupName") String groupName, String targetRole);
//
// @Path("/{groupName}/remove-share-with-user") @Path("/{groupName}/remove-share-with-user")
// @POST @POST
// @Permission(scope = "group-share", permissions = {"/permission/admin/device-mgt/user/groups/unshare"}) @Permission(name = "Unshare a Group", permission = "/permission/admin/device-mgt/user/groups/unshare")
// Response removeShareWithUser(@PathParam("groupName") String groupName, String targetUser); Response removeShareWithUser(@PathParam("groupName") String groupName, String targetUser);
//
// @Path("/{groupName}/remove-share-with-role") @Path("/{groupName}/remove-share-with-role")
// @POST @POST
// @Permission(scope = "group-share", permissions = {"/permission/admin/device-mgt/user/groups/unshare"}) @Permission(name = "Unshare a Group", permission = "/permission/admin/device-mgt/user/groups/unshare")
// Response removeShareWithRole(@PathParam("groupName") String groupName, String targetUser); Response removeShareWithRole(@PathParam("groupName") String groupName, String targetUser);
//
// @GET @GET
// @Path("/{groupName}/users") @Path("/{groupName}/users")
// @Permission(scope = "group-view", permissions = {"/permission/admin/device-mgt/user/groups/list"}) @Permission(name = "Get Users of Group", permission = "/permission/admin/device-mgt/user/groups/list")
// Response getUsersOfGroup(@PathParam("groupName") String groupName); Response getUsersOfGroup(@PathParam("groupName") String groupName);
//
// @GET @GET
// @Path("/{groupName}/devices") @Path("/{groupName}/devices")
// @Permission(scope = "group-view", permissions = {"/permission/admin/device-mgt/groups/roles"}) @Permission(name = "Get Devices of Group", permission = "/permission/admin/device-mgt/groups/roles")
// Response getDevicesOfGroup(@PathParam("groupName") String groupName, @QueryParam("offset") int offset, Response getDevicesOfGroup(@PathParam("groupName") String groupName, @QueryParam("offset") int offset,
// @QueryParam("limit") int limit); @QueryParam("limit") int limit);
//
// @POST @POST
// @Path("/{groupName}/devices") @Path("/{groupName}/devices")
// @Produces("application/json") @Produces("application/json")
// @Permission(scope = "group-add", permissions = {"/permission/admin/device-mgt/user/groups/devices/add"}) @Permission(name = "Add Device to a Group", permission = "/permission/admin/device-mgt/user/groups/devices/add")
// Response addDeviceToGroup(@PathParam("groupName") String groupName, DeviceIdentifier deviceIdentifier); Response addDeviceToGroup(@PathParam("groupName") String groupName, DeviceIdentifier deviceIdentifier);
//
// @DELETE
// @Path("/{groupName}/devices")
// @Permission(scope = "group-remove", permissions = {"/permission/admin/device-mgt/user/groups/devices/remove"})
// Response removeDeviceFromGroup(@PathParam("groupName") String groupName, @QueryParam("type") String type,
// @QueryParam("id") String id);
@DELETE
@Path("/{groupName}/devices")
@Permission(name = "Remove Devices from Group",
permission = "/permission/admin/device-mgt/user/groups/devices/remove")
Response removeDeviceFromGroup(@PathParam("groupName") String groupName, @QueryParam("type") String type,
@QueryParam("id") String id);
} }

@ -18,82 +18,92 @@
*/ */
package org.wso2.carbon.device.mgt.jaxrs.service.api.admin; package org.wso2.carbon.device.mgt.jaxrs.service.api.admin;
import io.swagger.annotations.*; import io.swagger.annotations.Api;
import org.wso2.carbon.apimgt.annotations.api.Scope; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.ResponseHeader;
import org.wso2.carbon.apimgt.annotations.api.API;
import org.wso2.carbon.apimgt.annotations.api.Permission;
import org.wso2.carbon.policy.mgt.common.DeviceGroupWrapper; import org.wso2.carbon.policy.mgt.common.DeviceGroupWrapper;
import javax.ws.rs.*; import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.Date;
//@Path("/admin/groups") @API(name = "Group Management Admin", version = "1.0.0", context = "/api/device-mgt/v1.0/admin/groups", tags = {"devicemgt_admin"})
//@Produces(MediaType.APPLICATION_JSON)
//@Consumes(MediaType.APPLICATION_JSON)
//@Api(value = "Group Management Administrative Service", description = "This an API intended to be used by " +
// "'internal' components to log in as an admin user and do a selected number of operations. " +
// "Further, this is strictly restricted to admin users only ")
public interface GroupManagementAdminService {
// @GET
// @ApiOperation(
// produces = MediaType.APPLICATION_JSON,
// httpMethod = "GET",
// value = "Get groups by the name.",
// notes = "Get devices the name of device and tenant.",
// response = DeviceGroupWrapper.class,
// responseContainer = "List",
// tags = "Group Management Administrative Service")
// @ApiResponses(value = {
// @ApiResponse(code = 200, message = "OK. \n Successfully fetched the list of groups.",
// response = DeviceGroupWrapper.class,
// responseContainer = "List",
// responseHeaders = {
// @ResponseHeader(
// name = "Content-Type",
// description = "The content type of the body"),
// @ResponseHeader(
// name = "ETag",
// description = "Entity Tag of the response resource.\n" +
// "Used by caches, or in conditional requests."),
// @ResponseHeader(
// name = "Last-Modified",
// description = "Date and time the resource has been modified the last time.\n" +
// "Used by caches, or in conditional requests."),
// }),
// @ApiResponse(
// code = 304,
// message = "Not Modified. \n Empty body because the client has already the latest version of the requested resource."),
// @ApiResponse(
// code = 406,
// message = "Not Acceptable.\n The requested media type is not supported"),
// @ApiResponse(
// code = 500,
// message = "Internal Server ErrorResponse. \n Server error occurred while fetching the group list.")
// })
// @Permission(scope = "group-view", permissions = {"/permission/admin/device-mgt/user/groups/list"})
// Response getGroupsOfUser(
// @ApiParam(
// name = "username",
// value = "Username of the user.",
// required = true)
// @QueryParam("username") String username,
// @ApiParam(
// name = "If-Modified-Since",
// value = "Timestamp of the last modified date",
// required = false)
// @HeaderParam("If-Modified-Since") String timestamp,
// @ApiParam(
// name = "offset",
// value = "Starting point within the complete list of items qualified.",
// required = false)
// @QueryParam("offset") int offset,
// @ApiParam(
// name = "limit",
// value = "Maximum size of resource array to return.",
// required = false)
// @QueryParam("limit") int limit);
//
@Path("/admin/groups")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Api(value = "Group Management Administrative Service", description = "This an API intended to be used by " +
"'internal' components to log in as an admin user and do a selected number of operations. " +
"Further, this is strictly restricted to admin users only ")
public interface GroupManagementAdminService {
@GET
@ApiOperation(
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "Get groups by the name.",
notes = "Get devices the name of device and tenant.",
response = DeviceGroupWrapper.class,
responseContainer = "List",
tags = "Group Management Administrative Service")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK. \n Successfully fetched the list of groups.",
response = DeviceGroupWrapper.class,
responseContainer = "List",
responseHeaders = {
@ResponseHeader(
name = "Content-Type",
description = "The content type of the body"),
@ResponseHeader(
name = "ETag",
description = "Entity Tag of the response resource.\n" +
"Used by caches, or in conditional requests."),
@ResponseHeader(
name = "Last-Modified",
description = "Date and time the resource has been modified the last time.\n" +
"Used by caches, or in conditional requests."),
}),
@ApiResponse(
code = 304,
message = "Not Modified. \n Empty body because the client has already the latest version of the " +
"requested resource."),
@ApiResponse(
code = 406,
message = "Not Acceptable.\n The requested media type is not supported"),
@ApiResponse(
code = 500,
message = "Internal Server ErrorResponse. \n Server error occurred while fetching the group list.")
})
@Permission(name = "View All Groups", permission = "/permission/admin/device-mgt/user/groups/list")
Response getGroupsOfUser(
@ApiParam(
name = "username",
value = "Username of the user.",
required = true)
@QueryParam("username") String username,
@ApiParam(
name = "If-Modified-Since",
value = "Timestamp of the last modified date",
required = false)
@HeaderParam("If-Modified-Since") String timestamp,
@ApiParam(
name = "offset",
value = "Starting point within the complete list of items qualified.",
required = false)
@QueryParam("offset") int offset,
@ApiParam(
name = "limit",
value = "Maximum size of resource array to return.",
required = false)
@QueryParam("limit") int limit);
} }

@ -21,14 +21,20 @@ package org.wso2.carbon.device.mgt.jaxrs.service.impl;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.Feature;
import org.wso2.carbon.device.mgt.common.FeatureManager;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceTypeList; import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceTypeList;
import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse; import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse;
import org.wso2.carbon.device.mgt.jaxrs.service.api.DeviceTypeManagementService; import org.wso2.carbon.device.mgt.jaxrs.service.api.DeviceTypeManagementService;
import org.wso2.carbon.device.mgt.jaxrs.service.impl.util.RequestValidationUtil;
import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils; import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils;
import javax.validation.constraints.Size;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam; import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.List; import java.util.List;
@ -56,4 +62,28 @@ public class DeviceTypeManagementServiceImpl implements DeviceTypeManagementServ
} }
} }
@GET
@Override
@Path("/{type}/features")
public Response getFeatures(@PathParam("type") @Size(max = 45) String type, @HeaderParam("If-Modified-Since") String ifModifiedSince) {
List<Feature> features;
DeviceManagementProviderService dms;
try {
dms = DeviceMgtAPIUtils.getDeviceManagementService();
FeatureManager fm = dms.getFeatureManager(type);
if (fm == null) {
return Response.status(Response.Status.NOT_FOUND).entity(
new ErrorResponse.ErrorResponseBuilder().setMessage("No feature manager is " +
"registered with the given type '" + type + "'").build()).build();
}
features = fm.getFeatures();
} catch (DeviceManagementException e) {
String msg = "Error occurred while retrieving the list of features of '" + type + "' device type";
log.error(msg, e);
return Response.serverError().entity(
new ErrorResponse.ErrorResponseBuilder().setMessage(msg).build()).build();
}
return Response.status(Response.Status.OK).entity(features).build();
}
} }

@ -18,10 +18,6 @@
*/ */
package org.wso2.carbon.device.mgt.jaxrs.service.impl; package org.wso2.carbon.device.mgt.jaxrs.service.impl;
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup;
import org.wso2.carbon.device.mgt.jaxrs.service.api.GroupManagementService;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
@ -33,105 +29,108 @@ import org.wso2.carbon.device.mgt.jaxrs.service.api.GroupManagementService;
import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils; import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils;
import org.wso2.carbon.policy.mgt.common.DeviceGroupWrapper; import org.wso2.carbon.policy.mgt.common.DeviceGroupWrapper;
import javax.ws.rs.*; import javax.ws.rs.Consumes;
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.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
//@Path("/groups") @Path("/groups")
//@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
//@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
public class GroupManagementServiceImpl implements GroupManagementService { public class GroupManagementServiceImpl implements GroupManagementService {
// private static final Log log = LogFactory.getLog(GroupManagementServiceImpl.class); private static final Log log = LogFactory.getLog(GroupManagementServiceImpl.class);
//
// @Override @Override
// public Response getGroups(@QueryParam("user") String user, @QueryParam("offset") int offset, public Response getGroups(@QueryParam("user") String user, @QueryParam("offset") int offset,
// @QueryParam("limit") int limit) { @QueryParam("limit") int limit) {
// try { try {
// List<DeviceGroupWrapper> groupWrappers = new ArrayList<>(); List<DeviceGroupWrapper> groupWrappers = new ArrayList<>();
// GroupManagementProviderService service = DeviceMgtAPIUtils.getGroupManagementProviderService(); GroupManagementProviderService service = DeviceMgtAPIUtils.getGroupManagementProviderService();
// List<DeviceGroup> deviceGroups = service.getGroups(user); List<DeviceGroup> deviceGroups = service.getGroups(user);
// int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
// for (DeviceGroup dg : deviceGroups) { for (DeviceGroup dg : deviceGroups) {
// DeviceGroupWrapper gw = new DeviceGroupWrapper(); DeviceGroupWrapper gw = new DeviceGroupWrapper();
// gw.setId(dg.getId()); gw.setId(dg.getId());
// gw.setOwner(dg.getOwner()); gw.setOwner(dg.getOwner());
// gw.setName(dg.getName()); gw.setName(dg.getName());
// gw.setTenantId(tenantId); gw.setTenantId(tenantId);
// groupWrappers.add(gw); groupWrappers.add(gw);
// } }
// return Response.status(Response.Status.OK).entity(groupWrappers).build(); return Response.status(Response.Status.OK).entity(groupWrappers).build();
// } catch (GroupManagementException e) { } catch (GroupManagementException e) {
// String error = "ErrorResponse occurred while getting the groups related to users for policy."; String error = "ErrorResponse occurred while getting the groups related to users for policy.";
// log.error(error, e); log.error(error, e);
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build();
// } }
// } }
//
// @Override @Override
// public Response createGroup(DeviceGroup group) { public Response createGroup(DeviceGroup group) {
// return null; return null;
// } }
//
// @Override @Override
// public Response getGroup(@PathParam("groupName") String groupName) { public Response getGroup(@PathParam("groupName") String groupName) {
// return null; return null;
// } }
//
// @Override @Override
// public Response updateGroup(@PathParam("groupName") String groupName, DeviceGroup deviceGroup) { public Response updateGroup(@PathParam("groupName") String groupName, DeviceGroup deviceGroup) {
// return null; return null;
// } }
//
// @Override @Override
// public Response deleteGroup(@PathParam("groupName") String groupName) { public Response deleteGroup(@PathParam("groupName") String groupName) {
// return null; return null;
// } }
//
// @Override @Override
// public Response shareGroupWithUser(String groupName, String targetUser) { public Response shareGroupWithUser(String groupName, String targetUser) {
// return null; return null;
// } }
//
// @Override @Override
// public Response shareGroupWithRole(String groupName, String targetRole) { public Response shareGroupWithRole(String groupName, String targetRole) {
// return null; return null;
// } }
//
// @Override @Override
// public Response removeShareWithUser(@PathParam("groupName") String groupName, public Response removeShareWithUser(@PathParam("groupName") String groupName,
// @QueryParam("username") String targetUser) { @QueryParam("username") String targetUser) {
// return null; return null;
// } }
//
// @Override @Override
// public Response removeShareWithRole(@PathParam("groupName") String groupName, public Response removeShareWithRole(@PathParam("groupName") String groupName,
// @QueryParam("roleName") String targetUser) { @QueryParam("roleName") String targetUser) {
// return null; return null;
// } }
//
// @Override @Override
// public Response getUsersOfGroup(@PathParam("groupName") String groupName) { public Response getUsersOfGroup(@PathParam("groupName") String groupName) {
// return null; return null;
// } }
//
// @Override @Override
// public Response getDevicesOfGroup(@PathParam("groupName") String groupName, @QueryParam("offset") int offset, public Response getDevicesOfGroup(@PathParam("groupName") String groupName, @QueryParam("offset") int offset,
// @QueryParam("limit") int limit) { @QueryParam("limit") int limit) {
// return null; return null;
// } }
//
// @Override @Override
// public Response addDeviceToGroup(@PathParam("groupName") String groupName, DeviceIdentifier deviceIdentifier) { public Response addDeviceToGroup(@PathParam("groupName") String groupName, DeviceIdentifier deviceIdentifier) {
// return null; return null;
// } }
//
// @Override
// public Response removeDeviceFromGroup(@PathParam("groupName") String groupName, @QueryParam("type") String type,
// @QueryParam("id") String id) {
// return null;
// }
@Override
public Response removeDeviceFromGroup(@PathParam("groupName") String groupName, @QueryParam("type") String type,
@QueryParam("id") String id) {
return null;
}
} }

@ -18,7 +18,6 @@
*/ */
package org.wso2.carbon.device.mgt.jaxrs.service.impl.admin; package org.wso2.carbon.device.mgt.jaxrs.service.impl.admin;
import io.swagger.annotations.ApiParam;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.common.PaginationResult;
@ -26,37 +25,42 @@ import org.wso2.carbon.device.mgt.common.group.mgt.GroupManagementException;
import org.wso2.carbon.device.mgt.jaxrs.service.api.admin.GroupManagementAdminService; import org.wso2.carbon.device.mgt.jaxrs.service.api.admin.GroupManagementAdminService;
import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils; import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils;
import javax.ws.rs.*; import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.util.Date;
//@Path("/admin/groups") @Path("/admin/groups")
//@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
//@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
public class GroupManagementAdminServiceImpl implements GroupManagementAdminService { public class GroupManagementAdminServiceImpl implements GroupManagementAdminService {
//
// private static final Log log = LogFactory.getLog(GroupManagementAdminServiceImpl.class); private static final Log log = LogFactory.getLog(GroupManagementAdminServiceImpl.class);
//
// @Override @GET
// public Response getGroupsOfUser( @Override
// @QueryParam("username") String username, public Response getGroupsOfUser(
// @HeaderParam("If-Modified-Since") String timestamp, @QueryParam("username") String username,
// @QueryParam("offset") int offset, @HeaderParam("If-Modified-Since") String timestamp,
// @QueryParam("limit") int limit) { @QueryParam("offset") int offset,
// try { @QueryParam("limit") int limit) {
// PaginationResult result = try {
// DeviceMgtAPIUtils.getGroupManagementProviderService().getGroups(username, offset, limit); PaginationResult result =
// if (result != null && result.getRecordsTotal() > 0) { DeviceMgtAPIUtils.getGroupManagementProviderService().getGroups(username, offset, limit);
// return Response.status(Response.Status.OK).entity(result).build(); if (result != null && result.getRecordsTotal() > 0) {
// } else { return Response.status(Response.Status.OK).entity(result).build();
// return Response.status(Response.Status.NOT_FOUND).build(); } else {
// } return Response.status(Response.Status.NOT_FOUND).build();
// } catch (GroupManagementException e) { }
// String msg = "ErrorResponse occurred while retrieving the groups of user '" + username + "'"; } catch (GroupManagementException e) {
// log.error(msg, e); String msg = "ErrorResponse occurred while retrieving the groups of user '" + username + "'";
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); log.error(msg, e);
// } return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
// } }
}
} }

@ -73,7 +73,7 @@
<bean id="policyManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.PolicyManagementServiceImpl"/> <bean id="policyManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.PolicyManagementServiceImpl"/>
<bean id="roleManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.RoleManagementServiceImpl"/> <bean id="roleManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.RoleManagementServiceImpl"/>
<bean id="userManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.UserManagementServiceImpl"/> <bean id="userManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.UserManagementServiceImpl"/>
<!--<bean id="groupManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.GroupManagementServiceImpl"/>--> <bean id="groupManagementService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.GroupManagementServiceImpl"/>
<bean id="deviceManagementAdminService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.admin.DeviceManagementAdminServiceImpl"/> <bean id="deviceManagementAdminService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.admin.DeviceManagementAdminServiceImpl"/>
<bean id="applicationManagementAdminService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.admin.ApplicationManagementAdminServiceImpl"/> <bean id="applicationManagementAdminService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.admin.ApplicationManagementAdminServiceImpl"/>
<bean id="groupManagementAdminService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.admin.GroupManagementAdminServiceImpl"/> <bean id="groupManagementAdminService" class="org.wso2.carbon.device.mgt.jaxrs.service.impl.admin.GroupManagementAdminServiceImpl"/>

@ -48,10 +48,10 @@
org.wso2.carbon.device.mgt.common.* org.wso2.carbon.device.mgt.common.*
</Export-Package> </Export-Package>
<Import-Package> <Import-Package>
javax.xml.bind.annotation, javax.xml.bind.annotation; version="${javax.xml.bind.imp.pkg.version}",
com.fasterxml.jackson.annotation;version="${jackson-annotations.version}", com.fasterxml.jackson.annotation;version="${jackson-annotations.version}",
org.wso2.carbon.apimgt.api.model.*;version="${carbon.api.mgt.version.range}", org.wso2.carbon.apimgt.api.model.*;version="${carbon.api.mgt.version.range}",
io.swagger.annotations.*;resolution:=optional io.swagger.annotations; version="${swagger.annotations.version}"
</Import-Package> </Import-Package>
</instructions> </instructions>
</configuration> </configuration>

@ -46,7 +46,7 @@ public class PushNotificationBasedOperationManager implements OperationManager {
Activity activity = this.operationManager.addOperation(operation, devices); Activity activity = this.operationManager.addOperation(operation, devices);
for (DeviceIdentifier deviceId : devices) { for (DeviceIdentifier deviceId : devices) {
try { try {
this.notificationProvider.execute(new NotificationContext(deviceId)); this.notificationProvider.execute(new NotificationContext(deviceId, operation));
} catch (PushNotificationExecutionFailedException e) { } catch (PushNotificationExecutionFailedException e) {
throw new OperationManagementException("Error occurred while sending push notification to device", e); throw new OperationManagementException("Error occurred while sending push notification to device", e);
} }

@ -104,12 +104,14 @@ deviceModule = function () {
if (device["properties"] && device["properties"].length > 0) { if (device["properties"] && device["properties"].length > 0) {
var propertiesList = device["properties"]; var propertiesList = device["properties"];
var properties = {}; var properties = {};
if (propertiesList) {
for (var i = 0; i < propertiesList.length; i++) { for (var i = 0; i < propertiesList.length; i++) {
if (propertiesList[i]["value"]) { if (propertiesList[i]["value"]) {
properties[propertiesList[i]["name"]] = properties[propertiesList[i]["name"]] =
propertiesList[i]["value"]; propertiesList[i]["value"];
} }
} }
}
filteredDeviceData["initialDeviceInfo"] = properties; filteredDeviceData["initialDeviceInfo"] = properties;

@ -38,9 +38,9 @@ var operationModule = function () {
} }
privateMethods.getOperationsFromFeatures = function (deviceType, operationType) { privateMethods.getOperationsFromFeatures = function (deviceType, operationType) {
var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/features/" + deviceType; var url = devicemgtProps["httpsURL"] + devicemgtProps["backendRestEndpoints"]["deviceMgt"] + "/device-types/" + deviceType + "/features";
var featuresList = serviceInvokers.XMLHttp.get(url, function (responsePayload) { var featuresList = serviceInvokers.XMLHttp.get(url, function (responsePayload) {
var features = responsePayload; var features = JSON.parse(responsePayload.responseText);
var featureList = []; var featureList = [];
var feature; var feature;
for (var i = 0; i < features.length; i++) { for (var i = 0; i < features.length; i++) {

@ -72,7 +72,7 @@ var invokers = function () {
var xmlHttpRequest = new XMLHttpRequest(); var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open(httpMethod, endpoint); xmlHttpRequest.open(httpMethod, endpoint);
for(var i in headers){ for (var i in headers) {
xmlHttpRequest.setRequestHeader(headers[i].name, headers[i].value); xmlHttpRequest.setRequestHeader(headers[i].name, headers[i].value);
} }
xmlHttpRequest.setRequestHeader(constants["CONTENT_TYPE_IDENTIFIER"], constants["APPLICATION_JSON"]); xmlHttpRequest.setRequestHeader(constants["CONTENT_TYPE_IDENTIFIER"], constants["APPLICATION_JSON"]);
@ -117,7 +117,8 @@ var invokers = function () {
* @param endpoint Backend REST API url. * @param endpoint Backend REST API url.
* @param responseCallback a function to be called with response retrieved. * @param responseCallback a function to be called with response retrieved.
*/ */
privateMethods["initiateXMLHTTPRequest"] = function (httpMethod, requestPayload, endpoint, responseCallback, headers) { privateMethods["initiateXMLHTTPRequest"] =
function (httpMethod, requestPayload, endpoint, responseCallback, headers) {
return privateMethods.execute(httpMethod, requestPayload, endpoint, responseCallback, 0, headers); return privateMethods.execute(httpMethod, requestPayload, endpoint, responseCallback, 0, headers);
}; };
@ -128,7 +129,8 @@ var invokers = function () {
*/ */
publicXMLHTTPInvokers["get"] = function (endpoint, responseCallback, headers) { publicXMLHTTPInvokers["get"] = function (endpoint, responseCallback, headers) {
var requestPayload = null; var requestPayload = null;
return privateMethods.initiateXMLHTTPRequest(constants["HTTP_GET"], requestPayload, endpoint, responseCallback, headers); return privateMethods.initiateXMLHTTPRequest(constants["HTTP_GET"], requestPayload, endpoint, responseCallback,
headers);
}; };
/** /**
@ -138,7 +140,8 @@ var invokers = function () {
* @param responseCallback a function to be called with response retrieved. * @param responseCallback a function to be called with response retrieved.
*/ */
publicXMLHTTPInvokers["post"] = function (endpoint, requestPayload, responseCallback, headers) { publicXMLHTTPInvokers["post"] = function (endpoint, requestPayload, responseCallback, headers) {
return privateMethods.initiateXMLHTTPRequest(constants["HTTP_POST"], requestPayload, endpoint, responseCallback, headers); return privateMethods.initiateXMLHTTPRequest(constants["HTTP_POST"], requestPayload, endpoint, responseCallback,
headers);
}; };
/** /**
@ -148,7 +151,8 @@ var invokers = function () {
* @param responseCallback a function to be called with response retrieved. * @param responseCallback a function to be called with response retrieved.
*/ */
publicXMLHTTPInvokers["put"] = function (endpoint, requestPayload, responseCallback, headers) { publicXMLHTTPInvokers["put"] = function (endpoint, requestPayload, responseCallback, headers) {
return privateMethods.initiateXMLHTTPRequest(constants["HTTP_PUT"], requestPayload, endpoint, responseCallback, headers); return privateMethods.initiateXMLHTTPRequest(constants["HTTP_PUT"], requestPayload, endpoint, responseCallback,
headers);
}; };
/** /**
@ -158,7 +162,8 @@ var invokers = function () {
*/ */
publicXMLHTTPInvokers["delete"] = function (endpoint, responseCallback, headers) { publicXMLHTTPInvokers["delete"] = function (endpoint, responseCallback, headers) {
var requestPayload = null; var requestPayload = null;
return privateMethods.initiateXMLHTTPRequest(constants["HTTP_DELETE"], requestPayload, endpoint, responseCallback, headers); return privateMethods.initiateXMLHTTPRequest(constants["HTTP_DELETE"], requestPayload, endpoint,
responseCallback, headers);
}; };
/** /**
@ -245,7 +250,8 @@ var invokers = function () {
* @param errorCallback a function to be called if en error is reserved. * @param errorCallback a function to be called if en error is reserved.
* @param headers a list of name value pairs for additional http headers. * @param headers a list of name value pairs for additional http headers.
*/ */
privateMethods["initiateHTTPClientRequest"] = function (method, url, successCallback, errorCallback, payload, headers) { privateMethods["initiateHTTPClientRequest"] =
function (method, url, successCallback, errorCallback, payload, headers) {
//noinspection JSUnresolvedVariable //noinspection JSUnresolvedVariable
var HttpClient = Packages.org.apache.commons.httpclient.HttpClient; var HttpClient = Packages.org.apache.commons.httpclient.HttpClient;
var httpMethodObject; var httpMethodObject;
@ -277,7 +283,7 @@ var invokers = function () {
//noinspection JSUnresolvedVariable //noinspection JSUnresolvedVariable
var Header = Packages.org.apache.commons.httpclient.Header; var Header = Packages.org.apache.commons.httpclient.Header;
for(var i in headers){ for (var i in headers) {
var header = new Header(); var header = new Header();
header.setName(headers[i].name); header.setName(headers[i].name);
header.setValue(headers[i].value); header.setValue(headers[i].value);
@ -321,14 +327,18 @@ var invokers = function () {
//noinspection JSUnresolvedFunction //noinspection JSUnresolvedFunction
var status = httpMethodObject.getStatusCode(); var status = httpMethodObject.getStatusCode();
if (status == 200) { if (status == 200) {
var responseContentDispositionHeader = httpMethodObject.getResponseHeader(constants["CONTENT_DISPOSITION_IDENTIFIER"]); var responseContentDispositionHeader = httpMethodObject.getResponseHeader(
constants["CONTENT_DISPOSITION_IDENTIFIER"]);
if (responseContentDispositionHeader) { if (responseContentDispositionHeader) {
return successCallback(httpMethodObject.getResponseBodyAsStream(), httpMethodObject.getResponseHeaders()); return successCallback(httpMethodObject.getResponseBodyAsStream(),
httpMethodObject.getResponseHeaders());
} else { } else {
return successCallback(httpMethodObject.getResponseBody()); return successCallback(httpMethodObject.getResponseBodyAsString(),
httpMethodObject.getResponseHeaders());
} }
} else { } else {
return errorCallback(httpMethodObject.getResponseBody()); return errorCallback(httpMethodObject.getResponseBodyAsString(),
httpMethodObject.getResponseHeaders());
} }
} catch (e) { } catch (e) {
return errorCallback(response); return errorCallback(response);
@ -349,8 +359,8 @@ var invokers = function () {
*/ */
publicHTTPClientInvokers["get"] = function (url, successCallback, errorCallback, headers) { publicHTTPClientInvokers["get"] = function (url, successCallback, errorCallback, headers) {
var requestPayload = null; var requestPayload = null;
return privateMethods. return privateMethods.initiateHTTPClientRequest(constants["HTTP_GET"], url, successCallback, errorCallback,
initiateHTTPClientRequest(constants["HTTP_GET"], url, successCallback, errorCallback, requestPayload, headers); requestPayload, headers);
}; };
/** /**
@ -362,8 +372,8 @@ var invokers = function () {
* @param headers a list of name value pairs for additional http headers. * @param headers a list of name value pairs for additional http headers.
*/ */
publicHTTPClientInvokers["post"] = function (url, payload, successCallback, errorCallback, headers) { publicHTTPClientInvokers["post"] = function (url, payload, successCallback, errorCallback, headers) {
return privateMethods. return privateMethods.initiateHTTPClientRequest(constants["HTTP_POST"], url, successCallback, errorCallback,
initiateHTTPClientRequest(constants["HTTP_POST"], url, successCallback, errorCallback, payload, headers); payload, headers);
}; };
/** /**
@ -375,8 +385,8 @@ var invokers = function () {
* @param headers a list of name value pairs for additional http headers. * @param headers a list of name value pairs for additional http headers.
*/ */
publicHTTPClientInvokers["put"] = function (url, payload, successCallback, errorCallback, headers) { publicHTTPClientInvokers["put"] = function (url, payload, successCallback, errorCallback, headers) {
return privateMethods. return privateMethods.initiateHTTPClientRequest(constants["HTTP_PUT"], url, successCallback, errorCallback,
initiateHTTPClientRequest(constants["HTTP_PUT"], url, successCallback, errorCallback, payload, headers); payload, headers);
}; };
/** /**
@ -388,8 +398,8 @@ var invokers = function () {
*/ */
publicHTTPClientInvokers["delete"] = function (url, successCallback, errorCallback, headers) { publicHTTPClientInvokers["delete"] = function (url, successCallback, errorCallback, headers) {
var requestPayload = null; var requestPayload = null;
return privateMethods. return privateMethods.initiateHTTPClientRequest(constants["HTTP_DELETE"], url, successCallback, errorCallback,
initiateHTTPClientRequest(constants["HTTP_DELETE"], url, successCallback, errorCallback, requestPayload, headers); requestPayload, headers);
}; };
var publicMethods = {}; var publicMethods = {};

@ -24,6 +24,7 @@ utility = function () {
var log = new Log("/app/modules/utility.js"); var log = new Log("/app/modules/utility.js");
var JavaClass = Packages.java.lang.Class; var JavaClass = Packages.java.lang.Class;
var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext; var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext;
var server = require("carbon")["server"];
var getOsgiService = function (className) { var getOsgiService = function (className) {
return PrivilegedCarbonContext.getThreadLocalCarbonContext().getOSGiService(JavaClass.forName(className)); return PrivilegedCarbonContext.getThreadLocalCarbonContext().getOSGiService(JavaClass.forName(className));
@ -71,7 +72,10 @@ utility = function () {
if (deviceTypeConfigFile.isExists()) { if (deviceTypeConfigFile.isExists()) {
try { try {
deviceTypeConfigFile.open("r"); deviceTypeConfigFile.open("r");
deviceTypeConfig = parse(deviceTypeConfigFile.readAll()); var config = deviceTypeConfigFile.readAll();
config = config.replace("%https.ip%", server.address("https"));
config = config.replace("%http.ip%", server.address("http"));
deviceTypeConfig = parse(config);
} catch (err) { } catch (err) {
log.error("Error while reading device config file for `" + deviceType + "`: " + err); log.error("Error while reading device config file for `" + deviceType + "`: " + err);
} finally { } finally {

@ -138,11 +138,11 @@
</thead> </thead>
<tbody id="ast-container"> <tbody id="ast-container">
<br class="c-both"/> <br class="c-both" />
</tbody> </tbody>
</table> </table>
</div> </div>
<br class="c-both"/> <br class="c-both" />
<div id="content-filter-types" style="display: none"> <div id="content-filter-types" style="display: none">
<div class="sort-title">Sort By</div> <div class="sort-title">Sort By</div>
<div class="sort-options"> <div class="sort-options">
@ -163,7 +163,7 @@
registered registered
{{/if}} {{/if}}
at the moment.</h2> at the moment.</h2>
<br/> <br />
<p class="text-center"> <p class="text-center">
{{#if groupName}} {{#if groupName}}
@ -233,7 +233,9 @@
<h3 class="pull-left modal-title"> <h3 class="pull-left modal-title">
Do you really want to remove this device from your Devices List? Do you really want to remove this device from your Devices List?
</h3> </h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="fw fw-cancel"></i></button> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><i
class="fw fw-cancel"></i>
</button>
</div> </div>
<div class="modal-body add-margin-top-2x add-margin-bottom-2x"> <div class="modal-body add-margin-top-2x add-margin-bottom-2x">
@ -256,7 +258,9 @@
<h3 class="pull-left modal-title"> <h3 class="pull-left modal-title">
Device was successfully removed. Device was successfully removed.
</h3> </h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="fw fw-cancel"></i></button> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><i
class="fw fw-cancel"></i>
</button>
</div> </div>
<div class="modal-body add-margin-top-2x add-margin-bottom-2x"> <div class="modal-body add-margin-top-2x add-margin-bottom-2x">
@ -273,7 +277,9 @@
<h3 class="pull-left modal-title"> <h3 class="pull-left modal-title">
Please enter new name for the device? Please enter new name for the device?
</h3> </h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="fw fw-cancel"></i></button> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><i
class="fw fw-cancel"></i>
</button>
</div> </div>
<div class="modal-body add-margin-top-2x add-margin-bottom-2x"> <div class="modal-body add-margin-top-2x add-margin-bottom-2x">
<input id="edit-device-name" style="color:#3f3f3f;padding:5px" type="text" <input id="edit-device-name" style="color:#3f3f3f;padding:5px" type="text"
@ -298,7 +304,9 @@
<h3 class="pull-left modal-title"> <h3 class="pull-left modal-title">
Device was successfully updated. Device was successfully updated.
</h3> </h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="fw fw-cancel"></i></button> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><i
class="fw fw-cancel"></i>
</button>
</div> </div>
<div class="modal-body add-margin-top-2x add-margin-bottom-2x"> <div class="modal-body add-margin-top-2x add-margin-bottom-2x">
@ -321,7 +329,7 @@
<div class="row"> <div class="row">
<div class="col-lg-5 col-md-6 col-centered"> <div class="col-lg-5 col-md-6 col-centered">
<h3>Exception at backend. Try Later.</h3> <h3>Exception at backend. Try Later.</h3>
<br/> <br />
<div class="buttons"> <div class="buttons">
<a href="#" id="device-400-link" class="btn-operations"> <a href="#" id="device-400-link" class="btn-operations">
&nbsp;&nbsp;&nbsp;&nbsp;Ok&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Ok&nbsp;&nbsp;&nbsp;&nbsp;
@ -337,7 +345,7 @@
<div class="row"> <div class="row">
<div class="col-lg-5 col-md-6 col-centered"> <div class="col-lg-5 col-md-6 col-centered">
<h3>Operation not permitted.</h3> <h3>Operation not permitted.</h3>
<br/> <br />
<div class="buttons"> <div class="buttons">
<a href="#" id="device-403-link" class="btn-operations"> <a href="#" id="device-403-link" class="btn-operations">
&nbsp;&nbsp;&nbsp;&nbsp;Ok&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Ok&nbsp;&nbsp;&nbsp;&nbsp;
@ -352,8 +360,9 @@
<div class="modal-content"> <div class="modal-content">
<div class="row"> <div class="row">
<div class="col-lg-5 col-md-6 col-centered"> <div class="col-lg-5 col-md-6 col-centered">
<h3>You don't have any groups to add this device. Please add group first.</h3> <h3>You don't have any groups to add this device. Please add group
<br/> first.</h3>
<br />
<div class="buttons"> <div class="buttons">
<a href="{{@app.context}}/group/add" class="btn-operations"> <a href="{{@app.context}}/group/add" class="btn-operations">
&nbsp;&nbsp;&nbsp;&nbsp;Add New Group&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Add New Group&nbsp;&nbsp;&nbsp;&nbsp;
@ -373,7 +382,7 @@
<div class="row"> <div class="row">
<div class="col-lg-5 col-md-6 col-centered"> <div class="col-lg-5 col-md-6 col-centered">
<h3>Device does not exist.</h3> <h3>Device does not exist.</h3>
<br/> <br />
<div class="buttons"> <div class="buttons">
<a href="#" id="remove-device-409-link" class="btn-operations"> <a href="#" id="remove-device-409-link" class="btn-operations">
&nbsp;&nbsp;&nbsp;&nbsp;Ok&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Ok&nbsp;&nbsp;&nbsp;&nbsp;
@ -386,10 +395,13 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div>
</div>
{{/zone}} {{/zone}}
{{#zone "bottomJs"}} {{#zone "bottomJs"}}
<script id="device-listing" data-current-user="{{currentUser.username}}" data-device-types="{{deviceTypes}}" <script id="device-listing" data-current-user="{{@user.username}}" data-device-types="{{deviceTypes}}"
type="text/x-handlebars-template"></script> type="text/x-handlebars-template"></script>
{{js "js/listing.js"}} {{js "js/listing.js"}}
{{/zone}} {{/zone}}

@ -87,20 +87,20 @@ $(document).ready(function () {
/* for device list sorting drop down */ /* for device list sorting drop down */
$(".ctrl-filter-type-switcher").popover({ $(".ctrl-filter-type-switcher").popover({
html : true, html: true,
content : function () { content: function () {
return $("#content-filter-types").html(); return $("#content-filter-types").html();
} }
}); });
$(".ast-container").on("click", ".claim-btn", function(e){ $(".ast-container").on("click", ".claim-btn", function (e) {
e.stopPropagation(); e.stopPropagation();
var deviceId = $(this).data("deviceid"); var deviceId = $(this).data("deviceid");
var serviceURL = "/temp-controller-agent/enrollment/claim?username=" + currentUser; var serviceURL = "/temp-controller-agent/enrollment/claim?username=" + currentUser;
var deviceIdentifier = {id: deviceId, type: "TemperatureController"}; var deviceIdentifier = {id: deviceId, type: "TemperatureController"};
invokerUtil.put(serviceURL, deviceIdentifier, function(message){ invokerUtil.put(serviceURL, deviceIdentifier, function (message) {
console.log(message); console.log(message);
}, function(message){ }, function (message) {
console.log(message.content); console.log(message.content);
}); });
}); });
@ -166,15 +166,15 @@ function toTitleCase(str) {
}); });
} }
function loadDevices(searchType, searchParam){ function loadDevices(searchType, searchParam) {
var serviceURL; var serviceURL;
if (groupName && groupOwner && $.hasPermission("LIST_OWN_DEVICES")) { if (groupName && groupOwner && $.hasPermission("LIST_OWN_DEVICES")) {
serviceURL = "/devicemgt_admin/groups/owner/" + groupOwner + "/name/" + groupName + "/devices"; serviceURL = "/api/device-mgt/v1.0/groups/owner/" + groupOwner + "/name/" + groupName + "/devices";
} else if ($.hasPermission("LIST_DEVICES")) { } else if ($.hasPermission("LIST_DEVICES")) {
serviceURL = "/devicemgt_admin/devices"; serviceURL = "/api/device-mgt/v1.0/devices";
} else if ($.hasPermission("LIST_OWN_DEVICES")) { } else if ($.hasPermission("LIST_OWN_DEVICES")) {
//Get authenticated users devices //Get authenticated users devices
serviceURL = "/devicemgt_admin/users/devices?username=" + currentUser; serviceURL = "/api/device-mgt/v1.0/users/devices?username=" + currentUser;
} else { } else {
$("#loading-content").remove(); $("#loading-content").remove();
$('#device-table').addClass('hidden'); $('#device-table').addClass('hidden');
@ -197,10 +197,10 @@ function loadDevices(searchType, searchParam){
return {}; return {};
} }
function getDeviceTypeLabel(type){ function getDeviceTypeLabel(type) {
var deviceTypes = deviceListing.data("deviceTypes"); var deviceTypes = deviceListing.data("deviceTypes");
for (var i = 0; i < deviceTypes.length; i++){ for (var i = 0; i < deviceTypes.length; i++) {
if (deviceTypes[i].type == type){ if (deviceTypes[i].type == type) {
return deviceTypes[i].label; return deviceTypes[i].label;
} }
} }
@ -227,29 +227,21 @@ function loadDevices(searchType, searchParam){
return type; return type;
} }
$('#device-grid').datatables_extended ({ var columns = [
serverSide: true, {
processing: false, targets: 0,
searching: true, data: 'name',
ordering: false, class: 'remove-padding icon-only content-fill',
filter: false, render: function (data, type, row, meta) {
pageLength : 16, return '<div class="thumbnail icon"><img class="square-element text fw " src="' + getDeviceTypeThumb(
ajax: { url : '/devicemgt/api/devices', data : {url : serviceURL}, row.deviceType) + '"/></div>';
dataSrc: function ( json ) {
$('#device-grid').removeClass('hidden');
$("#loading-content").remove();
var $list = $("#device-table :input[type='search']");
$list.each(function(){
$(this).addClass("hidden");
});
return json.data;
} }
}, },
columnDefs: [ {
{ targets: 0, data: 'name', className: 'remove-padding icon-only content-fill' , render: function ( data, type, row, meta ) { targets: 1,
return '<div class="thumbnail icon"><img class="square-element text fw " src="' + getDeviceTypeThumb(row.type) + '"/></div>'; data: 'name',
}}, class: 'fade-edge',
{ targets: 1, data: 'name', className: 'fade-edge' , render: function ( name, type, row, meta ) { render: function (name, type, row, meta) {
var model = getPropertyValue(row.properties, 'DEVICE_MODEL'); var model = getPropertyValue(row.properties, 'DEVICE_MODEL');
var vendor = getPropertyValue(row.properties, 'VENDOR'); var vendor = getPropertyValue(row.properties, 'VENDOR');
var html = '<h4>' + name + '</h4>'; var html = '<h4>' + name + '</h4>';
@ -257,11 +249,17 @@ function loadDevices(searchType, searchParam){
html += '<div>(' + vendor + '-' + model + ')</div>'; html += '<div>(' + vendor + '-' + model + ')</div>';
} }
return html; return html;
}}, }
{ targets: 2, data: 'enrolmentInfo.owner', className: 'fade-edge remove-padding-top'}, },
{targets: 2,
data: 'user',
class: 'fade-edge remove-padding-top',
},
{ {
targets: 3, data: 'enrolmentInfo.status', className: 'fade-edge remove-padding-top', targets: 3,
render: function ( status, type, row, meta ) { data: 'status',
class: 'fade-edge remove-padding-top',
render: function (status, type, row, meta) {
var html; var html;
switch (status) { switch (status) {
case 'ACTIVE' : case 'ACTIVE' :
@ -278,72 +276,97 @@ function loadDevices(searchType, searchParam){
break; break;
} }
return html; return html;
}}, }
},
{ {
targets: 4, data: 'type', className: 'fade-edge remove-padding-top', targets: 4,
render: function ( status, type, row, meta ) { data: 'deviceType',
return getDeviceTypeLabel(row.type); class: 'fade-edge remove-padding-top',
render: function (status, type, row, meta) {
return getDeviceTypeLabel(row.deviceType);
} }
}, },
{ {
targets: 5, data: 'enrolmentInfo.ownership', className: 'fade-edge remove-padding-top', targets: 5,
data: 'ownership',
class: 'fade-edge remove-padding-top',
render: function (status, type, row, meta) { render: function (status, type, row, meta) {
if (getDeviceTypeCategory(row.type) == 'mobile') { if (getDeviceTypeCategory(row.deviceType) == 'mobile') {
return row.enrolmentInfo.ownership; return row.enrolmentInfo.ownership;
} else { } else {
return null; return null;
} }
} }
}, },
{ targets: 6, data: 'enrolmentInfo.status' , className: 'text-right content-fill text-left-on-grid-view no-wrap' , {
render: function ( status, type, row, meta ) { targets: 6,
var deviceType = row.type; data: 'status',
class: 'text-right content-fill text-left-on-grid-view no-wrap',
render: function (status, type, row, meta) {
var deviceType = row.deviceType;
var deviceIdentifier = row.deviceIdentifier; var deviceIdentifier = row.deviceIdentifier;
var html = '<span></span>'; var html = '<span></span>';
if (status != 'REMOVED') { if (status != 'REMOVED') {
html = '<a href="device/' + deviceType + '?id=' + deviceIdentifier + '" data-click-event="remove-form"' + html =
' class="btn padding-reduce-on-grid-view"><span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' + '<a href="device/' + deviceType + '?id=' + deviceIdentifier + '" data-click-event="remove-form"'
+
' class="btn padding-reduce-on-grid-view"><span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>'
+
'<i class="fw fw-view fw-stack-1x"></i></span><span class="hidden-xs hidden-on-grid-view">View</span></a>'; '<i class="fw fw-view fw-stack-1x"></i></span><span class="hidden-xs hidden-on-grid-view">View</span></a>';
html += '<a href="device/' + deviceType + '/analytics?deviceId=' + deviceIdentifier + '&deviceName=' + row.name + '" ' + html += '<a href="device/' + deviceType + '/analytics?deviceId=' + deviceIdentifier + '&deviceName='
'data-click-event="remove-form" class="btn padding-reduce-on-grid-view"><span class="fw-stack">' + + row.name + '" ' +
'<i class="fw fw-ring fw-stack-2x"></i><i class="fw fw-statistics fw-stack-1x"></i></span>' + 'data-click-event="remove-form" class="btn padding-reduce-on-grid-view"><span class="fw-stack">'
+
'<i class="fw fw-ring fw-stack-2x"></i><i class="fw fw-statistics fw-stack-1x"></i></span>'
+
'<span class="hidden-xs hidden-on-grid-view">Analytics</span>'; '<span class="hidden-xs hidden-on-grid-view">Analytics</span>';
if (!groupName || !groupOwner) { if (!groupName || !groupOwner) {
html += '<a href="#" data-click-event="remove-form" class="btn padding-reduce-on-grid-view group-device-link" ' + html +=
'data-deviceid="' + deviceIdentifier + '" data-devicetype="' + deviceType + '" data-devicename="' + '<a href="#" data-click-event="remove-form" class="btn padding-reduce-on-grid-view group-device-link" '
+
'data-deviceid="' + deviceIdentifier + '" data-devicetype="' + deviceType
+ '" data-devicename="' +
row.name + '"><span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' + row.name + '"><span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' +
'<i class="fw fw-grouping fw-stack-1x"></i></span>' + '<i class="fw fw-grouping fw-stack-1x"></i></span>' +
'<span class="hidden-xs hidden-on-grid-view">Group</span></a>'; '<span class="hidden-xs hidden-on-grid-view">Group</span></a>';
} }
html += '<a href="#" data-click-event="remove-form" class="btn padding-reduce-on-grid-view edit-device-link" ' + html +=
'data-deviceid="' + deviceIdentifier + '" data-devicetype="' + deviceType + '" data-devicename="' + row.name + '">' + '<a href="#" data-click-event="remove-form" class="btn padding-reduce-on-grid-view edit-device-link" '
+
'data-deviceid="' + deviceIdentifier + '" data-devicetype="' + deviceType
+ '" data-devicename="' + row.name + '">' +
'<span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' + '<span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' +
'<i class="fw fw-edit fw-stack-1x"></i></span>' + '<i class="fw fw-edit fw-stack-1x"></i></span>' +
'<span class="hidden-xs hidden-on-grid-view">Edit</span></a>'; '<span class="hidden-xs hidden-on-grid-view">Edit</span></a>';
html += '<a href="#" data-click-event="remove-form" class="btn padding-reduce-on-grid-view remove-device-link" ' + html +=
'data-deviceid="' + deviceIdentifier + '" data-devicetype="' + deviceType + '" data-devicename="' + row.name + '">' + '<a href="#" data-click-event="remove-form" class="btn padding-reduce-on-grid-view remove-device-link" '
+
'data-deviceid="' + deviceIdentifier + '" data-devicetype="' + deviceType
+ '" data-devicename="' + row.name + '">' +
'<span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' + '<span class="fw-stack"><i class="fw fw-ring fw-stack-2x"></i>' +
'<i class="fw fw-delete fw-stack-1x"></i></span>' + '<i class="fw fw-delete fw-stack-1x"></i></span>' +
'<span class="hidden-xs hidden-on-grid-view">Delete</span>'; '<span class="hidden-xs hidden-on-grid-view">Delete</span>';
} }
return html; return html;
}} }
], }
"createdRow": function( row, data, dataIndex ) { ];
var fnCreatedRow = function (row, data, dataIndex) {
$(row).attr('data-type', 'selectable'); $(row).attr('data-type', 'selectable');
$(row).attr('data-deviceid', data.deviceIdentifier); $(row).attr('data-deviceid', data.deviceIdentifier);
$(row).attr('data-devicetype', data.type); $(row).attr('data-devicetype', data.type);
var model = getPropertyValue(data.properties, 'DEVICE_MODEL'); var model = getPropertyValue(data.properties, 'DEVICE_MODEL');
var vendor = getPropertyValue(data.properties, 'VENDOR'); var vendor = getPropertyValue(data.properties, 'VENDOR');
var owner = data.enrolmentInfo.owner; var owner = data.user;
var status = data.enrolmentInfo.status; var status = data.status;
var ownership = data.enrolmentInfo.ownership; var ownership = data.ownership;
var deviceType = data.type; var deviceType = data.type;
var category = getDeviceTypeCategory(deviceType); var category = getDeviceTypeCategory(deviceType);
$.each($('td', row), function (colIndex) { $.each($('td', row), function (colIndex) {
switch(colIndex) { switch (colIndex) {
case 1: case 1:
$(this).attr('data-search', model + ',' + vendor); $(this).attr('data-search', model + ',' + vendor);
$(this).attr('data-display', model); $(this).attr('data-display', model);
@ -372,12 +395,52 @@ function loadDevices(searchType, searchParam){
break; break;
} }
}); });
}, };
"fnDrawCallback": function( oSettings ) {
var dataFilter = function (data) {
data = JSON.parse(data);
var objects = [];
$(data.devices).each(function (index) {
objects.push(
{
model: getPropertyValue(data.devices[index].properties, "DEVICE_MODEL"),
vendor: getPropertyValue(data.devices[index].properties, "VENDOR"),
user: data.devices[index].enrolmentInfo.owner,
status: data.devices[index].enrolmentInfo.status,
ownership: data.devices[index].enrolmentInfo.ownership,
deviceType: data.devices[index].type,
deviceIdentifier: data.devices[index].deviceIdentifier,
name: data.devices[index].name
}
);
});
var json = {
"recordsTotal": data.count,
"recordsFiltered": data.count,
"data": objects
};
return JSON.stringify(json);
};
$('#device-grid').datatables_extended_serverside_paging(
null,
serviceURL,
dataFilter,
columns,
fnCreatedRow,
function () {
$(".icon .text").res_text(0.2); $(".icon .text").res_text(0.2);
$('#device-grid').removeClass('hidden');
$("#loading-content").remove();
attachDeviceEvents(); attachDeviceEvents();
}, {
"placeholder": "Search By Device Name",
"searchKey": "name"
} }
}); );
$(deviceCheckbox).click(function () { $(deviceCheckbox).click(function () {
addDeviceSelectedClass(this); addDeviceSelectedClass(this);
}); });
@ -403,7 +466,7 @@ $(document).ready(function () {
var permissionList = $("#permission").data("permission"); var permissionList = $("#permission").data("permission");
for (var key in permissionList) { for (var key in permissionList) {
if (permissionList.hasOwnProperty(key)){ if (permissionList.hasOwnProperty(key)) {
$.setPermission(key); $.setPermission(key);
} }
} }
@ -412,8 +475,8 @@ $(document).ready(function () {
/* for device list sorting drop down */ /* for device list sorting drop down */
$(".ctrl-filter-type-switcher").popover({ $(".ctrl-filter-type-switcher").popover({
html : true, html: true,
content : function () { content: function () {
return $("#content-filter-types").html(); return $("#content-filter-types").html();
} }
}); });
@ -423,14 +486,14 @@ $(document).ready(function () {
$("[data-toggle=popover]").popover(); $("[data-toggle=popover]").popover();
$(".ctrl-filter-type-switcher").popover ({ $(".ctrl-filter-type-switcher").popover({
html : true, html: true,
content: function() { content: function () {
return $('#content-filter-types').html(); return $('#content-filter-types').html();
} }
}); });
$('#nav').affix ({ $('#nav').affix({
offset: { offset: {
top: $('header').height() top: $('header').height()
} }
@ -464,7 +527,7 @@ function showPopup() {
function hidePopup() { function hidePopup() {
$(modalPopupContent).html(''); $(modalPopupContent).html('');
$(modalPopup).modal('hide'); $(modalPopup).modal('hide');
$('body').removeClass('modal-open').css('padding-right','0px'); $('body').removeClass('modal-open').css('padding-right', '0px');
$('.modal-backdrop').remove(); $('.modal-backdrop').remove();
} }
@ -483,16 +546,17 @@ function attachDeviceEvents() {
var deviceId = $(this).data("deviceid"); var deviceId = $(this).data("deviceid");
var deviceType = $(this).data("devicetype"); var deviceType = $(this).data("devicetype");
$(modalPopupContent).html($('#group-device-modal-content').html()); $(modalPopupContent).html($('#group-device-modal-content').html());
$('#user-groups').html('<div style="height:100px" data-state="loading" data-loading-text="Loading..." data-loading-style="icon-only" data-loading-inverse="true"></div>'); $('#user-groups').html(
'<div style="height:100px" data-state="loading" data-loading-text="Loading..." data-loading-style="icon-only" data-loading-inverse="true"></div>');
$("a#group-device-yes-link").hide(); $("a#group-device-yes-link").hide();
showPopup(); showPopup();
var serviceURL; var serviceURL;
if ($.hasPermission("LIST_ALL_GROUPS")) { if ($.hasPermission("LIST_ALL_GROUPS")) {
serviceURL = "/devicemgt_admin/groups/all"; serviceURL = "/api/device-mgt/v1.0/groups/all";
} else if ($.hasPermission("LIST_GROUPS")) { } else if ($.hasPermission("LIST_GROUPS")) {
//Get authenticated users groups //Get authenticated users groups
serviceURL = "/devicemgt_admin/groups/user/" + currentUser + "/all"; serviceURL = "/api/device-mgt/v1.0/groups/user/" + currentUser + "/all";
} }
invokerUtil.get(serviceURL, function (data) { invokerUtil.get(serviceURL, function (data) {
@ -507,7 +571,7 @@ function attachDeviceEvents() {
$("a#group-device-yes-link").show(); $("a#group-device-yes-link").show();
$("a#group-device-yes-link").click(function () { $("a#group-device-yes-link").click(function () {
var selectedGroup = $('#assign-group-selector').val(); var selectedGroup = $('#assign-group-selector').val();
serviceURL = "/devicemgt_admin/groups/owner/" + selectedGroup + "/devices"; serviceURL = "/api/device-mgt/v1.0/groups/owner/" + selectedGroup + "/devices";
var device = {"id": deviceId, "type": deviceType}; var device = {"id": deviceId, "type": deviceType};
invokerUtil.post(serviceURL, device, function (data) { invokerUtil.post(serviceURL, device, function (data) {
$(modalPopupContent).html($('#group-associate-device-200-content').html()); $(modalPopupContent).html($('#group-associate-device-200-content').html());
@ -545,7 +609,7 @@ function attachDeviceEvents() {
$("a.remove-device-link").click(function () { $("a.remove-device-link").click(function () {
var deviceId = $(this).data("deviceid"); var deviceId = $(this).data("deviceid");
var deviceType = $(this).data("devicetype"); var deviceType = $(this).data("devicetype");
var serviceURL = "/devicemgt_admin/devices/type/" + deviceType + "/id/" + deviceId; var serviceURL = "/api/device-mgt/v1.0/devices/type/" + deviceType + "/id/" + deviceId;
$(modalPopupContent).html($('#remove-device-modal-content').html()); $(modalPopupContent).html($('#remove-device-modal-content').html());
showPopup(); showPopup();
@ -576,7 +640,7 @@ function attachDeviceEvents() {
var deviceId = $(this).data("deviceid"); var deviceId = $(this).data("deviceid");
var deviceType = $(this).data("devicetype"); var deviceType = $(this).data("devicetype");
var deviceName = $(this).data("devicename"); var deviceName = $(this).data("devicename");
var serviceURL = "/devicemgt_admin/devices/type/" + deviceType + "/id/" + deviceId; var serviceURL = "/api/device-mgt/v1.0/devices/type/" + deviceType + "/id/" + deviceId;
$(modalPopupContent).html($('#edit-device-modal-content').html()); $(modalPopupContent).html($('#edit-device-modal-content').html());
$('#edit-device-name').val(deviceName); $('#edit-device-name').val(deviceName);

@ -54,7 +54,7 @@
<div> <div>
<span id="permission" data-permission="{{permissions.list}}"></span> <span id="permission" data-permission="{{permissions.list}}"></span>
{{#if groupCount}} {{#if groupCount}}
<div class="container-fluid" id="group-listing" data-current-user="{{currentUser.username}}"> <div class="container-fluid" id="group-listing" data-current-user="{{@user.username}}">
<table class="table table-striped table-hover list-table display responsive nowrap data-table table-selectable grid-view" <table class="table table-striped table-hover list-table display responsive nowrap data-table table-selectable grid-view"
id="group-grid"> id="group-grid">
<thead> <thead>

@ -47,24 +47,6 @@
{{/zone}} {{/zone}}
{{#zone "content"}} {{#zone "content"}}
{{!
Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
WSO2 Inc. licenses this file to you under the Apache License,
Version 2.0 (the "License"); you may not use this file except
in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
}}
<div id="loading-content" class="col-centered"> <div id="loading-content" class="col-centered">
{{#if removePermitted}} {{#if removePermitted}}
<input type="hidden" id="can-remove" value="true" /> <input type="hidden" id="can-remove" value="true" />
@ -87,7 +69,7 @@ under the License.
<th colspan="3"></th> <th colspan="3"></th>
</tr> </tr>
</thead> </thead>
<tbody id="ast-container" data-app-context="{{appContext}}"></tbody> <tbody id="ast-container" data-app-context="{{@app.context}}"></tbody>
</table> </table>
</div> </div>
@ -154,7 +136,7 @@ under the License.
{{#zone "bottomJs"}} {{#zone "bottomJs"}}
<!--suppress HtmlUnknownTarget --> <!--suppress HtmlUnknownTarget -->
<script id="role-listing" data-current-user="{{currentUser.username}}" <script id="role-listing" data-current-user="{{@user.username}}"
src="{{@page.publicUri}}/templates/role-listing.hbs" type="text/x-handlebars-template"></script> src="{{@page.publicUri}}/templates/role-listing.hbs" type="text/x-handlebars-template"></script>
{{js "js/role-listing.js"}} {{js "js/role-listing.js"}}
{{/zone}} {{/zone}}

@ -31,7 +31,6 @@ function onRequest(context) {
context["removePermitted"] = true; context["removePermitted"] = true;
} }
context["appContext"] = deviceMgtProps["appContext"];
context["adminRole"] = deviceMgtProps["adminRole"]; context["adminRole"] = deviceMgtProps["adminRole"];
return context; return context;

@ -327,7 +327,7 @@
{{/zone}} {{/zone}}
{{#zone "bottomJs"}} {{#zone "bottomJs"}}
<!--suppress HtmlUnknownTarget --> <!--suppress HtmlUnknownTarget -->
<script id="user-listing" data-current-user="{{currentUser.username}}" <script id="user-listing" data-current-user="{{@user.username}}"
src="{{@page.publicUri}}/templates/listing.hbs" type="text/x-handlebars-template"></script> src="{{@page.publicUri}}/templates/listing.hbs" type="text/x-handlebars-template"></script>
{{js "js/listing.js"}} {{js "js/listing.js"}}
{{/zone}} {{/zone}}

@ -52,7 +52,7 @@ $.fn.datatables_extended_serverside_paging = function (settings , url, dataFilte
filter: false, filter: false,
bSortCellsTop: true, bSortCellsTop: true,
ajax : { ajax : {
url: "/emm/api/data-tables/invoker", url: context + "/api/data-tables/invoker",
data : function (params) { data : function (params) {
var i; var i;
var searchParams = {}; var searchParams = {};

@ -70,7 +70,7 @@
{{css "css/listing-grid.css"}} {{css "css/listing-grid.css"}}
{{/zone}} {{/zone}}
{{#zone "bottomJs"}} {{#zone "bottomJs"}}
<script id="device-listing" data-current-user="{{currentUser.username}}" <script id="device-listing" data-current-user="{{@user.username}}"
src="{{@unit.publicUri}}/templates/listing.hbs" src="{{@unit.publicUri}}/templates/listing.hbs"
type="text/x-handlebars-template"></script> type="text/x-handlebars-template"></script>
<script type="text/javascript"> <script type="text/javascript">

@ -142,7 +142,13 @@ function loadDevices(searchType, searchParam){
} }
} else { } else {
$('#device-grid').addClass('hidden'); $('#device-grid').addClass('hidden');
$('#device-listing-status-msg').text('No device is available to be displayed.'); $('#device-listing-status-msg').html(
'<div class="col-centered text-center"><h3 class="text-muted"><i class="fw fw-mobile fw-3x"></i>' +
'</h3><h3 class="text-muted">No device type is available to be displayed.</h3>' +
'<a href="https://docs.wso2.com/display/IoTS100/Quick+Start+Guide" target="_blank" ' +
'class="btn-operations btn-default"><span class="fw-stack">' +
'<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-document fw-stack-1x"></i></span>' +
'&nbsp;&nbsp;Quick Startup Guide</a></div>');
} }
$(".icon .text").res_text(0.2); $(".icon .text").res_text(0.2);

@ -1,5 +1,5 @@
<tr data-type="selectable" data-deviceid="{{deviceTypeId}}" data-devicetype="{{deviceTypeName}}" <tr data-type="selectable" data-deviceid="{{deviceTypeId}}" data-devicetype="{{deviceTypeName}}"
data-href="{{appContext}}/device/{{deviceTypeName}}/enroll" class="clickable-row"> data-href="{{@app.context}}/device/{{deviceTypeName}}/enroll" class="clickable-row">
<td class="remove-padding icon-only content-fill" data-search="{{deviceCategory}}" data-display="{{deviceCategory}}"> <td class="remove-padding icon-only content-fill" data-search="{{deviceCategory}}" data-display="{{deviceCategory}}">
<div class="thumbnail icon"> <div class="thumbnail icon">
<!--<i class="square-element text fw fw-mobile"></i>--> <!--<i class="square-element text fw fw-mobile"></i>-->
@ -9,7 +9,7 @@
<td class="remove-padding-top" data-search="{{deviceTypeLabel}}" data-display="{{deviceTypeLabel}}"> <td class="remove-padding-top" data-search="{{deviceTypeLabel}}" data-display="{{deviceTypeLabel}}">
{{deviceTypeLabel}}</td> {{deviceTypeLabel}}</td>
<td class="text-right content-fill text-left-on-grid-view no-wrap"> <td class="text-right content-fill text-left-on-grid-view no-wrap">
<a href="{{appContext}}/device/{{deviceTypeName}}/enroll" <a href="{{@app.context}}/device/{{deviceTypeName}}/enroll"
data-click-event="remove-form" class="btn col-md-12"> data-click-event="remove-form" class="btn col-md-12">
<span class="fw-stack"> <span class="fw-stack">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>

@ -17,6 +17,10 @@
*/ */
(function () { (function () {
var deviceId = $(".device-id");
var deviceIdentifier = deviceId.data("deviceid");
var deviceType = deviceId.data("type");
$(document).ready(function () { $(document).ready(function () {
$(".panel-body").removeClass("hidden"); $(".panel-body").removeClass("hidden");
$("#loading-content").remove(); $("#loading-content").remove();
@ -25,10 +29,6 @@
loadOperationsLog(); loadOperationsLog();
} }
if ($('#policies').length) {
loadPolicies();
}
if ($('#policy_compliance').length) { if ($('#policy_compliance').length) {
loadPolicyCompliance(); loadPolicyCompliance();
} }
@ -47,158 +47,157 @@
}); });
function loadOperationsLog(update) { function loadOperationsLog(update) {
var operationsLog = $("#operations-log"); var operationsLogTable = "#operations-log-table";
var deviceListingSrc = operationsLog.attr("src"); if (update) {
var deviceId = operationsLog.data("device-id"); operationTable = $(operationsLogTable).DataTable();
var deviceType = operationsLog.data("device-type"); operationTable.ajax.reload(false);
return;
$.template("operations-log", deviceListingSrc, function (template) {
var serviceURL = "/devicemgt_admin/operations/" + deviceType + "/" + deviceId;
var successCallback = function (data) {
data = JSON.parse(data);
$('#operations-spinner').addClass('hidden');
var viewModel = {};
viewModel.operations = data;
if (data.length > 0) {
var content = template(viewModel);
if (!update) {
$("#operations-log-container").html(content);
$('#operations-log-table').datatables_extended();
} else {
$('#operations-log-table').dataTable().fnClearTable();
for (var i = 0; i < data.length; i++) {
var status;
if (data[i].status == "COMPLETED") {
status = "<span><i class='fw fw-ok icon-success'></i> Completed</span>";
} else if (data[i].status == "PENDING") {
status = "<span><i class='fw fw-warning icon-warning'></i> Pending</span>";
} else if (data[i].status == "ERROR") {
status = "<span><i class='fw fw-error icon-danger'></i> Error</span>";
} else if (data[i].status == "IN_PROGRESS") {
status = "<span><i class='fw fw-ok icon-warning'></i> In Progress</span>";
} }
operationTable = $(operationsLogTable).datatables_extended({
$('#operations-log-table').dataTable().fnAddData([ serverSide: true,
data[i].code, processing: false,
status, searching: false,
data[i].createdTimeStamp ordering: false,
]); pageLength : 10,
order: [],
ajax: {
url: context + "/api/operation/paginate",
data: {deviceId : deviceIdentifier, deviceType: deviceType},
dataSrc: function (json) {
$("#operations-spinner").addClass("hidden");
$("#operations-log-container").empty();
return json.data;
} }
},
columnDefs: [
{targets: 0, data: "code" },
{targets: 1, data: "status", render:
function (status) {
var html;
switch (status) {
case "COMPLETED" :
html = "<span><i class='fw fw-ok icon-success'></i> Completed</span>";
break;
case "PENDING" :
html = "<span><i class='fw fw-warning icon-warning'></i> Pending</span>";
break;
case "ERROR" :
html = "<span><i class='fw fw-error icon-danger'></i> Error</span>";
break;
case "IN_PROGRESS" :
html = "<span><i class='fw fw-ok icon-warning'></i> In Progress</span>";
break;
case "REPEATED" :
html = "<span><i class='fw fw-ok icon-warning'></i> Repeated</span>";
break;
} }
return html;
} }
},
}; {targets: 2, data: "createdTimeStamp", render:
invokerUtil.get(serviceURL, function (date) {
successCallback, function (message) { var value = String(date);
console.log(message); return value.slice(0, 16);
});
});
} }
function loadPolicies() {
var policyList = $("#policy-list");
var policyListingSrc = policyList.attr("src");
var deviceId = policyList.data("device-id");
var deviceType = policyList.data("device-type");
$.template("policy-list", policyListingSrc, function (template) {
var serviceURL = "/devicemgt_admin/policies";
var successCallback = function (data) {
data = JSON.parse(data);
$('#policy-spinner').addClass('hidden');
var policyListFromRestEndpoint = data.responseContent;
if (policyListFromRestEndpoint.length > 0) {
var viewModel = {};
var policyListToView = [];
var i, policyObjectFromRestEndpoint, policyObjectToView;
for (i = 0; i < policyListFromRestEndpoint.length; i++) {
// get list object
policyObjectFromRestEndpoint = policyListFromRestEndpoint[i];
// populate list object values to view-object
policyObjectToView = {};
policyObjectToView["id"] = policyObjectFromRestEndpoint["id"];
policyObjectToView["priorityId"] = policyObjectFromRestEndpoint["priorityId"];
policyObjectToView["name"] = policyObjectFromRestEndpoint["policyName"];
policyObjectToView["platform"] = policyObjectFromRestEndpoint["profile"]["deviceType"]["name"];
policyObjectToView["ownershipType"] = policyObjectFromRestEndpoint["ownershipType"];
policyObjectToView["compliance"] = policyObjectFromRestEndpoint["compliance"];
if (policyObjectFromRestEndpoint["active"] == true && policyObjectFromRestEndpoint["updated"] == true) {
policyObjectToView["status"] = "Active/Updated";
} else if (policyObjectFromRestEndpoint["active"] == true && policyObjectFromRestEndpoint["updated"] == false) {
policyObjectToView["status"] = "Active";
} else if (policyObjectFromRestEndpoint["active"] == false && policyObjectFromRestEndpoint["updated"] == true) {
policyObjectToView["status"] = "Inactive/Updated";
} else if (policyObjectFromRestEndpoint["active"] == false && policyObjectFromRestEndpoint["updated"] == false) {
policyObjectToView["status"] = "Inactive";
}
// push view-objects to list
policyListToView.push(policyObjectToView);
}
viewModel.policies = policyListToView;
var content = template(viewModel);
$("#policy-list-container").html(content);
$('#policy-table').datatables_extended();
} }
}; ],
invokerUtil.get(serviceURL, "createdRow": function(row, data) {
successCallback, function (message) { $(row).attr("data-type", "selectable");
console.log(message); $(row).attr("data-id", data["id"]);
}); $.each($("td", row),
function(colIndex) {
switch(colIndex) {
case 1:
$(this).attr("data-grid-label", "Code");
$(this).attr("data-display", data["code"]);
break;
case 2:
$(this).attr("data-grid-label", "Status");
$(this).attr("data-display", data["status"]);
break;
case 3:
$(this).attr("data-grid-label", "Created Timestamp");
$(this).attr("data-display", data["createdTimeStamp"]);
break;
}
}
);
}
}); });
} }
function loadPolicyCompliance() { function loadPolicyCompliance() {
var policyCompliance = $("#policy-view"); var policyCompliance = $("#policy-view");
var policySrc = policyCompliance.attr("src"); var policyComplianceTemplate = policyCompliance.attr("src");
var deviceId = policyCompliance.data("device-id"); var deviceId = policyCompliance.data("device-id");
var deviceType = policyCompliance.data("device-type"); var deviceType = policyCompliance.data("device-type");
var activePolicy = null; var activePolicy = null;
$.template("policy-view", policySrc, function (template) { $.template(
var serviceURLPolicy = "/devicemgt_admin/policies/" + deviceType + "/" + deviceId + "/active-policy" "policy-view",
var serviceURLCompliance = "/devicemgt_admin/policies/" + deviceType + "/" + deviceId; policyComplianceTemplate,
function (template) {
var successCallbackCompliance = function (data) { var getEffectivePolicyURL = "/api/device-mgt/v1.0/devices/" + deviceType + "/" + deviceId + "/effective-policy";
var getDeviceComplianceURL = "/api/device-mgt/v1.0/devices/" + deviceType + "/" + deviceId + "/compliance-data";
invokerUtil.get(
getEffectivePolicyURL,
// success-callback
function (data, textStatus, jqXHR) {
if (jqXHR.status == 200 && data) {
data = JSON.parse(data);
$("#policy-spinner").addClass("hidden");
if (data["active"] == true) {
activePolicy = data;
invokerUtil.get(
getDeviceComplianceURL,
// success-callback
function (data, textStatus, jqXHR) {
if (jqXHR.status == 200 && data) {
var viewModel = {}; var viewModel = {};
viewModel.policy = activePolicy; viewModel["policy"] = activePolicy;
viewModel.deviceType = deviceType; viewModel["deviceType"] = deviceType;
if (data != null && data.complianceFeatures != null && data.complianceFeatures != undefined && data.complianceFeatures.length > 0) { data = JSON.parse(data);
viewModel.compliance = "NON-COMPLIANT"; var content;
viewModel.complianceFeatures = data.complianceFeatures; if (data["complianceData"]) {
var content = template(viewModel); if (data["complianceData"]["complianceFeatures"] &&
data["complianceData"]["complianceFeatures"].length > 0) {
viewModel["compliance"] = "NON-COMPLIANT";
viewModel["complianceFeatures"] = data["complianceData"]["complianceFeatures"];
content = template(viewModel);
$("#policy-list-container").html(content); $("#policy-list-container").html(content);
} else { } else {
viewModel.compliance = "COMPLIANT"; viewModel["compliance"] = "COMPLIANT";
var content = template(viewModel); content = template(viewModel);
$("#policy-list-container").html(content); $("#policy-list-container").html(content);
$("#policy-compliance-table").addClass("hidden"); $("#policy-compliance-table").addClass("hidden");
} }
} else {
}; $("#policy-list-container").
html("<div class='panel-body'><br><p class='fw-warning'> This device " +
var successCallbackPolicy = function (data) { "has no policy applied.<p></div>");
data = JSON.parse(data);
$('#policy-spinner').addClass('hidden');
if (data != null && data.active == true) {
activePolicy = data;
invokerUtil.get(serviceURLCompliance,
successCallbackCompliance, function (message) {
console.log(message);
});
} }
}; }
},
invokerUtil.get(serviceURLPolicy, // error-callback
successCallbackPolicy, function (message) { function () {
console.log(message); $("#policy-list-container").
}); html("<div class='panel-body'><br><p class='fw-warning'> Loading policy compliance related data " +
}); "was not successful. please try refreshing data in a while.<p></div>");
}
);
}
}
},
// error-callback
function () {
$("#policy-list-container").
html("<div class='panel-body'><br><p class='fw-warning'> Loading policy compliance related data " +
"was not successful. please try refreshing data in a while.<p></div>");
}
);
}
);
} }
}()); }());

@ -23,11 +23,11 @@ function onRequest(context) {
if (deviceType != null && deviceType != undefined && deviceId != null && deviceId != undefined) { if (deviceType != null && deviceType != undefined && deviceId != null && deviceId != undefined) {
var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"];
var device = deviceModule.viewDevice(deviceType, deviceId); var device = deviceModule.viewDevice(deviceType, deviceId)["content"];
if (device) { if (device) {
var viewModel = {}; var viewModel = {};
var deviceInfo = device.properties.DEVICE_INFO; var deviceInfo = (device.properties) ? device.properties.DEVICE_INFO : null;
if (deviceInfo != undefined && String(deviceInfo.toString()).length > 0) { if (deviceInfo != undefined && String(deviceInfo.toString()).length > 0) {
deviceInfo = parse(stringify(deviceInfo)); deviceInfo = parse(stringify(deviceInfo));
if (device.type == "ios") { if (device.type == "ios") {
@ -111,7 +111,6 @@ function onRequest(context) {
} }
} }
log.info(device);
var utility = require("/app/modules/utility.js").utility; var utility = require("/app/modules/utility.js").utility;
var configs = utility.getDeviceTypeConfig(deviceType); var configs = utility.getDeviceTypeConfig(deviceType);
return {"device": device, "label" : configs["deviceType"]["label"]}; return {"device": device, "label" : configs["deviceType"]["label"]};

@ -55,7 +55,7 @@
</div> </div>
{{/zone}} {{/zone}}
{{#zone "bottomJs"}} {{#zone "bottomJs"}}
<script id="notification-listing" data-current-user="{{currentUser.username}}" <script id="notification-listing" data-current-user="{{@user.username}}"
data-image-resource="{{@unit.publicUri}}/images/" src="{{@unit.publicUri}}/templates/notification-listing.hbs" data-image-resource="{{@unit.publicUri}}/images/" src="{{@unit.publicUri}}/templates/notification-listing.hbs"
type="text/x-handlebars-template"></script> type="text/x-handlebars-template"></script>
{{js "js/notification-listing.js"}} {{js "js/notification-listing.js"}}

@ -87,7 +87,7 @@
{{#zone "navbarCollapsableRightItems"}} {{#zone "navbarCollapsableRightItems"}}
<ul id="notification-bubble-wrapper" class="nav navbar-nav navbar-right"> <ul id="notification-bubble-wrapper" class="nav navbar-nav navbar-right">
<li class="visible-inline-block"> <li class="visible-inline-block">
<!--<a href="{{appContext}}notification-listing" title="Failures of operations on the device side will be listed here">--> <!--<a href="{{@app.context}}notification-listing" title="Failures of operations on the device side will be listed here">-->
<a data-toggle="sidebar" data-target="#right-sidebar" data-container=".page-content" <a data-toggle="sidebar" data-target="#right-sidebar" data-container=".page-content"
aria-expanded="false" rel="notifications-sidebar"> aria-expanded="false" rel="notifications-sidebar">
<span class="icon fw-stack"> <span class="icon fw-stack">
@ -105,12 +105,12 @@
data-offset-top="80"> data-offset-top="80">
<ul class="sidebar-messages"> <ul class="sidebar-messages">
</ul> </ul>
<div class="text-center"><a href="{{appContext}}notification-listing" class="btn btn-primary">Show All Notifications</a></div> <div class="text-center"><a href="{{@app.context}}/notification-listing" class="btn btn-primary">Show All Notifications</a></div>
</div> </div>
{{/zone}} {{/zone}}
{{#zone "bottomJs"}} {{#zone "bottomJs"}}
<script id="notifications" data-current-user="{{currentUser.username}}" <script id="notifications" data-current-user="{{@user.username}}"
data-image-resource="{{self.publicURL}}/images/" src="{{self.publicURL}}/templates/notifications.hbs" data-image-resource="{{@unit.publicUri}}/images/" src="{{@unit.publicUri}}/templates/notifications.hbs"
type="text/x-handlebars-template"></script> type="text/x-handlebars-template"></script>
{{js "js/nav-menu.js"}} {{js "js/nav-menu.js"}}
{{/zone}} {{/zone}}

@ -4562,7 +4562,7 @@ a.wr-side-panel-toggle-btn.selected {
position: absolute; position: absolute;
top: 0; top: 0;
bottom: 0; bottom: 0;
left: -900px; left: -1000px;
z-index: 10000; z-index: 10000;
-moz-transition: left 0.4s ease; -moz-transition: left 0.4s ease;
transition: left 0.4s ease 0s; transition: left 0.4s ease 0s;

@ -1820,8 +1820,8 @@
<carbon.api.mgt.version.range>(5.0.0,7.0.0]</carbon.api.mgt.version.range> <carbon.api.mgt.version.range>(5.0.0,7.0.0]</carbon.api.mgt.version.range>
<!-- Carbon Analytics Commons --> <!-- Carbon Analytics Commons -->
<carbon.analytics.common.version>5.0.11</carbon.analytics.common.version> <carbon.analytics.common.version>5.1.3</carbon.analytics.common.version>
<carbon.analytics.common.version.range>[5.0.11,6.0.0)</carbon.analytics.common.version.range> <carbon.analytics.common.version.range>[5.1.3,6.0.0)</carbon.analytics.common.version.range>
<!-- Carbon Registry --> <!-- Carbon Registry -->
<carbon.registry.version>4.5.6</carbon.registry.version> <carbon.registry.version>4.5.6</carbon.registry.version>
@ -1888,7 +1888,8 @@
<!--javax ws rs version--> <!--javax ws rs version-->
<javax.ws.rs.version>2.0.1</javax.ws.rs.version> <javax.ws.rs.version>2.0.1</javax.ws.rs.version>
<swagger.version>1.5.8</swagger.version> <swagger.version>1.5.10</swagger.version>
<swagger.annotations.version>1.5.10</swagger.annotations.version>
<servlet-api.version>2.5</servlet-api.version> <servlet-api.version>2.5</servlet-api.version>
<!--JWT grant type extension feature--> <!--JWT grant type extension feature-->
@ -1898,6 +1899,7 @@
<hibernate-validator.version>5.0.2.Final</hibernate-validator.version> <hibernate-validator.version>5.0.2.Final</hibernate-validator.version>
<javax.xml.parsers.import.pkg.version>[0.0.0,1.0.0)</javax.xml.parsers.import.pkg.version> <javax.xml.parsers.import.pkg.version>[0.0.0,1.0.0)</javax.xml.parsers.import.pkg.version>
<javax.xml.bind.imp.pkg.version>[0.0.0,1.0.0)</javax.xml.bind.imp.pkg.version>
<!-- apache pdfbox version --> <!-- apache pdfbox version -->
<orbit.version.pdfbox>1.8.10.wso2v2</orbit.version.pdfbox> <orbit.version.pdfbox>1.8.10.wso2v2</orbit.version.pdfbox>

Loading…
Cancel
Save