antville/extra/updater/Global/convert.js

629 lines
21 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// The Antville Project
// http://code.google.com/p/antville
//
// Copyright 2007-2011 by Tobi Schäfer.
//
// Copyright 20012007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
// Matthias & Michael Platzer, Christoph Lincke.
//
// 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.
//
// $Revision$
// $LastChangedBy$
// $LastChangedDate$
// $URL$
var convert = function(type) {
if (!type) {
return;
}
var func;
if (func = arguments.callee[type]) {
try {
func();
} catch (ex) {
error(ex.toString());
}
} else {
execute(query(type));
}
}
convert.files = function() {
retrieve(query("files"));
traverse(function() {
var metadata = {
fileName: this.fileName,
contentType: this.type,
contentLength: this.size || 0,
}
this.description && (metadata.description = clean(this.description));
execute("update file set prototype = 'File', parent_type = 'Site', " +
"parent_id = site_id, metadata = $0 where id = $1",
metadata.toSource(), this.id);
});
}
convert.images = function() {
execute("alter table tag change id id int(11) not null auto_increment")
execute("alter table tag_hub change id id int(11) not null auto_increment");
retrieve("select distinct(IMAGE_TOPIC), IMAGE_F_SITE " +
"from AV_IMAGE where IMAGE_TOPIC is not null");
traverse(function() {
execute("insert into tag set site_id = $0, name = $1, type = $2",
this.IMAGE_F_SITE, this.IMAGE_TOPIC.replace(/^[\/\.]*$/, "?"), 'Image');
});
retrieve("select *, t.IMAGE_WIDTH as thumbnailWidth, t.IMAGE_HEIGHT " +
"as thumbnailHeight from AV_IMAGE i left join AV_IMAGE t on " +
"i.IMAGE_F_IMAGE_THUMB = t.IMAGE_ID left join tag on " +
"i.IMAGE_F_SITE = site_id and i.IMAGE_TOPIC = name and " +
"type = 'Image' left join AV_LAYOUT l on LAYOUT_ID = i.IMAGE_F_LAYOUT " +
"where i.IMAGE_WIDTH is not null and i.IMAGE_HEIGHT is not null and " +
"i.IMAGE_F_IMAGE_PARENT is null and i.IMAGE_ID > $min and " +
"i.IMAGE_ID <= $max order by i.IMAGE_ID");
traverse(function() {
var metadata = {
fileName: this.IMAGE_FILENAME + "." + this.IMAGE_FILEEXT,
contentLength: this.IMAGE_FILESIZE || 0,
contentType: "image/" + this.IMAGE_FILEEXT,
width: this.IMAGE_WIDTH,
height: this.IMAGE_HEIGHT
};
this.IMAGE_ALTTEXT && (metadata.description = clean(this.IMAGE_ALTTEXT));
if (this.thumbnailWidth && this.thumbnailHeight) {
metadata.thumbnailName = this.IMAGE_FILENAME + "_small" + "." +
this.IMAGE_FILEEXT;
metadata.thumbnailWidth = this.thumbnailWidth;
metadata.thumbnailHeight = this.thumbnailHeight;
}
this.metadata = metadata;
this.IMAGE_F_SITE = this.IMAGE_F_SITE || this.LAYOUT_F_SITE || null;
this.IMAGE_F_IMAGE_PARENT = this.IMAGE_F_LAYOUT || this.IMAGE_F_SITE;
this.IMAGE_CREATETIME || (this.IMAGE_CREATETIME = null);
this.IMAGE_F_USER_CREATOR || (this.IMAGE_F_USER_CREATOR = null);
this.IMAGE_MODIFYTIME || (this.IMAGE_MODIFYTIME = null);
this.IMAGE_F_USER_MODIFIER || (this.IMAGE_F_USER_MODIFIER = null);
execute("insert into image values ($IMAGE_ID, $IMAGE_ALIAS, " +
"$IMAGE_PROTOTYPE, $IMAGE_F_SITE, $IMAGE_F_IMAGE_PARENT, null, " +
"$metadata, $IMAGE_CREATETIME, $IMAGE_F_USER_CREATOR, " +
"$IMAGE_MODIFYTIME, $IMAGE_F_USER_MODIFIER)", this);
if (this.IMAGE_TOPIC) {
execute("insert into tag_hub set tag_id = $0, tagged_id = $1, " +
"tagged_type = 'Image', user_id = $2", this.id, this.IMAGE_ID,
this.IMAGE_F_USER_MODIFIER || this.IMAGE_F_USER_CREATOR);
}
//execute("delete from AV_IMAGE where IMAGE_ID = $0", this.IMAGE_ID);
}, 5000);
execute("alter table tag change id id int(11)")
execute("alter table tag_hub change id id int(11)");
}
convert.layoutImages = function() {
retrieve("select *, i.IMAGE_ALIAS, l.LAYOUT_ALIAS as layoutName, " +
"l.LAYOUT_ID as layoutId, t.IMAGE_WIDTH as thumbnailWidth, " +
"t.IMAGE_HEIGHT as thumbnailHeight, pl.LAYOUT_ALIAS as " +
"parentLayout from AV_LAYOUT pl, AV_IMAGE i left join " +
"AV_IMAGE t on i.IMAGE_F_IMAGE_THUMB = t.IMAGE_ID, AV_LAYOUT l " +
"left join AV_SITE site on SITE_ID = l.LAYOUT_F_SITE where " +
"i.IMAGE_F_LAYOUT = pl.LAYOUT_ID and l.LAYOUT_F_LAYOUT_PARENT = " +
"pl.LAYOUT_ID and pl.LAYOUT_F_SITE is null and i.IMAGE_PROTOTYPE " +
"= 'LayoutImage' and i.IMAGE_F_IMAGE_PARENT is null and " +
"i.IMAGE_ALIAS not in (select IMAGE_ALIAS from AV_IMAGE, " +
"AV_LAYOUT, AV_SITE where LAYOUT_ID = IMAGE_F_LAYOUT and " +
"SITE_ID = LAYOUT_F_SITE and IMAGE_PROTOTYPE = 'LayoutImage' " +
"and IMAGE_F_IMAGE_PARENT is null and LAYOUT_ID = l.LAYOUT_ID " +
"and SITE_ID = site.SITE_ID) and l.LAYOUT_ID > $min and " +
"l.LAYOUT_ID <= $max order by l.LAYOUT_ID");
traverse(function() {
var metadata = {
fileName: this.IMAGE_FILENAME + "." + this.IMAGE_FILEEXT,
contentLength: this.IMAGE_FILESIZE || 0,
contentType: "image/" + this.IMAGE_FILEEXT,
width: this.IMAGE_WIDTH,
height: this.IMAGE_HEIGHT
};
this.IMAGE_ALTTEXT && (metadata.description = clean(this.IMAGE_ALTTEXT));
if (this.thumbnailWidth && this.thumbnailHeight) {
metadata.thumbnailName = this.IMAGE_FILENAME + "_small" + "." +
this.IMAGE_FILEEXT;
metadata.thumbnailWidth = this.thumbnailWidth;
metadata.thumbnailHeight = this.thumbnailHeight;
}
this.metadata = metadata;
this.SITE_ID || (this.SITE_ID = null);
this.IMAGE_CREATETIME || (this.IMAGE_CREATETIME = this.SITE_CREATETIME);
this.IMAGE_F_USER_CREATOR || (this.IMAGE_F_USER_CREATOR =
this.SITE_F_USER_CREATOR || null);
this.IMAGE_MODIFYTIME || (this.IMAGE_MODIFYTIME = null);
this.IMAGE_F_USER_MODIFIER || (this.IMAGE_F_USER_MODIFIER = null);
execute("insert into image values ($IMAGE_ID, $IMAGE_ALIAS, " +
"'LayoutImage', $SITE_ID, $layoutId, 'Layout', $metadata, " +
"$IMAGE_CREATETIME, $IMAGE_F_USER_CREATOR, $IMAGE_MODIFYTIME, " +
"$IMAGE_F_USER_MODIFIER)", this);
var fpath = antville().properties.staticPath;
var files = [metadata.fileName, metadata.thumbnailName];
for each (var fname in files) {
var source = new helma.File(fpath + "/layouts/" +
this.parentLayout, fname);
var layoutDir = new helma.File(fpath + this.SITE_ALIAS +
"/layouts/", this.layoutName);
layoutDir.exists() || layoutDir.makeDirectory();
var dest = new helma.File(layoutDir, fname);
if (source.exists()) {
log("Copy " + source + " to " + dest);
if (dest.exists()) {
dest.remove();
}
source.hardCopy(dest);
}
}
}, 100);
}
convert.layouts = function() {
convert.xml("layout");
retrieve(query("layouts"));
traverse(function() {
var metadata = eval(this.metadata) || {};
metadata.title = this.LAYOUT_TITLE || "Layout #" + this.id;
metadata.description = this.LAYOUT_DESCRIPTION;
if (this.LAYOUT_ISIMPORT) {
// FIXME: metadata.origin = Layout.getById(id).href();
}
execute("update layout set metadata = " +
quote(metadata.toSource()) + " where id = " + this.id);
});
}
convert.sites = function() {
convert.xml("site");
retrieve(query("sites"));
traverse(function() {
var metadata = eval(this.metadata) || {};
metadata.email = this.SITE_EMAIL;
metadata.title = this.SITE_TITLE;
metadata.configured = this.SITE_LASTUPDATE;
metadata.pageSize = metadata.days || 3;
metadata.pageMode = "days";
metadata.timeZone = metadata.timezone || "CET";
metadata.archiveMode = metadata.archive ? "public" : "closed";
metadata.commentMode = metadata.discussions ? "enabled" : "disabled";
metadata.shortDateFormat = metadata.shortdateformat;
metadata.longDateFormat = metadata.longdateformat;
metadata.closed = this.SITE_LASTOFFLINE;
metadata.notifiedOfBlocking = this.SITE_LASTBLOCKWARN;
metadata.notifiedOfDeletion = this.SITE_LASTDELWARN;
metadata.callbackMode = this.SITE_ENABLEPING ?
"enabled" : "disabled";
// FIXME: metadata.webHookUrl = "";
metadata.locale = metadata.language;
if (metadata.country) {
metadata.locale += "_" + metadata.country;
}
var mode = metadata.usercontrib ? 'open' : this.mode;
for each (var key in ["enableping", "usercontrib", "archive",
"discussions", "days", "shortdateformat", "longdateformat",
"linkcolor", "alinkcolor", "vlinkcolor", "smallcolor",
"titlecolor", "titlefont", "textfont", "textcolor", "smallsize",
"smallfont", "textsize", "titlesize", "timezone", "bgcolor",
"language", "country"]) {
delete metadata[key];
}
execute("update site set metadata = " + quote(metadata.toSource()) +
", mode = " + quote(mode) + " where id = " + this.id);
});
}
convert.content = function() {
execute("alter table tag change id id int(11) not null auto_increment")
execute("alter table tag_hub change id id int(11) not null auto_increment");
retrieve("select distinct(TEXT_TOPIC), TEXT_F_SITE " +
"from AV_TEXT where TEXT_TOPIC is not null");
traverse(function() {
execute("insert into tag set site_id = $0, name = $1, type = 'Story'",
this.TEXT_F_SITE, this.TEXT_TOPIC.replace(/^[\/\.]*$/, "?"));
});
var metadata = function(xml) {
try {
return Xml.readFromString(clean(xml));
} catch (ex) {
app.debug(ex);
}
return {};
}
retrieve("select * from AV_TEXT left join tag on TEXT_F_SITE = site_id " +
"and TEXT_TOPIC = name and type = 'Story' where TEXT_ID > $min " +
"and TEXT_ID <= $max order by TEXT_ID");
traverse(function() {
if (this.TEXT_PROTOTYPE === "Comment") {
if (!this.TEXT_F_TEXT_PARENT) {
this.parent_type = "Story";
this.TEXT_F_TEXT_PARENT = this.TEXT_F_TEXT_STORY;
} else {
this.parent_type = "Comment";
}
this.status = "public";
this.mode = "hidden";
this.comment_mode = "open";
} else {
this.TEXT_F_TEXT_STORY = this.TEXT_F_TEXT_PARENT = null;
this.parent_type = null;
this.status = "public";
this.mode = "featured";
if (this.TEXT_ISONLINE == 1) {
this.mode = "hidden";
} else if (this.TEXT_ISONLINE != 2) {
this.status = "closed";
}
if (this.TEXT_EDITABLEBY == 1) {
this.status = "shared";
} else if (this.TEXT_EDITABLEBY == 2) {
this.status = "open";
}
this.comment_mode = this.TEXT_HASDISCUSSIONS == 1 ? "open" : "closed";
}
this.TEXT_F_USER_MODIFIER || (this.TEXT_F_USER_MODIFIER = null);
this.name = this.ALIAS || "";
this.metadata = metadata(this.TEXT_CONTENT);
execute("insert into content values ($TEXT_ID, $name, " +
"$TEXT_PROTOTYPE, $TEXT_F_SITE, $TEXT_F_TEXT_STORY, " +
"$TEXT_F_TEXT_PARENT, $parent_type, $TEXT_READS, $status, " +
"$mode, $comment_mode, $metadata, $TEXT_CREATETIME, " +
"$TEXT_F_USER_CREATOR, $TEXT_MODIFYTIME, $TEXT_F_USER_MODIFIER)",
this);
if (this.TEXT_TOPIC) {
execute("insert into tag_hub set tag_id = $0, tagged_id = $1, " +
"tagged_type = 'Story', user_id = $2", this.id, this.TEXT_ID,
this.TEXT_F_USER_MODIFIER || this.TEXT_F_USER_CREATOR);
}
//execute("delete from AV_TEXT where TEXT_ID = " + this.TEXT_ID);
}, 5000);
execute("alter table tag change id id int(11)")
execute("alter table tag_hub change id id int(11)");
}
convert.users = function() {
retrieve("select id, hash, salt, USER_URL from user");
traverse(function() {
var metadata = {
hash: this.hash,
salt: this.salt,
url: this.USER_URL
}
execute("update user set metadata = " +
quote(metadata.toSource()) + " where id = " + this.id);
});
}
convert.xml = function(table) {
var metadata = function(xml) {
try {
return Xml.readFromString(clean(xml));
} catch (ex) {
app.debug(ex);
}
return {};
};
retrieve(query("jsonize", table));
traverse(function() {
var data = metadata(this.xml);
execute("update " + table + " set metadata = " +
quote(data.toSource()) + ", xml = '' where id = " + this.id);
});
}
convert.skins = function() {
var styles = {
"bgcolor": "background color",
"linkcolor": "link color",
"alinkcolor": "active link color",
"vlinkcolor": "visited link color",
"titlefont": "big font",
"titlesize": "big font size",
"titlecolor": "big font color",
"textfont": "base font",
"textsize": "base font size",
"textcolor": "base font color",
"smallfont": "small font",
"smallsize": "small font size",
"smallcolor": "small font color"
}
var rename = function(prototype, skin) {
var map = {
Day: "Archive",
LayoutImage: "Image",
LayoutImageMgr: "Images",
RootLayoutMgr: "Layouts", // FIXME: obsolete
StoryMgr: "Stories",
SysMgr: "Admin",
SysLog: "LogEntry",
Topic: "Tag",
TopicMgr: "Tags",
Comment: {
toplevel: "main"
},
Members: {
statusloggedin: ["Membership", "status"],
statusloggedout: ["Membership", "login"]
},
Site: {
searchbox: "search",
style: "stylesheet"
},
Story: {
dayheader: "date",
display: "content",
historyview: "history"
}
}
var renamed;
if (renamed = map[prototype]) {
if (renamed.constructor === String) {
return rename(renamed, skin);
} else if (skin) {
renamed = renamed[skin];
if (renamed) {
if (renamed.constructor === Array) {
prototype = renamed[0];
skin = renamed[1];
} else {
skin = renamed;
}
}
}
} else if (prototype.lastIndexOf("Mgr") > 0) {
prototype = prototype.substr(0, prototype.length - 3) + "s";
return rename(prototype, skin);
}
return [prototype, skin];
}
var values = function(metadata) {
if (!metadata) {
return;
}
var data = eval(metadata);
res.push();
for (var key in styles) {
var name = styles[key];
var value = String(data[key]).toLowerCase();
if (key.endsWith("color") && !helma.Color.COLORNAMES[key] &&
!value.startsWith("#")) {
value = "#" + value;
}
value = value.replace(/([0-9]+) +px/, "$1px");
res.writeln('<% value "' + name + '" "' + value + '" %>');
}
return res.pop();
}
var clean = function(source) {
if (source) {
// Renaming prototype and skin names in skin macros
var re = /(<%\s*)([^.]+)(\.skin\s+name="?)([^"\s]+)/g;
source = source.replace(re, function() {
var $ = arguments;
var renamed = rename($[2].capitalize(), $[4]);
return $[1] + renamed[0].toLowerCase() + $[3] +
renamed[0] + "#" + renamed[1];
});
// Replacing layout.* macros with corresponding value macros
source = source.replace(/(<%\s*)layout\.([^\s]+)/g, function() {
var value = styles[arguments[2]];
if (value) {
return arguments[1] + "value " + quote(value);
}
return arguments[0];
});
return source;
}
}
var move = function(sourcePath, destPath) {
var source = new helma.File(sourcePath);
if (source.exists()) {
var destination = new helma.File(destPath);
if (destination.exists()) {
destination.removeDirectory();
}
destination.makeDirectory();
var files = source.list();
for each (var fname in files) {
(new helma.File(source, fname)).hardCopy(new helma.File(destination, fname));
}
}
return destPath;
}
var save = function(skins, fpath) {
if (!skins) {
return;
}
for (var prototype in skins) {
res.push();
var skinset = skins[prototype];
for (var skinName in skinset) {
res.writeln("<% #" + skinName + " %>");
skinset[skinName] && res.writeln(skinset[skinName].trim());
}
var data = res.pop();
if (data) {
var dir = new java.io.File(fpath, prototype);
dir.exists() || dir.mkdirs();
var file = new java.io.File(dir, prototype + ".skin");
file.exists() && file["delete"]();
log("Write " + prototype + ".skin" + " to " + file.getCanonicalPath());
var fos = new java.io.FileOutputStream(file);
var bos = new java.io.BufferedOutputStream(fos);
var writer = new java.io.OutputStreamWriter(bos, "UTF-8");
writer.write(data);
writer.close();
bos.close();
fos.close();
}
}
return;
}
var appSkins = {};
var skinfiles = antville().getSkinfiles();
for (var prototype in skinfiles) {
// Ignore lowercase prototypes
if (prototype.charCodeAt(0) > 90) {
continue;
}
appSkins[prototype] || (appSkins[prototype] = {});
var skin = createSkin(skinfiles[prototype][prototype]);
var subskins = skin.getSubskinNames();
for each (var name in subskins) {
appSkins[prototype][name] = skin.getSubskin(name).getSource();
}
}
var current, fpath, skins;
retrieve(query("skins"));
traverse(function() {
var site = this.site_name || "";
if (current !== site + this.layout_name) {
save(skins, fpath);
current = site + this.layout_name;
fpath = antville().properties.staticPath + site;
if (!site) {
return; // FIXME: root layouts not ready, yet
var file = new helma.File("db/antville/0.xml");
var xml = file.readAll();
var rootLayoutId = /sys_layout idref="(\d)*"/.exec(xml)[1] || 1;
fpath += rootLayoutId == this.layout_id ?
"/layout/" : "/layouts/" + this.layout_name;
} else {
fpath += "/layouts/" + this.layout_name;
}
skins = appSkins.clone({}, true);
skins.Site.values = values(this.layout_metadata);
}
if (!this.prototype || !this.name) {
return;
}
var renamed = rename(this.prototype, this.name);
var prototype = renamed[0];
var skinName = renamed[1];
var source, parent;
var appSkin = (skins[prototype] && skins[prototype][skinName]);
if (this.source !== null) {
source = this.source;
parent = this.parent !== null ? this.parent : appSkin;
} else {
source = this.parent;
parent = appSkin;
}
if (source !== null && source !== undefined) {
// FIXME: Ugly hack to change Membership to Members in a few skins
if (prototype === "Membership" &&
(skinName === "login" || skinName === "status")) {
source = source.replace(/(<%\s*)this./g, "$1members.");
}
// Adding the new calendar CSS classes to the old ones
if (prototype === "Site" && skinName === "stylesheet") {
source = source.replace(/(\.calHead)/g,
"table.calendar thead, $1");
source = source.replace(/(\.calDay)/g,
"table.calendar th, table.calendar tbody td.day, $1");
source = source.replace(/(\.calSelDay)/g,
"table.calendar tbody td.selected, $1");
source = source.replace(/(\.calFoot)/g,
"table.calendar tfoot td, $1");
}
ref = (skins[prototype] || (skins[prototype] = {}));
ref[skinName] = clean(source);
}
if (parent !== null && parent !== undefined) {
execute("update skin set source = '" +
clean(parent).replace(/'/g, "\\'") + "' where " +
'id = ' + this.id);
}
});
// One last time to be sure every layout's skins are saved
save(skins, fpath);
return;
}
convert.folders = function() {
retrieve("select site.name as site_name, layout.name as layout_name from " +
"site left join layout on site.layout_id = layout.id");
traverse(function() {
var dir = antville().properties.staticPath + this.site_name;
var source = new helma.File(dir, "layouts/" + this.layout_name);
var dest = new helma.File(dir, "layout");
log("Copy " + source + " to " + dest);
if (dest.exists()) {
dest.removeDirectory();
}
source.renameTo(dest);
});
}
convert.root = function() {
var rootId = antville().__app__.getProperty("rootId");
var staticDir = antville().properties.staticPath;
retrieve("select name from site where id = " + rootId);
traverse(function() {
if (this.name === "www") {
return;
}
var dir = new helma.File(staticDir, this.name);
var files = dir.list();
for each (fname in files) {
var source = new helma.File(dir, fname);
var dest = new helma.File(staticDir, "www/" + fname);
log("Rename " + source + " to " + dest);
source.renameTo(dest);
}
return;
});
execute("update site set name = 'www' where id = " + rootId);
return;
}