forked from community/device-mgt-core
Merge branch 'master' of https://github.com/wso2/carbon-device-mgt into apim
commit
9a4b904702
19
components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationUtil.java → components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java
19
components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationUtil.java → components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/lifecycle/util/AnnotationProcessor.java
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
*
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
*/
|
||||
package org.wso2.carbon.device.mgt.jaxrs;
|
||||
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
|
||||
public class ApiOriginFilter implements Filter {
|
||||
|
||||
public void doFilter(ServletRequest request, ServletResponse response,
|
||||
FilterChain chain) throws IOException, ServletException {
|
||||
HttpServletResponse res = (HttpServletResponse) response;
|
||||
res.addHeader("Access-Control-Allow-Origin", "*");
|
||||
res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
|
||||
res.addHeader("Access-Control-Allow-Headers", "Content-Type");
|
||||
chain.doFilter(request, response);
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
public void init(FilterConfig filterConfig) throws ServletException {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
*
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.wso2.carbon.device.mgt.jaxrs.api;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.Produces;
|
||||
|
||||
/**
|
||||
* Authentication related REST-API interface.
|
||||
*/
|
||||
@Api(value = "Authentication")
|
||||
@Produces({ "application/json", "application/xml" })
|
||||
@Consumes({ "application/json", "application/xml" })
|
||||
public interface Authentication {
|
||||
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
*
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.wso2.carbon.device.mgt.jaxrs.api.impl;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.Produces;
|
||||
|
||||
/**
|
||||
* Authentication related REST-API implementation.
|
||||
*/
|
||||
@Produces({ "application/json", "application/xml" })
|
||||
@Consumes({ "application/json", "application/xml" })
|
||||
public class AuthenticationImpl {
|
||||
|
||||
private static Log log = LogFactory.getLog(AuthenticationImpl.class);
|
||||
}
|
||||
|
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
*
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
|
||||
package org.wso2.carbon.device.mgt.common.operation.mgt;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
@ApiModel(value = "OperationResponse", description = "This class carries all information related to operation"
|
||||
+ " responses")
|
||||
public class OperationResponse {
|
||||
|
||||
@ApiModelProperty(name = "response", value = "Operation response return from the device", required = true)
|
||||
private String response;
|
||||
@ApiModelProperty(name = "recievedTimeStamp", value = "Time that the operation response received",
|
||||
required = true)
|
||||
private String recievedTimeStamp;
|
||||
|
||||
public String getResponse() {
|
||||
return response;
|
||||
}
|
||||
|
||||
public void setResponse(String response) {
|
||||
this.response = response;
|
||||
}
|
||||
|
||||
public String getRecievedTimeStamp() {
|
||||
return recievedTimeStamp;
|
||||
}
|
||||
|
||||
public void setRecievedTimeStamp(String recievedTimeStamp) {
|
||||
this.recievedTimeStamp = recievedTimeStamp;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||
*
|
||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||
* Version 2.0 (the "License"); you may not use this file except
|
||||
* in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* This class will read the configurations related to task. This task will be responsible for adding the operations.
|
||||
*/
|
||||
package org.wso2.carbon.device.mgt.core.config.deviceType;
|
||||
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
@XmlRootElement(name = "DTDepyloymentConfiguration")
|
||||
public class DTConfiguration {
|
||||
|
||||
private String dtHostAddress;
|
||||
private String dtHostPort;
|
||||
|
||||
@XmlElement(name = "DTHostAddress", required = true)
|
||||
public String getDtHostAddress() {
|
||||
return dtHostAddress;
|
||||
}
|
||||
|
||||
public void setDtHostAddress(String dtHostAddress) {
|
||||
this.dtHostAddress = dtHostAddress;
|
||||
}
|
||||
|
||||
@XmlElement(name = "DTHostPort", required = true)
|
||||
public String getDtHostPort() {
|
||||
return dtHostPort;
|
||||
}
|
||||
|
||||
public void setDtHostPort(String dtHostPort) {
|
||||
this.dtHostPort = dtHostPort;
|
||||
}
|
||||
|
||||
|
||||
}
|
28
components/device-mgt/org.wso2.carbon.device.mgt.extensions/src/main/java/org/wso2/carbon/device/mgt/extensions/feature/mgt/util/AnnotationUtil.java → components/device-mgt/org.wso2.carbon.device.mgt.extensions/src/main/java/org/wso2/carbon/device/mgt/extensions/feature/mgt/util/AnnotationProcessor.java
28
components/device-mgt/org.wso2.carbon.device.mgt.extensions/src/main/java/org/wso2/carbon/device/mgt/extensions/feature/mgt/util/AnnotationUtil.java → components/device-mgt/org.wso2.carbon.device.mgt.extensions/src/main/java/org/wso2/carbon/device/mgt/extensions/feature/mgt/util/AnnotationProcessor.java
@ -0,0 +1,38 @@
|
||||
<module name="utils" xmlns="http://wso2.org/projects/jaggery/module.xml">
|
||||
<script>
|
||||
<name>reflection</name>
|
||||
<path>scripts/reflection/reflection.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>file</name>
|
||||
<path>scripts/file/file.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>patterns</name>
|
||||
<path>scripts/patterns/patterns.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>xml</name>
|
||||
<path>scripts/xml/xml.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>request</name>
|
||||
<path>scripts/request/request.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>response</name>
|
||||
<path>scripts/response/response.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>time</name>
|
||||
<path>scripts/time/time.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>url</name>
|
||||
<path>scripts/url/url.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>exception</name>
|
||||
<path>scripts/exception/exception.js</path>
|
||||
</script>
|
||||
</module>
|
@ -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))
|
||||
|
@ -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;
|
||||
};
|
||||
}());
|
@ -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;
|
||||
|
||||
}());
|
@ -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;
|
||||
};
|
||||
}());
|
@ -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))
|
@ -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))
|
@ -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));
|
@ -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));
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
}());
|
@ -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);\
|
||||
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);\
|
Loading…
Reference in new issue