/**
* resourcebuilder.js - xhrdavclient resource object builder
*
* @license Copyright 2011 The xhrdavclient library authors.
* All rights reserved.
*/
goog.provide('xhrdav.ResourceBuilder');
goog.require('xhrdav.Conf');
goog.require('xhrdav.ResourceController');
/**
* xhrdavclient resource object
*
* @constructor
*/
xhrdav.ResourceBuilder = function() {
/**
* @private
* @type {Object}
*/
this.rawData_ = null;
/**
* @private
* @type {{root:xhrdav.ResourceController,
* childs:Array.<xhrdav.ResourceController}}
* @see xhrdav.ResourceController
*/
this.resources_ = null;
};
/**
* Create Resource and returning builder
*
* @param {Object} rawObj Converted WebDAV resoruce json/hash object.
* @return {xhrdav.ResourceBuilder} Resource builder object.
*/
xhrdav.ResourceBuilder.createCollection = function(rawObj) {
var builder = new xhrdav.ResourceBuilder();
builder.rawData_ = rawObj;
builder.convertRaw2Models();
return builder;
};
/**
* Convert raw data to model objects.
*/
xhrdav.ResourceBuilder.prototype.convertRaw2Models = function() {
var resp = [];
if (goog.isDefAndNotNull(this.rawData_.D$response)) {
if (goog.isArray(this.rawData_.D$response)) {
resp = this.rawData_.D$response;
} else {
resp = [this.rawData_.D$response];
}
}
// get properties from respnse data
var resList = [];
goog.array.forEach(resp, function(val, key) {
var res = new xhrdav.ResourceController();
res.href = val.D$href.$t;
res.pathlist = xhrdav.utils.path.split(res.href);
if (goog.string.startsWith(
res.pathlist[res.pathlist.length - 1], '.')) return; // Skip dot file.
res.id = goog.string.hashCode(goog.string.urlDecode(res.href));
res.name = res.pathlist[res.pathlist.length - 1];
if (!goog.isDefAndNotNull(val.D$propstat)) {
goog.array.extend(resList, res);
return;
}
var propstat = val.D$propstat;
res.status = propstat.D$status.$t || 'HTTP/1.1 404 Not Found';
var status_chunks = res.status.split(' ');
res.protocol = status_chunks.shift();
res.statuscode = parseInt(status_chunks.shift());
res.statustext = status_chunks.join(' ');
if (!goog.isDefAndNotNull(propstat.D$prop)) {
goog.array.extend(resList, res);
return;
}
var props = propstat.D$prop;
if (goog.isDefAndNotNull(props.D$getcontenttype) &&
goog.isDefAndNotNull(props.D$getcontenttype.$t)) {
res.contenttype = props.D$getcontenttype.$t;
}
if (goog.isDefAndNotNull(props.lp1$getcontentlength) &&
goog.isDefAndNotNull(props.lp1$getcontentlength.$t)) {
res.contentlength = parseInt(props.lp1$getcontentlength.$t);
}
if (goog.isDefAndNotNull(props.lp1$resourcetype)) {
var restype = props.lp1$resourcetype;
if (goog.isDefAndNotNull(restype.D$collection)) {
res.resourcetype = 'collection';
}
}
if (goog.isDefAndNotNull(props.lp1$creationdate) &&
goog.isDefAndNotNull(props.lp1$creationdate.$t)) {
var googDate = goog.date.fromIsoString(props.lp1$creationdate.$t);
res.creationdate = new Date(googDate.getTime());
}
if (goog.isDefAndNotNull(props.lp1$getlastmodified) &&
goog.isDefAndNotNull(props.lp1$getlastmodified.$t)) {
res.lastmodified = new Date(props.lp1$getlastmodified.$t);
}
if (goog.isDefAndNotNull(props.lp1$getetag) &&
goog.isDefAndNotNull(props.lp1$getetag.$t)) {
res.etag = props.lp1$getetag.$t;
}
if (goog.isDefAndNotNull(props.lp2$executable) &&
goog.isDefAndNotNull(props.lp2$executable.$t)) {
res.executable = (props.lp2$executable.$t == 'T') ? true : false;
}
goog.array.extend(resList, res);
});
// buile tree {root: <#root>, childs: <#element>, <#element>, ...}
this.buildTree_(resList);
};
/**
* Building tree from response data
*
* @private
* @param {Array.<xhrdav.ResourceController>} resList
* converted WebDAV collection controller object.
* @see xhrdav.ResourceController
*/
xhrdav.ResourceBuilder.prototype.buildTree_ = function(resList) {
goog.array.stableSort(resList, function(obj1, obj2) {
return (obj1.pathlist.length - obj2.pathlist.length);
});
this.resources_ = {};
this.resources_.root = resList.shift();
this.resources_.childs = (resList.length > 0) ? resList : [];
};
/**
* Getter rawData
*
* @return {Object} associated array of WebDAV collection.
*/
xhrdav.ResourceBuilder.prototype.getRawData = function() {
return this.rawData_;
};
/**
* Getter resources
*
* @return {{root:xhrdav.ResourceController,
* childs:Array.<xhrdav.ResourceController}}
* stored converted resource object.
* @see xhrdav.ResourceController
*/
xhrdav.ResourceBuilder.prototype.getResources = function() {
return this.resources_;
};
/**
* Serialize resources [Class method]
*
* @param {{root:xhrdav.ResourceController,
* childs:Array.<xhrdav.ResourceController}} resources
* @param {boolean} asModel TRUE: xhrdav.Resource FALSE: {}.
* @return {{root:xhrdav.Resource, childs:Array.<xhrdav.Resource}}
*/
xhrdav.ResourceBuilder.serialize = function(resources, asModel) {
var serializedResources = {};
var root = resources.root;
var childs = resources.childs;
serializedResources.root = root.serialize(asModel);
serializedResources.childs =
goog.array.map(childs, function(v, i) {
return v.serialize(asModel); }) || [];
return serializedResources;
};
/**
* Serialize resources
*
* @param {boolean} asModel TRUE: xhrdav.Resource FALSE: {}.
* @return {{root:xhrdav.Resource, childs:Array.<xhrdav.Resource}}
* @see xhrdav.ResourceBuilder.serialize
*/
xhrdav.ResourceBuilder.prototype.serialize = function(asModel) {
return xhrdav.ResourceBuilder.serialize(this.getResources(), asModel);
};
/* Entry point for closure compiler */
goog.exportSymbol('xhrdav.ResourceBuilder', xhrdav.ResourceBuilder);
goog.exportSymbol('xhrdav.ResourceBuilder.createCollection',
xhrdav.ResourceBuilder.createCollection);
goog.exportProperty(xhrdav.ResourceBuilder.prototype, 'convertRaw2Models',
xhrdav.ResourceBuilder.prototype.convertRaw2Models);
goog.exportProperty(xhrdav.ResourceBuilder.prototype, 'getRawData',
xhrdav.ResourceBuilder.prototype.getRawData);
goog.exportProperty(xhrdav.ResourceBuilder.prototype, 'getResources',
xhrdav.ResourceBuilder.prototype.getResources);
goog.exportSymbol('xhrdav.ResourceBuilder.serialize',
xhrdav.ResourceBuilder.serialize);
goog.exportProperty(xhrdav.ResourceBuilder.prototype, 'serialize',
xhrdav.ResourceBuilder.prototype.serialize);
/*
Structure raw data:
D$response
D$href
D$propstat
D$status
D$prop
D$getcontenttype
lp1$getcontentlength
lp1$resourcetype
D$collection
lp1$creationdate
lp1$getlastmodified
lp1$getetag
lp2$executable
D$lockdiscovery
D$activelock
D$locktype
D$write
D$lockscope
D$exclusive
D$depth
D$owner
D$timeout
D$locktoken
D$href opaquelocktoken:f81xx......
*/
/*
Structure converted data: Json/Hash repr
{href: '/mydav/',
status: 'HTTP/1.1 200 OK',
statuscode: 200, statustext: 'OK', protocol: 'HTTP/1.1',
resourcetype: ('collection' | null),
contenttype: ('http/unix-directory' | 'image/jpeg' | 'text/plain'),
contentlength: 4096
executable: ('F' | 'T')
creationdate: <#Date>, lastmodified: <#Date>
etag: '"f18da..."',
locktype: 'write', lockscope: 'exclusive', locktoken: opaquelocktoken:....,
lockdepth: 0, lockowner: '', timeout: ('Infinite' | #)}
*/