Skip to content

Commit

Permalink
#10 Contentで実行する場合も、プロファイルを取得できるようにした
Browse files Browse the repository at this point in the history
  • Loading branch information
unknown committed Oct 17, 2012
1 parent 17d02e1 commit 670129c
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 15 deletions.
8 changes: 2 additions & 6 deletions src/profiler_def.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

114 changes: 105 additions & 9 deletions src/session.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,10 @@ function profile(request) {

// forwardのプロファイル設定
weaveIntoForward(profiler, profilerDef);


// Contentのプロファイル設定
weaveIntoContent(profiler, profilerDef);

// ライブラリのプロファイル設定
profilerDef.getFunction("profileLibraries")(profiler);

Expand Down Expand Up @@ -118,6 +120,79 @@ function weaveIntoForward(profiler, profilerDef) {
}
}

/**
* Contentをオーバーライドして、プロファイラの設定を行う。
*
* @param {Profiler} profiler
* @param {Content} profilerDef
* @returns {undefined}
* @since 1.0.4
*/
function weaveIntoContent(profiler, profilerDef) {

if (Content.__profiler_weaved__) {
return;
}

// コンストラクタ引数を getFuncion などから参照できるように、
// Content完全に作りかえる。

// コンストラクタ
this.__proto__.Content = function(srcPath) {
this.srcPath = srcPath;
};

this.__proto__.Content.__profiler_weaved__ = true;

// execute
this.__proto__.Content.prototype.execute = function execute(request) {

return executeAndProfile(profiler, profilerDef, this.srcPath, request, true);
};

// executeFunction
this.__proto__.Content.executeFunction = function executeFunction() {

var args = Array.prototype.slice.call(arguments);
var path = args[0];
var functionName = args[1];
var funcArgs = [];

if (args.length >= 3) {
for (var i = 2; i < args.length; i++) {
funcArgs[i - 2] = args[i];
}
}

var scriptScope = getScriptScope(profiler, profilerDef, path);
return scriptScope[functionName].apply(this, funcArgs);
};

// getFunction
this.__proto__.Content.prototype.getFunction = function getFunction(functionName) {

var scriptScope = getScriptScope(profiler, profilerDef, this.srcPath);
return scriptScope[functionName];
};

// isError
this.__proto__.Content.prototype.isError = function isError() {

try {
$javaClass.JSSPViewBuilder.getBuilder().getComposition(this.srcPath);
return false;

} catch (e) {
return true;
}
};

// toString
this.__proto__.Content.prototype.toString = function toString() {
return this.srcPath;
};
}

/**
* im_actionにプロファイラを設定して実行する。
*
Expand All @@ -135,15 +210,32 @@ function executeAndProfileAction(request, profiler, profilerDef) {
return;
}

var imActive = request.im_active ? request.im_active.replace(/\(2f\)/g, "/").replace(/\(5f\)/g, "_") : null;
var imActive = request.im_active ?
request.im_active.replace(/\(2f\)/g, "/").replace(/\(5f\)/g, "_") :
null;

var path = imActive || currentPath;
var scriptScope = getScriptScope(profiler, profilerDef, imActive || currentPath);

scriptScope[imAction](request);
}

/**
* プロファイラ設定済みのScriptScopeオブジェクトを取得する。
*
* @param {Profiler} profiler
* @param {Content} profilerDef
* @param {String} path
* @returns {ScriptScope}
*/
function getScriptScope(profiler, profilerDef, path) {

var scriptScope = $javaClass.JSSPScriptBuilder.getBuilder().getScriptScope(path);

profiler.addAllExclude(scriptScope, getExcludeFunctions(profilerDef, path), path);
if (path !== "profiler_def") {
profiler.addAllExclude(scriptScope, getExcludeFunctions(profilerDef, path), path);
}

scriptScope[imAction](request);
return scriptScope;
}

/**
Expand Down Expand Up @@ -171,22 +263,22 @@ function getExcludeFunctions(profilerDef, path) {
}

/**
* pathを実行し、プロファイルを行う。また、結果をレスポンスに書き出す。
* pathを実行し、プロファイルを行う。
*
* @param {Profiler} profiler プロファイラオブジェクト
* @param {Object} profilerDef プロファイラ対象定義オブジェクト
* @param {String} path JSSPパス(拡張子は含まない)
* @param {Array<Object>} args pathの引数
* @param {boolean} returnText trueの場合、実行結果のHTMLを文字列で返却する。falseの場合は、結果をレスポンスに書き出す。
* @returns {undefined}
*/
function executeAndProfile(profiler, profilerDef, path, args) {
function executeAndProfile(profiler, profilerDef, path, args, returnText) {

var ctx = $javaClass.Context.getCurrentContext();

if (existsJsSource(path)) {
var scriptScope = $javaClass.JSSPScriptBuilder.getBuilder().getScriptScope(path);

profiler.addAllExclude(scriptScope, getExcludeFunctions(profilerDef, path), path);
var scriptScope = getScriptScope(profiler, profilerDef, path);

if ($javaClass.ScriptableObject.hasProperty(scriptScope, "init")) {

Expand All @@ -204,6 +296,10 @@ function executeAndProfile(profiler, profilerDef, path, args) {
try {
var html = view.execute(ctx, scriptScope || new $javaClass.ScriptScope());

if (returnText) {
return html;
}

Web.getHTTPResponse().sendMessageBodyString(html);

} finally {
Expand Down

0 comments on commit 670129c

Please sign in to comment.