1 define([
  2   'jls/lang/Class',
  3   'jls/lang/Exception',
  4   'jls/lang/Logger',
  5   'jls/util/XmlElement'
  6 ], function (
  7   Class,
  8   Exception,
  9   Logger,
 10   XmlElement
 11 ) {
 12 
 13 var Resource;
 14 //Late binding
 15 var Formatter;
 16 require(['jls/util/Formatter'], function(m) {
 17     Formatter = m;
 18 });
 19 
 20 Resource = Class.create( /** @lends jls.util.Resource.prototype */
 21 {
 22     /**
 23      * Creates a Resource.
 24      * 
 25      * @constructs
 26      * @class This class provides resource labels.
 27      */
 28     initialize : function() {
 29         this._bundle = {};
 30     },
 31     set : function(key, value) {
 32         if (typeof value == 'undefined') {
 33             delete this._bundle[key];
 34         } else {
 35             this._bundle[key] = value;
 36         }
 37         return this;
 38     },
 39     /**
 40      * Returns a label.
 41      *
 42      * @param {String} key The label key.
 43      * @returns {String} The label string.
 44      */
 45     get : function(key) {
 46         if (typeof key != 'string') {
 47             throw new Exception('Missing key argument');
 48         }
 49         if (key in this._bundle) {
 50             return this._bundle[key];
 51         }
 52         return key;
 53     },
 54     /**
 55      * Returns a formatted label.
 56      *
 57      * @param {String} key The formatted label key.
 58      * @returns {String} The formatted label string.
 59      */
 60     getf : function(key) {
 61         var args = Array.from(arguments);
 62         var key = args.shift();
 63         var format = this.get(key);
 64         if (arguments.length < 2) {
 65             return format;
 66         }
 67         args.unshift(format);
 68         return Formatter.format.apply(Formatter, args);
 69     }
 70 });
 71 
 72 Object.extend(Resource, /** @lends jls.util.Resource */
 73 {
 74     /**
 75      * The default resource.
 76      * @type jls.util.Resource
 77      */
 78     DEFAULT: new Resource(),
 79     loadFromXML : function(xml) {
 80         if (Logger.getInstance().isTraceEnabled()) {
 81             Logger.getInstance().trace('loadFromXML("' + xml.toString() + '")');
 82         }
 83         var res = new Resource();
 84         var entries = xml.getChildren();
 85         for (var i = 0; i < entries.length; i++) {
 86             var entry = entries[i];
 87             var key = entry.getAttribute('key');
 88             if ((entry.getName() == 'entry') && (key != null)) {
 89                 res.set(key, entry.getText());
 90             }
 91         }
 92         return res;
 93     },
 94     getPath : function(path, language) {
 95         if (typeof language == 'undefined') {
 96             language = _native.core.properties['user.language'];
 97         }
 98         return path + '.' + language + '.xml';
 99     },
100     _getResourceAsXML : function(path) {
101         if ('boot' in _native) {
102             var xml = _native.core.getResourceAsString(path, true);
103             return XmlElement.createFromDOM(xml);
104         } else {
105             var xml = new XML(_native.core.getResourceAsString(path));
106             return XmlElement.createFromE4X(xml);
107         }
108     },
109     /**
110      * Loads a resource from an XML path.
111      *
112      * @param {String} path The path of the XML resource to load.
113      * @param {String} [language] The language to use.
114      * @returns {jls.util.Resource} The resource.
115      */
116     load : function(path, language) {
117         /*
118          * TODO also try to load without language?
119          */
120         var xml = Resource._getResourceAsXML(Resource.getPath(path, language));
121         return Resource.loadFromXML(xml);
122     }
123 });
124 
125 return Resource;
126 });
127