File: src/Agent.js
- /*
- Copyright 2012 Rustici Software
-
- 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.
- */
-
- /**
- TinCan client library
-
- @module TinCan
- @submodule TinCan.Agent
- **/
- (function () {
- "use strict";
-
- /**
- @class TinCan.Agent
- @constructor
- */
- var Agent = TinCan.Agent = function (cfg) {
- this.log("constructor");
-
- /**
- @property name
- @type String
- */
- this.name = null;
-
- /**
- @property mbox
- @type String
- */
- this.mbox = null;
-
- /**
- @property mbox_sha1sum
- @type String
- */
- this.mbox_sha1sum = null;
-
- /**
- @property openid
- @type String
- */
- this.openid = null;
-
- /**
- @property account
- @type TinCan.AgentAccount
- */
- this.account = null;
-
- /**
- @property degraded
- @type Boolean
- @default false
- */
- this.degraded = false;
-
- this.init(cfg);
- };
- Agent.prototype = {
- /**
- @property objectType
- @type String
- @default Agent
- */
- objectType: "Agent",
-
- /**
- @property LOG_SRC
- */
- LOG_SRC: "Agent",
-
- /**
- @method log
- */
- log: TinCan.prototype.log,
-
- /**
- @method init
- @param {Object} [options] Configuration used to initialize
- */
- init: function (cfg) {
- this.log("init");
- var i,
- directProps = [
- "name",
- "mbox",
- "mbox_sha1sum",
- "openid"
- ],
- val
- ;
-
- cfg = cfg || {};
-
- // handle .9 split names and array properties into single interface
- if (typeof cfg.lastName !== "undefined" || typeof cfg.firstName !== "undefined") {
- cfg.name = "";
- if (typeof cfg.firstName !== "undefined" && cfg.firstName.length > 0) {
- cfg.name = cfg.firstName[0];
- if (cfg.firstName.length > 1) {
- this.degraded = true;
- }
- }
-
- if (cfg.name !== "") {
- cfg.name += " ";
- }
-
- if (typeof cfg.lastName !== "undefined" && cfg.lastName.length > 0) {
- cfg.name += cfg.lastName[0];
- if (cfg.lastName.length > 1) {
- this.degraded = true;
- }
- }
- } else if (typeof cfg.familyName !== "undefined" || typeof cfg.givenName !== "undefined") {
- cfg.name = "";
- if (typeof cfg.givenName !== "undefined" && cfg.givenName.length > 0) {
- cfg.name = cfg.givenName[0];
- if (cfg.givenName.length > 1) {
- this.degraded = true;
- }
- }
-
- if (cfg.name !== "") {
- cfg.name += " ";
- }
-
- if (typeof cfg.familyName !== "undefined" && cfg.familyName.length > 0) {
- cfg.name += cfg.familyName[0];
- if (cfg.familyName.length > 1) {
- this.degraded = true;
- }
- }
- }
-
- if (typeof cfg.name === "object" && cfg.name !== null) {
- if (cfg.name.length > 1) {
- this.degraded = true;
- }
- cfg.name = cfg.name[0];
- }
- if (typeof cfg.mbox === "object" && cfg.mbox !== null) {
- if (cfg.mbox.length > 1) {
- this.degraded = true;
- }
- cfg.mbox = cfg.mbox[0];
- }
- if (typeof cfg.mbox_sha1sum === "object" && cfg.mbox_sha1sum !== null) {
- if (cfg.mbox_sha1sum.length > 1) {
- this.degraded = true;
- }
- cfg.mbox_sha1sum = cfg.mbox_sha1sum[0];
- }
- if (typeof cfg.openid === "object" && cfg.openid !== null) {
- if (cfg.openid.length > 1) {
- this.degraded = true;
- }
- cfg.openid = cfg.openid[0];
- }
- if (typeof cfg.account === "object" && cfg.account !== null && typeof cfg.account.homePage === "undefined" && typeof cfg.account.name === "undefined") {
- if (cfg.account.length === 0) {
- delete cfg.account;
- }
- else {
- if (cfg.account.length > 1) {
- this.degraded = true;
- }
- cfg.account = cfg.account[0];
- }
- }
-
- if (cfg.hasOwnProperty("account")) {
- if (cfg.account instanceof TinCan.AgentAccount) {
- this.account = cfg.account;
- }
- else {
- this.account = new TinCan.AgentAccount (cfg.account);
- }
- }
-
- for (i = 0; i < directProps.length; i += 1) {
- if (cfg.hasOwnProperty(directProps[i]) && cfg[directProps[i]] !== null) {
- val = cfg[directProps[i]];
- if (directProps[i] === "mbox" && val.indexOf("mailto:") === -1) {
- val = "mailto:" + val;
- }
- this[directProps[i]] = val;
- }
- }
- },
-
- toString: function () {
- this.log("toString");
-
- if (this.name !== null) {
- return this.name;
- }
- if (this.mbox !== null) {
- return this.mbox.replace("mailto:", "");
- }
- if (this.mbox_sha1sum !== null) {
- return this.mbox_sha1sum;
- }
- if (this.openid !== null) {
- return this.openid;
- }
- if (this.account !== null) {
- return this.account.toString();
- }
-
- return this.objectType + ": unidentified";
- },
-
- /**
- While a TinCan.Agent instance can store more than one inverse functional identifier
- this method will always only output one to be compliant with the statement sending
- specification. Order of preference is: mbox, mbox_sha1sum, openid, account
-
- @method asVersion
- @param {String} [version] Version to return (defaults to newest supported)
- */
- asVersion: function (version) {
- this.log("asVersion: " + version);
- var result = {
- objectType: this.objectType
- };
-
- version = version || TinCan.versions()[0];
-
- if (version === "0.9") {
- if (this.mbox !== null) {
- result.mbox = [ this.mbox ];
- }
- else if (this.mbox_sha1sum !== null) {
- result.mbox_sha1sum = [ this.mbox_sha1sum ];
- }
- else if (this.openid !== null) {
- result.openid = [ this.openid ];
- }
- else if (this.account !== null) {
- result.account = [ this.account.asVersion(version) ];
- }
-
- if (this.name !== null) {
- result.name = [ this.name ];
- }
- } else {
- if (this.mbox !== null) {
- result.mbox = this.mbox;
- }
- else if (this.mbox_sha1sum !== null) {
- result.mbox_sha1sum = this.mbox_sha1sum;
- }
- else if (this.openid !== null) {
- result.openid = this.openid;
- }
- else if (this.account !== null) {
- result.account = this.account.asVersion(version);
- }
-
- if (this.name !== null) {
- result.name = this.name;
- }
- }
-
- return result;
- }
- };
-
- /**
- @method fromJSON
- @return {Object} Agent
- @static
- */
- Agent.fromJSON = function (agentJSON) {
- Agent.prototype.log("fromJSON");
- var _agent = JSON.parse(agentJSON);
-
- return new Agent(_agent);
- };
- }());
-
-