webgme-gridlabd
Version:
Metamodel, visualization, and model generators for gridlab-d in WebGME. Allows graphical model-driven development and simulation of power grids and power generation / transmission / distribution / storage systems.
179 lines (155 loc) • 4.94 kB
JavaScript
/*globals define*/
/*jshint node:true, browser:true*/
/**
* Generated by PluginGenerator 0.14.0 from webgme on Mon Apr 04 2016 12:03:32 GMT-0700 (PDT).
*/
define([
'plugin/PluginConfig',
'text!./metadata.json',
'plugin/PluginBase',
'gridlabd/meta',
'gridlabd/modelLoader',
'gridlabd/renderer',
'q'
], function (
PluginConfig,
pluginMetadata,
PluginBase,
MetaTypes,
loader,
renderer,
Q) {
'use strict';
pluginMetadata = JSON.parse(pluginMetadata);
/**
* Initializes a new instance of GenerateGLM.
* @class
* @augments {PluginBase}
* @classdesc This class represents the plugin GenerateGLM.
* @constructor
*/
var GenerateGLM = function () {
// Call base class' constructor.
PluginBase.call(this);
this.pluginMetadata = pluginMetadata;
this.metaTypes = MetaTypes;
};
/**
* Metadata associated with the plugin. Contains id, name, version, description, icon, configStructue etc.
* This is also available at the instance at this.pluginMetadata.
* @type {object}
*/
GenerateGLM.metadata = pluginMetadata;
// Prototypal inheritance from PluginBase.
GenerateGLM.prototype = Object.create(PluginBase.prototype);
GenerateGLM.prototype.constructor = GenerateGLM;
GenerateGLM.prototype.notify = function(level, msg) {
var self = this;
var prefix = self.projectId + '::' + self.projectName + '::' + level + '::';
if (level=='error')
self.logger.error(msg);
else if (level=='debug')
self.logger.debug(msg);
else if (level=='info')
self.logger.info(msg);
else if (level=='warning')
self.logger.warn(msg);
self.createMessage(self.activeNode, msg, level);
self.sendNotification(prefix+msg);
};
/**
* Main function for the plugin to execute. This will perform the execution.
* Notes:
* - Always log with the provided logger.[error,warning,info,debug].
* - Do NOT put any user interaction logic UI, etc. inside this method.
* - callback always has to be called even if error happened.
*
* @param {function(string, plugin.PluginResult)} callback - the result callback
*/
GenerateGLM.prototype.main = function (callback) {
// Use self to access core, project, result, logger etc from PluginBase.
// These are all instantiated at this point.
var self = this,
modelNode;
self.result.success = false;
self.runningOnServer = true;
if (typeof WebGMEGlobal !== 'undefined') {
self.runningOnServer = false;
}
self.updateMETA(self.metaTypes);
// What did the user select for our configuration?
var currentConfig = self.getCurrentConfig();
self.returnZip = currentConfig.returnZip;
modelNode = self.activeNode;
self.modelName = self.core.getAttribute(modelNode, 'name');
self.model = {};
self.fileData = '';
self.fileName = self.modelName + '.glm';
return loader.loadModel(self.core, modelNode, true, true)
.then(function(powerModel) {
self.powerModel = powerModel;
})
.then(function() {
return self.renderFile();
})
.then(function() {
return self.generateLocalArtifacts();
})
.then(function() {
return self.generateBlobArtifacts();
})
.then(function() {
self.result.success = true;
self.createMessage(self.activeNode, 'Generated GLM.');
callback(null, self.result);
})
.catch(function(err) {
self.result.success = false;
self.createMessage(self.activeNode, err, 'error');
callback(err, self.result);
});
};
GenerateGLM.prototype.renderFile = function() {
var self = this;
self.fileData = renderer.renderGLM(self.powerModel, self.core, self.META);
self.notify('info', 'Rendered GLM.');
};
GenerateGLM.prototype.generateLocalArtifacts = function() {
var self = this;
if (!self.runningOnServer) {
self.notify('info', 'Running in client, skipping server-side file-system GLM generation');
return;
}
var path = require('path');
var filendir = require('filendir');
self.notify('info', 'Saving GLM on server FS.');
var root_dir = path.join(process.cwd(),
'generated',
self.project.projectId,
self.branchName,
'models');
var deferred = Q.defer();
filendir.writeFile(path.join(root_dir, self.fileName), self.fileData, function(err) {
if (err) {
deferred.reject(err);
}
else {
deferred.resolve();
}
});
return deferred.promise;
};
GenerateGLM.prototype.generateBlobArtifacts = function() {
var self = this;
if (!self.returnZip) {
self.notify('info', 'User did not request the model to be returned.');
return;
}
self.notify('info', 'Returning model to user.');
return self.blobClient.putFile(self.fileName, self.fileData)
.then(function (hash) {
self.result.addArtifact(hash);
});
};
return GenerateGLM;
});