diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Group.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Group.java
index cc8ce89039..3f50b33596 100644
--- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Group.java
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/api/Group.java
@@ -35,10 +35,8 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import java.util.List;
-/**
- *
- */
-@Api(value = "Group")
+@Path("/groups")
+@Api(value = "Group", description = "Group related operations such as get all the available groups, etc.")
@SuppressWarnings("NonJaxWsWebServices")
public interface Group {
@@ -59,7 +57,7 @@ public interface Group {
@GET
@Produces("application/json")
- Response getGroups(@QueryParam("start") int startIndex, @PathParam("length") int length);
+ Response getGroups(@QueryParam("start") int startIndex, @QueryParam("length") int length);
@Path("/all")
@GET
@@ -119,8 +117,7 @@ public interface Group {
@PUT
@Produces("application/json")
Response addSharing(@QueryParam("shareUser") String shareUser, @PathParam("groupName") String groupName,
- @PathParam("owner") String owner, @PathParam("roleName") String roleName,
- @FormParam("permissions") String[] permissions);
+ @PathParam("owner") String owner, @PathParam("roleName") String roleName, String[] permissions);
@DELETE
@Path("/owner/{owner}/name/{groupName}/share/roles/{roleName}/permissions")
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/assembly/src.xml b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/assembly/src.xml
index 36997aa718..c9805f8946 100644
--- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/assembly/src.xml
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/assembly/src.xml
@@ -29,12 +29,17 @@
${basedir}/src/main/resources/jaggeryapps/devicemgt
- /
+ /jaggeryapps/devicemgt-cdmf/
true
${basedir}/src/main/resources/jaggeryapps/uuf-template-app
- /
+ /jaggeryapps/devicemgt-cdmf/
+ true
+
+
+ ${basedir}/src/main/resources/jaggery-modules
+ /jaggery-modules/
true
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/module.xml b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/module.xml
new file mode 100644
index 0000000000..485112332c
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/module.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/exception/exception.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/exception/exception.js
new file mode 100644
index 0000000000..a80361dec0
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/exception/exception.js
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) WSO2 Inc. (http://wso2.com) All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Description: The response of the currently invoked api enpoint is organized
+ */
+
+var exception = {};
+var log = new Log('exception_module');
+
+(function(exception) {
+ /**
+ *
+ * @param message The exception description
+ * @param code HTTP STATUS CODE related to the exception
+ * @return The error object
+ */
+ exception.buildExceptionObject = function(message, code) {
+ var error = {};
+ error.message = message;
+ error.code = code;
+ return error;
+ };
+
+ exception.handleError = function (exception, type, code){
+ var constants = require('rxt').constants;
+
+ if (type == constants.THROW_EXCEPTION_TO_CLIENT) {
+ log.debug(exception);
+ var e = exceptionModule.buildExceptionObject(exception, code);
+ throw e;
+ } else if (type == constants.LOG_AND_THROW_EXCEPTION) {
+ log.error(exception);
+ throw exception;
+ } else if (type == constants.LOG_EXCEPTION_AND_TERMINATE) {
+ log.error(exception);
+ var msg = 'An error occurred while serving the request!';
+ var e = exceptionModule.buildExceptionObject(msg, constants.STATUS_CODES.INTERNAL_SERVER_ERROR);
+ throw e;
+ } else if (type == constants.LOG_EXCEPTION_AND_CONTINUE) {
+ log.debug(exception);
+ }
+ else {
+ log.error(exception);
+ throw e;
+ }
+ };
+}(exception))
+
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/file/file.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/file/file.js
new file mode 100644
index 0000000000..f3aa6578f5
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/file/file.js
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+var file = {};
+(function() {
+ var log = new Log('utils-file');
+ var CONTENT_MAP = {
+ 'js': 'application/javascript',
+ 'css': 'text/css',
+ 'csv': 'text/csv',
+ 'html': 'text/html',
+ 'json': 'application/json',
+ 'png': 'image/png',
+ 'jpeg': 'image/jpeg',
+ 'gif': 'image/gif',
+ 'svg': 'image/svg+xml',
+ 'ttf': 'application/x-font-ttf',
+ 'eot': 'application/vnd.ms-fontobject',
+ 'woff': 'application/font-woff',
+ 'otf': 'application/x-font-otf',
+ 'zip': 'application/zip',
+ 'xml': 'text/xml',
+ 'xhtml': 'application/xhtml+xml',
+ 'pdf': 'application/pdf'
+ };
+ /**
+ * The function checks whether a directory contains a particular file
+ * @param dir The directory in which the file must be checked
+ * @param file A File object if the file exists,else null
+ */
+ file.getFileInDir = function(dir, fileName) {
+ var isFilePresent = false;
+ var files = dir.listFiles();
+ for (var index in files) {
+ if (files[index].getName() == fileName) {
+ return files[index];
+ }
+ }
+ return null;
+ };
+ /**
+ * The function returns the file extension of a filename
+ * @param file
+ * @return: The extension of the file
+ */
+ file.getExtension = function(file) {
+ var baseFileName = file.getName();
+ //Break up the name by .
+ var baseNameComponents = baseFileName.split('.');
+ var extension = baseNameComponents[baseNameComponents.length - 1];
+ return extension;
+ };
+ /**
+ * The function obtains the MIME type based on the extension
+ * @param The extension
+ * @return The mime type
+ */
+ file.getMimeType = function(extension) {
+ return CONTENT_MAP[extension];
+ };
+ /**
+ * The function returns the name of the file without the file extension
+ * @param file A file object
+ * @return: The name of the file without the extension
+ */
+ file.getFileName = function(file) {
+ //Get the name of the file
+ var baseFileName = file.getName();
+ //Break up the name by .
+ var baseNameComponents = baseFileName.split('.');
+ //Get all of the components except the last one
+ baseNameComponents.splice(baseNameComponents.length - 1, 1);
+ return baseNameComponents.join('.');
+ };
+ /**
+ * The function returns the contents of a directory as a JSON object.The name of the
+ * file is used as the property names without the extensions.
+ * NOTE: The method will not traverse sub folders.
+ * @param The directory to be inspected
+ * @return A JSON object which contains the files in the directory
+ */
+ file.getDirectoryContents = function(dir) {
+ var dirContents = {};
+ //Check if it is a directory
+ if (!dir.isDirectory()) {
+ log.info('Not a directory');
+ return dirContents;
+ }
+ //Obtain a list of all files
+ var files = this.getAllFiles(dir);
+ var name;
+ log.info('Files: ' + files);
+ //Create the directory object with each file been a property
+ for (var index in files) {
+ dirContents[this.getFileName(files[index])] = files[index];
+ }
+ return dirContents;
+ };
+ /**
+ * The function obtains a list of files that are not directories
+ * @param dir The directory to be inspected
+ * @return An array with all of the files in the directory
+ */
+ file.getAllFiles = function(dir) {
+ var filesInDir = [];
+ if (!dir.isDirectory()) {
+ return filesInDir;
+ }
+ //Obtain a list of all files
+ var files = dir.listFiles();
+ for (var index in files) {
+ log.info('Checking file: ' + files[index].getName());
+ //Check if the file is a directory
+ if (!files[index].isDirectory()) {
+ filesInDir.push(files[index]);
+ }
+ }
+ return filesInDir;
+ };
+ /**
+ * The function returns a list of all file names in a directory
+ * @param dir The directory to be inspected
+ * @return {An array containing the name of all files in a directory
+ */
+ file.getAllFileNames = function(dir) {
+ var files = dir.listFiles();
+ var list = [];
+ var fileName;
+ for (var index in files) {
+ if (files[index].isDirectory()) {
+ fileName=this.getFileName(files[index].getName());
+ list.push(fileName);
+ }
+ }
+ return list;
+ };
+ /**
+ * The function returns a list of all sub directories in a given directory
+ * @param dir The root directory
+ * @return: An array containing all sub directories
+ */
+ file.getAllSubDirs = function(dir) {
+ var files = dir.listFiles();
+ var subDirs = [];
+ for (var index in files) {
+ if (files[index].isDirectory()) {
+ subDirs.push(files[index]);
+ }
+ }
+ return subDirs;
+ };
+}());
\ No newline at end of file
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/patterns/patterns.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/patterns/patterns.js
new file mode 100644
index 0000000000..f0e55bb254
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/patterns/patterns.js
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+var patterns = {};
+
+(function () {
+
+ var DEF_ERR_ARITY = 3;
+ var DEF_HANDLE_ARITY = 2;
+ var log = new Log('utils.patterns.GenericPipe');
+
+ function GenericPipe(options) {
+ this.errHandlerArity = DEF_ERR_ARITY || options.errArity;
+ this.handlerArity = DEF_HANDLE_ARITY || options.handlerArity;
+ this.plugins = [];
+ this.finalHandler = function () {
+ };
+ }
+
+
+ /**
+ *The function registers the provided plugin
+ */
+ GenericPipe.prototype.plug = function (plugin, options) {
+ var options = options || {};
+ //Only a function
+ if (plugin instanceof Function) {
+ this.plugins.push({
+ handle: plugin,
+ options: options
+ });
+ }
+ //Is it a plugin object
+ else if (plugin instanceof Object) {
+ plugin.options = options;
+ this.plugins.push(plugin);
+ }
+
+ return this;
+ };
+
+ GenericPipe.prototype.finally = function (plugin) {
+ this.finalHandler = plugin;
+ return this;
+ };
+
+ GenericPipe.prototype.resolve = function (data, req, res, session) {
+ var context = {};
+ context.req = req;
+ context.res = res;
+ context.session = session;
+ context.data = data;
+ handle(context, this.plugins, this.errHandlerArity, this.handlerArity, this.finalHandler);
+ };
+
+ var handle = function (context, plugins, errArity, handlerArity, finallyHandler) {
+ var index = 0;
+ var currentPlugin;
+
+ var recursiveHandle = function (err) {
+
+ currentPlugin = plugins[index];
+
+ index++;
+
+ //Check if there is a plugin
+ if (!currentPlugin) {
+ //log.warn('No plugin found at index: ' + index);
+ return;
+ }
+
+ //Populate the options object for the plugin
+ context.options=currentPlugin.options;;
+
+ //Check if an error has been provided
+ if (err) {
+ //Can the current plugin handle the err
+ if (currentPlugin.handle.length == errArity) {
+ try {
+ currentPlugin.handle(err, context,recursiveHandle);
+ }
+ catch (e) {
+ recursiveHandle(e);
+ }
+ }
+ else {
+ recursiveHandle(err);
+ }
+ }
+ //There is no error so try to invoke the current plugin
+ else {
+ if (currentPlugin.handle.length == handlerArity) {
+ try {
+
+
+ currentPlugin.handle(context,recursiveHandle);
+ } catch (e) {
+ recursiveHandle(e);
+ }
+ }
+ else {
+ recursiveHandle();
+ }
+ }
+ };
+
+ recursiveHandle();
+ finallyHandler(context);
+ };
+
+ patterns.GenericPipe = GenericPipe;
+
+}());
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/reflection/reflection.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/reflection/reflection.js
new file mode 100644
index 0000000000..77ff58d49e
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/reflection/reflection.js
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+var reflection = {};
+/**
+ * Description: The script encapsulates any reflection related utility functions
+ */
+(function() {
+ var log = new Log('utils-reflection');
+ reflection.copyPropKeys = function(from, to) {
+ for (var key in from) {
+ if (from.hasOwnProperty(key)) {
+ to[key] = '';
+ }
+ }
+ return to;
+ };
+ /**
+ * The function recursively copies all property keys in an object
+ * @param from
+ * @param to
+ */
+ reflection.copyAllPropKeys = function(from, to) {
+ recurse(from, to, function(from, to, key) {
+ if (from[key] instanceof Object) {
+ to[key] = from[key];
+ } else {
+ to[key] = null;
+ }
+ });
+ };
+ reflection.copyAllPropValues = function(from, to) {
+ recurse(from, to, function(from, to, key) {
+ //Create an instance if the property does not exist
+ if (!to[key]) {
+ to[key] = {};
+ }
+ //Copy the values over
+ if (!(from[key] instanceof Object)) {
+ to[key] = from[key];
+ } else {
+ log.debug('Not copying values of key: ' + key);
+ }
+ });
+ };
+ /**
+ * The function will only copy public properties
+ * @param from
+ * @param to
+ */
+ reflection.copyPublicPropValues = function(from, to) {
+ recurse(from, to, function(from, to, key) {
+ //Ignore any hidden properties
+ if (key.charAt(0) == '_') {
+ log.warn('Drop key: ' + key);
+ return;
+ }
+ //Create an instance if the property does not exist
+ if (!to[key]) {
+ to[key] = {};
+ }
+ //Copy the values over
+ if (!(from[key] instanceof Object)) {
+ to[key] = from[key];
+ } else {
+ log.warn('Not copying values of key: ' + key);
+ }
+ });
+ };
+ reflection.inspect = function(from, to, cb) {
+ recurse(from, to, cb);
+ };
+ /**
+ * The function recursively traverses an object and then invokes the provided
+ * callback
+ * @param root
+ * @param clone
+ * @param cb
+ */
+ var recurse = function(root, clone, cb) {
+ var key;
+ //Check if the root is an object
+ if (!(root instanceof Object)) {
+ return;
+ } else {
+ var keys = Object.keys(root);
+ //Go through all the other keys in the current root
+ for (var index in keys) {
+ key = keys[index];
+ cb(root, clone, key);
+ recurse(root[key], clone[key], cb);
+ }
+ }
+ };
+ reflection.copyProps = function(from, to) {
+ for (var key in from) {
+ if (from.hasOwnProperty(key)) {
+ to[key] = from[key];
+ }
+ }
+ return to;
+ };
+ reflection.getProps = function(obj) {
+ var props = {};
+ for (var key in obj) {
+ if (!(obj[key] instanceof Function)) {
+ props[key] = obj[key];
+ }
+ }
+ return props;
+ };
+ reflection.printProps = function(obj) {
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ log.info('key: ' + key);
+ }
+ }
+ };
+ /**
+ * The function determines if a property is hidden based on _
+ * @param key
+ * @returns {boolean}
+ */
+ reflection.isHiddenProp = function(key) {
+ if (key == '') {
+ return false;
+ }
+ return (key.charAt(0) == '_') ? true : false;
+ };
+ var getDiff = function(a, b, diff) {};
+ /**
+ * The function calculates the differences between two simple JSON objects
+ * @param a The object with which b is compared
+ * @param b The target of the comparison
+ * @return An object which records the differences between the two objects
+ */
+ reflection.diff = function(a, b) {};
+ /**
+ * The function merges the two provided objects to create a new
+ * object.In the case where b has the same property as a; the property of b
+ * will have precedence
+ * @param {[type]} a [description]
+ * @param {[type]} b [description]
+ * @return A new object having the properties of both object a and b
+ */
+ reflection.merge = function(a, b) {
+ var newObj = {};
+ //Copy the properties of a first
+ for (var key in a) {
+ newObj[key] = b[key];
+ }
+ //Override with the properties of b
+ for (var key in b) {
+ newObj[key] = b[key];
+ }
+ return newObj;
+ };
+ /**
+ * The function allows a child class to override a select set of methods of
+ * a parent class.The original methods of the parent can be accessed
+ * using the this._super keyword
+ * @param {[type]} parent The parent class instance to be overriden
+ * @param {[type]} child The child class instance containing methods which will override the parent
+ */
+ reflection.override = function(parent, child) {
+ //Make a clone of the parent
+ var super = parse(stringify(parent));
+ for (var childKey in child) {
+ for (var parentKey in parent) {
+ //Only override those methods that are common
+ if (childKey === parentKey) {
+ var parentPtr = parent[parentKey];
+ var childPtr = child[childKey];
+ //Update the clone with the old parent method
+ super[parentKey] = parentPtr;
+ parent[parentKey] = childPtr;
+ /*parent[parentKey] = function() {
+ var result=childPtr.apply(this, arguments)||null;
+ return result;
+ };*/
+ }
+ }
+ }
+ //Allow the child object to call methods of the parent
+ parent._super = super;
+ };
+ reflection.overrideAll=function(parent,child){
+ //Make a clone of the parent
+ var super = parse(stringify(parent));
+ for (var childKey in child) {
+ for (var parentKey in parent) {
+ //Only override those methods that are common
+ if ( (child.hasOwnProperty(childKey))&&(parent.hasOwnProperty(parentKey)) ) {
+ var parentPtr = parent[parentKey];
+ var childPtr = child[childKey];
+ //Update the clone with the old parent method
+ super[parentKey] = parentPtr;
+ parent[parentKey] = childPtr;
+ /*parent[parentKey] = function() {
+ var result=childPtr.apply(this, arguments)||null;
+ return result;
+ };*/
+ }
+ }
+ }
+ //Allow the child object to call methods of the parent
+ parent._super = super;
+ };
+ reflection.isArray = function(object) {
+ if (Object.prototype.toString.call(object) === '[object Array]') {
+ return true;
+ }
+ return false;
+ };
+}());
\ No newline at end of file
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/request/request.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/request/request.js
new file mode 100644
index 0000000000..4218da70fd
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/request/request.js
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+var request = {};
+(function(request) {
+ var hasOwnProperty = function(obj, element) {
+ return Object.prototype.hasOwnProperty.call(obj, element);
+ };
+ var isObject = function(object) {;
+ return typeof object === 'object';
+ };
+ /*
+ * ECMA Standard (ECMA-262 : 5.1 Edition)*/
+ var decodes = function(encodedURI) {
+ return decodeURIComponent(encodedURI);
+ };
+ request.getQueryOptions = function(queryString) {
+ var opt={};
+ var sep = opt.sep || '&',
+ assign = opt.assign || '=',
+ compoArray = [];
+ var obj = {};
+ var decodedURI = decodes(queryString);
+ decodedURI.split(sep).forEach(function(comp) {
+ comp.split(assign).some(function(element, index, array) {
+ if (hasOwnProperty(obj, element.toString())) {
+ compoArray.push(obj[element]);
+ compoArray.push(array[1]);
+ obj[element] = compoArray;
+ } else {
+ Object.defineProperty(obj, element, {
+ enumerable: true,
+ writable: true,
+ value: array[1]
+ });
+ }
+ return true;
+ });
+ });
+ return obj;
+ };
+}(request))
\ No newline at end of file
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/response/response.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/response/response.js
new file mode 100644
index 0000000000..a8dae44247
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/response/response.js
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) WSO2 Inc. (http://wso2.com) All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Description: The response of the currently invoked api endpoint is organized
+ */
+
+var response = {};
+var log = new Log("response");
+
+(function(response) {
+
+ /**
+ * Build Error response
+ * @param resp jaggery-response object to retrieve to client
+ * @param code status code
+ * @param message message to the client side
+ * @return return response
+ */
+ response.buildErrorResponse = function(resp,code,message) {
+ var content={};
+ content.error = message;
+ resp = processResponse(resp,code,content);
+ return resp;
+ };
+
+ /**
+ * Build success response
+ * @param resp jaggery response object
+ * @param code status code
+ * @param data the result to client
+ * @return return response
+ */
+ response.buildSuccessResponse= function(resp, code, data){
+ var content={};
+ content.data = data;
+ resp = processResponse(resp,code,content);
+ return resp;
+ };
+
+ /**
+ * process General response
+ * @param resp jaggery response
+ * @param code status code
+ * @param data success result
+ * @return resp jaggery response
+ */
+ response.buildSuccessResponseForRxt= function(resp, code, data){
+ resp.status = code;
+ resp.content = data;
+ return resp;
+ };
+
+ /**
+ * General response builder
+ * @param resp jaggery response
+ * @param code status code
+ * @param content what ever the content to be sent as response
+ * @return resp jaggery response
+ */
+ function processResponse(resp, code, content){
+ resp.status = code;
+ resp.contentType = 'application/json';
+ resp.content = content;
+ return resp;
+
+ };
+
+ /**
+ *
+ * @param resp
+ * @param code
+ * @param data
+ * @return The http response
+ */
+ response.buildSuccessResponseForRxt= function(resp, code, data){
+ resp.contentType = 'application/json';
+ resp.status = code;
+ resp.content = data;
+ return resp;
+ };
+
+}(response))
\ No newline at end of file
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/time/time.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/time/time.js
new file mode 100644
index 0000000000..142d4fa73c
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/time/time.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+var time = {};
+(function(time) {
+ time.getCurrentTime = function(dateLength) {
+ var dateLength=dateLength||20;
+ var now = new String(new Date().valueOf());
+ var length = now.length;
+ var prefix = dateLength;
+ var onsetVal = '';
+ if (length != prefix) {
+ var onset = prefix - length;
+ for (var i = 0; i < onset; i++) {
+ onsetVal += '0';
+ }
+ }
+ return onsetVal + now;
+ };
+}(time));
\ No newline at end of file
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/url/url.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/url/url.js
new file mode 100644
index 0000000000..5f8154607a
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/url/url.js
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+var url = {};
+(function() {
+ var log=new Log('utils-url');
+ url.popServerDetails = function(obj) {
+ var process = require('process');
+ var localIP = process.getProperty('server.host');
+ var httpPort = process.getProperty('http.port');
+ var httpsPort = process.getProperty('https.port');
+ var value = '';
+ var carbonLocalIP = process.getProperty('carbon.local.ip');
+
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ value = obj[key];
+ if ((typeof value === 'string') && value.indexOf('%https.host%') > -1) {
+ value=value.replace('%https.host%', 'https://' + localIP + ':' + httpsPort);
+ } else if ((typeof value === 'string') && value.indexOf('%http.host%') > -1) {
+ value=value.replace('%http.host%', 'http://' + localIP + ':' + httpPort);
+ } else if ((typeof value === 'string') && value.indexOf('%https.carbon.local.ip%') > -1) {
+ value=value.replace('%https.carbon.local.ip%', 'https://' + carbonLocalIP + ':' + httpsPort);
+ } else if ((typeof value === 'string') && value.indexOf('%http.carbon.local.ip%') > -1) {
+ value=value.replace('%http.carbon.local.ip%', 'http://' + carbonLocalIP + ':' + httpPort);
+ }
+ obj[key] = value;
+ }
+ }
+ return obj;
+ };
+}(url));
\ No newline at end of file
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/xml/xml.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/xml/xml.js
new file mode 100644
index 0000000000..7caefe9d07
--- /dev/null
+++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggery-modules/utils/scripts/xml/xml.js
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * WSO2 Inc. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+var xml = {};
+
+(function () {
+
+ var log=new Log('util.xml')
+
+ /*
+ The method is used to create a JSON object using
+ an xml object.
+ @xmlElement: An xml element object to be processed
+ @return: A pseudo object containing the properties of the
+ xml element.
+ */
+ var createJSONObject = function (xmlElement) {
+
+ var pseudo = {};
+
+ //Extract all attributes
+ var attributes = xmlElement.@*;
+
+ //Fill the pseudo object with the attributes of the element
+ for (var attributeKey in attributes) {
+ var attribute = attributes[attributeKey];
+ pseudo[attribute.localName()] = attribute.toString();
+ }
+
+ return pseudo;
+ };
+
+ /*
+ The function converts an E4X Xml object to a JSON object
+ This function has been adapted from the work of Oleg Podsechin available at
+ https://gist.github.com/olegp/642667
+ It uses a slightly modified version of his algorithm , therefore
+ all credit should be attributed to Oleg Podsechin.
+ IMPORTANT:
+ 1. It does not create a 1..1 mapping due to the differences
+ between Xml and JSON.It is IMPORTANT that you verify the structure
+ of the object generated before using it.
+ 2. The input xml object must not contain the xml header information
+ This is a known bug 336551 (Mozilla Developer Network)
+ Source: https://developer.mozilla.org/en/docs/E4X
+ Please remove the header prior to sending the xml object for processing.
+ @root: A starting element in an E4X Xml object
+ @return: A JSON object mirroring the provided Xml object
+ */
+ var recursiveConvertE4XtoJSON = function (root) {
+
+ log.debug('Root: ' + root.localName());
+
+ //Obtain child nodes
+ var children = root.*;
+
+ //The number of children
+ var numChildren = children.length();
+
+ //No children
+ if (numChildren == 0) {
+
+ //Extract contents
+ return createJSONObject(root);
+ }
+ else {
+
+ //Create an empty object
+ var rootObject = createJSONObject(root);
+
+ //Could be multiple children
+ for (var childElementKey in children) {
+
+ var child = children[childElementKey];
+
+ log.debug('Examining child: ' + child.localName());
+
+ //If the child just contains a single value then stop
+ if (child.localName() == undefined) {
+
+ log.debug('Child is undefined: ' + child.toString());
+
+ //Change the object to just a key value pair
+ rootObject[root.localName()] = child.toString();
+ return rootObject;
+ }
+
+ //Make a recursive call to construct the child element
+ var createdObject = recursiveConvertE4XtoJSON(child);
+
+ log.debug('Converted object: ' + stringify(createdObject));
+
+ //Check if the root object has the property
+ if (rootObject.hasOwnProperty(child.localName())) {
+
+ log.debug('key: ' + child.localName() + ' already present.');
+ rootObject[child.localName()].push(createdObject);
+ }
+ else {
+
+ log.debug('key: ' + child.localName() + ' not present.');
+ rootObject[child.localName()] = [];
+ rootObject[child.localName()].push(createdObject);
+
+ }
+ }
+
+ log.debug('root: ' + root.localName());
+
+ return rootObject;
+ }
+ };
+
+ /**
+ * The function is used to convert an E4X xml to JSON
+ * @param root
+ */
+ xml.convertE4XtoJSON = function (root) {
+ return recursiveConvertE4XtoJSON(root);
+ };
+
+
+}());
diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/pom.xml
index 883cc9f3c3..d00f2d3213 100644
--- a/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/pom.xml
+++ b/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/pom.xml
@@ -57,7 +57,7 @@
zip
true
- ${project.build.directory}/maven-shared-archive-resources/jaggeryapps/devicemgt-cdmf
+ ${project.build.directory}/maven-shared-archive-resources
**/*
diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/src/main/resources/p2.inf b/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/src/main/resources/p2.inf
index d4cb94274f..47e5f30872 100644
--- a/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/src/main/resources/p2.inf
+++ b/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/src/main/resources/p2.inf
@@ -1,3 +1,4 @@
instructions.configure = \
org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt-cdmf);\
-org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.ui_${feature.version}/jaggeryapps/devicemgt-cdmf,target:${installFolder}/../../deployment/server/jaggeryapps/devicemgt-cdmf,overwrite:true);\
\ No newline at end of file
+org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.ui_${feature.version}/jaggeryapps/devicemgt-cdmf,target:${installFolder}/../../deployment/server/jaggeryapps/devicemgt-cdmf,overwrite:true);\
+org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.device.mgt.ui_${feature.version}/jaggery-modules/utils/,target:${installFolder}/../../modules/utils,overwrite:true);\
\ No newline at end of file