diff --git a/cache/projectTemplate.xml b/cache/projectTemplate.xml
deleted file mode 100644
index 3c89de9..0000000
--- a/cache/projectTemplate.xml
+++ /dev/null
@@ -1,739 +0,0 @@
-
-
-
-
-Cache Class Explorer vX.X.X/*build.replace:pkg.version*/
-Class contains methods that return structured classes/packages data.
-64010,55351.57242
-63653,67019.989197
-
-
-
-Return list with all namespaces
-1
-%ZEN.proxyObject
-
-
-
-
-
-Returns structured class tree with all classes available in current namespace
-1
-namespace:%String,showMapped=0
-%ZEN.proxyObject
- level) {
- set level = level + 1
- set resp = ##class(%ZEN.proxyObject).%New()
- do objects.GetAt(level - 1).%DispatchSetProperty("/" _ $LISTGET(parts, level - 1), resp)
- do objects.SetAt(resp, level)
- }
- if ($LISTLENGTH(parts) = level) {
- do resp.%DispatchSetProperty($LISTGET(parts, level), 0)
- }
- set lastParts = parts
- for i=1:1:$LISTLENGTH(lastParts)-1 {
- set $LIST(lastParts, i) = "/"_$LISTGET(lastParts, i)
- }
- set name = $order(classes(name))
- }
-
- quit objects.GetAt(1)
-]]>
-
-
-
-
-Return structured data about class.
-1
-oData:%ZEN.proxyObject,className:%String,level:%String="",currLevel:%Integer=0
-1
-%ZEN.proxyObject
-+level)) { quit "" }
- set currLevel = $increment(currLevel)
- set classDefinition = ##class(%Dictionary.ClassDefinition).%OpenId(className)
- set compiledClassDefinition = ##class(%Dictionary.CompiledClass).%OpenId(className)
- if (classDefinition = "") || (oData.classes.%DispatchGetProperty(classDefinition.Name) '= "") quit ""
-
- set oClass = ##class(%ZEN.proxyObject).%New()
- do oData.classes.%DispatchSetProperty(classDefinition.Name, oClass) // prevent from recursive setup
- set package = $LISTTOSTRING($LIST($LISTFROMSTRING(classDefinition.Name, "."), 1, *-1),".")
- set oProperties = ##class(%ZEN.proxyObject).%New()
- set oQueries = ##class(%ZEN.proxyObject).%New()
- set oIndices = ##class(%ZEN.proxyObject).%New()
- set oXDatas = ##class(%ZEN.proxyObject).%New()
-
- set oClass.isDataType = classDefinition.ClientDataTypeIsDefined()
- set oClass.isOdbcType = classDefinition.OdbcTypeIsDefined()
- set oClass.isSoapBindingStyle = classDefinition.SoapBindingStyleIsDefined()
- set oClass.isSoapBodyUse = classDefinition.SoapBodyUseIsDefined()
- set oClass.isSqlCategory = classDefinition.SqlCategoryIsDefined()
-
- set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.ClassDefinition")
- for j=1:1:props.Properties.Count() {
- set pname = props.Properties.GetAt(j).Name
- set:((pname '= "parent")
- && ('props.Properties.GetAt(j).Private)
- && ('$IsObject($PROPERTY(classDefinition, pname)))) $PROPERTY(oClass, pname) = $PROPERTY(classDefinition, pname)
- }
- if (oClass.TimeChanged) { set oClass.TimeChanged = $zdatetime(oClass.TimeChanged) }
- if (oClass.TimeCreated) { set oClass.TimeCreated = $zdatetime(oClass.TimeCreated) }
- if ((compiledClassDefinition '= "") && (compiledClassDefinition.ClassType '= "")) {
- set oClass.ClassType = compiledClassDefinition.ClassType // set class type from all inherited classes
- }
-
- set oClass.Super = "" // do not quit with super at this moment
- if (oData.restrictPackage) && ('..inPackage(oData.basePackageName, package)) quit oClass
- set oClass.Super = ..correctInheritance(oData, classDefinition, package) // now expand super names
-
- set oClass.properties = oProperties
- set count = classDefinition.Properties.Count()
- set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.PropertyDefinition")
- for i=1:1:count {
- set oProp = ##class(%ZEN.proxyObject).%New()
- set p = classDefinition.Properties.GetAt(i)
- do oProperties.%DispatchSetProperty(p.Name, oProp)
- for j=1:1:props.Properties.Count() {
- set pname = props.Properties.GetAt(j).Name
- set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(p, pname)
- }
- if (..classExists(package _ "." _ p.Type)) {
- set oProp.Type = package _ "." _ p.Type
- do ..fillClassData(oData, package _ "." _ p.Type, level, currLevel)
- } elseif (..classExists(..extendClassFromType(p.Type))) {
- set oProp.Type = ..extendClassFromType(p.Type)
- do ..fillClassData(oData, ..extendClassFromType(p.Type), level, currLevel)
- } else {
- set oProp.Type = ..extendClassFromType(p.Type)
- }
- }
-
- set oMethods = ##class(%ZEN.proxyObject).%New()
- set oClass.methods = oMethods
- set count = classDefinition.Methods.Count()
- set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.MethodDefinition")
- for i=1:1:count {
- set oMeth = ##class(%ZEN.proxyObject).%New()
- set met = classDefinition.Methods.GetAt(i)
- do oMethods.%DispatchSetProperty(met.Name, oMeth)
- for j=1:1:props.Properties.Count() {
- set pname = props.Properties.GetAt(j).Name
- set:((pname '= "parent") && (pname '= "Implementation")) $PROPERTY(oMeth, pname) = $PROPERTY(met, pname)
- }
- }
-
- set oParameters = ##class(%ZEN.proxyObject).%New()
- set oClass.parameters = oParameters
- set count = classDefinition.Parameters.Count()
- set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.ParameterDefinition")
- for i=1:1:count {
- set oPar = ##class(%ZEN.proxyObject).%New()
- set p = classDefinition.Parameters.GetAt(i)
- for j=1:1:props.Properties.Count() {
- set pname = props.Properties.GetAt(j).Name
- set:(pname '= "parent") $PROPERTY(oPar, pname) = $PROPERTY(p, pname)
- }
- do oParameters.%DispatchSetProperty(p.Name, oPar)
- }
-
- #dim q as %Dictionary.QueryDefinition
- set oClass.queries = oQueries
- set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.QueryDefinition")
- for i=1:1:classDefinition.Queries.Count() {
- set oProp = ##class(%ZEN.proxyObject).%New()
- set q = classDefinition.Queries.GetAt(i)
- for j=1:1:props.Properties.Count() {
- set pname = props.Properties.GetAt(j).Name
- set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(q, pname)
- }
- do oQueries.%DispatchSetProperty(q.Name, oProp)
- }
-
- #dim xd as %Dictionary.XDataDefinition
- set oClass.xdatas = oXDatas
- set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.XDataDefinition")
- for i=1:1:classDefinition.XDatas.Count() {
- set oProp = ##class(%ZEN.proxyObject).%New()
- set xd = classDefinition.XDatas.GetAt(i)
- for j=1:1:props.Properties.Count() {
- set pname = props.Properties.GetAt(j).Name
- set:((pname '= "parent") && (pname '= "Object")) $PROPERTY(oProp, pname) = $PROPERTY(xd, pname)
- }
- do oXDatas.%DispatchSetProperty(xd.Name, oProp)
- }
-
- #dim ind as %Dictionary.IndexDefinition
- set oClass.indices = oIndices
- set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.IndexDefinition")
- for i=1:1:classDefinition.Indices.Count() {
- set oProp = ##class(%ZEN.proxyObject).%New()
- set ind = classDefinition.Indices.GetAt(i)
- for j=1:1:props.Properties.Count() {
- set pname = props.Properties.GetAt(j).Name
- set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(ind, pname)
- }
- do oIndices.%DispatchSetProperty(ind.Name, oProp)
- }
-
- do ..collectInheritance(oData, oClass.Super, level, currLevel)
-
- quit oClass
-]]>
-
-
-
-
-Return method data.
-1
-className:%String,methodName:%String,namespace:%String
-%ZEN.proxyObject
-
-
-
-
-packageName is in basePackageName.]]>
-1
-basePackageName:%String,packageName:%String
-1
-%Boolean
-
-
-
-
-
-Wrap registered types to class names
-1
-typeName:%String
-1
-%String
-
-
-
-
-
-Return extended inheritance names
-1
-oData:%ZEN.proxyObject,baseClassDefinition:%Dictionary.ClassDefinition,basePack:%String
-1
-%String
-
-
-
-
-
-Fill inheritance data
-Returns new (correct) super
-1
-oData:%ZEN.proxyObject,super:%String,level:%String="",currLevel:%Integer=0
-1
-%Status
-
-
-
-
-
-Setup basic output data object
-1
-packageName:%String,baseNamespace:%String,savedName:%String
-1
-%ZEN.proxyObject
-
-
-
-
-
-Returns if class with given name exists.
-1
-className:%String
-%Boolean
-
-
-
-
-
-Returns structured package data
-1
-rootPackageName:%String,namespace:%String
-%ZEN.proxyObject
-
-
-
-
-1
-classList:%String,namespace:%String,level:%String=""
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-REST interface for ClassExplorer
-%CSP.REST
-64010,52108.241141
-63648,30450.187229
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-]]>
-
-
-
-
-Method returns whole class tree visible in the current namespace.
-1
-%Status
-
-
-
-
-
-Returns classTree by given class name
-1
-%Status
-
-
-
-
-
-Saves the view preferences
-1
-%Status
-
-
-
-
-
-Saves the view preferences
-1
-%Status
-
-
-
-
-
-Returns all package class trees by given package name
-1
-%Status
-
-
-
-
-
-Return the list of all namespaces
-1
-%Status
-
-
-
-
-
-Returns method description and code
-1
-%Status
-
-
-
-
-
-Method returns user application CSS.
-1
-%Status
-
-
-
-
-
-Method returns user application JavaScript.
-1
-%Status
-
-
-
-
-
-Method returns user application HTML.
-1
-%Status
-
-
-
-
-
-Issue an "304 Not Modified" status
-1
-%Status
-
-
-
-
-
-
-
-Cache Class Explorer vX.X.X/*build.replace:pkg.version*/ static content generator.
-Class contains methods that return JS/CSS/HTML data for single page application.
-63670,71368.846177
-63663,71456.865723
-
-
-
-Write the contents of xData tag
-1
-Const:%String
-%Status
-
-
-
-
-
-]]>
-
-
-
-
-]]>
-
-
-
-
-]]>
-
-
-
-
-
-%Projection.AbstractProjection
-63958,46205.449903
-63696,64041.85537
-
-
-/ClassExplorer
-
-
-
-ClassExplorer.Router
-
-
-
-WebAppInstaller
-
-
-
-
-This method is invoked when a class is compiled.
-1
-
-%Status
-
-
-
-
-
-This method is invoked when a class is 'uncompiled'.
-1
-
-%Status
-
-
-
-
diff --git a/gulpfile.js b/gulpfile.js
index af2e3d7..92d6bc0 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -14,7 +14,10 @@ var gulp = require("gulp"),
autoprefixer = require('autoprefixer-core'),
pkg = require("./package.json"),
zip = require("gulp-zip"),
- rename = require("gulp-rename");
+ rename = require("gulp-rename"),
+ preprocess = require("gulp-preprocess");
+
+var INSTALLER_CLASS_NAME = "ClassExplorer.Installer";
var banner = [
"",
@@ -26,7 +29,12 @@ var banner = [
" ** @see https://github.com/ZitRos/CacheClassExplorer",
" **/",
""
-].join("\n");
+].join("\n"),
+ context = {
+ context: {
+ package: pkg
+ }
+ };
var specialReplace = function () {
return replace(/[^\s]+\/\*build\.replace:(.*)\*\//g, function (part, match) {
@@ -42,12 +50,12 @@ gulp.task("clean", function () {
gulp.task("gatherLibs", ["clean"], function () {
return gulp.src([
- "web/jsLib/jquery.min.js",
- "web/jsLib/lodash.min.js",
- "web/jsLib/backbone-min.js",
- "web/jsLib/joint.js",
- "web/jsLib/joint.shapes.uml.js",
- "web/jsLib/ImageExporter.js"
+ "src/web/jsLib/jquery.min.js",
+ "src/web/jsLib/lodash.min.js",
+ "src/web/jsLib/backbone-min.js",
+ "src/web/jsLib/joint.js",
+ "src/web/jsLib/joint.shapes.uml.js",
+ "src/web/jsLib/ImageExporter.js"
])
.pipe(uglify({
output: {
@@ -58,18 +66,18 @@ gulp.task("gatherLibs", ["clean"], function () {
preserveComments: "some"
}))
.pipe(addsrc.append([
- "web/jsLib/joint.layout.DirectedGraph.min.js"
+ "src/web/jsLib/joint.layout.DirectedGraph.min.js"
]))
.pipe(stripComments({ safe: true }))
- .pipe(concat("CacheClassExplorer.js"))
+ .pipe(concat("index.js"))
.pipe(replace(//g, "\\x0B"))
.pipe(replace(/\x1b/g, "\\x1B"))
.pipe(gulp.dest("build/web/js/"));
});
gulp.task("gatherScripts", ["clean", "gatherLibs"], function () {
- return gulp.src("web/js/*.js")
- .pipe(concat("CacheClassExplorer.js"))
+ return gulp.src("src/web/js/*.js")
+ .pipe(concat("index.js"))
.pipe(specialReplace())
.pipe(wrap("CacheClassExplorer = (function(){<%= contents %> return CacheClassExplorer;}());"))
.pipe(uglify({
@@ -81,25 +89,25 @@ gulp.task("gatherScripts", ["clean", "gatherLibs"], function () {
preserveComments: "some"
}))
.pipe(header(banner, { pkg: pkg }))
- .pipe(addsrc.prepend("build/web/js/CacheClassExplorer.js"))
- .pipe(concat("CacheClassExplorer.js"))
+ .pipe(addsrc.prepend("build/web/js/index.js"))
+ .pipe(concat("index.js"))
.pipe(replace(/\x1b/g, "\\x1B"))
.pipe(gulp.dest("build/web/js/"));
});
gulp.task("gatherCSS", ["clean"], function () {
- return gulp.src("web/css/*.css")
- .pipe(concat("CacheClassExplorer.css"))
+ return gulp.src("src/web/css/*.css")
+ .pipe(concat("index.css"))
.pipe(postcss([ autoprefixer({ browsers: ["last 3 version"] }) ]))
.pipe(minifyCSS({ keepSpecialComments: 0 }))
.pipe(gulp.dest("build/web/css/"));
});
gulp.task("addHTMLFile", ["clean"], function () {
- return gulp.src("web/index.html")
+ return gulp.src("src/web/index.html")
.pipe(htmlReplace({
- "css": "css/CacheClassExplorer.css",
- "js": "js/CacheClassExplorer.js"
+ "css": "css/index.css",
+ "js": "js/index.js"
}))
.pipe(gulp.dest("build/web/"));
});
@@ -114,33 +122,32 @@ gulp.task("copyREADME", ["clean"], function () {
.pipe(gulp.dest("build/"));
});
-gulp.task("exportCacheXML", [
- "clean", "gatherCSS", "gatherScripts", "addHTMLFile", "copyLICENSE", "copyREADME"
-], function () {
- return gulp.src("cache/projectTemplate.xml")
- .pipe(specialReplace())
- .pipe(replace(
- /\{\{replace:css}}/,
- function () { return fs.readFileSync("build/web/css/CacheClassExplorer.css", "utf-8"); }
- ))
- .pipe(replace(
- /\{\{replace:js}}/,
- function () { return fs.readFileSync("build/web/js/CacheClassExplorer.js", "utf-8"); }
- ))
- .pipe(replace(
- /\{\{replace:html}}/,
- function () { return fs.readFileSync("build/web/index.html", "utf-8"); }
- ))
- .pipe(rename(function (path) { path.basename = "CacheClassExplorer-v" + pkg["version"]; }))
- .pipe(gulp.dest("build/Cache"));
+gulp.task("pre-cls", ["clean"], function () {
+ return gulp.src(["src/cls/**/*.cls"])
+ .pipe(rename(function (f) {
+ f.basename = (f.dirname === "." ? "" : f.dirname + ".") + f.basename;
+ f.dirname = ".";
+ if (f.basename !== INSTALLER_CLASS_NAME)
+ context.context.compileAfter +=
+ (context.context.compileAfter ? "," : "") + f.basename;
+ }))
+ .pipe(gulp.dest("build/cls/"));
+});
+
+gulp.task("cls", ["pre-cls", "copyLICENSE", "copyREADME", "addHTMLFile", "gatherScripts",
+ "gatherCSS"], function () {
+ return gulp.src(["build/cls/**/*.cls"])
+ .pipe(preprocess(context))
+ .pipe(gulp.dest("build/cls"));
});
-gulp.task("zipRelease", ["exportCacheXML"], function () {
- return gulp.src(["build/**/*", "!build/web/**/*"])
+gulp.task("zipRelease", function () {
+ return gulp.src(["build/**/*", "!build/web/**/*.*", "!build/cls/**/*.*"])
.pipe(zip("CacheClassExplorer-v" + pkg["version"] + ".zip", {
comment: "Cache UML explorer v" + pkg["version"] + " by Nikita Savchenko\n\n" +
"+ Cache folder holds XML file to import to InterSystems Cache.\n\n" +
- "For further information about installation and information, check README.md file."
+ "For further information about installation and information, check README.md file.\n\n"
+ + "See https://github.com/intersystems-ru/UMLExplorer"
}))
.pipe(gulp.dest("build"));
});
@@ -150,4 +157,4 @@ gulp.task("desktop", ["default"], function () {
.pipe(gulp.dest("C:/Users/ZitRo/Desktop"));
});
-gulp.task("default", ["zipRelease"]);
\ No newline at end of file
+gulp.task("default", ["cls"]);
\ No newline at end of file
diff --git a/import.bat b/import.bat
index 4446d65..1e36096 100644
--- a/import.bat
+++ b/import.bat
@@ -2,9 +2,19 @@
:: the project. Replace the path below to your Caché installation and build & import application to
:: Caché using only one command.
-:: CHANGE THIS PATH TO YOUR CACHÉ INSTALLATION PATH ON WINDOWS
+:: Latest NodeJS & Caché 2016.2+ IS REQUIRED TO PROCEED
+@echo off
+
+:: CHANGE THIS PATH TO YOUR CACHÉ INSTALLATION PATH ON WINDOWS (folder that contains bin, CSP, mgr and other folders)
set CACHE_DIR=C:\Program Files\InterSystems\Ensemble
-:: NAMESPACE IMPORTING TO
+:: NAMESPACE TO IMPORT PACKAGE TO
set NAMESPACE=USER
+:: Other variables
+set BUILD_DIR=build\cls
+:: Export
+set XML_EXPORT_DIR=build
+set PACKAGE_NAME=ClassExplorer
-npm run gulp & echo w "OK:"_$system.OBJ.ImportDir("%~dp0build\Cache",,"ck") halt | "%CACHE_DIR%\bin\cache.exe" -s "%CACHE_DIR%\mgr" -U %NAMESPACE%
\ No newline at end of file
+npm run gulp && ^
+echo s st = $system.Status.GetErrorText($system.OBJ.ImportDir("%~dp0%BUILD_DIR%",,"ck")) w "IMPORT STATUS: "_$case(st="",1:"OK",:st) halt | "%CACHE_DIR%\bin\cache.exe" -s "%CACHE_DIR%\mgr" -U %NAMESPACE% && ^
+echo s st = $system.Status.GetErrorText($system.OBJ.ExportPackage("%PACKAGE_NAME%", "%~dp0%XML_EXPORT_DIR%\%PACKAGE_NAME%-v"_##class(%PACKAGE_NAME%.Installer).#VERSION_".xml")) w $c(13,10)_"EXPORT STATUS: "_$case(st="",1:"OK",:st) halt | "%CACHE_DIR%\bin\cache.exe" -s "%CACHE_DIR%\mgr" -U %NAMESPACE%
\ No newline at end of file
diff --git a/package.json b/package.json
index ef69901..1ac3918 100755
--- a/package.json
+++ b/package.json
@@ -1,8 +1,10 @@
{
"name": "CacheClassExplorer",
- "version": "1.20.1",
+ "version": "1.21.0",
"description": "Class Explorer for InterSystems Caché",
- "directories": { "test": "test" },
+ "directories": {
+ "test": "test"
+ },
"dependencies": {},
"devDependencies": {
"autoprefixer-core": "^6.0.1",
@@ -14,6 +16,7 @@
"gulp-html-replace": "^1.6.2",
"gulp-minify-css": "^1.2.4",
"gulp-postcss": "^6.4.0",
+ "gulp-preprocess": "^2.0.0",
"gulp-rename": "^1.2.0",
"gulp-replace": "^0.5.3",
"gulp-strip-comments": "^2.4.5",
@@ -21,11 +24,27 @@
"gulp-wrap": "^0.13.0",
"gulp-zip": "^4.0.0"
},
- "scripts": { "gulp": "gulp" },
- "repository": { "type": "git", "url": "https://github.com/ZitRos/CacheUMLExplorer" },
- "keywords": [ "UMLExplorer", "Caché", "UML", "diagram" ],
+ "scripts": {
+ "gulp": "gulp",
+ "zip": "gulp zipRelease"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ZitRos/CacheUMLExplorer"
+ },
+ "keywords": [
+ "UMLExplorer",
+ "Caché",
+ "Class",
+ "Explorer",
+ "UML",
+ "diagram",
+ "builder"
+ ],
"author": "ZitRo",
"license": "MIT",
- "bugs": { "url": "https://github.com/ZitRos/CacheUMLExplorer/issues" },
+ "bugs": {
+ "url": "https://github.com/ZitRos/CacheUMLExplorer/issues"
+ },
"homepage": "https://github.com/ZitRos/CacheUMLExplorer"
}
diff --git a/src/cls/ClassExplorer/ClassView.cls b/src/cls/ClassExplorer/ClassView.cls
new file mode 100644
index 0000000..24bc574
--- /dev/null
+++ b/src/cls/ClassExplorer/ClassView.cls
@@ -0,0 +1,356 @@
+/// Cache Class Explorer v
+/// Class contains methods that return structured classes/packages data.
+Class ClassExplorer.ClassView
+{
+
+/// Return list with all namespaces
+ClassMethod getAllNamespacesList() As %ZEN.proxyObject
+{
+ set resp = ##class(%ZEN.proxyObject).%New()
+ set resp.namespaces = ##class(%ZEN.proxyObject).%New()
+ set resp.currentNamespace = $NAMESPACE
+ set result = ##class(%ResultSet).%New("%SYS.Namespace:List")
+ do result.Execute()
+ while (result.Next()) {
+ set ns = ##class(%ZEN.proxyObject).%New()
+ set ns.remote = result.Get("Remote")
+ set ns.status = result.Get("Status")
+ do resp.namespaces.%DispatchSetProperty(result.Get("Nsp"), ns)
+ }
+ return resp
+}
+
+/// Returns structured class tree with all classes available in current namespace
+ClassMethod getClassTree(namespace As %String, showMapped = 0) As %ZEN.proxyObject
+{
+ zn:$GET(namespace)'="" namespace
+ set resp = ##class(%ZEN.proxyObject).%New()
+
+ set showSystem = (namespace="%SYS")
+ do $System.OBJ.GetClassList(.classes, "/system="_showSystem_" /percent="
+ _showSystem_" /mapped=" _ showMapped)
+ set objects = ##class(%Library.ArrayOfObjects).%New()
+ set lastParts = $LB()
+
+ set level = 1
+ do objects.SetAt(resp, level)
+
+ set name = $order(classes(""))
+ while (name '= "") {
+ //if ($EXTRACT(name, 1, 1) = "%") && ($NAMESPACE '= "%SYS") { continue }
+ set parts = $LISTFROMSTRING(name, ".")
+ set level = 1
+ while ((level < $LISTLENGTH(parts)) && ($LISTGET(lastParts, level) = ("/"_$LISTGET(parts, level)))) {
+ set level = level + 1
+ }
+ set resp = objects.GetAt(level)
+ if (resp="") {
+ set resp = ##class(%ZEN.proxyObject).%New()
+ do objects.GetAt(level - 1).%DispatchSetProperty("/" _ $LISTGET(parts, level - 1), resp)
+ do objects.SetAt(resp, level)
+ }
+ while ($LISTLENGTH(parts) > level) {
+ set level = level + 1
+ set resp = ##class(%ZEN.proxyObject).%New()
+ do objects.GetAt(level - 1).%DispatchSetProperty("/" _ $LISTGET(parts, level - 1), resp)
+ do objects.SetAt(resp, level)
+ }
+ if ($LISTLENGTH(parts) = level) {
+ do resp.%DispatchSetProperty($LISTGET(parts, level), 0)
+ }
+ set lastParts = parts
+ for i=1:1:$LISTLENGTH(lastParts)-1 {
+ set $LIST(lastParts, i) = "/"_$LISTGET(lastParts, i)
+ }
+ set name = $order(classes(name))
+ }
+
+ quit objects.GetAt(1)
+}
+
+/// Return structured data about class.
+ClassMethod fillClassData(oData As %ZEN.proxyObject, className As %String, level As %String = "", currLevel As %Integer = 0) As %ZEN.proxyObject [ Private ]
+{
+ if ((level'="") && (+currLevel>+level)) { quit "" }
+ set currLevel = $increment(currLevel)
+ set classDefinition = ##class(%Dictionary.ClassDefinition).%OpenId(className)
+ set compiledClassDefinition = ##class(%Dictionary.CompiledClass).%OpenId(className)
+ if (classDefinition = "") || (oData.classes.%DispatchGetProperty(classDefinition.Name) '= "") quit ""
+
+ set oClass = ##class(%ZEN.proxyObject).%New()
+ do oData.classes.%DispatchSetProperty(classDefinition.Name, oClass) // prevent from recursive setup
+ set package = $LISTTOSTRING($LIST($LISTFROMSTRING(classDefinition.Name, "."), 1, *-1),".")
+ set oProperties = ##class(%ZEN.proxyObject).%New()
+ set oQueries = ##class(%ZEN.proxyObject).%New()
+ set oIndices = ##class(%ZEN.proxyObject).%New()
+ set oXDatas = ##class(%ZEN.proxyObject).%New()
+
+ set oClass.isDataType = classDefinition.ClientDataTypeIsDefined()
+ set oClass.isOdbcType = classDefinition.OdbcTypeIsDefined()
+ set oClass.isSoapBindingStyle = classDefinition.SoapBindingStyleIsDefined()
+ set oClass.isSoapBodyUse = classDefinition.SoapBodyUseIsDefined()
+ set oClass.isSqlCategory = classDefinition.SqlCategoryIsDefined()
+
+ set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.ClassDefinition")
+ for j=1:1:props.Properties.Count() {
+ set pname = props.Properties.GetAt(j).Name
+ set:((pname '= "parent")
+ && ('props.Properties.GetAt(j).Private)
+ && ('$IsObject($PROPERTY(classDefinition, pname)))) $PROPERTY(oClass, pname) = $PROPERTY(classDefinition, pname)
+ }
+ if (oClass.TimeChanged) { set oClass.TimeChanged = $zdatetime(oClass.TimeChanged) }
+ if (oClass.TimeCreated) { set oClass.TimeCreated = $zdatetime(oClass.TimeCreated) }
+ if ((compiledClassDefinition '= "") && (compiledClassDefinition.ClassType '= "")) {
+ set oClass.ClassType = compiledClassDefinition.ClassType // set class type from all inherited classes
+ }
+
+ set oClass.Super = "" // do not quit with super at this moment
+ if (oData.restrictPackage) && ('..inPackage(oData.basePackageName, package)) quit oClass
+ set oClass.Super = ..correctInheritance(oData, classDefinition, package) // now expand super names
+
+ set oClass.properties = oProperties
+ set count = classDefinition.Properties.Count()
+ set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.PropertyDefinition")
+ for i=1:1:count {
+ set oProp = ##class(%ZEN.proxyObject).%New()
+ set p = classDefinition.Properties.GetAt(i)
+ do oProperties.%DispatchSetProperty(p.Name, oProp)
+ for j=1:1:props.Properties.Count() {
+ set pname = props.Properties.GetAt(j).Name
+ set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(p, pname)
+ }
+ if (..classExists(package _ "." _ p.Type)) {
+ set oProp.Type = package _ "." _ p.Type
+ do ..fillClassData(oData, package _ "." _ p.Type, level, currLevel)
+ } elseif (..classExists(..extendClassFromType(p.Type))) {
+ set oProp.Type = ..extendClassFromType(p.Type)
+ do ..fillClassData(oData, ..extendClassFromType(p.Type), level, currLevel)
+ } else {
+ set oProp.Type = ..extendClassFromType(p.Type)
+ }
+ }
+
+ set oMethods = ##class(%ZEN.proxyObject).%New()
+ set oClass.methods = oMethods
+ set count = classDefinition.Methods.Count()
+ set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.MethodDefinition")
+ for i=1:1:count {
+ set oMeth = ##class(%ZEN.proxyObject).%New()
+ set met = classDefinition.Methods.GetAt(i)
+ do oMethods.%DispatchSetProperty(met.Name, oMeth)
+ for j=1:1:props.Properties.Count() {
+ set pname = props.Properties.GetAt(j).Name
+ set:((pname '= "parent") && (pname '= "Implementation")) $PROPERTY(oMeth, pname) = $PROPERTY(met, pname)
+ }
+ }
+
+ set oParameters = ##class(%ZEN.proxyObject).%New()
+ set oClass.parameters = oParameters
+ set count = classDefinition.Parameters.Count()
+ set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.ParameterDefinition")
+ for i=1:1:count {
+ set oPar = ##class(%ZEN.proxyObject).%New()
+ set p = classDefinition.Parameters.GetAt(i)
+ for j=1:1:props.Properties.Count() {
+ set pname = props.Properties.GetAt(j).Name
+ set:(pname '= "parent") $PROPERTY(oPar, pname) = $PROPERTY(p, pname)
+ }
+ do oParameters.%DispatchSetProperty(p.Name, oPar)
+ }
+
+ #dim q as %Dictionary.QueryDefinition
+ set oClass.queries = oQueries
+ set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.QueryDefinition")
+ for i=1:1:classDefinition.Queries.Count() {
+ set oProp = ##class(%ZEN.proxyObject).%New()
+ set q = classDefinition.Queries.GetAt(i)
+ for j=1:1:props.Properties.Count() {
+ set pname = props.Properties.GetAt(j).Name
+ set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(q, pname)
+ }
+ do oQueries.%DispatchSetProperty(q.Name, oProp)
+ }
+
+ #dim xd as %Dictionary.XDataDefinition
+ set oClass.xdatas = oXDatas
+ set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.XDataDefinition")
+ for i=1:1:classDefinition.XDatas.Count() {
+ set oProp = ##class(%ZEN.proxyObject).%New()
+ set xd = classDefinition.XDatas.GetAt(i)
+ for j=1:1:props.Properties.Count() {
+ set pname = props.Properties.GetAt(j).Name
+ set:((pname '= "parent") && (pname '= "Object")) $PROPERTY(oProp, pname) = $PROPERTY(xd, pname)
+ }
+ do oXDatas.%DispatchSetProperty(xd.Name, oProp)
+ }
+
+ #dim ind as %Dictionary.IndexDefinition
+ set oClass.indices = oIndices
+ set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.IndexDefinition")
+ for i=1:1:classDefinition.Indices.Count() {
+ set oProp = ##class(%ZEN.proxyObject).%New()
+ set ind = classDefinition.Indices.GetAt(i)
+ for j=1:1:props.Properties.Count() {
+ set pname = props.Properties.GetAt(j).Name
+ set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(ind, pname)
+ }
+ do oIndices.%DispatchSetProperty(ind.Name, oProp)
+ }
+
+ do ..collectInheritance(oData, oClass.Super, level, currLevel)
+
+ quit oClass
+}
+
+/// Return method data.
+ClassMethod getMethod(className As %String, methodName As %String, namespace As %String) As %ZEN.proxyObject
+{
+ zn:$GET(namespace)'="" namespace
+ set oMeth = ##class(%ZEN.proxyObject).%New()
+ set met = ##class(%Dictionary.MethodDefinition).%OpenId(className _ "||" _ methodName)
+ if (met = "") { set oMeth.error = 1 quit oMeth }
+
+ set oMeth.description = met.Description
+ set oMeth.arguments = met.FormalSpec
+ set oMeth.returns = met.ReturnType
+ set oMeth.code = ""
+ do {
+ set chars = met.Implementation.Read()
+ set oMeth.code = oMeth.code _ chars
+ } while (chars)
+
+ quit oMeth
+}
+
+/// Returns if packageName is in basePackageName.
+ClassMethod inPackage(basePackageName As %String, packageName As %String) As %Boolean [ Private ]
+{
+ set pack = $LISTFROMSTRING(packageName, ".")
+ set list = $LISTFROMSTRING(basePackageName, ".")
+ set OK = 1
+ for i=1:1:$LISTLENGTH(list) {
+ if ($LISTGET(list, i) = $LISTGET(pack, i)) {
+ set OK = 1
+ } else {
+ set OK = 0
+ quit
+ }
+ }
+ quit OK
+}
+
+/// Wrap registered types to class names
+ClassMethod extendClassFromType(typeName As %String) As %String [ Private ]
+{
+ return $CASE(typeName,
+ "%Boolean": "%Library.Boolean",
+ "%String": "%Library.String",
+ "%Integer": "%Library.Integer",
+ "%DataType": "%Library.DataType",
+ "%Status": "%Library.Status",
+ "%CacheString": "%Library.CacheString",
+ "%Persistent": "%Library.Persistent",
+ :typeName)
+}
+
+/// Return extended inheritance names
+ClassMethod correctInheritance(oData As %ZEN.proxyObject, baseClassDefinition As %Dictionary.ClassDefinition, basePack As %String) As %String [ Private ]
+{
+ set superParts = $LISTFROMSTRING(baseClassDefinition.Super, ",")
+ for i=1:1:$LISTLENGTH(superParts) {
+ set className = $LISTGET(superParts, i)
+
+ // try to find class with base package, if not successfull - try to add class as it is
+ if (..classExists(basePack_"."_className)) {
+ set clsName = basePack_"."_className
+ } else {
+ set clsName = ..extendClassFromType(className)
+ }
+
+ set $LIST(superParts, i) = clsName
+ }
+ quit $LISTTOSTRING(superParts)
+}
+
+/// Fill inheritance data
+/// Returns new (correct) super
+ClassMethod collectInheritance(oData As %ZEN.proxyObject, super As %String, level As %String = "", currLevel As %Integer = 0) As %Status [ Private ]
+{
+ set superParts = $LISTFROMSTRING(super, ",")
+ for i=1:1:$LISTLENGTH(superParts) {
+ do ..fillClassData(oData, $LISTGET(superParts, i), level, currLevel)
+ }
+ quit $$$OK
+}
+
+/// Setup basic output data object
+ClassMethod getBaseOData(packageName As %String, baseNamespace As %String, savedName As %String) As %ZEN.proxyObject [ Private ]
+{
+ set oData = ##class(%ZEN.proxyObject).%New()
+ set oData.basePackageName = packageName
+ set oData.restrictPackage = 1 // expand classes only in base package
+ set oData.classes = ##class(%ZEN.proxyObject).%New()
+
+ set ns = $namespace
+ zn baseNamespace
+ if $get(^ClassExplorer("savedView", ns_":"_savedName)) '= "" {
+ set oData.savedView = $get(^ClassExplorer("savedView", ns_":"_savedName))
+ }
+ zn ns
+
+ quit oData
+}
+
+/// Returns if class with given name exists.
+ClassMethod classExists(className As %String) As %Boolean
+{
+ quit ##class(%Dictionary.ClassDefinition).%OpenId(className) '= ""
+}
+
+/// Returns structured package data
+ClassMethod getPackageView(rootPackageName As %String, namespace As %String) As %ZEN.proxyObject
+{
+ set baseNamespace = $namespace
+ zn:$GET(namespace)'="" namespace
+ set oData = ..getBaseOData(rootPackageName, baseNamespace, "PACKAGE:"_rootPackageName)
+ set classes = ##class(%ResultSet).%New("%Dictionary.ClassDefinition:Summary")
+ do classes.Execute()
+ set listLen = $LISTLENGTH($LISTFROMSTRING(rootPackageName, ".")) // bottom level of package to extract
+
+ while (classes.Next()) {
+ set className = classes.Data("Name")
+ set packageName = $LISTTOSTRING($LIST($LISTFROMSTRING(className, "."), 1, listLen), ".")
+ if (packageName = rootPackageName) {
+ do ..fillClassData(oData, className)
+ }
+ }
+
+ quit oData
+}
+
+ClassMethod getArbitraryView(classList As %String, namespace As %String, level As %String = "")
+{
+ set baseNamespace = $namespace
+ zn:$GET(namespace)'="" namespace
+ set list = $LISTFROMSTRING(classList, ",")
+
+ set basePackages = $LB()
+ set count = 0
+ for i=1:1:$LISTLENGTH(list) {
+ set packName = $PIECE($LISTGET(list, i), ".", 1)
+ if ($LISTFIND(basePackages, packName) = 0) {
+ set $LIST(basePackages, count + 1) = packName
+ set count = count + 1
+ }
+ }
+
+ set oData = ..getBaseOData($LISTTOSTRING(basePackages, ",", 1), baseNamespace, "ARBITRARY:"_classList)
+
+ for i=1:1:$LISTLENGTH(list) {
+ do ..fillClassData(oData, $LISTGET(list, i), level)
+ }
+
+ quit oData
+}
+
+}
diff --git a/src/cls/ClassExplorer/Installer.cls b/src/cls/ClassExplorer/Installer.cls
new file mode 100644
index 0000000..b63e9ea
--- /dev/null
+++ b/src/cls/ClassExplorer/Installer.cls
@@ -0,0 +1,54 @@
+Class ClassExplorer.Installer Extends %Projection.AbstractProjection
+{
+
+Parameter VERSION = "";
+
+Parameter Name = "/ClassExplorer";
+
+Parameter DispatchClass = "ClassExplorer.Router";
+
+Projection Reference As Installer;
+
+/// This method is invoked when a class is compiled.
+ClassMethod CreateProjection(cls As %String, ByRef params) As %Status
+{
+ set properties("NameSpace") = $Namespace
+ set properties("Description") = "A WEB application for Cache UML Explorer."
+ set properties("IsNameSpaceDefault") = $$$NO
+ set properties("DispatchClass") = ..#DispatchClass
+
+ new $Namespace
+ set $Namespace = "%SYS"
+ do ##class(Security.System).GetInstallationSecuritySetting(.security)
+ if (security="None") {
+ set properties("AutheEnabled") = $$$AutheUnauthenticated
+ } else {
+ set properties("AutheEnabled") = $$$AutheCache
+ }
+
+ if ('##class(Security.Applications).Exists(..#Name)) {
+ write !, "Creating WEB application " _ ..#Name _ "..."
+ set st = ##class(Security.Applications).Create(..#Name, .properties)
+ write !, "WEB application " _ ..#Name _ " created."
+ } else {
+ set st = $$$OK
+ write !, "WEB application " _ ..#Name _ " already exists, so it is ready to use."
+ }
+ quit st
+}
+
+/// This method is invoked when a class is 'uncompiled'.
+ClassMethod RemoveProjection(cls As %String, ByRef params, recompile As %Boolean) As %Status
+{
+ new $Namespace
+ set $Namespace = "%SYS"
+ set st = $$$OK
+ if (##class(Security.Applications).Exists(..#Name)) {
+ write !, "Deleting WEB application " _ ..#Name _"..."
+ set st = ##class(Security.Applications).Delete(..#Name)
+ write !, "WEB application " _ ..#Name _ " was successfully removed."
+ }
+ quit st
+}
+
+}
diff --git a/src/cls/ClassExplorer/Router.cls b/src/cls/ClassExplorer/Router.cls
new file mode 100644
index 0000000..0275504
--- /dev/null
+++ b/src/cls/ClassExplorer/Router.cls
@@ -0,0 +1,141 @@
+/// Cache Class Explorer v
+/// REST interface for ClassExplorer
+Class ClassExplorer.Router Extends %CSP.REST
+{
+
+XData UrlMap
+{
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+/// Method returns whole class tree visible in the current namespace.
+ClassMethod GetClassTree() As %Status
+{
+ do ##class(ClassExplorer.ClassView).getClassTree(%request.Get("namespace"), %request.Get("mapped")).%ToJSON(, "o")
+ return $$$OK
+}
+
+/// Returns classTree by given class name
+ClassMethod GetArbitraryView() As %Status
+{
+ set classList = %request.Get("list")
+ set classData = ##class(ClassView).getArbitraryView(classList, %request.Get("namespace"), %request.Get("level"))
+ do classData.%ToJSON(, "o")
+ return $$$OK
+}
+
+/// Saves the view preferences
+ClassMethod SaveView() As %Status
+{
+ set name = %request.Get("name")
+ set content = %request.Content.Read($$$MaxStringLength) // ~ 7mb
+ set ^ClassExplorer("savedView", name) = content
+ write "{""OK"":true}"
+ return $$$OK
+}
+
+/// Saves the view preferences
+ClassMethod ResetView() As %Status
+{
+ set name = %request.Get("name")
+ kill ^ClassExplorer("savedView", name)
+ write "{""OK"":true}"
+ return $$$OK
+}
+
+/// Returns all package class trees by given package name
+ClassMethod GetPackageView() As %Status
+{
+ set packageName = %request.Get("name")
+ set classData = ##class(ClassView).getPackageView(packageName, %request.Get("namespace"))
+ do classData.%ToJSON(, "o")
+ return $$$OK
+}
+
+/// Return the list of all namespaces
+ClassMethod GetAllNamespacesList() As %Status
+{
+ do ##class(ClassExplorer.ClassView).getAllNamespacesList().%ToJSON(, "o")
+ return $$$OK
+}
+
+/// Returns method description and code
+ClassMethod GetMethod() As %Status
+{
+ set className = %request.Get("className")
+ set methodName = %request.Get("methodName")
+ set methodData = ##class(ClassView).getMethod(className, methodName, %request.Get("namespace"))
+ do methodData.%ToJSON(, "o")
+ return $$$OK
+}
+
+/// Method returns user application CSS.
+ClassMethod GetCss() As %Status
+{
+ #define CompileTime ##Expression("""" _ $zd($h, 11) _ ", "_ $zdt($NOW(0), 2,1) _ " GMT""")
+ set %response.CharSet = "utf-8"
+ set %response.ContentType = "text/css"
+ do %response.SetHeader("Last-Modified", $$$CompileTime)
+
+ if %request.GetCgiEnv("HTTP_IF_MODIFIED_SINCE")=$$$CompileTime {
+ do ..Http304()
+ } else {
+ do ##class(StaticContent).Write("CSS")
+ }
+
+ return $$$OK
+}
+
+/// Method returns user application JavaScript.
+ClassMethod GetJs() As %Status
+{
+ #define CompileTime ##Expression("""" _ $zd($h, 11) _ ", "_ $zdt($NOW(0), 2,1) _ " GMT""")
+ set %response.CharSet = "utf-8"
+ set %response.ContentType = "text/javascript"
+ do %response.SetHeader("Last-Modified", $$$CompileTime)
+
+ if %request.GetCgiEnv("HTTP_IF_MODIFIED_SINCE")=$$$CompileTime {
+ do ..Http304()
+ } else {
+ do ##class(StaticContent).Write("JS")
+ }
+
+ return $$$OK
+}
+
+/// Method returns user application HTML.
+ClassMethod Index() As %Status
+{
+ #define CompileTime ##Expression("""" _ $zd($h, 11) _ ", "_ $zdt($NOW(0), 2,1) _ " GMT""")
+ do %response.SetHeader("Last-Modified", $$$CompileTime)
+
+ if %request.GetCgiEnv("HTTP_IF_MODIFIED_SINCE")=$$$CompileTime {
+ do ..Http304()
+ } else {
+ do ##class(StaticContent).Write("HTML")
+ }
+
+ return $$$OK
+}
+
+/// Issue an "304 Not Modified" status
+ClassMethod Http304() As %Status
+{
+ Set %response.Status="304 Not Modified"
+ Quit $$$OK
+}
+
+}
diff --git a/src/cls/ClassExplorer/StaticContent.cls b/src/cls/ClassExplorer/StaticContent.cls
new file mode 100644
index 0000000..dd38e71
--- /dev/null
+++ b/src/cls/ClassExplorer/StaticContent.cls
@@ -0,0 +1,36 @@
+/// Cache Class Explorer v generated static content.
+/// Class contains methods that return JS/CSS/HTML data for single page application.
+Class ClassExplorer.StaticContent
+{
+
+/// Write the contents of xData tag
+ClassMethod Write(Const As %String) As %Status
+{
+ Set xdata = ##class(%Dictionary.CompiledXData).%OpenId("ClassExplorer.StaticContent||"_Const).Data
+ set status=##class(%XML.TextReader).ParseStream(xdata, .textreader)
+ while textreader.Read() { if (textreader.NodeType="chars") { w textreader.Value } }
+ return $$$OK
+}
+
+XData HTML
+{
+
+]]>
+
+}
+
+XData CSS
+{
+
+]]>
+
+}
+
+XData JS
+{
+
+]]>
+
+}
+
+}
diff --git a/web/css/classView.css b/src/web/css/classView.css
similarity index 100%
rename from web/css/classView.css
rename to src/web/css/classView.css
diff --git a/web/css/extras.css b/src/web/css/extras.css
similarity index 100%
rename from web/css/extras.css
rename to src/web/css/extras.css
diff --git a/web/css/helpView.css b/src/web/css/helpView.css
similarity index 100%
rename from web/css/helpView.css
rename to src/web/css/helpView.css
diff --git a/web/css/hoverMessage.css b/src/web/css/hoverMessage.css
similarity index 100%
rename from web/css/hoverMessage.css
rename to src/web/css/hoverMessage.css
diff --git a/web/css/interface.css b/src/web/css/interface.css
similarity index 100%
rename from web/css/interface.css
rename to src/web/css/interface.css
diff --git a/web/css/joint.min.css b/src/web/css/joint.min.css
similarity index 100%
rename from web/css/joint.min.css
rename to src/web/css/joint.min.css
diff --git a/web/css/methodCodeView.css b/src/web/css/methodCodeView.css
similarity index 100%
rename from web/css/methodCodeView.css
rename to src/web/css/methodCodeView.css
diff --git a/web/css/settingsView.css b/src/web/css/settingsView.css
similarity index 100%
rename from web/css/settingsView.css
rename to src/web/css/settingsView.css
diff --git a/web/css/syntax.css b/src/web/css/syntax.css
similarity index 100%
rename from web/css/syntax.css
rename to src/web/css/syntax.css
diff --git a/web/css/treeView.css b/src/web/css/treeView.css
similarity index 100%
rename from web/css/treeView.css
rename to src/web/css/treeView.css
diff --git a/web/index.html b/src/web/index.html
old mode 100755
new mode 100644
similarity index 100%
rename from web/index.html
rename to src/web/index.html
diff --git a/web/js/CacheClassExplorer.js b/src/web/js/CacheClassExplorer.js
old mode 100755
new mode 100644
similarity index 100%
rename from web/js/CacheClassExplorer.js
rename to src/web/js/CacheClassExplorer.js
diff --git a/web/js/ClassTree.js b/src/web/js/ClassTree.js
old mode 100755
new mode 100644
similarity index 100%
rename from web/js/ClassTree.js
rename to src/web/js/ClassTree.js
diff --git a/web/js/ClassView.js b/src/web/js/ClassView.js
old mode 100755
new mode 100644
similarity index 100%
rename from web/js/ClassView.js
rename to src/web/js/ClassView.js
diff --git a/web/js/HoverMessage.js b/src/web/js/HoverMessage.js
similarity index 100%
rename from web/js/HoverMessage.js
rename to src/web/js/HoverMessage.js
diff --git a/web/js/Lib.js b/src/web/js/Lib.js
similarity index 100%
rename from web/js/Lib.js
rename to src/web/js/Lib.js
diff --git a/web/js/Logic.js b/src/web/js/Logic.js
similarity index 100%
rename from web/js/Logic.js
rename to src/web/js/Logic.js
diff --git a/web/js/Source.js b/src/web/js/Source.js
old mode 100755
new mode 100644
similarity index 100%
rename from web/js/Source.js
rename to src/web/js/Source.js
diff --git a/web/js/UI.js b/src/web/js/UI.js
similarity index 100%
rename from web/js/UI.js
rename to src/web/js/UI.js
diff --git a/web/jsLib/ImageExporter.js b/src/web/jsLib/ImageExporter.js
similarity index 100%
rename from web/jsLib/ImageExporter.js
rename to src/web/jsLib/ImageExporter.js
diff --git a/web/jsLib/backbone-min.js b/src/web/jsLib/backbone-min.js
similarity index 100%
rename from web/jsLib/backbone-min.js
rename to src/web/jsLib/backbone-min.js
diff --git a/web/jsLib/joint.js b/src/web/jsLib/joint.js
similarity index 100%
rename from web/jsLib/joint.js
rename to src/web/jsLib/joint.js
diff --git a/web/jsLib/joint.layout.DirectedGraph.min.js b/src/web/jsLib/joint.layout.DirectedGraph.min.js
similarity index 100%
rename from web/jsLib/joint.layout.DirectedGraph.min.js
rename to src/web/jsLib/joint.layout.DirectedGraph.min.js
diff --git a/web/jsLib/joint.shapes.uml.js b/src/web/jsLib/joint.shapes.uml.js
similarity index 100%
rename from web/jsLib/joint.shapes.uml.js
rename to src/web/jsLib/joint.shapes.uml.js
diff --git a/web/jsLib/jquery.min.js b/src/web/jsLib/jquery.min.js
similarity index 100%
rename from web/jsLib/jquery.min.js
rename to src/web/jsLib/jquery.min.js
diff --git a/web/jsLib/lodash.min.js b/src/web/jsLib/lodash.min.js
similarity index 100%
rename from web/jsLib/lodash.min.js
rename to src/web/jsLib/lodash.min.js