1
0
Fork 0

Merge branch 'sharding' of ssh://github.com/triAGENS/ArangoDB into sharding

This commit is contained in:
Max Neunhoeffer 2013-12-12 10:24:50 +01:00
commit d11a1ac2d3
81 changed files with 1385 additions and 1440 deletions

View File

@ -14,7 +14,7 @@ They provide all the HTTP goodness.
If you just want to install an existing application, please use the
@ref UserManualFoxxManager. If you want to create your own application,
please continue.
please continue reading.
Overview
========
@ -965,3 +965,46 @@ provides a few mechanisms for this:
Of course you can also use `console.log` or any other means of logging output.
Deploying a Foxx application{#UserManualFoxxDeployment}
=======================================================
When a Foxx application is ready to be used in production, it is time to leave the
development mode and deploy the app in a production environment.
The first step is to copy the application's script directory to the target ArangoDB
server. If your development and production environment are the same, there is
nothing to do. If production runs on a different server, you should copy the
development application directory to some temporary place on the production server.
When the application code is present on the production server, you can use the
`fetch` and `mount` commands from the @ref UserManualFoxxManager to register the
application in the production ArangoDB instance and make it available.
Here are the individual steps to carry out:
- development:
- cd into the directory that application code is in. Then create a tar.gz file with
the application code (replace `app` with the actual name):
cd /path/to/development/apps/directory
tar cvfz app.tar.gz app
- copy the tar.gz file to the production server:
scp app.tar.gz production:/tmp/
- production:
- create a temporary directory, e.g. `/tmp/apps` and extract the tar archive into
this directory:
mkdir /tmp/apps
cd /tmp/apps
tar xvfz /tmp/app.tar.gz
- start the ArangoDB shell and run the following commands in it:
fm.fetch("directory", "/tmp/apps/app");
fm.mount("app", "/app");
More information on how to deploy applications from different sources can be
found in the @ref UserManualFoxxManager "Foxx Manager manual".

View File

@ -8,3 +8,4 @@ TOC {#UserManualFoxxTOC}
- @ref UserManualFoxxDetailsModel
- @ref UserManualFoxxDetailsRepository
- @ref UserManualFoxxDevelopment
- @ref UserManualFoxxDeployment

View File

@ -3,24 +3,44 @@ ArangoDB's User Manual (@VERSION) {#UserManual}
@NAVIGATE_UserManual
@CHAPTER_REF{Installing}
@CHAPTER_REF{FirstStepsArangoDB}
@CHAPTER_REF{UserManualArangosh}
@CHAPTER_REF{UserManualWebInterface}
@CHAPTER_REF{HandlingDatabases}
@CHAPTER_REF{HandlingCollections}
@CHAPTER_REF{HandlingDocuments}
@CHAPTER_REF{HandlingEdges}
@CHAPTER_REF{SimpleQueries}
@CHAPTER_REF{Aql}
@CHAPTER_REF{ExtendingAql}
@CHAPTER_REF{AqlExamples}
@CHAPTER_REF{Graphs}
@CHAPTER_REF{Traversals}
@CHAPTER_REF{Transactions}
@CHAPTER_REF{UserManualReplication}
@CHAPTER_REF{UserManualFoxx}
@CHAPTER_REF{UserManualFoxxManager}
@CHAPTER_REF{HandlingEndpoints}
@CHAPTER_REF{CommandLine}
@CHAPTER_REF{Glossary}
@CHAPTER_REF{Installing}: Downloading and compiling ArangoDB
@CHAPTER_REF{FirstStepsArangoDB}: An Introduction to ArangoDB
@CHAPTER_REF{UserManualArangosh}: Using the ArangoDB shell
@CHAPTER_REF{UserManualWebInterface}: Administering ArangoDB via the web interface
@CHAPTER_REF{HandlingDatabases}: Organising data in databases
@CHAPTER_REF{HandlingCollections}: Managing collections
@CHAPTER_REF{HandlingDocuments}: Saving, updating, and deleting documents
@CHAPTER_REF{HandlingEdges}: Storing and querying edges
@CHAPTER_REF{SimpleQueries}: Running more specialised queries
@CHAPTER_REF{Aql}: The ArangoDB query language for complex querying
@CHAPTER_REF{ExtendingAql}: How to embed user-defined functions into AQL
@CHAPTER_REF{AqlExamples}: Example queries for AQL
@CHAPTER_REF{Graphs}: Managing graphs in ArangoDB
@CHAPTER_REF{Traversals}: Running custom graph traversals
@CHAPTER_REF{Transactions}: Wrapping multiple operations in an ACID transaction
@CHAPTER_REF{UserManualReplication}: Configuring, starting, stopping the replication
@CHAPTER_REF{UserManualFoxx}: A JavaScript framework to build simple applications and APIs with ArangoDB
@CHAPTER_REF{UserManualFoxxManager}: Installing and uninstalling Foxx applications
@CHAPTER_REF{HandlingEndpoints}: Making the server listen on multiple ports
@CHAPTER_REF{CommandLine}: All the command-line options
@CHAPTER_REF{Glossary}: The obvious definitions

View File

@ -92,3 +92,16 @@ You can use the Google group for improvements, feature requests, comments
http://www.arangodb.org/connect
Citing ArangoDB
---------------
Please kindly cite ArangoDB in your publications if it helps your research:
```bibtex
@misc{ArangoDB2013,
Author = {ArangoDB},
Title = { {ArangoDB}: An Open Source multi-purpose database supporting flexible data models for documents, graphs, and key-values.},
Year = {2013},
Howpublished = {\url{http://arangodb.org/}
}
```

View File

@ -119,6 +119,10 @@ SERVER_OPT := \
--server.threads 4 \
$(SERVER_START)
if ENABLE_CLUSTER
SERVER_OPT += --cluster.agency-endpoint tcp://127.0.0.1:4001 --cluster.agency-prefix UnitTests --cluster.my-id arangod --cluster.my-address tcp://127.0.0.1:8529
endif
CLIENT_OPT := \
--configuration none \
--javascript.startup-directory @top_srcdir@/js \
@ -365,6 +369,9 @@ SHELL_COMMON = \
@top_srcdir@/js/common/tests/shell-download.js \
@top_srcdir@/js/common/tests/shell-edge.js \
@top_srcdir@/js/common/tests/shell-fs.js \
@top_srcdir@/js/common/tests/shell-graph-traversal.js \
@top_srcdir@/js/common/tests/shell-graph-algorithms.js \
@top_srcdir@/js/common/tests/shell-graph-measurement.js \
@top_srcdir@/js/common/tests/shell-keygen.js \
@top_srcdir@/js/common/tests/shell-simple-query.js \
@top_srcdir@/js/common/tests/shell-statement.js \
@ -388,22 +395,24 @@ SHELL_SERVER_ONLY = \
@top_srcdir@/js/server/tests/transactions.js \
@top_srcdir@/js/server/tests/routing.js \
@top_srcdir@/js/server/tests/shell-any.js \
@top_srcdir@/js/common/tests/shell-bitarray-index.js \
@top_srcdir@/js/server/tests/shell-bitarray-index.js \
@top_srcdir@/js/server/tests/shell-database.js \
@top_srcdir@/js/common/tests/shell-foxx.js \
@top_srcdir@/js/common/tests/shell-foxx-repository.js \
@top_srcdir@/js/common/tests/shell-foxx-model.js \
@top_srcdir@/js/common/tests/shell-foxx-base-middleware.js \
@top_srcdir@/js/common/tests/shell-foxx-template-middleware.js \
@top_srcdir@/js/common/tests/shell-foxx-format-middleware.js \
@top_srcdir@/js/common/tests/shell-foxx-preprocessor.js \
@top_srcdir@/js/common/tests/shell-graph-traversal.js \
@top_srcdir@/js/common/tests/shell-graph-algorithms.js \
@top_srcdir@/js/common/tests/shell-graph-measurement.js \
@top_srcdir@/js/common/tests/shell-skiplist-index.js \
@top_srcdir@/js/server/tests/shell-foxx.js \
@top_srcdir@/js/server/tests/shell-foxx-repository.js \
@top_srcdir@/js/server/tests/shell-foxx-model.js \
@top_srcdir@/js/server/tests/shell-foxx-base-middleware.js \
@top_srcdir@/js/server/tests/shell-foxx-template-middleware.js \
@top_srcdir@/js/server/tests/shell-foxx-format-middleware.js \
@top_srcdir@/js/server/tests/shell-foxx-preprocessor.js \
@top_srcdir@/js/server/tests/shell-skiplist-index.js \
@top_srcdir@/js/server/tests/shell-skiplist-rm-performance.js \
@top_srcdir@/js/server/tests/shell-skiplist-correctness.js
if ENABLE_CLUSTER
SHELL_SERVER_ONLY += \
@top_srcdir@/js/server/tests/agency.js
endif
SHELL_SERVER = $(SHELL_COMMON) $(SHELL_SERVER_ONLY)
.PHONY: unittests-shell-server

View File

@ -150,6 +150,10 @@ static bool CheckArgumentType (TRI_aql_node_t const* parameter,
const param_t* const allowed) {
param_t found = InitParam();
if (parameter->_type == TRI_AQL_NODE_REFERENCE) {
return true;
}
if (parameter->_type == TRI_AQL_NODE_PARAMETER) {
// node is a bind parameter
char* name = TRI_AQL_NODE_STRING(parameter);

View File

@ -132,6 +132,21 @@ std::string AgencyCommResult::errorMessage () const {
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief extract the error details from the result
/// if there is no error, an empty string will be returned
////////////////////////////////////////////////////////////////////////////////
std::string AgencyCommResult::errorDetails () const {
const std::string errorMessage = this->errorMessage();
if (errorMessage.empty()) {
return _message;
}
return _message + " (" + errorMessage + ")";
}
////////////////////////////////////////////////////////////////////////////////
/// @brief recursively flatten the JSON response into a map
////////////////////////////////////////////////////////////////////////////////
@ -211,6 +226,7 @@ bool AgencyCommResult::processJsonNode (TRI_json_t const* node,
// otherwise return value
out[prefix] = std::string(value->_value._string.data, value->_value._string.length - 1);
}
}
}
}
@ -297,7 +313,8 @@ AgencyConnectionOptions AgencyComm::_globalConnectionOptions = {
/// @brief constructs an agency communication object
////////////////////////////////////////////////////////////////////////////////
AgencyComm::AgencyComm () {
AgencyComm::AgencyComm (bool addNewEndpoints)
: _addNewEndpoints(addNewEndpoints) {
}
////////////////////////////////////////////////////////////////////////////////
@ -401,7 +418,8 @@ void AgencyComm::disconnect () {
/// @brief adds an endpoint to the endpoints list
////////////////////////////////////////////////////////////////////////////////
bool AgencyComm::addEndpoint (std::string const& endpointSpecification) {
bool AgencyComm::addEndpoint (std::string const& endpointSpecification,
bool toFront) {
LOG_TRACE("adding global endpoint '%s'", endpointSpecification.c_str());
{
@ -430,7 +448,12 @@ bool AgencyComm::addEndpoint (std::string const& endpointSpecification) {
return false;
}
AgencyComm::_globalEndpoints.push_back(agencyEndpoint);
if (toFront) {
AgencyComm::_globalEndpoints.push_front(agencyEndpoint);
}
else {
AgencyComm::_globalEndpoints.push_back(agencyEndpoint);
}
}
return true;
@ -501,6 +524,12 @@ bool AgencyComm::hasEndpoint (std::string const& endpointSpecification) {
////////////////////////////////////////////////////////////////////////////////
void AgencyComm::setPrefix (std::string const& prefix) {
// agency prefix must not be changed
if (! _globalPrefix.empty() && prefix != _globalPrefix) {
LOG_ERROR("agency-prefix cannot be changed at runtime");
return;
}
_globalPrefix = prefix;
// make sure prefix starts with a forward slash
@ -518,6 +547,14 @@ void AgencyComm::setPrefix (std::string const& prefix) {
LOG_TRACE("setting agency-prefix to '%s'", prefix.c_str());
}
////////////////////////////////////////////////////////////////////////////////
/// @brief gets the global prefix for all operations
////////////////////////////////////////////////////////////////////////////////
std::string AgencyComm::prefix () {
return _globalPrefix;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate a timestamp
////////////////////////////////////////////////////////////////////////////////
@ -539,6 +576,32 @@ std::string AgencyComm::generateStamp () {
/// @brief get a stringified version of the endpoints
////////////////////////////////////////////////////////////////////////////////
const std::vector<std::string> AgencyComm::getEndpoints () {
std::vector<std::string> result;
{
// iterate over the list of endpoints
READ_LOCKER(AgencyComm::_globalLock);
std::list<AgencyEndpoint*>::const_iterator it = AgencyComm::_globalEndpoints.begin();
while (it != AgencyComm::_globalEndpoints.end()) {
AgencyEndpoint const* agencyEndpoint = (*it);
assert(agencyEndpoint != 0);
result.push_back(agencyEndpoint->_endpoint->getSpecification());
++it;
}
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief get a stringified version of the endpoints
////////////////////////////////////////////////////////////////////////////////
const std::string AgencyComm::getEndpointsString () {
std::string result;
@ -600,6 +663,27 @@ AgencyEndpoint* AgencyComm::createAgencyEndpoint (std::string const& endpointSpe
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief gets the backend version
////////////////////////////////////////////////////////////////////////////////
std::string AgencyComm::getVersion () {
AgencyCommResult result;
sendWithFailover(triagens::rest::HttpRequest::HTTP_REQUEST_GET,
_globalConnectionOptions._requestTimeout,
result,
"version",
"",
false);
if (result.successful()) {
return result._body;
}
return "";
}
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a directory in the backend
////////////////////////////////////////////////////////////////////////////////
@ -803,7 +887,7 @@ AgencyEndpoint* AgencyComm::popEndpoint () {
/// @brief reinsert an endpoint into the queue
////////////////////////////////////////////////////////////////////////////////
bool AgencyComm::requeueEndpoint (AgencyEndpoint* agencyEndpoint,
void AgencyComm::requeueEndpoint (AgencyEndpoint* agencyEndpoint,
bool wasWorking) {
WRITE_LOCKER(AgencyComm::_globalLock);
const size_t numEndpoints = _globalEndpoints.size();
@ -825,8 +909,6 @@ bool AgencyComm::requeueEndpoint (AgencyEndpoint* agencyEndpoint,
}
assert(_globalEndpoints.size() == numEndpoints);
return wasWorking;
}
////////////////////////////////////////////////////////////////////////////////
@ -908,8 +990,21 @@ bool AgencyComm::sendWithFailover (triagens::rest::HttpRequest::HttpRequestType
if (! AgencyComm::hasEndpoint(endpoint)) {
// redirection to an unknown endpoint
if (_addNewEndpoints) {
AgencyComm::addEndpoint(endpoint, true);
// re-check the new endpoint
if (AgencyComm::hasEndpoint(endpoint)) {
++numEndpoints;
continue;
}
}
LOG_ERROR("found redirection to unknown endpoint '%s'. Will not follow!",
endpoint.c_str());
// this is an error
return false;
}
@ -917,10 +1012,16 @@ bool AgencyComm::sendWithFailover (triagens::rest::HttpRequest::HttpRequestType
continue;
}
// watches might time out, this still counts as a success
const bool wasSuccessful = result.successful() || (isWatch && result._statusCode == 0);
// we can stop iterating over endpoints if the operation succeeded,
// if a watch timed out or
// if the reason for failure was a client-side error
const bool canAbort = result.successful() ||
(isWatch && result._statusCode == 0) ||
(result._statusCode >= 400 && result._statusCode <= 499);
if (requeueEndpoint(agencyEndpoint, wasSuccessful)) {
requeueEndpoint(agencyEndpoint, canAbort);
if (canAbort) {
// we're done
return true;
}
@ -954,13 +1055,14 @@ bool AgencyComm::send (triagens::httpclient::GeneralClientConnection* connection
assert(! url.empty());
result._statusCode = 0;
LOG_TRACE("sending %s request to agency at endpoint '%s', url '%s': %s",
/*
LOG_INFO("sending %s request to agency at endpoint '%s', url '%s': %s",
triagens::rest::HttpRequest::translateMethod(method).c_str(),
connection->getEndpoint()->getSpecification().c_str(),
url.c_str(),
body.c_str());
*/
triagens::httpclient::SimpleHttpClient client(connection,
timeout,
false);
@ -1014,12 +1116,12 @@ bool AgencyComm::send (triagens::httpclient::GeneralClientConnection* connection
if (found) {
result._index = triagens::basics::StringUtils::uint64(lastIndex);
}
LOG_TRACE("request to agency returned status code %d, message: '%s', body: '%s'",
/*
LOG_INFO("request to agency returned status code %d, message: '%s', body: '%s'",
result._statusCode,
result._message.c_str(),
result._body.c_str());
*/
delete response;
return result.successful();

View File

@ -147,6 +147,13 @@ namespace triagens {
std::string errorMessage () const;
////////////////////////////////////////////////////////////////////////////////
/// @brief extract the error details from the result
/// if there is no error, an empty string will be returned
////////////////////////////////////////////////////////////////////////////////
std::string errorDetails () const;
////////////////////////////////////////////////////////////////////////////////
/// @brief return the location header (might be empty)
////////////////////////////////////////////////////////////////////////////////
@ -202,7 +209,7 @@ namespace triagens {
/// @brief creates a communication channel
////////////////////////////////////////////////////////////////////////////////
AgencyComm ();
AgencyComm (bool = true);
////////////////////////////////////////////////////////////////////////////////
/// @brief destroys a communication channel
@ -236,31 +243,45 @@ namespace triagens {
/// @brief adds an endpoint to the agents list
////////////////////////////////////////////////////////////////////////////////
static bool addEndpoint (std::string const&);
static bool addEndpoint (std::string const&,
bool = false);
////////////////////////////////////////////////////////////////////////////////
/// @brief removes an endpoint from the agents list
////////////////////////////////////////////////////////////////////////////////
static bool removeEndpoint (std::string const&);
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if an endpoint is present
////////////////////////////////////////////////////////////////////////////////
static bool hasEndpoint (std::string const&);
////////////////////////////////////////////////////////////////////////////////
/// @brief get a stringified version of the endpoints
////////////////////////////////////////////////////////////////////////////////
static const std::vector<std::string> getEndpoints ();
////////////////////////////////////////////////////////////////////////////////
/// @brief get a stringified version of the endpoints
////////////////////////////////////////////////////////////////////////////////
static const std::string getEndpointsString ();
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the global prefix for all operations
////////////////////////////////////////////////////////////////////////////////
static void setPrefix (std::string const&);
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the global prefix for all operations
////////////////////////////////////////////////////////////////////////////////
static std::string prefix ();
////////////////////////////////////////////////////////////////////////////////
/// @brief generate a timestamp
////////////////////////////////////////////////////////////////////////////////
@ -281,6 +302,12 @@ namespace triagens {
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief gets the backend version
////////////////////////////////////////////////////////////////////////////////
std::string getVersion ();
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a directory in the backend
////////////////////////////////////////////////////////////////////////////////
@ -351,7 +378,7 @@ namespace triagens {
/// @brief reinsert an endpoint into the queue
////////////////////////////////////////////////////////////////////////////////
bool requeueEndpoint (AgencyEndpoint*,
void requeueEndpoint (AgencyEndpoint*,
bool);
////////////////////////////////////////////////////////////////////////////////
@ -389,22 +416,10 @@ namespace triagens {
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief connect timeout
/// @brief automatically add unknown endpoints if redirected to by agency?
////////////////////////////////////////////////////////////////////////////////
double _connectTimeout;
////////////////////////////////////////////////////////////////////////////////
/// @brief request timeout
////////////////////////////////////////////////////////////////////////////////
double _requestTimeout;
////////////////////////////////////////////////////////////////////////////////
/// @brief connect retries
////////////////////////////////////////////////////////////////////////////////
size_t _connectRetries;
bool _addNewEndpoints;
// -----------------------------------------------------------------------------
// --SECTION-- private static variables

View File

@ -205,15 +205,20 @@ bool ApplicationCluster::start () {
_myAddress.c_str());
}
ServerState::instance()->setRole(role);
ServerState::instance()->setState(ServerState::STATE_STARTUP);
AgencyComm comm;
const std::string version = comm.getVersion();
LOG_INFO("Cluster feature is turned on. Server id: '%s', internal address: %s, role: %s, agency endpoints: %s",
LOG_INFO("Cluster feature is turned on. "
"Agency version: %s, Agency endpoints: %s, "
"server id: '%s', internal address: %s, role: %s",
version.c_str(),
endpoints.c_str(),
_myId.c_str(),
_myAddress.c_str(),
ServerState::roleToString(role).c_str(),
endpoints.c_str());
ServerState::roleToString(role).c_str());
// start heartbeat thread
_heartbeat = new HeartbeatThread(_myId, _heartbeatInterval * 1000, 5);

View File

@ -70,6 +70,10 @@ namespace triagens {
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief whether or not the cluster is enabled
////////////////////////////////////////////////////////////////////////////////
inline bool enabled () const {
return _enableCluster;
}

View File

@ -277,7 +277,6 @@ ArangoServer::ArangoServer (int argc, char** argv)
_databasePath(),
_defaultMaximalSize(TRI_JOURNAL_DEFAULT_MAXIMAL_SIZE),
_defaultWaitForSync(false),
_developmentMode(false),
_forceSyncProperties(true),
_unusedForceSyncShapes(false),
_disableReplicationLogger(false),
@ -501,6 +500,7 @@ void ArangoServer::buildApplicationServer () {
#ifdef TRI_ENABLE_CLUSTER
_applicationCluster = new ApplicationCluster();
if (_applicationCluster == 0) {
LOG_FATAL_AND_EXIT("out of memory");
}
@ -576,10 +576,9 @@ void ArangoServer::buildApplicationServer () {
// configure v8 w/ development-mode
if (_applicationServer->programOptions().has("development-mode")) {
_developmentMode = true;
_applicationV8->enableDevelopmentMode();
}
// .............................................................................
// set language of default collator
// .............................................................................
@ -656,6 +655,12 @@ void ArangoServer::buildApplicationServer () {
mode == OperationMode::MODE_UNITTESTS ||
mode == OperationMode::MODE_JSLINT ||
mode == OperationMode::MODE_SCRIPT) {
#ifdef TRI_ENABLE_CLUSTER
// we need to prepare the cluster even in console mode
_applicationCluster->prepare();
#endif
int res = executeConsole(mode);
TRI_EXIT_FUNCTION(res, NULL);
@ -663,6 +668,11 @@ void ArangoServer::buildApplicationServer () {
#ifdef TRI_ENABLE_MRUBY
else if (mode == OperationMode::MODE_RUBY_CONSOLE) {
#ifdef TRI_ENABLE_CLUSTER
// we need to prepare the cluster even in console mode
_applicationCluster->prepare();
#endif
int res = executeRubyConsole();
TRI_EXIT_FUNCTION(res, NULL);

View File

@ -349,21 +349,6 @@ namespace triagens {
bool _defaultWaitForSync;
////////////////////////////////////////////////////////////////////////////////
/// @brief development mode
///
/// @CMDOPT{\--development-mode}
///
/// Specifying this option will start the server in development mode. The
/// development mode forces reloading of all actions and Foxx applications on
/// every HTTP request. This is very resource-intensive and slow, but makes
/// developing server-side actions and Foxx applications much easier.
///
/// Never use this option in production.
////////////////////////////////////////////////////////////////////////////////
bool _developmentMode;
////////////////////////////////////////////////////////////////////////////////
/// @brief force syncing of collection properties
///
@ -518,6 +503,21 @@ namespace triagens {
string _defaultLanguage;
////////////////////////////////////////////////////////////////////////////////
/// @brief development mode
///
/// @CMDOPT{\--development-mode}
///
/// Specifying this option will start the server in development mode. The
/// development mode forces reloading of all actions and Foxx applications on
/// every HTTP request. This is very resource-intensive and slow, but makes
/// developing server-side actions and Foxx applications much easier.
///
/// Never use this option in production.
////////////////////////////////////////////////////////////////////////////////
bool _developmentMode; /* variable is only used for documentation generation */
////////////////////////////////////////////////////////////////////////////////
/// @brief the server
////////////////////////////////////////////////////////////////////////////////

View File

@ -764,8 +764,10 @@ bool ApplicationV8::prepareV8Instance (const size_t i) {
{
v8::HandleScope scope;
TRI_AddGlobalVariableVocbase(context->_context, "APP_PATH", v8::String::New(_appPath.c_str()));
TRI_AddGlobalVariableVocbase(context->_context, "DEV_APP_PATH", v8::String::New(_devAppPath.c_str()));
char const* logfile = TRI_GetFilenameLogging();
TRI_AddGlobalVariableVocbase(context->_context, "LOGFILE_PATH", logfile != 0 ? v8::String::New(logfile) : v8::Null());
TRI_AddGlobalVariableVocbase(context->_context, "APP_PATH", v8::String::New(_appPath.c_str(), _appPath.size()));
TRI_AddGlobalVariableVocbase(context->_context, "DEV_APP_PATH", v8::String::New(_devAppPath.c_str(), _devAppPath.size()));
TRI_AddGlobalVariableVocbase(context->_context, "DEVELOPMENT_MODE", v8::Boolean::New(_developmentMode));
}

View File

@ -76,6 +76,10 @@
#include "v8.h"
#include "V8/JSLoader.h"
#ifdef TRI_ENABLE_CLUSTER
#include "Cluster/AgencyComm.h"
#endif
#include "unicode/timezone.h"
#include "unicode/utypes.h"
#include "unicode/datefmt.h"
@ -2205,6 +2209,309 @@ static TRI_general_cursor_t* UnwrapGeneralCursor (v8::Handle<v8::Object> cursorO
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- agency functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief compares and swaps a value in the agency
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_CasAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() < 3) {
TRI_V8_EXCEPTION_USAGE(scope, "set(<key>, <oldValue>, <newValue>, <throw>)");
}
const std::string key = TRI_ObjectToString(argv[0]);
const std::string oldValue = TRI_ObjectToString(argv[1]);
const std::string newValue = TRI_ObjectToString(argv[2]);
bool shouldThrow = false;
if (argv.Length() > 3) {
shouldThrow = TRI_ObjectToBoolean(argv[3]);
}
AgencyComm comm;
AgencyCommResult result = comm.casValue(key, oldValue, newValue);
if (! result.successful()) {
if (! shouldThrow) {
return scope.Close(v8::False());
}
const std::string errorDetails = result.errorDetails();
v8::Handle<v8::Value> err = v8::String::New(errorDetails.c_str(), errorDetails.size());
return scope.Close(v8::ThrowException(err));
}
return scope.Close(v8::True());
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a directory in the agency
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_CreateDirectoryAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() != 1) {
TRI_V8_EXCEPTION_USAGE(scope, "createDirectory(<key>)");
}
const std::string key = TRI_ObjectToString(argv[0]);
AgencyComm comm;
AgencyCommResult result = comm.createDirectory(key);
if (! result.successful()) {
const std::string errorDetails = result.errorDetails();
v8::Handle<v8::Value> err = v8::String::New(errorDetails.c_str(), errorDetails.size());
return scope.Close(v8::ThrowException(err));
}
return scope.Close(v8::True());
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief gets a value from the agency
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_GetAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() < 1) {
TRI_V8_EXCEPTION_USAGE(scope, "get(<key>, <recursive>)");
}
const std::string key = TRI_ObjectToString(argv[0]);
bool recursive = false;
if (argv.Length() > 1) {
recursive = TRI_ObjectToBoolean(argv[1]);
}
AgencyComm comm;
AgencyCommResult result = comm.getValues(key, recursive);
if (! result.successful()) {
const std::string errorDetails = result.errorDetails();
v8::Handle<v8::Value> err = v8::String::New(errorDetails.c_str(), errorDetails.size());
return scope.Close(v8::ThrowException(err));
}
std::map<std::string, std::string> out;
result.flattenJson(out, "", false);
std::map<std::string, std::string>::const_iterator it = out.begin();
v8::Handle<v8::Object> l = v8::Object::New();
while (it != out.end()) {
const std::string key = (*it).first;
const std::string value = (*it).second;
l->Set(v8::String::New(key.c_str(), key.size()), v8::String::New(value.c_str(), value.size()));
++it;
}
return scope.Close(l);
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief removes a value from the agency
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_RemoveAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() < 1) {
TRI_V8_EXCEPTION_USAGE(scope, "remove(<key>, <recursive>)");
}
const std::string key = TRI_ObjectToString(argv[0]);
bool recursive = false;
if (argv.Length() > 1) {
recursive = TRI_ObjectToBoolean(argv[1]);
}
AgencyComm comm;
AgencyCommResult result = comm.removeValues(key, recursive);
if (! result.successful()) {
const std::string errorDetails = result.errorDetails();
v8::Handle<v8::Value> err = v8::String::New(errorDetails.c_str(), errorDetails.size());
return scope.Close(v8::ThrowException(err));
}
return scope.Close(v8::True());
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief sets a value in the agency
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_SetAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() < 2) {
TRI_V8_EXCEPTION_USAGE(scope, "set(<key>, <value>)");
}
const std::string key = TRI_ObjectToString(argv[0]);
const std::string value = TRI_ObjectToString(argv[1]);
AgencyComm comm;
AgencyCommResult result = comm.setValue(key, value);
if (! result.successful()) {
const std::string errorDetails = result.errorDetails();
v8::Handle<v8::Value> err = v8::String::New(errorDetails.c_str(), errorDetails.size());
return scope.Close(v8::ThrowException(err));
}
return scope.Close(v8::True());
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief watches a value in the agency
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_WatchAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() < 1) {
TRI_V8_EXCEPTION_USAGE(scope, "watch(<key>, <waitIndex>, <timeout)");
}
const std::string key = TRI_ObjectToString(argv[0]);
double timeout = 1.0;
uint64_t waitIndex = 0;
if (argv.Length() > 1) {
waitIndex = TRI_ObjectToUInt64(argv[1], true);
}
if (argv.Length() > 2) {
timeout = TRI_ObjectToDouble(argv[2]);
}
AgencyComm comm;
AgencyCommResult result = comm.watchValue(key, waitIndex, timeout);
if (result._statusCode == 0) {
// watch timed out
return scope.Close(v8::False());
}
if (! result.successful()) {
const std::string errorDetails = result.errorDetails();
v8::Handle<v8::Value> err = v8::String::New(errorDetails.c_str(), errorDetails.size());
return scope.Close(v8::ThrowException(err));
}
std::map<std::string, std::string> out;
result.flattenJson(out, "", false);
std::map<std::string, std::string>::const_iterator it = out.begin();
v8::Handle<v8::Object> l = v8::Object::New();
while (it != out.end()) {
const std::string key = (*it).first;
const std::string value = (*it).second;
l->Set(v8::String::New(key.c_str(), key.size()), v8::String::New(value.c_str(), value.size()));
++it;
}
return scope.Close(l);
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the agency endpoints
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_EndpointsAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() != 0) {
TRI_V8_EXCEPTION_USAGE(scope, "endpoints()");
}
const std::vector<std::string> endpoints = AgencyComm::getEndpoints();
v8::Handle<v8::Array> l = v8::Array::New();
for (size_t i = 0; i < endpoints.size(); ++i) {
const std::string endpoint = endpoints[i];
l->Set((uint32_t) i, v8::String::New(endpoint.c_str(), endpoint.size()));
}
return scope.Close(l);
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the agency prefix
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_PrefixAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() != 0) {
TRI_V8_EXCEPTION_USAGE(scope, "prefix()");
}
const std::string prefix = AgencyComm::prefix();
return scope.Close(v8::String::New(prefix.c_str(), prefix.size()));
}
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the agency version
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
static v8::Handle<v8::Value> JS_VersionAgency (v8::Arguments const& argv) {
v8::HandleScope scope;
if (argv.Length() != 0) {
TRI_V8_EXCEPTION_USAGE(scope, "version()");
}
AgencyComm comm;
const std::string version = comm.getVersion();
return scope.Close(v8::String::New(version.c_str(), version.size()));
}
#endif
// -----------------------------------------------------------------------------
// --SECTION-- javascript functions
// -----------------------------------------------------------------------------
@ -9027,6 +9334,31 @@ void TRI_InitV8VocBridge (v8::Handle<v8::Context> context,
TRI_AddGlobalFunctionVocbase(context, "LIST_ENDPOINTS", JS_ListEndpoints, true);
TRI_AddGlobalFunctionVocbase(context, "RELOAD_AUTH", JS_ReloadAuth, true);
TRI_AddGlobalFunctionVocbase(context, "TRANSACTION", JS_Transaction, true);
#ifdef TRI_ENABLE_CLUSTER
// .............................................................................
// generate the agency template
// .............................................................................
ft = v8::FunctionTemplate::New();
ft->SetClassName(TRI_V8_SYMBOL("ArangoAgency"));
rt = ft->InstanceTemplate();
rt->SetInternalFieldCount(2);
TRI_AddMethodVocbase(rt, "cas", JS_CasAgency);
TRI_AddMethodVocbase(rt, "createDirectory", JS_CreateDirectoryAgency);
TRI_AddMethodVocbase(rt, "get", JS_GetAgency);
TRI_AddMethodVocbase(rt, "remove", JS_RemoveAgency);
TRI_AddMethodVocbase(rt, "set", JS_SetAgency);
TRI_AddMethodVocbase(rt, "watch", JS_WatchAgency);
TRI_AddMethodVocbase(rt, "endpoints", JS_EndpointsAgency);
TRI_AddMethodVocbase(rt, "prefix", JS_PrefixAgency);
TRI_AddMethodVocbase(rt, "version", JS_VersionAgency);
v8g->AgencyTempl = v8::Persistent<v8::ObjectTemplate>::New(isolate, rt);
TRI_AddGlobalFunctionVocbase(context, "ArangoAgency", ft->GetFunction());
#endif
// .............................................................................
// create global variables

View File

@ -272,7 +272,8 @@ actions.defineHttp({
callback : function (req, res) {
var result = {
appPath: module.appPath(),
devAppPath: internal.developmentMode ? module.devAppPath() : null
devAppPath: internal.developmentMode ? module.devAppPath() : null,
logFilePath: internal.logfilePath
};
actions.resultOk(req, res, actions.HTTP_OK, { result: result });

View File

@ -0,0 +1,36 @@
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 300;
src: local('Open Sans Light'), local('OpenSans-Light'), url(../fonts/opensans/OpenSansLight.woff) format('woff');
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
src: local('Open Sans'), local('OpenSans'), url(../fonts/opensans/OpenSans.woff) format('woff');
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 700;
src: local('Open Sans Bold'), local('OpenSans-Bold'), url(../fonts/opensans/OpenSansBold.woff) format('woff');
}
@font-face {
font-family: 'Open Sans';
font-style: italic;
font-weight: 300;
src: local('Open Sans Light Italic'), local('OpenSansLight-Italic'), url(../fonts/opensans/OpenSansLightItalic.woff) format('woff');
}
@font-face {
font-family: 'Open Sans';
font-style: italic;
font-weight: 400;
src: local('Open Sans Italic'), local('OpenSans-Italic'), url(../fonts/opensans/OpenSansItalic.woff) format('woff');
}
@font-face {
font-family: 'Open Sans';
font-style: italic;
font-weight: 700;
src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), url(../fonts/opensans/OpenSansBoldItalic.woff) format('woff');
}

View File

@ -18,7 +18,7 @@
COLOR_BOLD_WHITE, COLOR_YELLOW, COLOR_BOLD_YELLOW, COLOR_CYAN, COLOR_BOLD_CYAN, COLOR_MAGENTA,
COLOR_BOLD_MAGENTA, PRETTY_PRINT, VALGRIND, VERSION, UPGRADE,
BYTES_SENT_DISTRIBUTION, BYTES_RECEIVED_DISTRIBUTION, CONNECTION_TIME_DISTRIBUTION,
REQUEST_TIME_DISTRIBUTION, DEVELOPMENT_MODE, THREAD_NUMBER,
REQUEST_TIME_DISTRIBUTION, DEVELOPMENT_MODE, THREAD_NUMBER, LOGFILE_PATH,
SYS_PLATFORM */
////////////////////////////////////////////////////////////////////////////////
@ -128,6 +128,15 @@
SYS_LOG("warning", "################################################################################");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief logfilePath
////////////////////////////////////////////////////////////////////////////////
if (typeof LOGFILE_PATH !== "undefined") {
exports.logfilePath = LOGFILE_PATH;
delete LOGFILE_PATH;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief quiet
////////////////////////////////////////////////////////////////////////////////

View File

@ -1,20 +0,0 @@
<!DOCTYPE html>
<html>
<body id="jasminetestlinks" onload="">
<ul>
<li><a href="runnerAll.html">All</a></li>
<li><a href="runnerGraphViewer.html">Graph Viewer</a></li>
<li><a href="runnerEdgeShaper.html">Edge Shaper</a></li>
<li><a href="runnerNodeShaper.html">Node Shaper</a></li>
<li><a href="runnerForceLayouter.html">Force-Based Layout</a></li>
<li><a href="runnerJSONAdapter.html">JSON Adapter</a></li>
<li><a href="runnerArangoAdapter.html">Arango Adapter</a></li>
<li><a href="runnerEventDispatcher.html">Event Dispatcher</a></li>
<li><a href="runnerEventLibrary.html">Event Library</a></li>
<li><a href="runnerColourMapper.html">Colour Mapper</a></li>
<li><a href="runnerZoomManager.html">Zoom Manager</a></li>
<li><a href="runnerNodeReducer.html">Node Reducer</a></li>
</ul>
</body>
</html>

View File

@ -1,106 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Graph Interface</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/d3.fisheye.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="helper/objectsHelper.js"></script>
<script type="text/javascript" src="helper/mocks.js"></script>
<script type="text/javascript" src="../graphViewer.js"></script>
<script type="text/javascript" src="../graph/colourMapper.js"></script>
<script type="text/javascript" src="../graph/nodeShaper.js"></script>
<script type="text/javascript" src="../graph/jsonAdapter.js"></script>
<script type="text/javascript" src="../graph/arangoAdapter.js"></script>
<script type="text/javascript" src="../graph/edgeShaper.js"></script>
<script type="text/javascript" src="../graph/forceLayouter.js"></script>
<script type="text/javascript" src="../graph/eventDispatcher.js"></script>
<script type="text/javascript" src="../graph/eventLibrary.js"></script>
<script type="text/javascript" src="../graph/zoomManager.js"></script>
<!-- UI Modules> -->
<script type="text/javascript" src="../ui/modalDialogHelper.js"></script>
<script type="text/javascript" src="../ui/nodeShaperControls.js"></script>
<script type="text/javascript" src="../ui/edgeShaperControls.js"></script>
<script type="text/javascript" src="../ui/arangoAdapterControls.js"></script>
<script type="text/javascript" src="../ui/layouterControls.js"></script>
<script type="text/javascript" src="../ui/uiComponentsHelper.js"></script>
<script type="text/javascript" src="../ui/eventDispatcherControls.js"></script>
<script type="text/javascript" src="../ui/graphViewerUI.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specColourMapper/colourMapperSpec.js"></script>
<script type="text/javascript" src="specGraphViewer/graphViewerSpec.js"></script>
<script type="text/javascript" src="specGraphViewer/graphViewerUISpec.js"></script>
<script type="text/javascript" src="specAdapter/interfaceSpec.js"></script>
<script type="text/javascript" src="specAdapter/jsonAdapterSpec.js"></script>
<script type="text/javascript" src="specAdapter/arangoAdapterSpec.js"></script>
<script type="text/javascript" src="specAdapter/arangoAdapterUISpec.js"></script>
<script type="text/javascript" src="specNodeShaper/nodeShaperSpec.js"></script>
<script type="text/javascript" src="specNodeShaper/nodeShaperUISpec.js"></script>
<script type="text/javascript" src="specEdgeShaper/edgeShaperSpec.js"></script>
<script type="text/javascript" src="specEdgeShaper/edgeShaperUISpec.js"></script>
<script type="text/javascript" src="specForceLayouter/forceLayouterSpec.js"></script>
<script type="text/javascript" src="specForceLayouter/forceLayouterUISpec.js"></script>
<script type="text/javascript" src="specEvents/eventLibrarySpec.js"></script>
<script type="text/javascript" src="specEvents/eventDispatcherSpec.js"></script>
<script type="text/javascript" src="specEvents/eventDispatcherUISpec.js"></script>
<script type="text/javascript" src="specZoomManager/zoomManagerSpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,73 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Arango Adapter</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="../graph/arangoAdapter.js"></script>
<script type="text/javascript" src="../ui/uiComponentsHelper.js"></script>
<script type="text/javascript" src="../ui/modalDialogHelper.js"></script>
<script type="text/javascript" src="../ui/arangoAdapterControls.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specAdapter/interfaceSpec.js"></script>
<script type="text/javascript" src="specAdapter/arangoAdapterSpec.js"></script>
<script type="text/javascript" src="specAdapter/arangoAdapterUISpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,66 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Edge Shaper</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="../graph/colourMapper.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specColourMapper/colourMapperSpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,74 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Edge Shaper</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="helper/objectsHelper.js"></script>
<script type="text/javascript" src="../graph/colourMapper.js"></script>
<script type="text/javascript" src="../graph/edgeShaper.js"></script>
<script type="text/javascript" src="../ui/uiComponentsHelper.js"></script>
<script type="text/javascript" src="../ui/modalDialogHelper.js"></script>
<script type="text/javascript" src="../ui/edgeShaperControls.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specEdgeShaper/edgeShaperSpec.js"></script>
<script type="text/javascript" src="specEdgeShaper/edgeShaperUISpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,78 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Event Dispatcher</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="helper/objectsHelper.js"></script>
<script type="text/javascript" src="helper/mocks.js"></script>
<script type="text/javascript" src="../graph/eventLibrary.js"></script>
<script type="text/javascript" src="../graph/colourMapper.js"></script>
<script type="text/javascript" src="../graph/nodeShaper.js"></script>
<script type="text/javascript" src="../graph/edgeShaper.js"></script>
<script type="text/javascript" src="../graph/eventDispatcher.js"></script>
<script type="text/javascript" src="../ui/modalDialogHelper.js"></script>
<script type="text/javascript" src="../ui/uiComponentsHelper.js"></script>
<script type="text/javascript" src="../ui/eventDispatcherControls.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specEvents/eventDispatcherSpec.js"></script>
<script type="text/javascript" src="specEvents/eventDispatcherUISpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,66 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Event Library</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="../graph/eventLibrary.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specEvents/eventLibrarySpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,71 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Force Layouter</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="../graph/forceLayouter.js"></script>
<script type="text/javascript" src="../ui/uiComponentsHelper.js"></script>
<script type="text/javascript" src="../ui/modalDialogHelper.js"></script>
<script type="text/javascript" src="../ui/layouterControls.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specForceLayouter/forceLayouterSpec.js"></script>
<script type="text/javascript" src="specForceLayouter/forceLayouterUISpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,87 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Graph Viewer</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="helper/commMock.js"></script>
<script type="text/javascript" src="../graph/colourMapper.js"></script>
<script type="text/javascript" src="../graph/nodeShaper.js"></script>
<script type="text/javascript" src="../graph/edgeShaper.js"></script>
<script type="text/javascript" src="../graph/forceLayouter.js"></script>
<script type="text/javascript" src="../graph/JSONAdapter.js"></script>
<script type="text/javascript" src="../graph/eventLibrary.js"></script>
<script type="text/javascript" src="../graph/eventDispatcher.js"></script>
<!-- UI Modules> -->
<script type="text/javascript" src="../ui/modalDialogHelper.js"></script>
<script type="text/javascript" src="../ui/nodeShaperControls.js"></script>
<script type="text/javascript" src="../ui/edgeShaperControls.js"></script>
<script type="text/javascript" src="../ui/arangoAdapterControls.js"></script>
<script type="text/javascript" src="../ui/layouterControls.js"></script>
<script type="text/javascript" src="../ui/uiComponentsHelper.js"></script>
<script type="text/javascript" src="../ui/eventDispatcherControls.js"></script>
<script type="text/javascript" src="../ui/graphViewerUI.js"></script>
<script type="text/javascript" src="../graphViewer.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specGraphViewer/graphViewerSpec.js"></script>
<script type="text/javascript" src="specGraphViewer/graphViewerUISpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,56 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test JSLint</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript" src="specClickExpander/clickExpanderSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,66 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test JSON Adapter</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="../graph/jsonAdapter.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specAdapter/interfaceSpec.js"></script>
<script type="text/javascript" src="specAdapter/jsonAdapterSpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,71 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Zoom Manager</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/d3.fisheye.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/objectsHelper.js"></script>
<script type="text/javascript" src="../graph/nodeReducer.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specNodeReducer/nodeReducerSpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,73 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Node Shaper</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="../graph/colourMapper.js"></script>
<script type="text/javascript" src="../graph/nodeShaper.js"></script>
<script type="text/javascript" src="../ui/uiComponentsHelper.js"></script>
<script type="text/javascript" src="../ui/modalDialogHelper.js"></script>
<script type="text/javascript" src="../ui/nodeShaperControls.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specNodeShaper/nodeShaperSpec.js"></script>
<script type="text/javascript" src="specNodeShaper/nodeShaperUISpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,71 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Zoom Manager</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jslint.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="../../lib/d3.v3.min.js"></script>
<script type="text/javascript" src="../../lib/d3.fisheye.js"></script>
<script type="text/javascript" src="../../lib/underscore.js"></script>
<script type="text/javascript" src="../../lib/jquery-1.8.3.js"></script>
<script type="text/javascript" src="../../lib/bootstrap.js"></script>
<script type="text/javascript" src="../../lib/jquery.livequery.js"></script>
<script type="text/javascript" src="helper/eventHelper.js"></script>
<script type="text/javascript" src="../graph/zoomManager.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specZoomManager/zoomManagerSpec.js"></script>
<!-- run JSLINT -->
<script type="text/javascript" src="specJSLint/jsLintSpec.js"></script>
<script type="text/javascript">
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body>
<h1>
<a href="jasmineTestLinks.html">Back to List</a>
</h1>
</body>
</html>

View File

@ -1,78 +0,0 @@
/*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true */
/*global beforeEach, afterEach */
/*global describe, it, expect, jasmine, spyOn*/
/*global waitsFor, runs, waits */
/*global _, JSLINT*/
/*global document*/
(function () {
"use strict";
describe('JSLint', function () {
var options = {},
lint = /^\/specJSLint|[\w\W]jsLintSpec\.js$/;
function get(path) {
path = path + "?" + new Date().getTime();
var xhr;
try {
xhr = new jasmine.XmlHttpRequest();
xhr.open("GET", path, false);
xhr.send(null);
} catch (e) {
throw new Error("couldn't fetch " + path + ": " + e);
}
if (xhr.status < 200 || xhr.status > 299) {
throw new Error("Could not load '" + path + "'.");
}
return xhr.responseText;
}
describe('checking codeFiles', function() {
var files = /^([\w\W]*lib\/[\w\W]*)|([\w\W]*Spec\.js)$/;
_.each(document.getElementsByTagName('script'), function (element) {
var script = element.getAttribute('src');
if (script === null || files.test(script)) {
return;
}
it(script, function () {
var self = this,
source = get(script),
result = JSLINT(source, options);
_.each(JSLINT.errors, function (error) {
self.addMatcherResult(new jasmine.ExpectationResult({
passed: false,
message: "line " + error.line + ' - ' + error.reason + ' - ' + error.evidence
}));
});
expect(true).toBe(true); // force spec to show up if there are no errors
});
});
});
describe('checking specFiles', function() {
var files = /^\/spec*|[\w\W]*Spec\.js$/;
_.each(document.getElementsByTagName('script'), function (element) {
var script = element.getAttribute('src');
if (!files.test(script) || lint.test(script)) {
return;
}
it(script, function () {
var self = this,
source = get(script),
result = JSLINT(source, options);
_.each(JSLINT.errors, function (error) {
self.addMatcherResult(new jasmine.ExpectationResult({
passed: false,
message: "line " + error.line + ' - ' + error.reason + ' - ' + error.evidence
}));
});
expect(true).toBe(true); // force spec to show up if there are no errors
});
});
});
});
}());

View File

@ -1,149 +0,0 @@
// Karma configuration
// Generated on Thu Jul 04 2013 11:39:34 GMT+0200 (CEST)
module.exports = function(karma) {
karma.set({
// base path, that will be used to resolve files and exclude
basePath: '../jasmine_test/',
// frameworks to use
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
'lib/jasmine-1.3.1/jasmine-html.js',
'lib/jslint.js',
'../../lib/d3.v3.min.js',
'../../lib/d3.fisheye.js',
'../../lib/underscore.js',
'../../lib/jquery-1.8.3.js',
'../../lib/bootstrap.js',
'../../lib/jquery.livequery.js',
'../../lib/jquery-ui-1.9.2.custom.js',
// Mocks
'helper/eventHelper.js',
'helper/objectsHelper.js',
'helper/mocks.js',
'helper/commMock.js',
'helper/uiMatchers.js',
// Core Modules
'../graphViewer.js',
'../graph/domObserverFactory.js',
'../graph/colourMapper.js',
'../graph/communityNode.js',
'../graph/webWorkerWrapper.js',
'../graph/nodeShaper.js',
'../graph/abstractAdapter.js',
'../graph/jsonAdapter.js',
'../graph/arangoAdapter.js',
'../graph/foxxAdapter.js',
'../graph/previewAdapter.js',
'../graph/edgeShaper.js',
'../graph/forceLayouter.js',
'../graph/eventDispatcher.js',
'../graph/eventLibrary.js',
'../graph/zoomManager.js',
'../graph/nodeReducer.js',
'../graph/modularityJoiner.js',
// UI Modules
'../ui/modalDialogHelper.js',
'../ui/nodeShaperControls.js',
'../ui/edgeShaperControls.js',
'../ui/arangoAdapterControls.js',
'../ui/layouterControls.js',
'../ui/uiComponentsHelper.js',
'../ui/eventDispatcherControls.js',
'../ui/graphViewerUI.js',
'../ui/graphViewerWidget.js',
'../ui/graphViewerPreview.js',
// Specs
'specColourMapper/colourMapperSpec.js',
'specWindowObjects/domObserverFactorySpec.js',
'specCommunityNode/communityNodeSpec.js',
'specAdapter/interfaceSpec.js',
'specAdapter/abstractAdapterSpec.js',
'specAdapter/jsonAdapterSpec.js',
'specAdapter/arangoAdapterSpec.js',
'specAdapter/foxxAdapterSpec.js',
'specAdapter/previewAdapterSpec.js',
'specAdapter/arangoAdapterUISpec.js',
'specNodeShaper/nodeShaperSpec.js',
'specNodeShaper/nodeShaperUISpec.js',
'specEdgeShaper/edgeShaperSpec.js',
'specEdgeShaper/edgeShaperUISpec.js',
'specForceLayouter/forceLayouterSpec.js',
'specForceLayouter/forceLayouterUISpec.js',
'specEvents/eventLibrarySpec.js',
'specEvents/eventDispatcherSpec.js',
'specEvents/eventDispatcherUISpec.js',
'specZoomManager/zoomManagerSpec.js',
'specGraphViewer/graphViewerSpec.js',
'specGraphViewer/graphViewerUISpec.js',
'specGraphViewer/graphViewerWidgetSpec.js',
'specGraphViewer/graphViewerPreviewSpec.js',
'specNodeReducer/nodeReducerSpec.js',
'specNodeReducer/modularityJoinerSpec.js',
'specWindowObjects/workerWrapperSpec.js',
'specJSLint/jsLintSpec.js'
],
// list of files to exclude
exclude: [
],
// test results reporter to use
// possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
reporters: ['progress'],
// web server port
port: 9876,
// cli runner port
runnerPort: 9100,
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: karma.LOG_DISABLE || karma.LOG_ERROR || karma.LOG_WARN || karma.LOG_INFO || karma.LOG_DEBUG
logLevel: karma.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera
// - Safari (only Mac)
// - PhantomJS
// - IE (only Windows)
browsers: [],
// If browser does not capture in given timeout [ms], kill it
captureTimeout: 60000,
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: false
});
};

View File

@ -37,15 +37,13 @@ function ArangoAdapterControls(list, adapter) {
if (adapter === undefined) {
throw "The ArangoAdapter has to be given.";
}
var baseClass = "adapter";
this.addControlChangeCollections = function(callback) {
var prefix = "control_adapter_collections",
idprefix = prefix + "_";
adapter.getCollections(function(nodeCols, edgeCols) {
adapter.getGraphs(function(graphs) {
uiComponentsHelper.createButton(baseClass, list, "Collections", prefix, function() {
uiComponentsHelper.createButton(list, "Collections", prefix, function() {
modalDialogHelper.createModalDialog("Switch Collections",
idprefix, [{
type: "decission",
@ -132,7 +130,7 @@ function ArangoAdapterControls(list, adapter) {
prioList = adapter.getPrioList(),
label = "Group vertices";
uiComponentsHelper.createButton(baseClass, list, label, prefix, function() {
uiComponentsHelper.createButton(list, label, prefix, function() {
modalDialogHelper.createModalChangeDialog(label,
idprefix, [{
type: "extendable",
@ -155,7 +153,7 @@ function ArangoAdapterControls(list, adapter) {
});
/*
adapter.getCollections(function(nodeCols, edgeCols) {
uiComponentsHelper.createButton(baseClass, list, "Collections", prefix, function() {
uiComponentsHelper.createButton(list, "Collections", prefix, function() {
modalDialogHelper.createModalDialog("Switch Collections",
idprefix, [{
type: "list",

View File

@ -37,13 +37,12 @@ function EdgeShaperControls(list, shaper) {
if (shaper === undefined) {
throw "The EdgeShaper has to be given.";
}
var self = this,
baseClass = "graph";
var self = this;
this.addControlOpticShapeNone = function() {
var prefix = "control_edge_none",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "None", prefix, function() {
uiComponentsHelper.createButton(list, "None", prefix, function() {
shaper.changeTo({
shape: {
type: EdgeShaper.shapes.NONE
@ -55,7 +54,7 @@ function EdgeShaperControls(list, shaper) {
this.addControlOpticShapeArrow = function() {
var prefix = "control_edge_arrow",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Arrow", prefix, function() {
uiComponentsHelper.createButton(list, "Arrow", prefix, function() {
shaper.changeTo({
shape: {
type: EdgeShaper.shapes.ARROW
@ -69,7 +68,7 @@ function EdgeShaperControls(list, shaper) {
this.addControlOpticLabel = function() {
var prefix = "control_edge_label",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Label", prefix, function() {
uiComponentsHelper.createButton(list, "Label", prefix, function() {
modalDialogHelper.createModalDialog("Switch Label Attribute",
idprefix, [{
type: "text",
@ -90,7 +89,7 @@ function EdgeShaperControls(list, shaper) {
this.addControlOpticSingleColour = function() {
var prefix = "control_edge_singlecolour",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Single Colour", prefix, function() {
uiComponentsHelper.createButton(list, "Single Colour", prefix, function() {
modalDialogHelper.createModalDialog("Switch to Colour",
idprefix, [{
type: "text",
@ -111,7 +110,7 @@ function EdgeShaperControls(list, shaper) {
this.addControlOpticAttributeColour = function() {
var prefix = "control_edge_attributecolour",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Colour by Attribute", prefix, function() {
uiComponentsHelper.createButton(list, "Colour by Attribute", prefix, function() {
modalDialogHelper.createModalDialog("Display colour by attribute",
idprefix, [{
type: "text",
@ -132,7 +131,7 @@ function EdgeShaperControls(list, shaper) {
this.addControlOpticGradientColour = function() {
var prefix = "control_edge_gradientcolour",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Gradient Colour", prefix, function() {
uiComponentsHelper.createButton(list, "Gradient Colour", prefix, function() {
modalDialogHelper.createModalDialog("Change colours for gradient",
idprefix, [{
type: "text",
@ -173,4 +172,4 @@ function EdgeShaperControls(list, shaper) {
self.addAllActions();
};
}
}

View File

@ -76,7 +76,6 @@ function EventDispatcherControls(list, nodeShaper, edgeShaper, dispatcherConfig)
edit: "edit",
view: "view"
},
baseClass = "event",
dispatcher = new EventDispatcher(nodeShaper, edgeShaper, dispatcherConfig),
setCursorIcon = function(icon) {
@ -102,7 +101,6 @@ function EventDispatcherControls(list, nodeShaper, edgeShaper, dispatcherConfig)
},
createButton = function(title, callback) {
uiComponentsHelper.createButton(
baseClass,
list,
title,
"control_event_" + title,

View File

@ -299,9 +299,9 @@ function GraphViewerUI(container, adapterConfig, optWidth, optHeight, viewerConf
slider = document.createElement("div");
slider.id = "gv_zoom_slider";
slider.className = "gv_zoom_slider";
background.appendChild(zoomUI);
background.insertBefore(zoomUI, svg[0][0]);
zoomUI.appendChild(zoomButtons);
zoomUI.appendChild(slider);
$( "#gv_zoom_slider" ).slider({

View File

@ -37,13 +37,12 @@ function LayouterControls(list, layouter) {
if (layouter === undefined) {
throw "The Layouter has to be given.";
}
var self = this,
baseClass = "layout";
var self = this;
this.addControlGravity = function() {
var prefix = "control_layout_gravity",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Gravity", prefix, function() {
uiComponentsHelper.createButton(list, "Gravity", prefix, function() {
modalDialogHelper.createModalDialog("Switch Gravity Strength",
idprefix, [{
type: "text",
@ -61,7 +60,7 @@ function LayouterControls(list, layouter) {
this.addControlCharge = function() {
var prefix = "control_layout_charge",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Charge", prefix, function() {
uiComponentsHelper.createButton(list, "Charge", prefix, function() {
modalDialogHelper.createModalDialog("Switch Charge Strength",
idprefix, [{
type: "text",
@ -79,7 +78,7 @@ function LayouterControls(list, layouter) {
this.addControlDistance = function() {
var prefix = "control_layout_distance",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Distance", prefix, function() {
uiComponentsHelper.createButton(list, "Distance", prefix, function() {
modalDialogHelper.createModalDialog("Switch Distance Strength",
idprefix, [{
type: "text",
@ -101,4 +100,4 @@ function LayouterControls(list, layouter) {
self.addControlCharge();
};
}
}

View File

@ -38,7 +38,6 @@ function NodeShaperControls(list, shaper) {
throw "The NodeShaper has to be given.";
}
var self = this,
baseClass = "graph",
colourDiv,
fillColourDiv = function(mapping) {
@ -63,7 +62,7 @@ function NodeShaperControls(list, shaper) {
};
this.addControlOpticShapeNone = function() {
uiComponentsHelper.createButton(baseClass, list, "None", "control_node_none", function() {
uiComponentsHelper.createButton(list, "None", "control_node_none", function() {
shaper.changeTo({
shape: {
type: NodeShaper.shapes.NONE
@ -75,7 +74,7 @@ function NodeShaperControls(list, shaper) {
this.addControlOpticShapeCircle = function() {
var prefix = "control_node_circle",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Circle", prefix, function() {
uiComponentsHelper.createButton(list, "Circle", prefix, function() {
modalDialogHelper.createModalDialog("Switch to Circle",
idprefix, [{
type: "text",
@ -96,7 +95,7 @@ function NodeShaperControls(list, shaper) {
this.addControlOpticShapeRect = function() {
var prefix = "control_node_rect",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Rectangle", prefix, function() {
uiComponentsHelper.createButton(list, "Rectangle", prefix, function() {
modalDialogHelper.createModalDialog("Switch to Rectangle",
"control_node_rect_", [{
type: "text",
@ -122,7 +121,7 @@ function NodeShaperControls(list, shaper) {
this.addControlOpticLabel = function() {
var prefix = "control_node_label",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Label", prefix, function() {
uiComponentsHelper.createButton(list, "Label", prefix, function() {
modalDialogHelper.createModalChangeDialog("Change label attribute",
idprefix, [{
type: "text",
@ -144,7 +143,7 @@ function NodeShaperControls(list, shaper) {
this.addControlOpticSingleColour = function() {
var prefix = "control_node_singlecolour",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Single Colour", prefix, function() {
uiComponentsHelper.createButton(list, "Single Colour", prefix, function() {
modalDialogHelper.createModalDialog("Switch to Colour",
idprefix, [{
type: "text",
@ -170,7 +169,7 @@ function NodeShaperControls(list, shaper) {
this.addControlOpticAttributeColour = function() {
var prefix = "control_node_attributecolour",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Colour by Attribute", prefix, function() {
uiComponentsHelper.createButton(list, "Colour by Attribute", prefix, function() {
modalDialogHelper.createModalDialog("Display colour by attribute",
idprefix, [{
type: "text",
@ -191,7 +190,7 @@ function NodeShaperControls(list, shaper) {
this.addControlOpticExpandColour = function() {
var prefix = "control_node_expandcolour",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Expansion Colour", prefix, function() {
uiComponentsHelper.createButton(list, "Expansion Colour", prefix, function() {
modalDialogHelper.createModalDialog("Display colours for expansion",
idprefix, [{
type: "text",
@ -221,7 +220,7 @@ function NodeShaperControls(list, shaper) {
this.addControlOpticLabelAndColour = function(adapter) {
var prefix = "control_node_labelandcolour",
idprefix = prefix + "_";
uiComponentsHelper.createButton(baseClass, list, "Label", prefix, function() {
uiComponentsHelper.createButton(list, "Label", prefix, function() {
modalDialogHelper.createModalChangeDialog("Change label attribute",
idprefix, [{
type: "text",

View File

@ -33,23 +33,24 @@ var uiComponentsHelper = uiComponentsHelper || {};
(function componentsHelper() {
"use strict";
uiComponentsHelper.createButton = function(baseclass, list, title, prefix, callback) {
uiComponentsHelper.createButton = function(list, title, prefix, callback) {
var li = document.createElement("li"),
button = document.createElement("button");
li.className = baseclass + "_control " + prefix;
li.className = "graph_control " + prefix;
li.id = prefix;
li.appendChild(button);
button.className = "btn btn-primary gv_dropdown_entry";
button.appendChild(document.createTextNode(title));
list.appendChild(li);
button.id = prefix + "_button";
button.onclick = callback;
};
uiComponentsHelper.createListEntry = function(baseclass, list, title, prefix, callback) {
uiComponentsHelper.createListEntry = function(list, title, prefix, callback) {
var button = document.createElement("li"),
a = document.createElement("a"),
label = document.createElement("label");
button.className = baseclass + "_control " + prefix;
button.className = "graph_control " + prefix;
button.id = prefix;
button.appendChild(a);
a.className = "gv_dropdown_entry";

View File

@ -523,6 +523,30 @@ Vertex.prototype.addOutEdge = function (ine, id, label, data) {
return this._graph.addEdge(this, ine, id, label, data);
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.degree = function () {
return this.getEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of in-edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.inDegree = function () {
return this.getInEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of out-edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.outDegree = function () {
return this.getOutEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the identifier of a vertex
///

View File

@ -60,6 +60,7 @@ Edge.prototype.setProperty = function (name, value) {
update = this._properties;
update[name] = value;
this._graph.emptyCachedPredecessors();
results = GraphAPI.putEdge(this._graph._properties._key, this._properties._key, update);
@ -279,6 +280,8 @@ Graph.prototype.drop = function () {
Graph.prototype._saveEdge = function(id, out_vertex_id, in_vertex_id, params) {
var results;
this.emptyCachedPredecessors();
params._key = id;
params._from = out_vertex_id;
@ -379,6 +382,7 @@ Graph.prototype.getEdges = function () {
////////////////////////////////////////////////////////////////////////////////
Graph.prototype.removeVertex = function (vertex) {
this.emptyCachedPredecessors();
GraphAPI.deleteVertex(this._properties._key, vertex._properties._key);
vertex._properties = undefined;
};
@ -388,7 +392,9 @@ Graph.prototype.removeVertex = function (vertex) {
////////////////////////////////////////////////////////////////////////////////
Graph.prototype.removeEdge = function (edge) {
this.emptyCachedPredecessors();
GraphAPI.deleteEdge(this._properties._key, edge._properties._key);
this._edgesCache[edge._properties._id] = undefined;
edge._properties = undefined;
};

View File

@ -61,6 +61,7 @@
<div id="shortcutDiv">
<b>Submit:</b> CTRL/CMD + Return ; <b>Undo:</b> CTRL/CMD + Z ; <b>Redo:</b> CTRL/CMD + SHIFT + Z ;
<b>Toggle Comments:</b> CTRL/CMD + SHIFT + C
<br /><b>Warning:</b> Right now there is a bug in Safari, the cursor is misplaced. Please use a different browser for now. Fix in progress.
</div>
</div>

View File

@ -9,7 +9,7 @@
<meta name="author" content="Heiko Kernbach, Michael Hackstein">
<!-- NO EXTERNAL LINKS link href='http://fonts.googleapis.com/css?family=Lato:300,400,700' rel='stylesheet' type='text/css' -->
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,300,400italic,700italic,700' rel='stylesheet' type='text/css'>
<!-- NO EXTERNAL LINKS <link href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,300,400italic,700italic,700' rel='stylesheet' type='text/css'> -->
<link href="css/style.css" rel="stylesheet">
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
</head>

View File

@ -75,7 +75,7 @@
"frontend/js/lib/handlebars-1.0.rc.1.js",
"frontend/js/lib/underscore.js",
"frontend/js/lib/backbone.js",
"frontend/js/lib/d3.v3.js",
"frontend/js/lib/d3.v3.min.js",
"frontend/js/lib/nv.d3.js",
"frontend/js/lib/d3.fisheye.js",
"frontend/js/lib/ColVis.js",
@ -93,6 +93,7 @@
"css/style.css": {
"files": [
"frontend/css/openSansFont.css",
"frontend/css/swagger/hightlight.default.css",
"frontend/css/bootstrap.css",
"frontend/css/arangodbIcons.css",

View File

@ -32,7 +32,7 @@ module.exports = function(karma) {
'frontend/js/lib/handlebars-1.0.rc.1.js',
'frontend/js/lib/underscore.js',
'frontend/js/lib/backbone.js',
'frontend/js/lib/d3.v3.js',
'frontend/js/lib/d3.v3.min.js',
'frontend/js/lib/nv.d3.js',
'frontend/js/lib/d3.fisheye.js',
'frontend/js/lib/ejs_0.9_alpha_1_production.js',
@ -171,9 +171,7 @@ module.exports = function(karma) {
//Templates
{pattern: 'frontend/js/templates/*.ejs', served:true, included:false, watched: true},
// Specs
// GraphViewer
'test/specs/graphViewer/specColourMapper/colourMapperSpec.js',
'test/specs/graphViewer/specWindowObjects/domObserverFactorySpec.js',
@ -184,23 +182,23 @@ module.exports = function(karma) {
'test/specs/graphViewer/specAdapter/arangoAdapterSpec.js',
'test/specs/graphViewer/specAdapter/foxxAdapterSpec.js',
'test/specs/graphViewer/specAdapter/previewAdapterSpec.js',
// 'test/specs/graphViewer/specAdapter/arangoAdapterUISpec.js',
'test/specs/graphViewer/specAdapter/arangoAdapterUISpec.js',
'test/specs/graphViewer/specNodeShaper/nodeShaperSpec.js',
// 'test/specs/graphViewer/specNodeShaper/nodeShaperUISpec.js',
'test/specs/graphViewer/specNodeShaper/nodeShaperUISpec.js',
'test/specs/graphViewer/specEdgeShaper/edgeShaperSpec.js',
// 'test/specs/graphViewer/specEdgeShaper/edgeShaperUISpec.js',
'test/specs/graphViewer/specEdgeShaper/edgeShaperUISpec.js',
'test/specs/graphViewer/specForceLayouter/forceLayouterSpec.js',
// 'test/specs/graphViewer/specForceLayouter/forceLayouterUISpec.js',
'test/specs/graphViewer/specForceLayouter/forceLayouterUISpec.js',
'test/specs/graphViewer/specEvents/eventLibrarySpec.js',
'test/specs/graphViewer/specEvents/eventDispatcherSpec.js',
// 'test/specs/graphViewer/specEvents/eventDispatcherUISpec.js',
// 'test/specs/graphViewer/specZoomManager/zoomManagerSpec.js',
// 'test/specs/graphViewer/specGraphViewer/graphViewerSpec.js',
'test/specs/graphViewer/specEvents/eventDispatcherUISpec.js',
'test/specs/graphViewer/specZoomManager/zoomManagerSpec.js',
'test/specs/graphViewer/specGraphViewer/graphViewerSpec.js',
'test/specs/graphViewer/specGraphViewer/graphViewerUISpec.js',
'test/specs/graphViewer/specGraphViewer/graphViewerWidgetSpec.js',
'test/specs/graphViewer/specGraphViewer/graphViewerPreviewSpec.js',
'test/specs/graphViewer/specNodeReducer/nodeReducerSpec.js',
// 'test/specs/graphViewer/specNodeReducer/modularityJoinerSpec.js',
'test/specs/graphViewer/specNodeReducer/modularityJoinerSpec.js',
'test/specs/graphViewer/specWindowObjects/workerWrapperSpec.js',
// Arango
@ -221,7 +219,6 @@ module.exports = function(karma) {
// Router
'test/specs/router/routerSpec.js',
// JSLint
'test/specJSLint/jsLintSpec.js'
],

View File

@ -95,7 +95,6 @@ var uiMatchers = uiMatchers || {};
expect(btn).toBeTag("button");
expect(btn).toBeOfClass("btn");
expect(btn).toBeOfClass("btn-icon");
// Correctness of buttons is checked in eventDispatcherUISpec.
});
return true;
},

View File

@ -100,12 +100,13 @@
var idPrefix = "#control_adapter_collections";
beforeEach(function() {
adapterUI.addControlChangeCollections();
expect($("#control_adapter_list " + idPrefix).length).toEqual(1);
expect($("#control_adapter_list " + idPrefix)[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_adapter_collections");
expect($(idPrefix + "_modal").length).toEqual(1);
runs(function() {
adapterUI.addControlChangeCollections();
expect($("#control_adapter_list " + idPrefix).length).toEqual(1);
expect($("#control_adapter_list " + idPrefix)[0]).toConformToListCSS();
helper.simulateMouseEvent("click", idPrefix.substr(1) + "_button");
expect($(idPrefix + "_modal").length).toEqual(1);
});
});
afterEach(function() {
@ -191,25 +192,29 @@
});
describe('change priority list control', function() {
var idPrefix;
beforeEach(function() {
idPrefix = "#control_adapter_priority";
adapterUI.addControlChangePriority();
expect($("#control_adapter_list #control_adapter_priority").length).toEqual(1);
expect($("#control_adapter_list #control_adapter_priority")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_adapter_priority");
expect($("#control_adapter_priority_modal").length).toEqual(1);
expect($("#control_adapter_list " + idPrefix).length).toEqual(1);
expect($("#control_adapter_list " + idPrefix)[0]).toConformToListCSS();
helper.simulateMouseEvent("click", idPrefix.substr(1) + "_button");
expect($(idPrefix + "_modal").length).toEqual(1);
});
afterEach(function() {
waitsFor(function() {
return $("#control_adapter_priority_modal").length === 0;
return $(idPrefix + "_modal").length === 0;
}, 2000, "The modal dialog should disappear.");
});
it('should be added to the list', function() {
runs(function() {
$("#control_adapter_priority_attribute_1").attr("value", "foo");
helper.simulateMouseEvent("click", "control_adapter_priority_submit");
$(idPrefix + "_attribute_1").attr("value", "foo");
helper.simulateMouseEvent("click", idPrefix.substr(1) + "_submit");
expect(adapter.changeTo).toHaveBeenCalledWith({
prioList: ["foo"]
});
@ -218,8 +223,8 @@
it('should not add empty attributes to priority', function() {
runs(function() {
$("#control_adapter_priority_attribute_1").attr("value", "");
helper.simulateMouseEvent("click", "control_adapter_priority_submit");
$(idPrefix + "_attribute_1").attr("value", "");
helper.simulateMouseEvent("click", idPrefix.substr(1) + "_submit");
expect(adapter.changeTo).toHaveBeenCalledWith({
prioList: []
});
@ -228,13 +233,13 @@
it('should add a new line to priority on demand', function() {
runs(function() {
helper.simulateMouseEvent("click", "control_adapter_priority_attribute_addLine");
expect($("#control_adapter_priority_attribute_1").length).toEqual(1);
expect($("#control_adapter_priority_attribute_2").length).toEqual(1);
expect($("#control_adapter_priority_attribute_addLine").length).toEqual(1);
$("#control_adapter_priority_attribute_1").attr("value", "foo");
$("#control_adapter_priority_attribute_2").attr("value", "bar");
helper.simulateMouseEvent("click", "control_adapter_priority_submit");
helper.simulateMouseEvent("click", idPrefix.substr(1) + "_attribute_addLine");
expect($(idPrefix + "_attribute_1").length).toEqual(1);
expect($(idPrefix + "_attribute_2").length).toEqual(1);
expect($(idPrefix + "_attribute_addLine").length).toEqual(1);
$(idPrefix + "_attribute_1").attr("value", "foo");
$(idPrefix + "_attribute_2").attr("value", "bar");
helper.simulateMouseEvent("click", idPrefix.substr(1) + "_submit");
expect(adapter.changeTo).toHaveBeenCalledWith({
prioList: ["foo", "bar"]
});
@ -291,6 +296,8 @@
});
});
});
/* TO_DO
it('should load the current prioList from the adapter', function() {
@ -326,7 +333,7 @@
helper.simulateMouseEvent("click", "control_adapter_priority_cancel");
});
});
*/
});
it('should be able to add all controls to the list', function() {

View File

@ -74,7 +74,7 @@
expect($("#control_edge_list #control_edge_none").length).toEqual(1);
expect($("#control_edge_list #control_edge_none")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_edge_none");
helper.simulateMouseEvent("click", "control_edge_none_button");
expect(shaper.changeTo).toHaveBeenCalledWith({
shape: {
@ -91,7 +91,7 @@
expect($("#control_edge_list #control_edge_arrow").length).toEqual(1);
expect($("#control_edge_list #control_edge_arrow")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_edge_arrow");
helper.simulateMouseEvent("click", "control_edge_arrow_button");
expect(shaper.changeTo).toHaveBeenCalledWith({
shape: {
@ -109,7 +109,7 @@
expect($("#control_edge_list #control_edge_label").length).toEqual(1);
expect($("#control_edge_list #control_edge_label")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_edge_label");
helper.simulateMouseEvent("click", "control_edge_label_button");
$("#control_edge_label_key").attr("value", "theAnswer");
helper.simulateMouseEvent("click", "control_edge_label_submit");
@ -131,7 +131,7 @@
expect($("#control_edge_list #control_edge_singlecolour").length).toEqual(1);
expect($("#control_edge_list #control_edge_singlecolour")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_edge_singlecolour");
helper.simulateMouseEvent("click", "control_edge_singlecolour_button");
$("#control_edge_singlecolour_stroke").attr("value", "#123456");
helper.simulateMouseEvent("click", "control_edge_singlecolour_submit");
@ -156,7 +156,7 @@
expect($("#control_edge_list #control_edge_attributecolour").length).toEqual(1);
expect($("#control_edge_list #control_edge_attributecolour")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_edge_attributecolour");
helper.simulateMouseEvent("click", "control_edge_attributecolour_button");
$("#control_edge_attributecolour_key").attr("value", "label");
helper.simulateMouseEvent("click", "control_edge_attributecolour_submit");
@ -181,7 +181,7 @@
expect($("#control_edge_list #control_edge_gradientcolour").length).toEqual(1);
expect($("#control_edge_list #control_edge_gradientcolour")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_edge_gradientcolour");
helper.simulateMouseEvent("click", "control_edge_gradientcolour_button");
$("#control_edge_gradientcolour_source").attr("value", "#123456");
$("#control_edge_gradientcolour_target").attr("value", "#654321");
helper.simulateMouseEvent("click", "control_edge_gradientcolour_submit");

View File

@ -252,7 +252,9 @@
expect(adapter.createNode).toHaveBeenCalledWith(
{},
jasmine.any(Function)
jasmine.any(Function),
jasmine.any(Number), // Number not yet correctly tested
jasmine.any(Number)
);
/*
expect(adapter.createNode).toHaveBeenCalledWith(

View File

@ -75,7 +75,7 @@
expect($("#control_layout_list #control_layout_gravity").length).toEqual(1);
expect($("#control_layout_list #control_layout_gravity")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_layout_gravity");
helper.simulateMouseEvent("click", "control_layout_gravity_button");
expect($("#control_layout_gravity_modal").length).toEqual(1);
@ -100,7 +100,7 @@
expect($("#control_layout_list #control_layout_distance").length).toEqual(1);
expect($("#control_layout_list #control_layout_distance")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_layout_distance");
helper.simulateMouseEvent("click", "control_layout_distance_button");
expect($("#control_layout_distance_modal").length).toEqual(1);
@ -125,7 +125,7 @@
expect($("#control_layout_list #control_layout_charge").length).toEqual(1);
expect($("#control_layout_list #control_layout_charge")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_layout_charge");
helper.simulateMouseEvent("click", "control_layout_charge_button");
expect($("#control_layout_charge_modal").length).toEqual(1);

View File

@ -936,17 +936,26 @@
this.addMatchers({
toContainKarateClubCommunities: function() {
var c1 = [
"10", "15", "16", "19", "21", "23", "27",
"30", "31", "33", "34", "9"
"10", "15", "16", "19", "21", "23",
"30", "33", "34"
].sort().join(),
c2 = ["1", "12", "13", "14", "18", "2", "20", "22", "3", "4", "8"].sort().join(),
c3 = ["11", "17", "5", "6", "7"].sort().join(),
c4 = ["24", "25", "26", "28", "29", "32"].sort().join(),
swap = ["9", "27", "31"],
comms = this.actual,
failed = false,
msg = "Found incorrect: ";
_.each(comms, function(o) {
var check = o.nodes.sort().join();
var check = o.nodes;
_.each(swap, function (s) {
var index = _.indexOf(check, s);
if (index > -1) {
check = _.without(check, s);
swap = _.without(swap, s);
}
});
check = check.sort().join();
switch (check) {
case c1:
c1 = "";
@ -980,6 +989,9 @@
if (c4 !== "") {
notFound += "[" + c4 + "] ";
}
if (swap.length > 0) {
notFound += "[" + swap.join() + "] ";
}
return msg + " and did not find: " + notFound;
};
return !failed;
@ -2058,4 +2070,4 @@
});
});
}());
}());

View File

@ -87,7 +87,7 @@
expect($("#control_node_list #control_node_none").length).toEqual(1);
expect($("#control_node_list #control_node_none")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_none");
helper.simulateMouseEvent("click", "control_node_none_button");
expect(shaper.changeTo).toHaveBeenCalledWith({
shape: {
@ -103,13 +103,11 @@
expect($("#control_node_list #control_node_circle").length).toEqual(1);
expect($("#control_node_list #control_node_circle")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_circle");
helper.simulateMouseEvent("click", "control_node_circle_button");
expect($("#control_node_circle_modal").length).toEqual(1);
$("#control_node_circle_radius").attr("value", 42);
helper.simulateMouseEvent("click", "control_node_circle_submit");
expect(shaper.changeTo).toHaveBeenCalledWith({
shape: {
type: NodeShaper.shapes.CIRCLE,
@ -131,7 +129,7 @@
expect($("#control_node_list #control_node_rect").length).toEqual(1);
expect($("#control_node_list #control_node_rect")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_rect");
helper.simulateMouseEvent("click", "control_node_rect_button");
$("#control_node_rect_width").attr("value", 42);
$("#control_node_rect_height").attr("value", 12);
helper.simulateMouseEvent("click", "control_node_rect_submit");
@ -158,7 +156,7 @@
expect($("#control_node_list #control_node_label").length).toEqual(1);
expect($("#control_node_list #control_node_label")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_label");
helper.simulateMouseEvent("click", "control_node_label_button");
$("#control_node_label_key").attr("value", "theAnswer");
helper.simulateMouseEvent("click", "control_node_label_submit");
@ -180,7 +178,7 @@
expect($("#control_node_list #control_node_singlecolour").length).toEqual(1);
expect($("#control_node_list #control_node_singlecolour")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_singlecolour");
helper.simulateMouseEvent("click", "control_node_singlecolour_button");
$("#control_node_singlecolour_fill").attr("value", "#123456");
$("#control_node_singlecolour_stroke").attr("value", "#654321");
helper.simulateMouseEvent("click", "control_node_singlecolour_submit");
@ -207,7 +205,7 @@
expect($("#control_node_list #control_node_attributecolour").length).toEqual(1);
expect($("#control_node_list #control_node_attributecolour")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_attributecolour");
helper.simulateMouseEvent("click", "control_node_attributecolour_button");
$("#control_node_attributecolour_key").attr("value", "label");
helper.simulateMouseEvent("click", "control_node_attributecolour_submit");
@ -232,7 +230,7 @@
expect($("#control_node_list #control_node_expandcolour").length).toEqual(1);
expect($("#control_node_list #control_node_expandcolour")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_expandcolour");
helper.simulateMouseEvent("click", "control_node_expandcolour_button");
$("#control_node_expandcolour_expanded").attr("value", "#123456");
$("#control_node_expandcolour_collapsed").attr("value", "#654321");
helper.simulateMouseEvent("click", "control_node_expandcolour_submit");
@ -324,7 +322,7 @@
expect($("#control_node_list #control_node_expandcolour").length).toEqual(1);
expect($("#control_node_list #control_node_expandcolour")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_expandcolour");
helper.simulateMouseEvent("click", "control_node_expandcolour_button");
$("#control_node_expandcolour_expanded").attr("value", "#123456");
$("#control_node_expandcolour_collapsed").attr("value", "#654321");
@ -355,7 +353,7 @@
expect($("#control_node_list #control_node_labelandcolour").length).toEqual(1);
expect($("#control_node_list #control_node_labelandcolour")[0]).toConformToListCSS();
helper.simulateMouseEvent("click", "control_node_labelandcolour");
helper.simulateMouseEvent("click", "control_node_labelandcolour_button");
$("#control_node_labelandcolour_label-attribute").attr("value", "label");
helper.simulateMouseEvent("click", "control_node_labelandcolour_submit");

View File

@ -367,7 +367,8 @@ function processSource (src) {
processGithubRepository(src);
}
else {
throwBadParameter("Unknown application type '" + src.type + "'");
throwBadParameter("Unknown application type '" + src.type + "'. " +
"expected type: 'github', 'zip', or 'directory'.");
}
// upload file to the server
@ -1444,7 +1445,9 @@ exports.help = function () {
}
arangodb.print();
arangodb.print("use foxx-manager --help to show a list of global options");
arangodb.print("Use foxx-manager --help to show a list of global options\n");
arangodb.print("There is also an online manual available at:");
arangodb.print("https://www.arangodb.org/manuals/current/UserManualFoxxManager.html");
// additional newline
arangodb.print();

View File

@ -59,6 +59,7 @@ Edge.prototype.setProperty = function (name, value) {
update = this._properties;
update[name] = value;
this._graph.emptyCachedPredecessors();
results = GraphAPI.putEdge(this._graph._properties._key, this._properties._key, update);
@ -278,6 +279,8 @@ Graph.prototype.drop = function () {
Graph.prototype._saveEdge = function(id, out_vertex_id, in_vertex_id, params) {
var results;
this.emptyCachedPredecessors();
params._key = id;
params._from = out_vertex_id;
@ -378,6 +381,7 @@ Graph.prototype.getEdges = function () {
////////////////////////////////////////////////////////////////////////////////
Graph.prototype.removeVertex = function (vertex) {
this.emptyCachedPredecessors();
GraphAPI.deleteVertex(this._properties._key, vertex._properties._key);
vertex._properties = undefined;
};
@ -387,7 +391,9 @@ Graph.prototype.removeVertex = function (vertex) {
////////////////////////////////////////////////////////////////////////////////
Graph.prototype.removeEdge = function (edge) {
this.emptyCachedPredecessors();
GraphAPI.deleteEdge(this._properties._key, edge._properties._key);
this._edgesCache[edge._properties._id] = undefined;
edge._properties = undefined;
};

View File

@ -18,7 +18,7 @@
COLOR_BOLD_WHITE, COLOR_YELLOW, COLOR_BOLD_YELLOW, COLOR_CYAN, COLOR_BOLD_CYAN, COLOR_MAGENTA,
COLOR_BOLD_MAGENTA, PRETTY_PRINT, VALGRIND, VERSION, UPGRADE,
BYTES_SENT_DISTRIBUTION, BYTES_RECEIVED_DISTRIBUTION, CONNECTION_TIME_DISTRIBUTION,
REQUEST_TIME_DISTRIBUTION, DEVELOPMENT_MODE, THREAD_NUMBER,
REQUEST_TIME_DISTRIBUTION, DEVELOPMENT_MODE, THREAD_NUMBER, LOGFILE_PATH,
SYS_PLATFORM */
////////////////////////////////////////////////////////////////////////////////
@ -128,6 +128,15 @@
SYS_LOG("warning", "################################################################################");
}
////////////////////////////////////////////////////////////////////////////////
/// @brief logfilePath
////////////////////////////////////////////////////////////////////////////////
if (typeof LOGFILE_PATH !== "undefined") {
exports.logfilePath = LOGFILE_PATH;
delete LOGFILE_PATH;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief quiet
////////////////////////////////////////////////////////////////////////////////

View File

@ -522,6 +522,30 @@ Vertex.prototype.addOutEdge = function (ine, id, label, data) {
return this._graph.addEdge(this, ine, id, label, data);
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.degree = function () {
return this.getEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of in-edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.inDegree = function () {
return this.getInEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of out-edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.outDegree = function () {
return this.getOutEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the identifier of a vertex
///

View File

@ -175,8 +175,6 @@ function dijkstraSuite() {
try {
// Drop the graph if it exsits
graph = new Graph(graph_name);
print("FOUND: ");
PRINT_OBJECT(graph);
graph.drop();
} catch (err1) {
}
@ -293,7 +291,7 @@ function dijkstraSuite() {
e2 = graph.addEdge(v2, v3),
e3,
pathes = v1.pathTo(v3, {cached: true});
e3 = graph.addEdge(v1, v3);
pathes = v1.pathTo(v3, {cached: true});

View File

@ -261,13 +261,17 @@ function FIX_VALUE (value) {
}
if (type === 'object') {
var result = { };
for (i in value) {
if (value.hasOwnProperty(i)) {
value[i] = FIX_VALUE(value[i]);
if (typeof value[i] === 'function') {
continue;
}
result[i] = FIX_VALUE(value[i]);
}
}
return value;
return result;
}
return null;

View File

@ -325,30 +325,6 @@ Vertex.prototype.setProperty = function (name, value) {
return value;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.degree = function () {
return this.getEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of in-edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.inDegree = function () {
return this.getInEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of out-edges
////////////////////////////////////////////////////////////////////////////////
Vertex.prototype.outDegree = function () {
return this.getOutEdges().length;
};
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
@ -500,7 +476,7 @@ Graph.prototype.initialize = function (name, vertices, edges, waitForSync) {
this._verticesCache = {};
this._edgesCache = {};
// and store the cashes
// and store the caches
this.predecessors = {};
this.distances = {};
};

451
js/server/tests/agency.js Normal file
View File

@ -0,0 +1,451 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief test the agency communication layer
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
///
/// 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.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Jan Steemann
/// @author Copyright 2013, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
var jsunity = require("jsunity");
var internal = require("internal");
// -----------------------------------------------------------------------------
// --SECTION-- agency
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite: agency
////////////////////////////////////////////////////////////////////////////////
function AgencySuite () {
var agency;
return {
setUp : function () {
agency = new ArangoAgency();
try {
agency.remove("UnitTestsAgency", true);
}
catch (err) {
// dir may not exist. this is not a problem
}
agency.createDirectory("UnitTestsAgency");
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test version
////////////////////////////////////////////////////////////////////////////////
testVersion : function () {
assertMatch(/^etcd/, agency.version());
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test watch
////////////////////////////////////////////////////////////////////////////////
testWatchTimeout : function () {
assertTrue(agency.set("UnitTestsAgency/foo", "bar"));
var wait = 3;
var start = require("internal").time();
assertFalse(agency.watch("UnitTestsAgency/foo", 0, wait));
var end = require("internal").time();
assertEqual(wait, Math.round(end - start));
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test watch
////////////////////////////////////////////////////////////////////////////////
testWatchChange : function () {
assertTrue(agency.set("UnitTestsAgency/foo", "bar"));
var wait = 1;
var start = require("internal").time();
assertFalse(agency.watch("UnitTestsAgency/foo", 0, wait));
var end = require("internal").time();
assertEqual(wait, Math.round(end - start));
assertTrue(agency.set("UnitTestsAgency/foo", "baz"));
assertTrue(agency.set("UnitTestsAgency/foo", "bart"));
start = require("internal").time();
var result = agency.watch("UnitTestsAgency/foo", 1, wait);
end = require("internal").time();
assertEqual(0, Math.round(end - start));
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test cas
////////////////////////////////////////////////////////////////////////////////
testCas : function () {
assertTrue(agency.set("UnitTestsAgency/foo", "bar"));
assertTrue(agency.cas("UnitTestsAgency/foo", "bar", "baz"));
assertTrue(agency.cas("UnitTestsAgency/foo", "baz", "bart"));
assertFalse(agency.cas("UnitTestsAgency/foo", "foo", "bar"));
try {
agency.cas("UnitTestsAgency/foo", "foo", "bar", true);
fail();
}
catch (err) {
}
assertTrue(agency.cas("UnitTestsAgency/foo", "bart", "baz", true));
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test createDir
////////////////////////////////////////////////////////////////////////////////
testCreateDir : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
try {
// re-create an existing dir
agency.createDir("UnitTestsAgency/someDir");
fail();
}
catch (err) {
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test createDir / remove
////////////////////////////////////////////////////////////////////////////////
testCreateRemoveDir : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
assertTrue(agency.remove("UnitTestsAgency/someDir", true));
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test removeDir
////////////////////////////////////////////////////////////////////////////////
testRemoveDirNonRecursive : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
try {
assertTrue(agency.remove("UnitTestsAgency/someDir", false));
fail();
}
catch (err) {
// not a file
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test removeDir
////////////////////////////////////////////////////////////////////////////////
testRemoveDirRecursive1 : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/2/1"));
agency.set("UnitTestsAgency/1/1/foo", "bar");
agency.set("UnitTestsAgency/2/1/foo", "baz");
assertTrue(agency.remove("UnitTestsAgency/1/1", true));
assertTrue(agency.remove("UnitTestsAgency/1/2", true));
assertTrue(agency.remove("UnitTestsAgency/1", true));
assertTrue(agency.remove("UnitTestsAgency/2", true));
var values = agency.get("UnitTestsAgency", true);
assertEqual({ }, values); // empty
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test removeDir
////////////////////////////////////////////////////////////////////////////////
testRemoveDirRecursive2 : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/2/1"));
agency.set("UnitTestsAgency/1/1/foo", "bar");
agency.set("UnitTestsAgency/2/1/foo", "baz");
assertTrue(agency.remove("UnitTestsAgency/1", true));
try {
agency.get("UnitTestsAgency/1", true);
fail();
}
catch (err) {
// key not found
}
var values = agency.get("UnitTestsAgency/2", true);
assertEqual({ "UnitTestsAgency/2/1/foo" : "baz" }, values);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test removeDir
////////////////////////////////////////////////////////////////////////////////
testRemoveDirRecursive3 : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2/1"));
assertTrue(agency.createDirectory("UnitTestsAgency/1/2/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/2"));
assertTrue(agency.createDirectory("UnitTestsAgency/2/1"));
agency.set("UnitTestsAgency/1/1/foo", "bar");
agency.set("UnitTestsAgency/2/1/foo", "baz");
assertTrue(agency.remove("UnitTestsAgency", true));
try {
agency.get("UnitTestsAgency", true);
fail();
}
catch (err) {
// key not found
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test removeDir
////////////////////////////////////////////////////////////////////////////////
testRemoveDirNonExisting : function () {
try {
assertTrue(agency.remove("UnitTestsAgency/someDir", true));
fail();
}
catch (err) {
// key not found
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test remove
////////////////////////////////////////////////////////////////////////////////
testRemoveKeys : function () {
var i;
for (i = 0; i < 100; ++i) {
assertTrue(agency.set("UnitTestsAgency/" + i, "value" + i));
}
for (i = 10; i < 90; ++i) {
assertTrue(agency.remove("UnitTestsAgency/" + i));
}
var values;
for (i = 0; i < 100; ++i) {
if (i >= 10 && i < 90) {
try {
values = agency.get("UnitTestsAgency/" + i);
fail();
}
catch (err) {
}
}
else {
values = agency.get("UnitTestsAgency/" + i);
assertTrue(values.hasOwnProperty("UnitTestsAgency/" + i));
assertEqual(values["UnitTestsAgency/" + i], "value" + i);
}
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test set / get
////////////////////////////////////////////////////////////////////////////////
testGet : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
agency.set("UnitTestsAgency/someDir/foo", "bar");
var values = agency.get("UnitTestsAgency/someDir/foo");
assertTrue(values.hasOwnProperty("UnitTestsAgency/someDir/foo"));
assertEqual(values["UnitTestsAgency/someDir/foo"], "bar");
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test set / get directory
////////////////////////////////////////////////////////////////////////////////
testGetDirectory : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
assertTrue(agency.set("UnitTestsAgency/someDir/foo", "bar"));
var values = agency.get("UnitTestsAgency", false);
assertEqual({ }, values);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test set / get multi
////////////////////////////////////////////////////////////////////////////////
testGetMulti : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
assertTrue(agency.set("UnitTestsAgency/someDir/foo", "bar"));
assertTrue(agency.set("UnitTestsAgency/someDir/baz", "bart"));
var values = agency.get("UnitTestsAgency", true);
assertEqual({ "UnitTestsAgency/someDir/baz" : "bart", "UnitTestsAgency/someDir/foo" : "bar" }, values);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test set / get
////////////////////////////////////////////////////////////////////////////////
testGetUpdated : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
agency.set("UnitTestsAgency/someDir/foo", "bar");
var values = agency.get("UnitTestsAgency/someDir/foo");
assertTrue(values.hasOwnProperty("UnitTestsAgency/someDir/foo"));
assertEqual(values["UnitTestsAgency/someDir/foo"], "bar");
agency.set("UnitTestsAgency/someDir/foo", "baz");
values = agency.get("UnitTestsAgency/someDir/foo");
assertTrue(values.hasOwnProperty("UnitTestsAgency/someDir/foo"));
assertEqual(values["UnitTestsAgency/someDir/foo"], "baz");
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test set / get
////////////////////////////////////////////////////////////////////////////////
testGetDeleted : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
agency.set("UnitTestsAgency/someDir/foo", "bar");
var values = agency.get("UnitTestsAgency/someDir/foo");
assertTrue(values.hasOwnProperty("UnitTestsAgency/someDir/foo"));
assertEqual(values["UnitTestsAgency/someDir/foo"], "bar");
agency.remove("UnitTestsAgency/someDir/foo");
try {
values = agency.get("UnitTestsAgency/someDir/foo");
fail();
}
catch (err) {
// key not found
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test get
////////////////////////////////////////////////////////////////////////////////
testGetNonExisting1 : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
try {
agency.get("UnitTestsAgency/someDir/foo");
fail();
}
catch (err) {
// key not found
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test get
////////////////////////////////////////////////////////////////////////////////
testGetNonExisting2 : function () {
try {
agency.get("UnitTestsAgency/someOtherDir");
fail();
}
catch (err) {
// key not found
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test set / get
////////////////////////////////////////////////////////////////////////////////
testGetUrlEncodedValue : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
var value = "bar=BAT;foo=%47abc;degf=2343%20hihi aha\nabc";
agency.set("UnitTestsAgency/someDir/foobar", value);
var values = agency.get("UnitTestsAgency/someDir/foobar");
assertTrue(values.hasOwnProperty("UnitTestsAgency/someDir/foobar"));
assertEqual(values["UnitTestsAgency/someDir/foobar"], value);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test set / get
////////////////////////////////////////////////////////////////////////////////
testGetUrlEncodedKey : function () {
assertTrue(agency.createDirectory("UnitTestsAgency/someDir"));
var key = "foo bar baz / hihi";
agency.set("UnitTestsAgency/someDir/" + encodeURIComponent(key), "something");
var values = agency.get("UnitTestsAgency/someDir/" + encodeURIComponent(key));
assertTrue(values.hasOwnProperty("UnitTestsAgency/someDir/" + key));
assertEqual(values["UnitTestsAgency/someDir/" + key], "something");
}
};
}
// -----------------------------------------------------------------------------
// --SECTION-- main
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief executes the test suites
////////////////////////////////////////////////////////////////////////////////
jsunity.run(AgencySuite);
return jsunity.done();
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// @addtogroup\\|// --SECTION--\\|/// @page\\|/// @}\\)"
// End:

View File

@ -29,7 +29,7 @@ var jsunity = require("jsunity");
var internal = require("internal");
// -----------------------------------------------------------------------------
// --SECTION-- collection methods
// --SECTION-- compaction
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////

View File

@ -107,6 +107,12 @@ static bool Initialised = false;
static bool ShutdownInitalised = false;
////////////////////////////////////////////////////////////////////////////////
/// @brief name of first log file
////////////////////////////////////////////////////////////////////////////////
static char* LogfileName = 0;
////////////////////////////////////////////////////////////////////////////////
/// @brief log appenders
////////////////////////////////////////////////////////////////////////////////
@ -1706,6 +1712,11 @@ TRI_log_appender_t* TRI_CreateLogAppenderFile (char const* filename,
TRI_PushBackVectorPointer(&Appenders, &appender->base);
TRI_UnlockSpin(&AppendersLock);
// register the name of the first logfile
if (LogfileName == NULL) {
LogfileName = TRI_DuplicateStringZ(TRI_CORE_MEM_ZONE, filename);
}
// and return base structure
return &appender->base;
}
@ -1962,6 +1973,14 @@ TRI_log_appender_t* TRI_CreateLogAppenderSyslog (char const* name,
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief return global log file name
////////////////////////////////////////////////////////////////////////////////
char const* TRI_GetFilenameLogging () {
return LogfileName;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief initialises the logging components
////////////////////////////////////////////////////////////////////////////////
@ -2023,6 +2042,11 @@ bool TRI_ShutdownLogging (bool clearBuffers) {
// logging is now inactive (this will terminate the logging thread)
LoggingActive = 0;
if (LogfileName != NULL) {
TRI_Free(TRI_CORE_MEM_ZONE, LogfileName);
LogfileName = 0;
}
// join with the logging thread
if (ThreadedLogging) {
TRI_LockCondition(&LogCondition);

View File

@ -544,6 +544,12 @@ struct TRI_log_appender_s* TRI_CreateLogAppenderSyslog (char const*,
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief return global log file name
////////////////////////////////////////////////////////////////////////////////
char const* TRI_GetFilenameLogging (void);
////////////////////////////////////////////////////////////////////////////////
/// @brief initialises the logging components
///

View File

@ -39,10 +39,10 @@ TRI_v8_global_s::TRI_v8_global_s (v8::Isolate* isolate)
: JSBarriers(),
JSCollections(),
AgencyTempl(),
ErrorTempl(),
GeneralCursorTempl(),
ShapedJsonTempl(),
TransactionTempl(),
VocbaseColTempl(),
VocbaseTempl(),

View File

@ -209,6 +209,14 @@ typedef struct TRI_v8_global_s {
// --SECTION-- JAVASCRIPT OBJECT TEMPLATES
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief agency template
////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_ENABLE_CLUSTER
v8::Persistent<v8::ObjectTemplate> AgencyTempl;
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief error template
////////////////////////////////////////////////////////////////////////////////
@ -227,12 +235,6 @@ typedef struct TRI_v8_global_s {
v8::Persistent<v8::ObjectTemplate> ShapedJsonTempl;
////////////////////////////////////////////////////////////////////////////////
/// @brief transaction template
////////////////////////////////////////////////////////////////////////////////
v8::Persistent<v8::ObjectTemplate> TransactionTempl;
////////////////////////////////////////////////////////////////////////////////
/// @brief TRI_vocbase_col_t template
////////////////////////////////////////////////////////////////////////////////