forked from community/product-iots
Merge pull request #187 from ayyoob/merge-prod
few changes after apimgt version upgradeapplication-manager-new
commit
f9ad68f7be
@ -0,0 +1,46 @@
|
||||
#
|
||||
# Copyright (c) 2005-2010, 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.
|
||||
#
|
||||
|
||||
# This file contains the configuration parameters used by the Non-blocking HTTP transport
|
||||
|
||||
#http.socket.timeout=60000
|
||||
#http.socket.buffer-size=8192
|
||||
#http.tcp.nodelay=1
|
||||
#http.connection.stalecheck=0
|
||||
|
||||
# Uncomment the following property for an AIX based deployment
|
||||
#http.nio.interest-ops-queueing=true
|
||||
|
||||
# HTTP Sender thread pool parameters
|
||||
#snd_t_core=20
|
||||
#snd_t_max=100
|
||||
#snd_alive_sec=5
|
||||
#snd_qlen=-1
|
||||
#snd_io_threads=2
|
||||
|
||||
# HTTP Listener thread pool parameters
|
||||
#lst_t_core=20
|
||||
#lst_t_max=100
|
||||
#lst_alive_sec=5
|
||||
#lst_qlen=-1
|
||||
#lst_io_threads=2
|
||||
nhttp.rest.dispatcher.service=__MultitenantDispatcherService
|
||||
|
||||
rest_uri_api_regex=\\w+://.+:\\d+/t/.*|\\w+://.+\\w+/t/.*|^(/t/).*
|
||||
rest_uri_proxy_regex=\\w+://.+:\\d+/services/t/.*|\\w+://.+\\w+/services/t/.*|^(/services/t/)
|
||||
|
||||
# This property is crucial for automated tests
|
||||
http.socket.reuseaddr=true
|
@ -0,0 +1,51 @@
|
||||
#
|
||||
# Copyright (c) 2005-2010, 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.
|
||||
#
|
||||
|
||||
## This file contains the configuration parameters used by the Pass-through HTTP transport
|
||||
|
||||
## Nhttp tuning parameters
|
||||
#http.socket.timeout=60000
|
||||
#http.connection.timeout=0
|
||||
#http.socket.buffer-size=8192
|
||||
#http.socket.linger=-1
|
||||
#http.nio.select-interval=1000
|
||||
#http.tcp.nodelay=true
|
||||
#http.connection.stalecheck=false
|
||||
#http.socket.reuseaddr=false
|
||||
|
||||
## Uncomment the following for AIX based deployments
|
||||
#http.nio.interest-ops-queueing=true
|
||||
|
||||
## Pass-through HTTP transport specific tuning parameters
|
||||
worker_pool_size_core=400
|
||||
worker_pool_size_max=500
|
||||
#worker_thread_keepalive_sec=60
|
||||
#worker_pool_queue_length=-1
|
||||
#io_threads_per_reactor=2
|
||||
io_buffer_size=16384
|
||||
#http.max.connection.per.host.port=32767
|
||||
|
||||
## Other parameters
|
||||
#http.user.agent.preserve=false
|
||||
#http.server.preserve=true
|
||||
#http.connection.disable.keepalive=false
|
||||
|
||||
# URI configurations that determine if it requires custom rest dispatcher
|
||||
rest_uri_api_regex=\\w+://.+:\\d+/t/.*|\\w+://.+\\w+/t/.*|^(/t/).*
|
||||
rest_uri_proxy_regex=\\w+://.+:\\d+/services/t/.*|\\w+://.+\\w+/services/t/.*|^(/services/t/)
|
||||
|
||||
# This property is crucial for automated tests
|
||||
http.socket.reuseaddr=true
|
Binary file not shown.
@ -1,897 +0,0 @@
|
||||
<%
|
||||
var site = require("/site/conf/site.json");
|
||||
//TODO : remove this when log configs are implemented
|
||||
//Log.prototype.isDebugEnabled = function () {
|
||||
// return false;
|
||||
//};
|
||||
|
||||
//TODO : remove this when Context HO is implemented.
|
||||
var context = context || {
|
||||
put:function (key, value) {
|
||||
session.put(key, value);
|
||||
},
|
||||
get:function (key) {
|
||||
return session.get(key);
|
||||
},
|
||||
remove:function (key) {
|
||||
session.remove(key);
|
||||
}
|
||||
};
|
||||
|
||||
var jagg = jagg || (function () {
|
||||
var ctx = context;
|
||||
|
||||
var modules = {};
|
||||
|
||||
var requirs = {};
|
||||
|
||||
var templates = {};
|
||||
|
||||
var initializers = {};
|
||||
|
||||
var bloks = {};
|
||||
|
||||
var data;
|
||||
|
||||
var reverse_proxy;
|
||||
|
||||
var setData = function (d) {
|
||||
data = d;
|
||||
};
|
||||
|
||||
var getData = function () {
|
||||
return data;
|
||||
};
|
||||
|
||||
var getUser = function () {
|
||||
var user = session.get("logged.user");
|
||||
|
||||
// If user is null then check for mutual auth
|
||||
if (!user) {
|
||||
user = mutualAuthVerifier(user);
|
||||
}
|
||||
|
||||
return user;
|
||||
};
|
||||
|
||||
var setUser = function (user) {
|
||||
//if jaggery allow session reset
|
||||
if (typeof request.getSession == "function") {
|
||||
if (session && !session.isNew()) {
|
||||
session.invalidate();
|
||||
}
|
||||
session = request.getSession(true);
|
||||
}
|
||||
session.put("logged.user", user);
|
||||
};
|
||||
|
||||
var mutualAuthVerifier = function(user){
|
||||
|
||||
var log = new Log();
|
||||
var site = require("/site/conf/site.json");
|
||||
|
||||
if(site.mutualAuthConfiguration){
|
||||
if (site.mutualAuthConfiguration.enabled == "true") {
|
||||
|
||||
// cert will be available only if trust store holds client certificate. Otherwise it is null
|
||||
var cert = request.getAttribute("javax.servlet.request.X509Certificate");
|
||||
var userName = request.getHeader("MutualAuthUserName");
|
||||
|
||||
// proceed mutul ssl validation if cert and user name set properly
|
||||
|
||||
if (cert != null) {
|
||||
if (userName) {
|
||||
var security = require("apimstore");
|
||||
var mutualAuthHostObject = new security.MutualAuthHostObject();
|
||||
var isValidUser = mutualAuthHostObject.validateUserNameHeader(userName);
|
||||
// Group ID feature not supported here
|
||||
var groupId="";
|
||||
session.put("groupId", groupId);
|
||||
if (isValidUser) {
|
||||
log.info("Mutual Auth authentication success for user : " + userName);
|
||||
user = {username: userName, cookie: null, hasPublisherAccess: false};
|
||||
return user;
|
||||
} else {
|
||||
log.debug("Mutual authentication failed for invalid user : " + userName);
|
||||
}
|
||||
|
||||
} else {
|
||||
log.debug("Mutual authentication failed for invalid user : MutualAuthUserName header is empty");
|
||||
}
|
||||
} else {
|
||||
log.debug("Mutual Authentication failed due to no trusted certificate");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var getThemeFile = function (path) {
|
||||
var p, index, theme = getUserTheme();
|
||||
if (theme.tenant_theme) {
|
||||
p = getTenantThemePath() + path;
|
||||
index = p.indexOf("?");
|
||||
if (new File(p.substring(0, index == -1 ? p.length : index)).isExists()) {
|
||||
return p;
|
||||
}
|
||||
}
|
||||
if (theme.subtheme) {
|
||||
p = getThemePath() + "subthemes/" + theme.subtheme + "/" + path;
|
||||
index = p.indexOf("?");
|
||||
if(new File(p.substring(0, index == -1 ? p.length : index)).isExists()) {
|
||||
return p;
|
||||
}
|
||||
}
|
||||
return getThemePath() + path;
|
||||
};
|
||||
|
||||
var getThemesPath = function () {
|
||||
return "/site/themes/";
|
||||
};
|
||||
|
||||
var getTenantThemesPath = function(){
|
||||
return "/site/tenant_themes/";
|
||||
};
|
||||
|
||||
var getThemePath = function () {
|
||||
return getThemesPath() + getUserTheme().base + "/";
|
||||
};
|
||||
|
||||
var getTenantThemePath = function (){
|
||||
return getTenantThemesPath() + getTheme().tenant_theme + "/";
|
||||
}
|
||||
|
||||
var getBlockFile = function (name) {
|
||||
return getBlocksDir() + name + "/block.jag";
|
||||
};
|
||||
|
||||
var getInitializerFile = function (name) {
|
||||
return getThemeFile("templates/" + name + "/initializer.jag");
|
||||
};
|
||||
|
||||
var getTemplateFile = function (name) {
|
||||
return getThemeFile("templates/" + name + "/template.jag");
|
||||
};
|
||||
|
||||
var getTemplatePath = function(themeDir, name) {
|
||||
return themeDir + "templates/" + name + "/template.jag";
|
||||
};
|
||||
|
||||
var getModuleFile = function (name) {
|
||||
return getModulesDir() + name + "/module.jag";
|
||||
};
|
||||
|
||||
var getBlocksDir = function () {
|
||||
return "/site/blocks/";
|
||||
};
|
||||
|
||||
var getThemesDir = function () {
|
||||
return "/site/themes/";
|
||||
};
|
||||
|
||||
var getModulesDir = function () {
|
||||
return "/modules/";
|
||||
};
|
||||
|
||||
var getTheme = function () {
|
||||
//TODO : remove following lines if theme switching need to be avoided
|
||||
var site = require("/site/conf/site.json"),
|
||||
theme = request.getParameter("theme"),
|
||||
subtheme = request.getParameter("subtheme");
|
||||
var r = {
|
||||
base : theme ? theme : site.theme.base,
|
||||
subtheme : subtheme ? subtheme : site.theme.subtheme,
|
||||
};
|
||||
//load the tenant theme if exists
|
||||
var tenant = getTenantDomain();
|
||||
if(tenant){
|
||||
tenant = tenant.replace("/",".");
|
||||
r.tenant_theme = getTenantDomain();
|
||||
}
|
||||
return r;
|
||||
};
|
||||
|
||||
var getUserTheme = function () {
|
||||
return session.get("theme") ? session.get("theme") : getTheme();
|
||||
};
|
||||
|
||||
var mergeParams = function (extInputs, defInputs) {
|
||||
var key, obj;
|
||||
extInputs = extInputs || {};
|
||||
for (key in defInputs) {
|
||||
if (defInputs.hasOwnProperty(key)) {
|
||||
obj = extInputs[key];
|
||||
if (!obj) {
|
||||
extInputs[key] = defInputs[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
return extInputs;
|
||||
};
|
||||
|
||||
var renderBlock = function (name, inputs, outputs, populate) {
|
||||
//initializeTemplate({name:name, params:null}, jagg);
|
||||
|
||||
var init, fn, blok, log = new Log();
|
||||
|
||||
fn = template(name);
|
||||
if (!fn) {
|
||||
log.error("Template header and footer includes are missing for : " + name);
|
||||
}
|
||||
if (populate) {
|
||||
blok = block(name);
|
||||
|
||||
if (!inputs) {
|
||||
inputs = blok.getInputs ? blok.getInputs() : {};
|
||||
} else {
|
||||
mergeParams(inputs, blok.getInputs ? blok.getInputs() : null);
|
||||
}
|
||||
|
||||
if (blok.getOutputs) {
|
||||
outputs = blok.getOutputs(inputs);
|
||||
} else if (blok.getInputs) {
|
||||
outputs = inputs;
|
||||
} else {
|
||||
outputs = {};
|
||||
}
|
||||
}
|
||||
init = initializer(name);
|
||||
if (init.postInitialize) {
|
||||
init.postInitialize(inputs, outputs);
|
||||
}
|
||||
fn(inputs, outputs, jagg);
|
||||
};
|
||||
|
||||
var inheritParent = function (blok, name) {
|
||||
var parent = require(getBlockFile(name));
|
||||
for (var prop in parent) {
|
||||
if (parent.hasOwnProperty(prop)) {
|
||||
if (!blok[prop]) {
|
||||
blok[prop] = parent[prop];
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var initializeBlock = function (obj) {
|
||||
if (!obj) {
|
||||
return;
|
||||
}
|
||||
var extInputs, defInputs, parent, tmpl, inputBlocks, outputBlocks, outputs, tmplInitializer, bloks, i, length,
|
||||
name = obj.name, blok = block(name), log = new Log();
|
||||
|
||||
template(name);
|
||||
extInputs = obj.inputs || (obj.inputs = {});
|
||||
defInputs = blok.getInputs ? blok.getInputs() : {};
|
||||
mergeParams(extInputs, defInputs);
|
||||
|
||||
if (blok.getInputBlocks) {
|
||||
inputBlocks = blok.getInputBlocks();
|
||||
length = inputBlocks.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
initializeBlocks(inputBlocks[i], extInputs);
|
||||
}
|
||||
}
|
||||
|
||||
if (blok.getOutputs) {
|
||||
outputs = blok.getOutputs(extInputs);
|
||||
} else if (blok.getInputs) {
|
||||
outputs = extInputs;
|
||||
} else {
|
||||
outputs = {};
|
||||
}
|
||||
|
||||
obj.outputs = outputs;
|
||||
if (blok.getOutputBlocks) {
|
||||
outputBlocks = blok.getOutputBlocks();
|
||||
length = outputBlocks.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
initializeBlocks(outputBlocks[i], outputs);
|
||||
}
|
||||
}
|
||||
|
||||
if (blok.getStaticBlocks) {
|
||||
bloks = blok.getStaticBlocks();
|
||||
length = bloks.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
initializeBlock({name:bloks[i], inputs:null});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// [ "foo", "bar", "mar"]
|
||||
// [{ "name" : "foo/bar", params : {}}]
|
||||
var initializeBlocks = function (keys, inputs) {
|
||||
if (!inputs) {
|
||||
return;
|
||||
}
|
||||
var i, length, values, last;
|
||||
if (typeof keys !== "string") {
|
||||
length = keys.length;
|
||||
values = inputs[keys[0]];
|
||||
last = (length == 1);
|
||||
if (values instanceof Array) {
|
||||
length = values.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
if (last) {
|
||||
initializeBlock(values[i]);
|
||||
} else {
|
||||
initializeBlocks(keys.slice(1), values[i]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (last) {
|
||||
initializeBlock(values);
|
||||
} else {
|
||||
initializeBlocks(keys.slice(1), values);
|
||||
}
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
values = inputs[keys];
|
||||
}
|
||||
|
||||
if (values instanceof Array) {
|
||||
length = values.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
initializeBlock(values[i]);
|
||||
}
|
||||
} else {
|
||||
initializeBlock(values);
|
||||
}
|
||||
};
|
||||
|
||||
var insertData = function (jagg, template, parent, name, key, value) {
|
||||
var keys, values, data = getData();
|
||||
data = data[parent] || (data[parent] = {});
|
||||
data = data[name] || (data[name] = {});
|
||||
data = data[template] || (data[template] = {});
|
||||
|
||||
keys = data.keys || (data.keys = []);
|
||||
values = data.values || (data.values = {});
|
||||
|
||||
keys.push(key);
|
||||
values[key] = value;
|
||||
};
|
||||
|
||||
|
||||
var printData = function (tmpls) {
|
||||
var key, tmpl, keys, values, i, length;
|
||||
for (key in tmpls) {
|
||||
if (tmpls.hasOwnProperty(key)) {
|
||||
tmpl = tmpls[key];
|
||||
keys = tmpl.keys;
|
||||
values = tmpl.values;
|
||||
length = keys.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
print(values[keys[i]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var getUrlMapping = function (path) {
|
||||
var urlMap = ctx.get("url.map"), url, configs, i, length, mapping, mappings, file;
|
||||
if (urlMap) {
|
||||
url = urlMap[path];
|
||||
return url ? url : path;
|
||||
}
|
||||
file = new File("/jaggery.conf");
|
||||
file.open("r");
|
||||
configs = parse(file.readAll());
|
||||
file.close();
|
||||
|
||||
urlMap = {};
|
||||
mappings = configs.urlMappings;
|
||||
length = mappings.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
mapping = mappings[i];
|
||||
urlMap[mapping.path] = mapping.url;
|
||||
}
|
||||
ctx.put("url.map", urlMap);
|
||||
url = urlMap[path];
|
||||
return url ? url : path;
|
||||
};
|
||||
|
||||
var getRequestSegments = function(){
|
||||
var href = request.getRequestURL()
|
||||
var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)(\/[^?#]*)(\?[^#]*|)(#.*|)$/);
|
||||
return match && {
|
||||
protocol: match[1],
|
||||
host: match[2],
|
||||
hostname: match[3],
|
||||
port: match[4],
|
||||
pathname: match[5],
|
||||
search: match[6],
|
||||
hash: match[7]
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
var getMappedUrl = function (path) {
|
||||
return getAbsoluteUrl(getUrlMapping(path));
|
||||
};
|
||||
|
||||
var getAbsoluteUrl = function (path) {
|
||||
var host = ""
|
||||
if(isReverseProxyEnabled()){
|
||||
host = "https://" + site.reverseProxy.host ;
|
||||
}else{
|
||||
var match = getRequestSegments();
|
||||
var host = match.protocol + "//" + match.host;
|
||||
}
|
||||
return host + url(path);
|
||||
};
|
||||
|
||||
var getSiteDomainFromRequest = function(){
|
||||
var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)(\/[^?#]*)(\?[^#]*|)(#.*|)$/);
|
||||
}
|
||||
|
||||
var getHttpsUrl = function(path, parameters){
|
||||
var hostname = "";
|
||||
var requestSegments = getRequestSegments();
|
||||
mod = jagg.module("manager");
|
||||
hostname = mod.getHTTPsURL();
|
||||
hostname = hostname.replace("https://","");
|
||||
|
||||
// if the site is fronted by a proxy server
|
||||
if(isReverseProxyEnabled()){
|
||||
hostname = site.reverseProxy.host ;
|
||||
//if a custom https port is used
|
||||
if(site.reverseProxy.hosts_port){
|
||||
hostname = hostname + ":" + site.reverseProxy.hosts_port;
|
||||
}
|
||||
}
|
||||
|
||||
return "https://" + hostname + url(path, parameters);
|
||||
}
|
||||
|
||||
var url = function(path,parameters){
|
||||
var tail = "";
|
||||
if(parameters){
|
||||
var params = [];
|
||||
for (var key in parameters) {
|
||||
params.push(key+"="+parameters[key]) ;
|
||||
}
|
||||
if(/\?/.test(path)){
|
||||
tail = "&";
|
||||
}
|
||||
else{
|
||||
tail = "?";
|
||||
}
|
||||
tail = tail + params.join("&");
|
||||
}
|
||||
return getSiteContext()+ path + tail;
|
||||
};
|
||||
|
||||
var getTenantURLPrefix = function(tail) {
|
||||
if (!tail) {
|
||||
tail = "";
|
||||
}
|
||||
if( site.reverseProxy.tenantHeader == null ||
|
||||
request.getHeader(site.reverseProxy.tenantHeader) == null){
|
||||
if(getTenantDomain() != null){
|
||||
return tail + "tenant=" + getTenantDomain();
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
// following function will generate a url with the currently activated tenant
|
||||
var urlTenanted = function(path, parameters){
|
||||
//if tenented add tenant url
|
||||
if(getTenantDomain() != null && !(/(\?tenant\=|\&tenant\=)/i.test(path))){
|
||||
if(!parameters){
|
||||
parameters = {};
|
||||
}
|
||||
parameters.tenant = getTenantDomain();
|
||||
}
|
||||
if(isReverseProxyEnabled()){
|
||||
return getHttpsUrl(path, parameters)
|
||||
}
|
||||
return url(path,parameters)
|
||||
};
|
||||
|
||||
var getCarbonProxyContextPath = function(){
|
||||
var CarbonUtils = Packages.org.wso2.carbon.utils.CarbonUtils;
|
||||
var carbonUtils = new CarbonUtils();
|
||||
var context = carbonUtils.getServerConfiguration().getFirstProperty("ProxyContextPath");
|
||||
if(context != null)
|
||||
return context;
|
||||
else
|
||||
return '';
|
||||
};
|
||||
|
||||
var isReverseProxyEnabled = function(){
|
||||
if(reverse_proxy != undefined){
|
||||
return reverse_proxy;
|
||||
}
|
||||
if(site.reverseProxy.enabled){
|
||||
if(site.reverseProxy.enabled == "auto"){
|
||||
var xfwd = request.getHeader("X-Forwarded-Host");
|
||||
if(xfwd != null){
|
||||
var xfwd = xfwd.split(",")[0];
|
||||
//if(xfwd.trim() == site.reverseProxy.host){
|
||||
reverse_proxy = true;
|
||||
site.reverseProxy.host = xfwd.trim();
|
||||
//}
|
||||
}else{
|
||||
reverse_proxy = false;
|
||||
}
|
||||
}
|
||||
else{
|
||||
reverse_proxy = true;
|
||||
}
|
||||
}
|
||||
else{
|
||||
reverse_proxy = false;
|
||||
}
|
||||
return reverse_proxy;
|
||||
};
|
||||
|
||||
var getSiteContext = function(){
|
||||
if(isReverseProxyEnabled()){
|
||||
//If we use a custom domain mapping we will not use the context.
|
||||
if( site.reverseProxy.tenantHeader != null &&
|
||||
request.getHeader(site.reverseProxy.tenantHeader) != null){
|
||||
return "";
|
||||
}
|
||||
else{
|
||||
return site.reverseProxy.context
|
||||
}
|
||||
}
|
||||
|
||||
var proxyContext = getCarbonProxyContextPath();
|
||||
return proxyContext + site.context;
|
||||
};
|
||||
|
||||
var getRegistryPath = function(path){
|
||||
if(isReverseProxyEnabled()){
|
||||
if(site.reverseProxy.regContext != undefined){
|
||||
return site.reverseProxy.regContext + path;
|
||||
}
|
||||
return site.reverseProxy.context + path;
|
||||
}
|
||||
|
||||
var ProxyContextPath = getCarbonProxyContextPath();
|
||||
return ProxyContextPath + path;
|
||||
}
|
||||
|
||||
var module = function (name, module) {
|
||||
if (module) {
|
||||
return modules[name] = module;
|
||||
}
|
||||
module = modules[name];
|
||||
if (module) {
|
||||
return module;
|
||||
}
|
||||
include(getModuleFile(name));
|
||||
return modules[name];
|
||||
};
|
||||
|
||||
var requir = function (path) {
|
||||
var obj = requirs[path];
|
||||
return obj ? obj : requirs[path] = require(path);
|
||||
};
|
||||
|
||||
var block = function (name, blok) {
|
||||
var parent;
|
||||
if (blok) {
|
||||
return bloks[name] = blok;
|
||||
}
|
||||
blok = bloks[name];
|
||||
if (blok) {
|
||||
return blok;
|
||||
}
|
||||
//we need to include and initialize
|
||||
include(getBlockFile(name));
|
||||
blok = bloks[name];
|
||||
parent = blok.getParent;
|
||||
if (parent) {
|
||||
parent = parent();
|
||||
inheritParent(blok, parent);
|
||||
}
|
||||
if (blok.initialize) {
|
||||
//TODO which to pass into initialize method
|
||||
blok.initialize(getData());
|
||||
}
|
||||
return bloks[name];
|
||||
};
|
||||
|
||||
var template = function (name, tmpl) {
|
||||
var blok, parent, init;
|
||||
if (tmpl) {
|
||||
return templates[name] = tmpl;
|
||||
}
|
||||
tmpl = templates[name];
|
||||
if (tmpl) {
|
||||
return tmpl;
|
||||
}
|
||||
|
||||
blok = block(name);
|
||||
parent = blok.getParent;
|
||||
if (parent) {
|
||||
name = parent();
|
||||
}
|
||||
|
||||
tmpl = templates[name];
|
||||
if (tmpl) {
|
||||
return tmpl;
|
||||
}
|
||||
|
||||
include(getTemplateFile(name));
|
||||
init = initializer(name);
|
||||
if (init.preInitialize) {
|
||||
init.preInitialize();
|
||||
}
|
||||
return templates[name];
|
||||
};
|
||||
|
||||
var initializer = function (name, init) {
|
||||
var blok, parent;
|
||||
if (init) {
|
||||
return initializers[name] = init;
|
||||
}
|
||||
init = initializers[name];
|
||||
if (init) {
|
||||
return init;
|
||||
}
|
||||
|
||||
blok = block(name);
|
||||
parent = blok.getParent;
|
||||
if (parent) {
|
||||
name = parent();
|
||||
}
|
||||
|
||||
init = initializers[name];
|
||||
if (init) {
|
||||
return init;
|
||||
}
|
||||
|
||||
include(getInitializerFile(name));
|
||||
return initializers[name];
|
||||
};
|
||||
|
||||
var render = function (obj) {
|
||||
var init, fn, inputs, outputs, name = obj.name, log = new Log(), blok;
|
||||
setData(obj);
|
||||
initializeBlock(obj);
|
||||
include(getTemplateFile(name));
|
||||
fn = template(name);
|
||||
if (!fn) {
|
||||
log.error("Template header and footer includes are missing for : " + name);
|
||||
}
|
||||
inputs = obj.inputs;
|
||||
blok = block(name);
|
||||
if (blok.getOutputs) {
|
||||
outputs = blok.getOutputs(inputs);
|
||||
} else if (blok.getInputs) {
|
||||
outputs = inputs;
|
||||
} else {
|
||||
outputs = {};
|
||||
}
|
||||
init = initializer(name);
|
||||
if (init.postInitialize) {
|
||||
init.postInitialize(inputs, outputs);
|
||||
}
|
||||
fn(inputs, outputs, jagg);
|
||||
};
|
||||
|
||||
var includeBlock = function (name, inputs) {
|
||||
renderBlock(name, inputs, null, true);
|
||||
};
|
||||
|
||||
var includeBlocks = function (bloks) {
|
||||
if (!bloks) {
|
||||
return;
|
||||
}
|
||||
|
||||
var i, d, length;
|
||||
if (bloks instanceof Array) {
|
||||
length = bloks.length;
|
||||
for (i = 0; i < length; i++) {
|
||||
d = bloks[i];
|
||||
renderBlock(d.name, d.inputs, d.outputs, false);
|
||||
}
|
||||
} else {
|
||||
renderBlock(bloks.name, bloks.inputs, bloks.outputs, false);
|
||||
}
|
||||
};
|
||||
|
||||
var addHeaderCSS = function (template, key, css) {
|
||||
css = '<link type="text/css" rel="stylesheet" href="' + url(getThemeFile(css)) + '"/>';
|
||||
insertData(this, template, "header", "css", key, css);
|
||||
};
|
||||
|
||||
var addHeaderCSSCode = function (template, key, css) {
|
||||
css = '<style type="text/css">' + css + '</style>';
|
||||
insertData(this, template, "header", "css", key, css);
|
||||
};
|
||||
|
||||
var addHeaderJS = function (template, key, js) {
|
||||
js = '<script type="text/javascript" src="' + url(getThemeFile(js)) + '"></script>\n';
|
||||
insertData(this, template, "header", "js", key, js);
|
||||
};
|
||||
|
||||
var addHeaderJSCode = function (template, key, js) {
|
||||
js = '<script type="text/javascript">' + js + '</script>';
|
||||
insertData(this, template, "header", "js", key, js);
|
||||
};
|
||||
|
||||
var addHeaderCode = function (template, key, code) {
|
||||
insertData(this, template, "header", "code", key, code);
|
||||
};
|
||||
|
||||
var addFooterCSS = function (template, key, css) {
|
||||
css = '<link type="text/css" rel="stylesheet" href="' + url(getThemeFile(css)) + '"/>';
|
||||
insertData(this, template, "footer", "css", key, css);
|
||||
};
|
||||
|
||||
var addFooterCSSCode = function (template, key, css) {
|
||||
css = '<style type="text/css">' + css + '</style>';
|
||||
insertData(this, template, "footer", "css", key, css);
|
||||
};
|
||||
|
||||
var addFooterJS = function (template, key, js) {
|
||||
js = '\t<script type="text/javascript" src="' + url(getThemeFile(js)) + '"></script>\n';
|
||||
insertData(this, template, "footer", "js", key, js);
|
||||
};
|
||||
|
||||
var addFooterJSCode = function (template, key, js) {
|
||||
js = '<script type="text/javascript">' + js + '</script>';
|
||||
insertData(this, template, "footer", "js", key, js);
|
||||
};
|
||||
|
||||
var addFooterCode = function (template, key, code) {
|
||||
insertData(this, template, "footer", "code", key, code);
|
||||
};
|
||||
|
||||
var includeJag = function (path) {
|
||||
include(getThemeFile(path));
|
||||
};
|
||||
|
||||
var getTenantDomain = function(){
|
||||
if(isReverseProxyEnabled()){
|
||||
// check if tenant header exists
|
||||
if(site.reverseProxy.tenantHeader != undefined && site.reverseProxy.tenantHeader != null
|
||||
&& request.getHeader(site.reverseProxy.tenantHeader) != null){
|
||||
return request.getHeader(site.reverseProxy.tenantHeader);
|
||||
}
|
||||
}
|
||||
return request.getParameter("tenant");
|
||||
}
|
||||
|
||||
var setCSRFToken = function(){
|
||||
var cookie = request.getCookie("csrftoken");
|
||||
var user = jagg.getUser();
|
||||
var csrfuser = session.get('csrfuser');
|
||||
//set CSRF if it is not set + you need to refresh the token if the user has changed.
|
||||
if( !cookie || user != csrfuser){
|
||||
//Use a secure random as the CSRF token.
|
||||
var SecureRandom = Packages.java.security.SecureRandom;
|
||||
var random = new SecureRandom();
|
||||
var BigInteger = Packages.java.math.BigInteger;
|
||||
var token = new BigInteger(130, random).toString(32);
|
||||
|
||||
var cookie= {'name':'csrftoken','value': token , 'maxAge': 86400, 'path':"/"};
|
||||
session.put('csrfuser',user);
|
||||
response.addCookie(cookie);
|
||||
}
|
||||
}
|
||||
|
||||
var isCSRFTokenValid = function(){
|
||||
var log = new Log();
|
||||
var cookie = request.getCookie("csrftoken");
|
||||
var token = request.getHeader("X-CSRFToken");
|
||||
var user = jagg.getUser();
|
||||
if(cookie == null || cookie.value == token){
|
||||
return true;
|
||||
}
|
||||
else{
|
||||
log.info("CSRF Token error at "+request.getRequestURI());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
var validateInputs = function(config){
|
||||
var errors = [];
|
||||
//set most used parapeters
|
||||
config.name = { type:"name"};
|
||||
config.provider = { type:"provider"};
|
||||
config.version = { type:"name"};
|
||||
|
||||
for(var key in config){
|
||||
var value = request.getParameter(key);
|
||||
if(value == null){
|
||||
if(config[key].required)
|
||||
errors.push(key);
|
||||
continue;
|
||||
}
|
||||
switch (config[key].type) {
|
||||
case "url":
|
||||
break;
|
||||
case "input":
|
||||
var regex = /([<>\"\'])/;
|
||||
if(regex.test(value)) errors.push(key);
|
||||
break;
|
||||
case "number":
|
||||
var regex = /^[0-9]*$/;
|
||||
if(!regex.test(value)) errors.push(key);
|
||||
break;
|
||||
case "safetext":
|
||||
var regex = /^[a-zA-Z0-9]*$/;
|
||||
if(!regex.test(value)) errors.push(key);
|
||||
break;
|
||||
case "uuid":
|
||||
var regex = /^[a-zA-Z0-9\-]*$/;
|
||||
if(!regex.test(value)) errors.push(key);
|
||||
break;
|
||||
case "name":
|
||||
var regex = /([~!#$;%^*+={}\|\\<>\"\'\/,])/;
|
||||
if(regex.test(value)) errors.push(key);
|
||||
break;
|
||||
case "password":
|
||||
var regex = /^[\S]{5,30}$/;
|
||||
if(!regex.test(value)) errors.push(key);
|
||||
break;
|
||||
case "email":
|
||||
var regex = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
|
||||
if(!regex.test(value)) errors.push(key);
|
||||
break;
|
||||
case "provider":
|
||||
var regex = /([~!#$;%^*+={}\|\\<>\"\'\,])/;
|
||||
if(regex.test(value)) errors.push(key);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
if(errors.length > 0){
|
||||
return errors;
|
||||
}
|
||||
else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
setUser:setUser,
|
||||
getUser:getUser,
|
||||
block:block,
|
||||
module:module,
|
||||
initializer:initializer,
|
||||
includeBlock:includeBlock,
|
||||
includeBlocks:includeBlocks,
|
||||
render:render,
|
||||
template:template,
|
||||
require:requir,
|
||||
getAbsoluteUrl:getAbsoluteUrl,
|
||||
getMappedUrl:getMappedUrl,
|
||||
printData:printData,
|
||||
getUserTheme:getUserTheme,
|
||||
getThemeFile:getThemeFile,
|
||||
getModulesDir:getModulesDir,
|
||||
data:getData,
|
||||
addHeaderCSS:addHeaderCSS,
|
||||
addHeaderCSSCode:addHeaderCSSCode,
|
||||
addHeaderJS:addHeaderJS,
|
||||
addHeaderJSCode:addHeaderJSCode,
|
||||
addHeaderCode:addHeaderCode,
|
||||
addFooterCSS:addFooterCSS,
|
||||
addFooterCSSCode:addFooterCSSCode,
|
||||
addFooterJS:addFooterJS,
|
||||
addFooterJSCode:addFooterJSCode,
|
||||
addFooterCode:addFooterCode,
|
||||
includeJag:includeJag,
|
||||
url:url,
|
||||
urlTenanted:urlTenanted,
|
||||
getRegistryPath:getRegistryPath,
|
||||
getSiteContext:getSiteContext,
|
||||
getHttpsUrl:getHttpsUrl,
|
||||
getTenantDomain:getTenantDomain,
|
||||
setCSRFToken:setCSRFToken,
|
||||
isCSRFTokenValid:isCSRFTokenValid,
|
||||
validateInputs:validateInputs,
|
||||
getTenantURLPrefix:getTenantURLPrefix
|
||||
};
|
||||
|
||||
}());
|
||||
%>
|
@ -1,168 +0,0 @@
|
||||
<%
|
||||
var getAuthServerURL = function() {
|
||||
return getAPIStoreObj().getAuthServerURL();
|
||||
};
|
||||
|
||||
var getHTTPsURL = function() {
|
||||
return getAPIStoreObj().getHTTPsURL(request.getRequestURL());
|
||||
};
|
||||
|
||||
var getHTTPURL = function() {
|
||||
return getAPIStoreObj().getHTTPURL();
|
||||
};
|
||||
|
||||
var getHostname = function() {
|
||||
return getAPIStoreObj().getHostName();
|
||||
};
|
||||
|
||||
var getAPIPublisherURL = function() {
|
||||
var result,log=new Log();
|
||||
var store = getAPIStoreObj();
|
||||
try {
|
||||
result = store.getAPIPublisherURL();
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("getAPIPublisherURL : ");
|
||||
}
|
||||
return {
|
||||
error:false,
|
||||
url:result
|
||||
};
|
||||
} catch (e) {
|
||||
return {
|
||||
error:true,
|
||||
message:e.message.split(":")[1]
|
||||
};
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
var getServer = function() {
|
||||
return {
|
||||
server : "localhost",
|
||||
port : "9443"
|
||||
};
|
||||
};
|
||||
|
||||
var isSelfSignupEnabled = function(){
|
||||
return getAPIStoreObj().isSelfSignupEnabled();
|
||||
};
|
||||
|
||||
var isSelfSignupEnabledForTenantUser = function(tenantDomain){
|
||||
var log = new Log();
|
||||
try {
|
||||
|
||||
if (tenantDomain == null) {
|
||||
return getAPIStoreObj().isSelfSignupEnabledForTenant("carbon.super");
|
||||
} else {
|
||||
return getAPIStoreObj().isSelfSignupEnabledForTenant(tenantDomain);
|
||||
}
|
||||
} catch (e) {
|
||||
log.error(e.message);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
var getAdminCookie = function() {
|
||||
//TODO : this should be set in the Context during the deployment
|
||||
|
||||
};
|
||||
|
||||
var getAPIStoreObj = function() {
|
||||
|
||||
var tenantDomain = jagg.getTenantDomain();
|
||||
var user = jagg.getUser();
|
||||
var store;
|
||||
if (user == null) {
|
||||
store = require('apimstore');
|
||||
var storeHostObj = new store.APIStore();
|
||||
if(tenantDomain != null && tenantDomain != ""){
|
||||
storeHostObj.loadRegistryOfTenant(tenantDomain);
|
||||
}
|
||||
return storeHostObj;
|
||||
} else {
|
||||
store = require('apimstore');
|
||||
return new store.APIStore(user.username);
|
||||
}
|
||||
};
|
||||
|
||||
var getAPIConsumerObj = function() {
|
||||
var user = jagg.getUser();
|
||||
|
||||
var APIManagerFactory = Packages.org.wso2.carbon.apimgt.impl.APIManagerFactory;
|
||||
|
||||
return APIManagerFactory.getInstance().getAPIConsumer(user);
|
||||
};
|
||||
|
||||
var loadTenantRegistry = function (tenantDomain) {
|
||||
try {
|
||||
if (tenantDomain != null && tenantDomain != "") {
|
||||
getAPIStoreObj().loadRegistryOfTenant(tenantDomain);
|
||||
return
|
||||
{
|
||||
error:false
|
||||
}
|
||||
;
|
||||
}
|
||||
} catch (e) {
|
||||
return {
|
||||
error:true,
|
||||
message:e.message
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
var loadTenantAxisConfiguration = function (tenantDomain) {
|
||||
|
||||
try {
|
||||
if (tenantDomain != null && tenantDomain != "") {
|
||||
|
||||
getAPIStoreObj().loadAxisConfigOfTenant(String(tenantDomain));
|
||||
return
|
||||
{
|
||||
error:false
|
||||
}
|
||||
;
|
||||
}
|
||||
} catch (e) {
|
||||
return {
|
||||
error:true,
|
||||
message:e.message
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
var getActiveTenantDomains=function(){
|
||||
var tenantDomains,
|
||||
log = new Log(),
|
||||
store = jagg.module("manager").getAPIStoreObj();
|
||||
|
||||
try {
|
||||
tenantDomains = store.getActiveTenantDomains();
|
||||
tenantDomains = parse(stringify(tenantDomains));
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("isTenantMode : " + stringify(api));
|
||||
}
|
||||
|
||||
return {
|
||||
error:false,
|
||||
tenantDomains:tenantDomains
|
||||
};
|
||||
} catch (e) {
|
||||
//log.error(e.message);
|
||||
return {
|
||||
error:true,
|
||||
tenantDomains:null,
|
||||
message:e.message
|
||||
};
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
var getUsageClient = function(){
|
||||
var user = jagg.getUser();
|
||||
return org.wso2.carbon.apimgt.usage.client.UsageClient.getClient(user);
|
||||
}
|
||||
|
||||
%>
|
@ -0,0 +1,10 @@
|
||||
<module name="lifecycle" xmlns="http://wso2.org/projects/jaggery/module.xml">
|
||||
<script>
|
||||
<name>core</name>
|
||||
<path>scripts/core/core.js</path>
|
||||
</script>
|
||||
<script>
|
||||
<name>api</name>
|
||||
<path>scripts/api/api.js</path>
|
||||
</script>
|
||||
</module>
|
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* The api namespace exposes methods to retrieve information individual states of the lifecycles
|
||||
* deployed to the Governance Registry
|
||||
* @namespace
|
||||
* @example
|
||||
* var api = require('lifecycle').api;
|
||||
* var superTenantId=-1234;
|
||||
*
|
||||
* api.getLifecycleList(superTenantId);
|
||||
* @requires store
|
||||
* @requires event
|
||||
* @requires utils
|
||||
* @requires Packages.org.wso2.carbon.governance.lcm.util.CommonUtil
|
||||
*/
|
||||
var api = {};
|
||||
(function (api, core) {
|
||||
var log = new Log('lifecycle');
|
||||
|
||||
/**
|
||||
* Represents a class which models a lifecycle
|
||||
* @constructor
|
||||
* @param {Object} definiton The JSON definition of a lifecycle
|
||||
* @memberOf api
|
||||
*/
|
||||
function Lifecycle(definiton) {
|
||||
this.definition = definiton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the JSON definition for the lifecycle managed by the instance
|
||||
* @return {Object} Lifecycle definition
|
||||
*/
|
||||
Lifecycle.prototype.getDefinition = function () {
|
||||
return this.definition;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the name of the lifecycle
|
||||
* @return {String} The name of the lifecycle
|
||||
*/
|
||||
Lifecycle.prototype.getName = function () {
|
||||
if (!this.definition.name) {
|
||||
throw 'Unable to locate name attribute in the lifecycle definition ';
|
||||
}
|
||||
return this.definition.name;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns an instance of the Lifecycle class
|
||||
* @example
|
||||
* var lc = api.getLifecycle('SimpleLifeCycle',-1234);
|
||||
* lc.nextStates('initial');
|
||||
* @param {String} lifecycleName The name of the lifecycle
|
||||
* @param {Number} tenantDomain The tenant ID
|
||||
* @return {Object} An instance of the Lifecycle class
|
||||
* @throws Unable to locate lifecycle without a tenant ID
|
||||
*/
|
||||
api.getLifecycle = function (tenantDomain, APIProvider) {
|
||||
if (!tenantDomain) {
|
||||
throw 'Unable to locate lifecycle without a tenantDomain';
|
||||
}
|
||||
var lcJSON = core.getJSONDef(tenantDomain,APIProvider);
|
||||
|
||||
if (!lcJSON) {
|
||||
log.warn('Unable to locate lifecycle for the tenant: ' + tenantDomain);
|
||||
return null; //TODO: This should throw an exception
|
||||
}
|
||||
return new Lifecycle(lcJSON);
|
||||
};
|
||||
|
||||
|
||||
}(api, core));
|
@ -0,0 +1,158 @@
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* The core namespace contains methods that load the lifecycle definitions from the registry
|
||||
* @namespace
|
||||
* @example
|
||||
* var core = require('lifecycle').core;
|
||||
* core.init(); //Should only be called once in the lifecycle of an app.Ideally in an init script
|
||||
* @requires store
|
||||
* @requires event
|
||||
* @requires utils
|
||||
* @requires Packages.org.wso2.carbon.governance.lcm.util.CommonUtil
|
||||
*/
|
||||
var core = {};
|
||||
(function(core) {
|
||||
var CommonUtil = Packages.org.wso2.carbon.governance.lcm.util.CommonUtil;
|
||||
var LC_MAP = 'lc.map';
|
||||
var EMPTY = '';
|
||||
var log = new Log('lifecycle');
|
||||
var addRawLifecycle = function(lifecycleName, content, tenantId) {
|
||||
var lcMap = core.configs(tenantId);
|
||||
if (!lcMap.raw) {
|
||||
lcMap.raw = {};
|
||||
}
|
||||
lcMap.raw[lifecycleName] = new String(content);
|
||||
};
|
||||
var addJsonLifecycle = function(lifecycleName, definition, tenantId) {
|
||||
var lcMap = core.configs(tenantId);
|
||||
if (!lcMap.json) {
|
||||
lcMap.json = {};
|
||||
}
|
||||
lcMap.json[lifecycleName] = definition;
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts array references to properties.The JSON conversion produces some properties which need to be accessed
|
||||
* using array indexes.
|
||||
* @param {Object} obj Unaltered JSON object
|
||||
* @return {Object} JSON object with resolved array references
|
||||
*/
|
||||
var transformJSONLifecycle = function(obj) {
|
||||
obj.configuration = obj.configuration[0];
|
||||
obj.configuration.lifecycle = obj.configuration.lifecycle[0];
|
||||
obj.configuration.lifecycle.scxml = obj.configuration.lifecycle.scxml[0];
|
||||
var states = obj.configuration.lifecycle.scxml.state;
|
||||
var stateObj = {};
|
||||
var state;
|
||||
for (var index = 0; index < states.length; index++) {
|
||||
state = states[index];
|
||||
stateObj[state.id.toLowerCase()] = state;
|
||||
if (stateObj[state.id.toLowerCase()].datamodel) {
|
||||
stateObj[state.id.toLowerCase()].datamodel = stateObj[state.id.toLowerCase()].datamodel[0];
|
||||
}
|
||||
}
|
||||
obj.configuration.lifecycle.scxml.state = stateObj;
|
||||
return obj;
|
||||
};
|
||||
/*
|
||||
Creates an xml file from the contents of an Rxt file
|
||||
@rxtFile: An rxt file
|
||||
@return: An xml file
|
||||
*/
|
||||
var createXml = function(content) {
|
||||
var fixedContent = content.replace('<xml version="1.0"?>', EMPTY).replace('</xml>', EMPTY);
|
||||
return new XML(fixedContent);
|
||||
};
|
||||
var parseLifeycle = function(content) {
|
||||
var ref = require('utils').xml;
|
||||
var obj = ref.convertE4XtoJSON(createXml(content));
|
||||
return obj;
|
||||
};
|
||||
var loadLifecycles = function(tenantDomain,APIProvider) {
|
||||
|
||||
//Obtain the definition
|
||||
content = APIProvider.getLifecycleConfiguration(tenantDomain);
|
||||
//Store the raw lifecycle
|
||||
addRawLifecycle("APILifeCycle", content, tenantDomain);
|
||||
//Parse the raw lifecycle definition into a json
|
||||
var jsonLifecycle = parseLifeycle(new String(content));
|
||||
//Correct any array references
|
||||
jsonLifecycle = transformJSONLifecycle(jsonLifecycle);
|
||||
//Store the json lifecycle definition
|
||||
addJsonLifecycle("APILifeCycle", jsonLifecycle, tenantDomain);
|
||||
if(log.isDebugEnabled()){
|
||||
log.debug('Found lifecycle: ' + jsonLifecycle.name + ' tenant: ' + tenantDomain);
|
||||
}
|
||||
|
||||
};
|
||||
var init = function(tenantDomain,APIProvider) {
|
||||
loadLifecycles(tenantDomain,APIProvider);
|
||||
};
|
||||
core.force = function(tenantDomain,APIProvider) {
|
||||
init(tenantDomain,APIProvider);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the lifecycle map which is stored in the application context
|
||||
* The map is maintained on a per user basis
|
||||
* @param {Number} tenantId The tenant ID
|
||||
* @return {Object} The lifecycle map
|
||||
*/
|
||||
core.configs = function(tenantDomain) {
|
||||
var lcMap = application.get(LC_MAP);
|
||||
if (!lcMap) {
|
||||
log.debug('Creating lcMap in the application context');
|
||||
lcMap = {};
|
||||
application.put(LC_MAP, lcMap);
|
||||
}
|
||||
if (!lcMap[tenantDomain]) {
|
||||
log.debug('Creating lcMap for the tenant: ' + tenantDomain + ' in application context');
|
||||
lcMap[tenantDomain] = {};
|
||||
}
|
||||
return lcMap[tenantDomain];
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the JSON definition of the provided lifecycle for the given tenant
|
||||
* @param {Number} tenantDomain The tenant Domain
|
||||
* @return {Object} The JSON definitin of the lifecycle
|
||||
* @throws There is no lifcycle information for the tenant
|
||||
* @throws There is no json lifecycle information for the lifecycle of the tenant
|
||||
*/
|
||||
core.getJSONDef = function(tenantDomain,APIProvider) {
|
||||
var lifecycleName='APILifeCycle';
|
||||
var lcMap = core.configs(tenantDomain);
|
||||
if (!lcMap) {
|
||||
throw 'There is no lifecycle information for the tenant: ' + tenantDomain;
|
||||
}
|
||||
//if (!lcMap.json) {
|
||||
// throw 'There is no json lifecycle information for the lifecycle of tenant: ' + tenantDomain;
|
||||
//}
|
||||
if (!lcMap.json) {
|
||||
core.force(tenantDomain,APIProvider);
|
||||
lcMap = core.configs(tenantDomain);
|
||||
if (!lcMap.json[lifecycleName]){
|
||||
throw 'There is no lifecycle information for ';
|
||||
}
|
||||
}
|
||||
return lcMap.json[lifecycleName];
|
||||
};
|
||||
|
||||
|
||||
}(core));
|
@ -0,0 +1,6 @@
|
||||
<module name="utils" xmlns="http://wso2.org/projects/jaggery/module.xml">
|
||||
<script>
|
||||
<name>xml</name>
|
||||
<path>scripts/xml/xml.js</path>
|
||||
</script>
|
||||
</module>
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
}());
|
Loading…
Reference in new issue