      1 // The Antville Project
      2 // http://code.google.com/p/antville
      3 //
      4 // Copyright 2007-2011 by Tobi Schäfer.
      5 //
      6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
      7 // Matthias & Michael Platzer, Christoph Lincke.
      8 //
      9 // Licensed under the Apache License, Version 2.0 (the ``License'');
     10 // you may not use this file except in compliance with the License.
     11 // You may obtain a copy of the License at
     12 //
     13 //    http://www.apache.org/licenses/LICENSE-2.0
     14 //
     15 // Unless required by applicable law or agreed to in writing, software
     16 // distributed under the License is distributed on an ``AS IS'' BASIS,
     17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18 // See the License for the specific language governing permissions and
     19 // limitations under the License.
     20 //
     21 // $Revision$
     22 // $LastChangedBy$
     23 // $LastChangedDate$
     24 // $URL$
     25
     26 /**
     27  * @fileOverview Defines metadata extensions of Helma’s built-in
     28  * HopObject prototype.
     29  */
     30
     31 /**
     32  *
     33  * @param {String} name
     34  */
     35 HopObject.prototype.handleMetadata = function(name) {
     36    this.__defineGetter__(name, function() {
     37       return this.getMetadata(name);
     38    });
     39    this.__defineSetter__(name, function(value) {
     40       return this.setMetadata(name, value);
     41    });
     42    this[name + "_macro"] = function(param) {
     43       var value;
     44       if (value = this[name]) {
     45          res.write(value);
     46       }
     47       return;
     48    };
     49    return;
     50 }
     51
     52 /**
     53  *
     54  * @param {String} name
     55  * @returns {Object}
     56  */
     57 HopObject.prototype.getMetadata = function(name) {
     58    if (!this.metadata) {
     59       throw Error("No metadata collection defined for prototype " + this.constructor.name);
     60    } else {
     61       this.metadata.prefetchChildren();
     62    }
     63
     64    var self = this;
     65
     66    if (!name) {
     67       var result = {};
     68       this.metadata.forEach(function() {
     69          var name = this.name;
     70          if (name) {
     71             result[name] = self.getMetadata(name);
     72          }
     73       });
     74       return result;
     75    }
     76
     77    var meta = this.metadata.get(name);
     78    if (!meta) {
     79       return null;
     80    }
     81
     82    return meta.getValue();
     83 }
     84
     85 /**
     86  *
     87  * @param {String} name
     88  * @param {Object} value
     89  */
     90 HopObject.prototype.setMetadata = function(name, value) {
     91    if (!this.metadata) {
     92       throw Error("No metadata collection defined for prototype " + this.constructor.name);
     93    }
     94
     95    if (!name) {
     96       throw Error("Insufficient arguments");
     97    }
     98
     99    if (typeof name === "object") {
    100       for (var i in name) {
    101          this.setMetadata(i, name[i]);
    102       }
    103       return;
    104    }
    105
    106    var metadata = this.metadata.get(name);
    107
    108    if (metadata) {
    109       metadata.setValue(value);
    110    } else {
    111       metadata = new Metadata(this, name, value);
    112       if (metadata.value !== null) {
    113          // metadata.persist() is not enough or there will be redundant records!
    114          this.metadata.add(metadata);
    115       }
    116    }
    117    return;
    118 }
    119
    120 /**
    121  *
    122  * @param {String} name
    123  */
    124 HopObject.prototype.deleteMetadata = function(name) {
    125    if (!this.metadata) {
    126       throw Error("No metadata collection defined for prototype " + this.constructor.name);
    127    }
    128
    129    var self = this;
    130
    131    if (arguments.length === 0) {
    132       return HopObject.remove.call(this.metadata);
    133    }
    134
    135    Array.prototype.forEach.call(arguments, function(name) {
    136       var metadata = self.metadata.get(name);
    137       metadata && metadata.remove();
    138       return;
    139    });
    140    return;
    141 }
    142
    143 /**
    144  *
    145  * @param {Object} param
    146  * @param {String} name
    147  */
    148 HopObject.prototype.metadata_macro = function(param, name) {
    149    var value = this.getMetadata(name);
    150    value && res.write(value);
    151    return;
    152 }
    153