diff --git a/backend/php/properties/php.properties.json b/backend/php/properties/php.properties.json
index 32d5084..8ce703a 100644
--- a/backend/php/properties/php.properties.json
+++ b/backend/php/properties/php.properties.json
@@ -1,4 +1,9 @@
{
- "request.path": "../index.php",
+ "request.path": "index.php",
"should.pay.toll": "false"
+
+ "development.settings": {
+ "url": "http://localhost/php/clipperz"
+ }
+
}
\ No newline at end of file
diff --git a/backend/php/src/configuration.php b/backend/php/src/configuration.php
index 291e3a1..85f680e 100644
--- a/backend/php/src/configuration.php
+++ b/backend/php/src/configuration.php
@@ -16,10 +16,10 @@ $configuration['db_encoding'] = 0;
// edit the information below to match your database settings
-$configuration['db'] = 'clipperz'; // database name
+$configuration['db'] = 'clipperz'; // database name
$configuration['host'] = 'localhost'; // database host
-$configuration['user'] = 'root'; // database user
-$configuration['pass'] = 'pass'; // database password
+$configuration['user'] = 'clipperz'; // database user
+$configuration['pass'] = 'clipperz'; // database password
$configuration['port'] = '3306'; // database port
diff --git a/backend/php/src/index.php b/backend/php/src/index.php
index 214ac01..da7c60c 100644
--- a/backend/php/src/index.php
+++ b/backend/php/src/index.php
@@ -140,7 +140,9 @@ function updateUserData($parameters, &$user) {
$user->header = $parameters["header"];
$user->statistics = $parameters["statistics"];
$user->version = $parameters["version"];
- $user->lock = $parameters["lock"];
+ if (array_key_exists("lock", $parameters)) {
+ $user->lock = $parameters["lock"];
+ }
}
function updateRecordData($parameters, &$record, &$recordVersion) {
@@ -153,7 +155,9 @@ function updateRecordData($parameters, &$record, &$recordVersion) {
$recordVersion->reference = $recordVersionData ["reference"];
$recordVersion->data = $recordVersionData ["data"];
$recordVersion->version = $recordVersionData ["version"];
- $recordVersion->previous_version_id = $recordVersionData ["previousVersion"];
+ if (array_key_exists("previousVersion", $recordVersionData)) {
+ $recordVersion->previous_version_id = $recordVersionData ["previousVersion"];
+ }
$recordVersion->previous_version_key = $recordVersionData ["previousVersionKey"];
}
@@ -365,6 +369,7 @@ error_log("oneTimePassword");
case "message":
error_log("message");
+//error_log("message: ".json_encode($parameters));
if ($parameters["srpSharedSecret"] == $_SESSION["K"]) {
$message = $parameters["message"];
@@ -446,6 +451,88 @@ error_log("message");
$result["lock"] = $user->lock;
$result["result"] = "done";
+ //=============================================================
+ } else if ($message == "saveChanges") {
+
+//{
+// "message":"saveChanges",
+// "srpSharedSecret":"edc78508907c942173818f7247fa64869ba80672a7aa8d27b8fa6bfe524fb9c8",
+// "parameters":{
+// "records":{
+// "updated":[
+// {
+// "currentRecordVersion":{
+// "previousVersionKey":"####",
+// "reference":"08c8eb7ec528fbf987bbfb84fe2e960cf9ae937b19fbb5f05d8d90a7039fac6a",
+// "data":"WYQ16AjodjsmyZDXa4MKxOju0F…beD/zXlbVb0Zj0ZI/N55bZ",
+// "version":"0.3"
+// },
+// "record":{
+// "reference":"83de5304f60a808e48a815c6203d7d3f24874d3f40faba420bbc60b376fcc356",
+// "data":"B6uBuBE Aly0knvgrUppodDTGZQC…guizL9QvHCWyM bQQBGBVvHZ6LfA==",
+// "version":"0.3"
+// }
+// }
+// ],
+// "deleted":[
+//
+// ]
+// },
+// "user":{
+// "header":"{\"rec…sion\":\"0.1\"}",
+// "statistics":"e6iXVEM4i8ZatPZFCCads/9F",
+// "version":"0.3"
+// }
+// }
+//}
+ $user = new user();
+ $user = $user->Get($_SESSION["userId"]);
+ updateUserData($parameters["parameters"]["user"], $user);
+
+ $recordToUpdateParameterList = $parameters["parameters"]["records"]["updated"];
+ $c = count($recordToUpdateParameterList);
+ for ($i=0; $i<$c; $i++) {
+ $recordList = $user->GetRecordList(array(array("reference", "=", $recordToUpdateParameterList [$i]["record"]["reference"])));
+ if (count($recordList) == 0) {
+ $currentRecord = new record();
+ $currentVersion = new recordversion();
+ $isNewRecord = true;
+ } else {
+ $currentRecord = $recordList[0];
+ $currentRecordVersions = $currentRecord->GetRecordversionList();
+ $currentVersion = $currentRecordVersions[0];
+ $isNewRecord = false;
+ }
+
+ updateRecordData($recordToUpdateParameterList[$i], $currentRecord, $currentVersion);
+
+ if ($isNewRecord == true) {
+ $currentRecord->SaveNew();
+ $currentVersion->SaveNew();
+
+ $currentRecord->AddRecordversion($currentVersion);
+ $user->AddRecord($currentRecord);
+ }
+
+ $currentRecord->Save();
+ $currentVersion->Save();
+ }
+
+ $user->Save();
+
+ $recordToDeleteReferenceList = $parameters["parameters"]["records"]["deleted"];
+ $recordList = array();
+ $c = count($recordToDeleteReferenceList);
+ for ($i=0; $i<$c; $i++) {
+ array_push($recordList, array("reference", "=", $recordToDeleteReferenceList[$i]));
+ }
+
+ $record = new record();
+ $record->DeleteList($recordList, true);
+
+ $result["lock"] = $user->lock;
+ $result["result"] = "done";
+
//=============================================================
} else if ($message == "getRecordDetail") {
//{
@@ -474,21 +561,94 @@ error_log("message");
// updatedDate:"Tue, 17 April 2007 17:17:52 UTC",
// data:"0/BjzyY6jeh71h...pAw2++NEyylGhMC5C5f5m8pBApYziN84s4O3JQ3khW/1UttQl4="
// }
+
+
+// # Actual result (causing error in /gamma)
+// {
+// "result" : {
+// "currentVersion" : {
+// "reference" : "cb05177f96a832062c6b936d24323cb74a64e2ef1d97ee026cd1003755af7495",
+// "data" : "RAnoHmikp7RmiZ2WVyEMW+Ia",
+// "header" : "",
+// "version" : "0.3",
+// "creationDate" : "0000-00-00 00:00:00",
+// "updateDate" : "2011-10-09 19:49:11",
+// "accessDate" : "2011-10-09 19:49:11"
+// },
+// "reference" : "b07e2afa2ba782b9f379649b36ded6de0452b43c27e6b887c7ce4f2a93f44346",
+// "data" : "NtK1nkLUabbJQx5uO8ept...ZJ5dkJYYkyh3VQ==",
+// "version" : "0.3",
+// "creationDate" : "2011-10-09 19:49:11",
+// "updateDate" : "Tue, 30 Nov 1999 00:00:00 +0000",
+// "accessDate" : "0000-00-00 00:00:00",
+// "oldestUsedEncryptedVersion" : "---"
+// }
+// }
+
+
+// # Response from the online /gamma version
+// {
+// "result" : {
+// "versions" : {
+// "e2c193f017ad4f6babf51de59f7550a40596afc0c27373b6a360e426b5bc06de" : {
+// "reference" : "e2c193f017ad4f6babf51de59f7550a40596afc0c27373b6a360e426b5bc06de",
+// "data" : "s\/3ClggH4uCcf+BkIMqQ...+W0PVt\/MJ3t7s1g0g",
+// "creationDate" : "Mon, 10 October 2011 14:42:42 UTC",
+// "header" : "####",
+// "updateDate" : "Mon, 10 October 2011 14:42:42 UTC",
+// "previousVersion" : "a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463",
+// "version" : "0.3",
+// "accessDate" : "Mon, 10 October 2011 14:42:42 UTC",
+// "previousVersionKey" : "####"
+// },
+// [...]
+// "a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463" : {
+// "reference" : "a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463",
+// "accessDate" : "Mon, 10 October 2011 14:41:17 UTC",
+// "creationDate" : "Mon, 27 October 2008 08:16:14 UTC",
+// "version" : "0.3",
+// "data" : "m3yhZu81UAjCY6U2Kn...IUCb9suV0fldGOg=",
+// "updateDate" : "Mon, 27 October 2008 08:16:14 UTC",
+// "header" : "####"
+// }
+// },
+// "oldestUsedEncryptedVersion" : "0.2",
+// "reference" : "36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113",
+// "data" : "frlUkTbaOWD9j2ROat...ruWioCK0Mss27oHjPg==",
+// "creationDate" : "Wed, 14 March 2007 17:39:35 UTC",
+// "version" : "0.3",
+// "accessDate" : "Mon, 10 October 2011 14:45:12 UTC",
+// "currentVersion" : "e2c193f017ad4f6babf51de59f7550a40596afc0c27373b6a360e426b5bc06de",
+// "updatedDate" : "Mon, 10 October 2011 14:45:12 UTC"
+// },
+// "toll" : {
+// "requestType" : "MESSAGE",
+// "targetValue" : "a516c942a3792cc620775a41f8870a6c7b51796d9a94da978a75da6a52eb1e10",
+// "cost" : 2
+// }
+// }
+
$record = new record();
$recordList = $record->GetList(array(array("reference", "=", $parameters["parameters"]["reference"])));
$currentRecord = $recordList[0];
$currentRecordVersions = $currentRecord->GetRecordversionList();
$currentVersion = $currentRecordVersions[0];
-
- $result["currentVersion"] = array();
- $result["currentVersion"]["reference"] = $currentVersion->reference;
- $result["currentVersion"]["data"] = $currentVersion->data;
- $result["currentVersion"]["header"] = $currentVersion->header;
- $result["currentVersion"]["version"] = $currentVersion->version;
- $result["currentVersion"]["creationDate"] = $currentVersion->creation_date;
- $result["currentVersion"]["updateDate"] = $currentVersion->update_date;
- $result["currentVersion"]["accessDate"] = $currentVersion->access_date;
+
+ $result["versions"] = array();
+// foreach ($currentRecordVersions as $currentVersion) {
+ $result["versions"][$currentVersion->reference] = array();
+ $result["versions"][$currentVersion->reference]["reference"] = $currentVersion->reference;
+ $result["versions"][$currentVersion->reference]["data"] = $currentVersion->data;
+ $result["versions"][$currentVersion->reference]["header"] = $currentVersion->header;
+ $result["versions"][$currentVersion->reference]["version"] = $currentVersion->version;
+ $result["versions"][$currentVersion->reference]["creationDate"] = $currentVersion->creation_date;
+ $result["versions"][$currentVersion->reference]["updateDate"] = $currentVersion->update_date;
+ $result["versions"][$currentVersion->reference]["accessDate"] = $currentVersion->access_date;
+
+// }
+ $result["currentVersion"] = $currentVersion->reference;
+// $result["currentVersion"] = $currentRecord->currentVersion; // ????
$result["reference"] = $currentRecord->reference;
$result["data"] = $currentRecord->data;
@@ -749,7 +909,10 @@ error_log("default");
}
session_write_close();
+
+ $finalResult = Array();
+ $finalResult["result"] = $result;
- echo(json_encode($result));
-error_log("result: ".json_encode($result));
+ echo(json_encode($finalResult));
+error_log("result: ".json_encode($finalResult));
?>
diff --git a/backend/python/properties/python.properties.json b/backend/python/properties/python.properties.json
index e69de29..128c98e 100644
--- a/backend/python/properties/python.properties.json
+++ b/backend/python/properties/python.properties.json
@@ -0,0 +1,8 @@
+{
+ "request.path": "clipperz.py",
+ "should.pay.toll": "false"
+
+ "development.settings": {
+ "url": "http://localhost/python/clipperz"
+ }
+}
\ No newline at end of file
diff --git a/frontend/beta/html/index_template.html b/frontend/beta/html/index_template.html
index 9862518..27a8a64 100644
--- a/frontend/beta/html/index_template.html
+++ b/frontend/beta/html/index_template.html
@@ -23,7 +23,7 @@ Clipperz_IEisBroken = true;
Clipperz_normalizedNewLine = '\x0d\x0a';
-@js_DEBUG@
+@js_LINKED@
@@ -68,7 +68,7 @@ Clipperz_normalizedNewLine = '\x0d\x0a';
diff --git a/frontend/gamma/js/Clipperz/Async.js b/frontend/gamma/js/Clipperz/Async.js
index 7c9d783..97d8ecf 100644
--- a/frontend/gamma/js/Clipperz/Async.js
+++ b/frontend/gamma/js/Clipperz/Async.js
@@ -62,7 +62,8 @@ Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, {
'callback': function (aValue) {
if (this._shouldTrace) {
- Clipperz.log("CALLBACK " + this._name, aValue);
+ // Clipperz.log("CALLBACK " + this._name, aValue);
+ console.log("CALLBACK " + this._name, aValue);
}
if (this.chained == false) {
@@ -82,7 +83,8 @@ Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, {
resultMessage = "RESULT " + this._name + " <==";
// this.addCallback(function(aResult) {
Clipperz.Async.Deferred.superclass.addCallback.call(this, function(aResult) {
- Clipperz.log(resultMessage, aResult);
+ // Clipperz.log(resultMessage, aResult);
+ console.log(resultMessage, aResult);
return aResult;
});
@@ -106,8 +108,10 @@ Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, {
message = "[" + this._count + "] " + this._name + " ";
// this.addBoth(function(aResult) {Clipperz.log(message + "-->", aResult); return aResult;});
this.addCallbacks(
- function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;},
- function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
+ // function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;},
+ function(aResult) {console.log("-OK- " + message + "-->"/*, aResult*/); return aResult;},
+ // function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
+ function(aResult) {console.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
);
}
@@ -116,8 +120,10 @@ Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, {
if (this._shouldTrace) {
// this.addBoth(function(aResult) {Clipperz.log(message + "<--", aResult); return aResult;});
this.addCallbacks(
- function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;},
- function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;}
+ // function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;},
+ function(aResult) {console.log("-OK- " + message + "<--", aResult); return aResult;},
+ // function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;}
+ function(aResult) {console.log("FAIL " + message + "<--", aResult); return aResult;}
);
}
},
@@ -406,6 +412,7 @@ MochiKit.Base.update(Clipperz.Async.DeferredSynchronizer.prototype, {
} else if (this.numberOfMethodsDone() == this.methods().length) {
this.result().callback();
} else if (this.numberOfMethodsDone() > this.methods().length) {
+ alert("Clipperz.Async.Deferred.handleMethodCallDone -> WTF!");
// WTF!!! :(
}
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy.js b/frontend/gamma/js/Clipperz/PM/Proxy.js
index 190bffd..9817eac 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy.js
@@ -142,7 +142,7 @@ Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, {
'processMessage': function (aFunctionName, someParameters, aRequestType) {
var deferredResult;
- deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false});
+ deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:true});
deferredResult.addMethod(this, 'payToll', aRequestType);
deferredResult.addMethod(this, 'sendMessage', aFunctionName);
deferredResult.addMethod(this, 'setTollCallback');
diff --git a/frontend/gamma/properties/gamma.properties.json b/frontend/gamma/properties/gamma.properties.json
index 57f26f1..5fab24d 100644
--- a/frontend/gamma/properties/gamma.properties.json
+++ b/frontend/gamma/properties/gamma.properties.json
@@ -183,7 +183,7 @@
],
"css": [
- "clipperz/clipperz.css",
- "clipperz/compact.css"
+ "clipperz.css",
+ "compact.css"
]
}
\ No newline at end of file
diff --git a/scripts/builder/backendBuilder.py b/scripts/builder/backendBuilder.py
index 16dbe2f..5ecdda0 100644
--- a/scripts/builder/backendBuilder.py
+++ b/scripts/builder/backendBuilder.py
@@ -3,57 +3,69 @@
import sys, os, json
import shutil
-import main
import hashlib
-class BackendBuilder:
+import main
+
+#===================================================================
+
+
+class BackendBuilder(object):
def __init__ (self, projectTargetDir, frontends, versions, settings):
self.projectTargetDir = projectTargetDir
self.frontends = frontends
self.versions = versions
self.settings = settings
+
+ # --------------------------------------------------------------------------
def name (self):
raise NotImplementedError()
+
def relativePath (self):
raise NotImplementedError()
+
def compileCode (self):
- pass
+ raise NotImplementedError()
+
- def copyCompiledCodeToTargetDir (self):
- src = self.sourceFolder()
- dst = self.targetFolder()
- main.createFolder(os.path.dirname(dst))
- shutil.copytree(src, dst)
+ def createPackage (self):
+ raise NotImplementedError()
+
+ # --------------------------------------------------------------------------
def sourceFolder (self):
- return main.projectBaseDir() + '/backend/' + self.relativePath() + '/src'
-
+ return os.path.join(main.projectBaseDir() , 'backend', self.relativePath(), 'src')
+
+
+ def tempFolder (self):
+ return os.path.join(self.projectTargetDir, '.tmp', self.relativePath())
+
+
+ def frontEndTempFolder (self):
+ return self.tempFolder()
+
+
+ def developmentTargetFolder (self):
+ return os.path.join(self.projectTargetDir, 'development', self.relativePath())
def targetFolder (self):
- return self.projectTargetDir + self.relativePath()
+ return os.path.join(self.projectTargetDir, self.relativePath())
+
+ # --------------------------------------------------------------------------
- def createTargetFolder (self):
- main.createFolder(self.targetFolder())
-
-
-# def copyFrontendResources (self, frontend):
-# print "copying resources for frontend: " + frontend
-# print "SETTINGS: " + str(self.settings)
-
-
- def writeToTargetFolder (self, filename, content):
- file = open(self.targetFolder() + '/' + filename, 'w')
+ def writeToFolder (self, folder, filename, content):
+ file = open(os.path.join(folder, filename), 'w')
file.write(content.encode('utf-8'))
file.close()
- def configureIndexContent (self, indexContent):
+ def configureIndexContent (self, indexContent, requestPathPrefix = ".."):
result = indexContent
- result = result.replace( '@request.path@', self.settings['request.path'] )
+ result = result.replace( '@request.path@', requestPathPrefix + '/' + self.settings['request.path'] )
result = result.replace( '@should.pay.toll@', self.settings['should.pay.toll'] )
return result
@@ -68,22 +80,39 @@ class BackendBuilder:
print message + ": " + sha256Digest + " (sha256)"
+ def shouldCompileCode (self):
+ return ('debug' in self.versions) or ('install' in self.versions)
+
def run (self):
print self.name() + " - RUN"
- self.compileCode()
- self.copyCompiledCodeToTargetDir()
+ if self.shouldCompileCode():
+ self.compileCode()
- for frontend in self.frontends:
- frontendPath = frontend.module + '/'
- if 'debug' in self.versions:
- frontend.copyResourcesToTargetFolder(self.targetFolder())
- #self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assembleDebugVersion()))
- self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG')))
+ for frontend in self.frontends:
+ main.createFolder(os.path.join(self.frontEndTempFolder(), frontend.module))
+
+ if 'debug' in self.versions:
+ frontend.copyResourcesToFolder(self.frontEndTempFolder())
+
+ index = self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG'))
+ self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index_debug.html'), index)
+
+ if 'install' in self.versions:
+ index = self.configureIndexContent(frontend.assemble())
+ self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index.html'), index)
+
+ self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index.html checksum")
- if 'install' in self.versions:
- index = self.configureIndexContent(frontend.assemble())
- self.writeToTargetFolder(frontendPath + 'index.html', index)
- self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index.html checksum")
+ self.createPackage()
+
+ if 'development' in self.versions:
+ for frontend in self.frontends:
+ main.createFolder(os.path.join(self.developmentTargetFolder(), frontend.module))
+
+ index = self.configureIndexContent(frontend.assemble(assemblyMode='DEVELOPMENT', versionType='DEBUG'), self.settings['development.settings']['url'])
+ self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module, 'index_development.html'), index)
+
+#===================================================================
diff --git a/scripts/builder/phpBuilder.py b/scripts/builder/backends/phpBuilder.py
similarity index 57%
rename from scripts/builder/phpBuilder.py
rename to scripts/builder/backends/phpBuilder.py
index cb4661d..c928aa0 100644
--- a/scripts/builder/phpBuilder.py
+++ b/scripts/builder/backends/phpBuilder.py
@@ -1,14 +1,13 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
-from backendBuilder import BackendBuilder
+from scriptLanguageBuilder import ScriptLanguageBuilder
-class PhpBuilder(BackendBuilder):
+class PhpBuilder(ScriptLanguageBuilder):
def name(self):
return "PHP builder"
+
def relativePath(self):
return 'php'
-
-
diff --git a/scripts/builder/backends/pythonBuilder.py b/scripts/builder/backends/pythonBuilder.py
new file mode 100644
index 0000000..1e44209
--- /dev/null
+++ b/scripts/builder/backends/pythonBuilder.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+
+from scriptLanguageBuilder import ScriptLanguageBuilder
+
+class PythonBuilder(ScriptLanguageBuilder):
+
+ def name(self):
+ return "Python builder"
+
+
+ def relativePath(self):
+ return 'python'
+
+
+ def compileCode (self):
+ src = self.sourceFolder()
+ dst = self.targetFolder()
+
+ shutil.copytree(src, dst)
+
+
+# def copyCompiledCodeToTargetDir (self):
+# src = self.sourceFolder()
+# dst = self.targetFolder()
+#
+# shutil.copytree(src, dst)
diff --git a/scripts/builder/backends/scriptLanguageBuilder.py b/scripts/builder/backends/scriptLanguageBuilder.py
new file mode 100644
index 0000000..7d5b31c
--- /dev/null
+++ b/scripts/builder/backends/scriptLanguageBuilder.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+
+import shutil
+from backendBuilder import BackendBuilder
+
+class ScriptLanguageBuilder(BackendBuilder):
+
+ def compileCode (self):
+ src = self.sourceFolder()
+ dst = self.tempFolder()
+
+ shutil.copytree(src, dst)
+
+
+ def createPackage (self):
+ src = self.tempFolder()
+ dst = self.targetFolder()
+
+ shutil.copytree(src, dst)
diff --git a/scripts/builder/frontendBuilder.py b/scripts/builder/frontendBuilder.py
index 55054ee..dae837b 100644
--- a/scripts/builder/frontendBuilder.py
+++ b/scripts/builder/frontendBuilder.py
@@ -9,17 +9,11 @@ import shutil
import StringIO
import urllib
-#from mercurial import ui, hg
-#from mercurial.node import hex
-from dulwich.repo import Repo
-
import main
+class FrontendBuilder(object):
-
-class FrontendBuilder:
-
- def __init__ (self, frontend, settings):
+ def __init__ (self, frontend, settings, repositoryVersion):
if '.' in frontend:
moduleComponents = frontend.split('.')
self.module = moduleComponents[0]
@@ -30,53 +24,26 @@ class FrontendBuilder:
self.settings = settings
self.projectDir = main.projectBaseDir()
+ # self.repository = repository.repositoryWithPath(self.projectDir)
+ self.repositoryVersion = repositoryVersion
self.processedFiles = {}
- def mercurialRepositoryVersion (self):
- repo = hg.repository(ui.ui(), self.projectDir)
- context = repo['tip']
- result = str(context)
-
- return result
-
-
- def gitRepositoryVersion (self):
- repo = Repo(self.projectDir)
- #if repo.is_dirty():
- # print "WARNING: build run with dirty repository"
- result = repo.refs['HEAD']
-
- return result
-
-
-
- def repositoryVersion (self):
- cacheKey = 'repositoryVersion'
- if not self.processedFiles.has_key(cacheKey):
- #result = self.mercurialRepositoryVersion()
- result = self.gitRepositoryVersion()
- self.processedFiles[cacheKey] = result
- else:
- result = self.processedFiles[cacheKey]
-
- return result
-
-
- #def relativePath (self):
- # return self.module
- #
-
def log (self, message):
print "frontend [" + self.module + "]: " + message
- def absolutePathForSourceFile (self, folder, basePath, file):
- return folder + '/frontend/' + self.module + '/' + basePath + '/' + file
+ def absolutePathForSources (self):
+ return os.path.join(self.projectDir, 'frontend', self.module)
+
+
+ def absolutePathForSourceFile (self, basePath, file):
+ return os.path.join(self.absolutePathForSources(), basePath, file)
def absolutePathForTargetFile (self, folder, basePath, file):
- return folder + '/' + self.module + '/' + basePath + '/' + file
+ return os.path.join(folder, self.module, basePath, file)
+
def filterFiles (self, files):
result = []
@@ -92,13 +59,13 @@ class FrontendBuilder:
def copyResources (self, sourceFolder, destinationFolder, fileType):
for file in self.filterFiles(self.settings[fileType]):
- src = self.absolutePathForSourceFile(sourceFolder, fileType, file)
+ src = self.absolutePathForSourceFile(fileType, file)
dst = self.absolutePathForTargetFile(destinationFolder, fileType, file)
main.createFolder(os.path.dirname(dst))
shutil.copy2(src, dst)
- def copyResourcesToTargetFolder (self, targetFolder):
+ def copyResourcesToFolder (self, targetFolder):
self.copyResources(self.projectDir, targetFolder, 'css')
self.copyResources(self.projectDir, targetFolder, 'js')
@@ -108,7 +75,7 @@ class FrontendBuilder:
for file in self.filterFiles(files):
try:
- fileHandler = codecs.open(self.absolutePathForSourceFile(self.projectDir, basePath, file), 'r', 'utf-8')
+ fileHandler = codecs.open(self.absolutePathForSourceFile(basePath, file), 'r', 'utf-8')
except:
print "FILE: " + file
@@ -181,8 +148,8 @@ class FrontendBuilder:
#==========================================================================
- def compressJS_jsmin (self, js):
- self.log("compressing JS code")
+ def compressJS_jsmin (self, js, description):
+ self.log("compressing " + description + " code")
original = StringIO.StringIO(js)
output = StringIO.StringIO()
@@ -196,7 +163,7 @@ class FrontendBuilder:
return result
- def compressJS_closureCompiler (self, js):
+ def compressJS_closureCompiler (self, js, description):
# Googles Closure compiler
# java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js
@@ -205,14 +172,14 @@ class FrontendBuilder:
return result
- def compressJS (self, js):
- return self.compressJS_jsmin(js)
- #return self.compressJS_closureCompiler(js)
+ def compressJS (self, js, description):
+ return self.compressJS_jsmin(js, description)
+ #return self.compressJS_closureCompiler(js, description)
#==========================================================================
- def packBookmarklet (self, bookmakeletCode):
+ def packBookmarklet (self, bookmakeletCode, version):
replacers = [
('isLoginForm', 'ilf'),
('findLoginForm', 'flf'),
@@ -227,7 +194,7 @@ class FrontendBuilder:
('parameters', 'p' ),
('inputElementValues', 'iev'),
]
- result = self.compressJS(bookmakeletCode)
+ result = self.compressJS(bookmakeletCode, version + " bookmarklet")
result = re.sub('\n', ' ', result) # Fit all in a single line
# result = re.sub('\s+', ' ', result) # Collapse "redundant" spaces. WARNING: this could have some evil side effects on constant strings used inside to code!!
@@ -300,7 +267,7 @@ class FrontendBuilder:
def bookmarklet (self):
cacheKey = 'bookmarklet'
if not self.processedFiles.has_key(cacheKey):
- result = 'bookmarklet="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet.js'])) + '";bookmarklet_ie="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet_IE.js'])) + '";'
+ result = 'bookmarklet="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet.js']), "regular") + '";bookmarklet_ie="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet_IE.js']), "IE") + '";'
self.processedFiles[cacheKey] = result
else:
result = self.processedFiles[cacheKey]
@@ -308,7 +275,7 @@ class FrontendBuilder:
return result
- def replaceTemplatePlaceholders (self, assemblyMode, pageTitle, copyright, css, code, version, versionType):
+ def replaceTemplatePlaceholders (self, pageTitle, copyright, css, code, jsLoadMode, version, versionType):
result = self.template()
result = result.replace('@page.title@', pageTitle, 1)
@@ -317,7 +284,7 @@ class FrontendBuilder:
#result = result.replace('@bookmarklet@', bookmarklet, 1)
result = result.replace('@application.version@', version, 1)
result = result.replace('@application.version.type@', versionType, 1)
- result = result.replace('@js_' + assemblyMode + '@', code, 1)
+ result = result.replace('@js_' + jsLoadMode + '@', code, 1)
result = re.sub('@js_[^@]+@', '', result)
@@ -343,7 +310,7 @@ class FrontendBuilder:
def cssTagsForFiles (self, basePath, files):
#
- return '\n'.join(map(lambda file: '
', files))
+ return '\n'.join(map(lambda file: '
', files))
def cssTagForContent (self, content):
@@ -352,17 +319,17 @@ class FrontendBuilder:
def scriptTagsForFiles (self, basePath, files):
#
- return '\n'.join(map(lambda file: '', files))
+ return '\n'.join(map(lambda file: '', files))
def scriptTagForContent (self, content):
return ''
- def assembleVersion (self, assemblyMode, pageTitle, copyright, css, js, version, versionType):
+ def assembleVersion (self, pageTitle, copyright, css, js, jsLoadMode, version, versionType):
cacheKey = version + "-" + versionType
if not self.processedFiles.has_key(cacheKey):
- result = self.replaceTemplatePlaceholders(assemblyMode, pageTitle, copyright, css, js, version, versionType)
+ result = self.replaceTemplatePlaceholders(pageTitle, copyright, css, js, jsLoadMode, version, versionType)
self.processedFiles[cacheKey] = result
else:
result = self.processedFiles[cacheKey]
@@ -372,24 +339,48 @@ class FrontendBuilder:
def assemble (self, assemblyMode='INSTALL', versionType='LIVE'):
- pageTitle = "Clipperz - " + self.module
- if versionType != 'LIVE':
- pageTitle += " [" + versionType + " - " + assemblyMode +"]"
-
- if assemblyMode == 'INSTALL':
- css = self.cssTagForContent(self.compressCSS(self.loadFilesContent('css', self.settings['css'])))
- js = self.scriptTagForContent(self.bookmarklet() + '\n' + self.compressJS(self.loadFilesContent('js', self.settings['js'])))
+
+ if versionType == 'LIVE':
+ pageTitle = "Clipperz - " + self.module
else:
- css = self.cssTagsForFiles('css', self.filterFiles(self.settings['css']))
- js = self.scriptTagForContent(self.bookmarklet()) + '\n' + self.scriptTagsForFiles('js', self.filterFiles(self.settings['js']))
-
+ pageTitle = "Clipperz - " + self.module + " [" + versionType + " - " + assemblyMode +"]"
+
+ if assemblyMode == 'INSTALL':
+ copyright = self.assembleCopyrightHeader()
+ css = self.cssTagForContent(self.compressCSS(self.loadFilesContent('css', self.settings['css'])))
+ js = self.scriptTagForContent(
+ self.bookmarklet() +
+ '\n' +
+ self.compressJS(self.loadFilesContent('js', self.settings['js']), "application")
+ )
+ jsLoadMode = 'EMBEDDED'
+
+ elif assemblyMode == 'DEBUG':
+ copyright = self.assembleCopyrightHeader()
+ css = self.cssTagsForFiles('./css', self.filterFiles(self.settings['css']))
+ js = self.scriptTagForContent(self.bookmarklet()) + \
+ '\n' + \
+ self.scriptTagsForFiles('./js', self.filterFiles(self.settings['js']))
+ jsLoadMode = 'LINKED'
+
+ elif assemblyMode == 'DEVELOPMENT':
+ copyright = ""
+ css = self.cssTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'css')), self.filterFiles(self.settings['css']))
+ js = self.scriptTagForContent(self.bookmarklet()) + \
+ '\n' + \
+ self.scriptTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'js')), self.filterFiles(self.settings['js']))
+ jsLoadMode = 'LINKED'
+
+ else:
+ raise NotImplementedError()
+
return self.assembleVersion(
- assemblyMode = assemblyMode,
pageTitle = pageTitle,
- copyright = self.assembleCopyrightHeader(),
+ copyright = copyright,
css = css,
js = js,
- version = self.repositoryVersion(),
+ jsLoadMode = jsLoadMode,
+ version = self.repositoryVersion,
versionType = versionType
)
diff --git a/scripts/builder/main.py b/scripts/builder/main.py
index 94f738f..6fce65d 100755
--- a/scripts/builder/main.py
+++ b/scripts/builder/main.py
@@ -1,16 +1,17 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
-import sys, os, json
+import sys
+import os
+import json
import shutil
import pprint
-import frontendBuilder
import codecs
import itertools
-
from collections import deque
-from phpBuilder import PhpBuilder
-from pythonBuilder import PythonBuilder
+
+import frontendBuilder
+import repository
pp = pprint.PrettyPrinter(indent=4, depth=4)
@@ -34,7 +35,7 @@ def createFolder (path):
#--------------------------------------------------------------------
def loadSettings (component, module):
- print "MODULE: " + module
+ # print "MODULE: " + module
if '.' in module:
moduleComponents = module.split('.')
@@ -43,7 +44,8 @@ def loadSettings (component, module):
else:
submodule = module
- settings = codecs.open(projectBaseDir() + '/' + component + '/' + module + '/properties/' + submodule + '.properties.json', 'r', 'utf-8')
+ #settings = codecs.open(projectBaseDir() + os.sep + component + os.sep + module + os.sep + 'properties' + os.sep + submodule + '.properties.json', 'r', 'utf-8')
+ settings = codecs.open(os.path.join(projectBaseDir(), component, module, 'properties', submodule + '.properties.json'), 'r', 'utf-8')
result = json.load(settings)
settings.close
@@ -71,24 +73,25 @@ def loadSettings (component, module):
def assembleBackend (backend, frontends, versions):
settings = loadSettings('backend', backend)
- if backend == 'php':
- backendBuilder = PhpBuilder(projectTargetDir(), frontends, versions, settings)
- elif backend == 'python':
- backendBuilder = PythonBuilder(projectTargetDir(), frontends, versions, settings)
- #elif backend == 'java':
- # buildJavaBackend (frontends, versions, settings)
- else:
- raise Exception('unrecognized backend: ' + backend)
-
+ builderModuleName = backend + 'Builder'
+ builderClassName = backend.capitalize() + 'Builder'
+
+ builderModule = __import__(builderModuleName)
+ builderClass = getattr(builderModule, builderClassName)
+
+ backendBuilder = builderClass(projectTargetDir(), frontends, versions, settings)
backendBuilder.run()
#====================================================================
-def build (settings):
+def build (settings, repository):
frontends = []
+ if repository.areTherePendingChanges():
+ print "\nWARNING: repository has pending changes\n"
+
for frontend in settings['frontends']:
- frontends.append(frontendBuilder.FrontendBuilder(frontend, loadSettings('frontend', frontend)))
+ frontends.append(frontendBuilder.FrontendBuilder(frontend, loadSettings('frontend', frontend), repository.version()))
for backend in settings['backends']:
assembleBackend(backend, frontends, settings['versions'])
@@ -96,7 +99,7 @@ def build (settings):
#--------------------------------------------------------------------
def clean ():
- print "cleaning up …"
+ # print "cleaning up …"
if os.path.exists(projectTargetDir()):
shutil.rmtree(projectTargetDir())
@@ -107,35 +110,42 @@ def usage (message):
print "ERROR: " + message
print
- print "build.py clean"
- print "build.py clean install"
- print "build.py install --ALL"
- print "build.py install debug --ALL"
- print "build.py clean install debug --ALL"
- print "build.ph install, debug --backends php java --frontends beta gamma"
- print "build.ph install, debug --backends php java --frontends beta gamma gamma.mobile"
+ # print "build clean"
+ # print "build clean install"
+ print "build install --ALL"
+ print "build install debug --ALL"
+ # print "build clean install debug --ALL"
+ print "build install debug --backends php python --frontends beta gamma"
+ print "build install debug development --backends php python --frontends beta gamma gamma.mobile"
exit(1)
#--------------------------------------------------------------------
+def allFrontends ():
+ return ['beta', 'gamma', 'mobile']
+
+def allBackends ():
+ return ['php', 'python']
+
+#--------------------------------------------------------------------
+
def main ():
settings = {}
parameters = list(itertools.islice(sys.argv, 1, None))
-
- shouldClean = len(filter(lambda x: x == 'clean', parameters)) > 0
- if (shouldClean):
- clean ()
-
- parameters = filter(lambda x: x != 'clean', parameters)
+
+ sys.path.append(os.path.join(scriptDir(), 'backends'))
+ currentRepository = repository.repositoryWithPath(projectBaseDir())
+
+ clean()
versions = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters))
- settings['versions'] = versions; #['debug', 'install']
+ settings['versions'] = versions; #['debug', 'install', 'development']
parameters = deque(itertools.dropwhile(lambda x: not x.startswith('--'), parameters))
if len(parameters) > 0:
parameter = parameters.popleft()
if parameter == "--ALL":
- settings['frontends'] = ['beta', 'gamma', 'mobile']
- settings['backends'] = ['php', 'python', 'java']
+ settings['frontends'] = allFrontends()
+ settings['backends'] = allBackends()
else:
while parameter != None:
values = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters))
@@ -158,8 +168,9 @@ def main ():
if (not settings.has_key('backends')):
usage("missing 'backends'")
- build (settings)
-
+ build(settings, currentRepository)
+ else:
+ usage("Suggestions on how to call the 'build' script:")
if __name__ == "__main__":
diff --git a/scripts/builder/pythonBuilder.py b/scripts/builder/pythonBuilder.py
deleted file mode 100644
index a84598d..0000000
--- a/scripts/builder/pythonBuilder.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: UTF-8 -*-
-
-from backendBuilder import BackendBuilder
-
-class PythonBuilder(BackendBuilder):
-
- def name(self):
- return "Python builder"
-
- def relativePath(self):
- return 'python'
-
-
diff --git a/scripts/builder/repository.py b/scripts/builder/repository.py
new file mode 100644
index 0000000..89db9a5
--- /dev/null
+++ b/scripts/builder/repository.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+
+
+def repositoryWithPath (path):
+ try:
+ from dulwich.repo import Repo
+
+ repo = Repo(path)
+ result = GitRepository(repo, path)
+ except:
+ from mercurial import ui, hg
+
+ repo = hg.repository(ui.ui(), path)
+ result = HgRepository(repo, path)
+
+ return result
+
+
+#===================================================================
+
+
+class Repository(object):
+
+ def __init__ (self, repository, path):
+ self.repository = repository
+ self.path = path
+
+
+ def revision (self):
+ raise NotImplementedError()
+
+
+ def areTherePendingChanges (self):
+ raise NotImplementedError()
+
+
+ def version (self):
+ result = self.revision()
+ if self.areTherePendingChanges():
+ result = '>>> ' + result + ' <<<'
+
+ # print "VERSION: " + result
+ return result
+
+
+#===================================================================
+
+
+class GitRepository(Repository):
+
+ def revision (self):
+ return repository.refs['HEAD']
+
+
+ def areTherePendingChanges (self):
+ return repository.is_dirty()
+
+
+#===================================================================
+
+
+class HgRepository(Repository):
+ # http://mercurial.selenic.com/wiki/MercurialApi
+
+ def revision (self):
+ return 'hg:' + str(self.repository['tip'])
+
+
+ def areTherePendingChanges (self):
+ # TODO: FIXME: repository.status() does not report 'unknown(?)' files. :(
+ return not all(map(lambda fileList: len(fileList) == 0, self.repository.status()))
+
+
+#===================================================================