(function(window)
{
var Gitana = window.Gitana;
/**
* Object factory
*
* Produces object instances (nodes included) for given json.
*/
Gitana.ObjectFactory = Base.extend(
/** @lends Gitana.ObjectFactory.prototype */
{
constructor: function()
{
this.create = function(klass, existing, object)
{
var created = new klass(existing, object);
return created;
};
},
platformDataStoreMap: function(platform, object)
{
return this.create(Gitana.PlatformDataStoreMap, platform, object);
},
platformDataStore: function(platform, object)
{
var type = object.datastoreTypeId;
return this[type](platform, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// CLUSTER
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
platform: function(cluster, object)
{
return this.create(Gitana.Platform, cluster, object);
},
job: function(cluster, object)
{
var type = null;
if (object)
{
if (Gitana.isString(object))
{
type = object;
}
else
{
type = object["type"];
}
}
var job = null;
if ("copy" == type)
{
job = this.create(Gitana.CopyJob, cluster, object);
}
else if ("export" == type)
{
job = this.create(Gitana.TransferExportJob, cluster, object);
}
else if ("import" == type)
{
job = this.create(Gitana.TransferImportJob, cluster, object);
}
else
{
job = this.create(Gitana.Job, cluster, object);
}
return job;
},
jobMap: function(cluster, object)
{
return this.create(Gitana.JobMap, cluster, object);
},
logEntry: function(cluster, object)
{
return this.create(Gitana.LogEntry, cluster, object);
},
logEntryMap: function(cluster, object)
{
return this.create(Gitana.LogEntryMap, cluster, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// PLATFORM
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
auditRecord: function(repository, object)
{
return this.create(Gitana.AuditRecord, repository, object);
},
auditRecordMap: function(repository, object)
{
return this.create(Gitana.AuditRecordMap, repository, object);
},
stack: function(platform, object)
{
return this.create(Gitana.Stack, platform, object);
},
stackMap: function(platform, object)
{
return this.create(Gitana.StackMap, platform, object);
},
project: function(platform, object)
{
return this.create(Gitana.Project, platform, object);
},
projectMap: function(platform, object)
{
return this.create(Gitana.ProjectMap, platform, object);
},
scheduledWork: function(platform, object)
{
return this.create(Gitana.ScheduledWork, platform, object);
},
scheduledWorkMap: function(platform, object)
{
return this.create(Gitana.ScheduledWorkMap, platform, object);
},
report: function(platform, object)
{
return this.create(Gitana.Report, platform, object);
},
reportMap: function(platform, object)
{
return this.create(Gitana.ReportMap, platform, object);
},
repository: function(platform, object)
{
return this.create(Gitana.Repository, platform, object);
},
repositoryMap: function(platform, object)
{
return this.create(Gitana.RepositoryMap, platform, object);
},
domain: function(platform, object)
{
return this.create(Gitana.Domain, platform, object);
},
domainMap: function(platform, object)
{
return this.create(Gitana.DomainMap, platform, object);
},
vault: function(platform, object)
{
return this.create(Gitana.Vault, platform, object);
},
vaultMap: function(platform, object)
{
return this.create(Gitana.VaultMap, platform, object);
},
registrar: function(platform, object)
{
return this.create(Gitana.Registrar, platform, object);
},
registrarMap: function(platform, object)
{
return this.create(Gitana.RegistrarMap, platform, object);
},
directory: function(platform, object)
{
return this.create(Gitana.Directory, platform, object);
},
directoryMap: function(platform, object)
{
return this.create(Gitana.DirectoryMap, platform, object);
},
application: function(platform, object)
{
return this.create(Gitana.Application, platform, object);
},
applicationMap: function(platform, object)
{
return this.create(Gitana.ApplicationMap, platform, object);
},
warehouse: function(platform, object)
{
return this.create(Gitana.Warehouse, platform, object);
},
warehouseMap: function(platform, object)
{
return this.create(Gitana.WarehouseMap, platform, object);
},
webhost: function(platform, object)
{
return this.create(Gitana.WebHost, platform, object);
},
webhostMap: function(platform, object)
{
return this.create(Gitana.WebHostMap, platform, object);
},
autoClientMapping: function(webhost, object)
{
return this.create(Gitana.AutoClientMapping, webhost, object);
},
autoClientMappingMap: function(webhost, object)
{
return this.create(Gitana.AutoClientMappingMap, webhost, object);
},
trustedDomainMapping: function(webhost, object)
{
return this.create(Gitana.TrustedDomainMapping, webhost, object);
},
trustedDomainMappingMap: function(webhost, object)
{
return this.create(Gitana.TrustedDomainMappingMap, webhost, object);
},
deployedApplication: function(webhost, object)
{
return this.create(Gitana.DeployedApplication, webhost, object);
},
deployedApplicationMap: function(webhost, object)
{
return this.create(Gitana.DeployedApplicationMap, webhost, object);
},
descriptor: function(platform, object)
{
return this.create(Gitana.Descriptor, platform, object);
},
descriptorMap: function(platform, object)
{
return this.create(Gitana.DescriptorMap, platform, object);
},
client: function(platform, object)
{
var client = this.create(Gitana.Client, platform, object);
Gitana.stampInto(client, Gitana.ClientMethods);
return client;
},
clientMap: function(platform, object)
{
return this.create(Gitana.ClientMap, platform, object);
},
authenticationGrant: function(platform, object)
{
return this.create(Gitana.AuthenticationGrant, platform, object);
},
authenticationGrantMap: function(platform, object)
{
return this.create(Gitana.AuthenticationGrantMap, platform, object);
},
billingProviderConfiguration: function(platform, object)
{
return this.create(Gitana.BillingProviderConfiguration, platform, object);
},
billingProviderConfigurationMap: function(platform, object)
{
return this.create(Gitana.BillingProviderConfigurationMap, platform, object);
},
workflowModel: function(platform, object)
{
return this.create(Gitana.WorkflowModel, platform, object);
},
workflowModelMap: function(platform, object)
{
return this.create(Gitana.WorkflowModelMap, platform, object);
},
workflowInstance: function(platform, object)
{
return this.create(Gitana.WorkflowInstance, platform, object);
},
workflowInstanceMap: function(platform, object)
{
return this.create(Gitana.WorkflowInstanceMap, platform, object);
},
workflowTask: function(platform, object)
{
return this.create(Gitana.WorkflowTask, platform, object);
},
workflowTaskMap: function(platform, object)
{
return this.create(Gitana.WorkflowTaskMap, platform, object);
},
workflowComment: function(platform, object)
{
return this.create(Gitana.WorkflowComment, platform, object);
},
workflowCommentMap: function(platform, object)
{
return this.create(Gitana.WorkflowCommentMap, platform, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// REPOSITORY
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
changeset: function(repository, object)
{
return this.create(Gitana.Changeset, repository, object);
},
branch: function(repository, object)
{
return this.create(Gitana.Branch, repository, object);
},
/**
* Creates a node
*
* @param branch
* @param object either object or the string type id
*/
node: function(branch, object)
{
var objectClass = null;
if (object)
{
// allow for object to be the type id
if (Gitana.isString(object))
{
object = {
"_type": object
};
}
// see if we can derive a more accurate type
var type = object["_type"];
if (type)
{
if (Gitana.ObjectFactory.registry[type])
{
objectClass = Gitana.ObjectFactory.registry[type];
}
}
if (!objectClass)
{
// allow default trip through to association for association types
if (type && Gitana.startsWith(type, "a:"))
{
objectClass = Gitana.Association;
}
}
if (!objectClass)
{
// check out if it says its an association via special key
if (object.__is_association && object.__is_association())
{
objectClass = Gitana.Association;
}
}
}
if (!objectClass)
{
// assume node
objectClass = Gitana.Node;
}
// instantiate and set any properties
return this.create(objectClass, branch, object);
},
association: function(branch, object)
{
return this.create(Gitana.Association, branch, object);
},
release: function(repository, object)
{
return this.create(Gitana.Release, repository, object);
},
branchMap: function(repository, object)
{
return this.create(Gitana.BranchMap, repository, object);
},
changesetMap: function(repository, object)
{
return this.create(Gitana.ChangesetMap, repository, object);
},
releaseMap: function(repository, object)
{
return this.create(Gitana.ReleaseMap, repository, object);
},
nodeMap: function(branch, object)
{
return this.create(Gitana.NodeMap, branch, object);
},
definition: function(branch, object)
{
return this.create(Gitana.Definition, branch, object);
},
form: function(branch, object)
{
return this.create(Gitana.Form, branch, object);
},
traversalResults: function(branch, object)
{
return this.create(Gitana.TraversalResults, branch, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// DOMAINS
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
domainPrincipal: function(domain, object)
{
// create the principal
var principal = this.create(Gitana.DomainPrincipal, domain, object);
// extend the principal pre-emptively if we have an object
if (object)
{
this.extendPrincipal(principal);
}
return principal;
},
domainPrincipalMap: function(domain, object)
{
return this.create(Gitana.PrincipalMap, domain, object);
},
extendPrincipal: function(principal)
{
if (principal.getType() && principal.objectType() == "Gitana.DomainPrincipal")
{
if (principal.getType() == "USER")
{
Gitana.stampInto(principal, Gitana.DomainUser);
}
else if (principal.getType() == "GROUP")
{
Gitana.stampInto(principal, Gitana.DomainGroup);
}
}
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// VAULTS
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
archive: function(vault, object)
{
return this.create(Gitana.Archive, vault, object);
},
archiveMap: function(vault, object)
{
return this.create(Gitana.ArchiveMap, vault, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MISCELLANEOUS
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
team: function(cluster, teamable, object)
{
return new Gitana.Team(cluster, teamable, object);
},
teamMap: function(cluster, teamable, object)
{
return new Gitana.TeamMap(cluster, teamable, object);
},
activity: function(datastore, object)
{
return new Gitana.Activity(datastore, object);
},
activityMap: function(datastore, object)
{
return new Gitana.ActivityMap(datastore, object);
},
role: function(cluster, roleContainer, object)
{
return new Gitana.Role(cluster, roleContainer, object);
},
roleMap: function(cluster, roleContainer, object)
{
return new Gitana.RoleMap(cluster, roleContainer, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// REGISTRAR
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
tenant: function(registrar, object)
{
return this.create(Gitana.Tenant, registrar, object);
},
tenantMap: function(registrar, object)
{
return this.create(Gitana.TenantMap, registrar, object);
},
plan: function(registrar, object)
{
return this.create(Gitana.Plan, registrar, object);
},
planMap: function(registrar, object)
{
return this.create(Gitana.PlanMap, registrar, object);
},
meter: function(registrar, object)
{
return this.create(Gitana.Meter, registrar, object);
},
meterMap: function(registrar, object)
{
return this.create(Gitana.MeterMap, registrar, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// DIRECTORY
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
identity: function(directory, object)
{
return this.create(Gitana.Identity, directory, object);
},
identityMap: function(directory, object)
{
return this.create(Gitana.IdentityMap, directory, object);
},
connection: function(directory, object)
{
return this.create(Gitana.Connection, directory, object);
},
connectionMap: function(directory, object)
{
return this.create(Gitana.ConnectionMap, directory, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// WAREHOUSE
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
interactionApplication: function(warehouse, object)
{
return this.create(Gitana.InteractionApplication, warehouse, object);
},
interactionApplicationMap: function(warehouse, object)
{
return this.create(Gitana.InteractionApplicationMap, warehouse, object);
},
interactionSession: function(warehouse, object)
{
return this.create(Gitana.InteractionSession, warehouse, object);
},
interactionSessionMap: function(warehouse, object)
{
return this.create(Gitana.InteractionSessionMap, warehouse, object);
},
interactionPage: function(warehouse, object)
{
return this.create(Gitana.InteractionPage, warehouse, object);
},
interactionPageMap: function(warehouse, object)
{
return this.create(Gitana.InteractionPageMap, warehouse, object);
},
interactionNode: function(warehouse, object)
{
return this.create(Gitana.InteractionNode, warehouse, object);
},
interactionNodeMap: function(warehouse, object)
{
return this.create(Gitana.InteractionNodeMap, warehouse, object);
},
interactionUser: function(warehouse, object)
{
return this.create(Gitana.InteractionUser, warehouse, object);
},
interactionUserMap: function(warehouse, object)
{
return this.create(Gitana.InteractionUserMap, warehouse, object);
},
interactionContinent: function(warehouse, object)
{
return this.create(Gitana.InteractionContinent, warehouse, object);
},
interactionContinentMap: function(warehouse, object)
{
return this.create(Gitana.InteractionContinentMap, warehouse, object);
},
interactionCountry: function(warehouse, object)
{
return this.create(Gitana.InteractionCountry, warehouse, object);
},
interactionCountryMap: function(warehouse, object)
{
return this.create(Gitana.InteractionCountryMap, warehouse, object);
},
interactionCity: function(warehouse, object)
{
return this.create(Gitana.InteractionCity, warehouse, object);
},
interactionCityMap: function(warehouse, object)
{
return this.create(Gitana.InteractionCityMap, warehouse, object);
},
interactionRegion: function(warehouse, object)
{
return this.create(Gitana.InteractionRegion, warehouse, object);
},
interactionRegionMap: function(warehouse, object)
{
return this.create(Gitana.InteractionRegionMap, warehouse, object);
},
interactionPostalCode: function(warehouse, object)
{
return this.create(Gitana.InteractionPostalCode, warehouse, object);
},
interactionPostalCodeMap: function(warehouse, object)
{
return this.create(Gitana.InteractionPostalCodeMap, warehouse, object);
},
interactionUserAgent: function(warehouse, object)
{
return this.create(Gitana.InteractionUserAgent, warehouse, object);
},
interactionUserAgentMap: function(warehouse, object)
{
return this.create(Gitana.InteractionUserAgentMap, warehouse, object);
},
interactionOperatingSystem: function(warehouse, object)
{
return this.create(Gitana.InteractionOperatingSystem, warehouse, object);
},
interactionOperatingSystemMap: function(warehouse, object)
{
return this.create(Gitana.InteractionOperatingSystemMap, warehouse, object);
},
interactionDevice: function(warehouse, object)
{
return this.create(Gitana.InteractionDevice, warehouse, object);
},
interactionDeviceMap: function(warehouse, object)
{
return this.create(Gitana.InteractionDeviceMap, warehouse, object);
},
interactionReport: function(warehouse, object)
{
return this.create(Gitana.InteractionReport, warehouse, object);
},
interactionReportMap: function(warehouse, object)
{
return this.create(Gitana.InteractionReportMap, warehouse, object);
},
interactionReportEntry: function(warehouse, object)
{
return this.create(Gitana.InteractionReportEntry, warehouse, object);
},
interactionReportEntryMap: function(warehouse, object)
{
return this.create(Gitana.InteractionReportEntryMap, warehouse, object);
},
interaction: function(warehouse, object)
{
return this.create(Gitana.Interaction, warehouse, object);
},
interactionMap: function(warehouse, object)
{
return this.create(Gitana.InteractionMap, warehouse, object);
},
conversionTrigger: function(warehouse, object)
{
return this.create(Gitana.ConversionTrigger, warehouse, object);
},
conversionTriggerMap: function(warehouse, object)
{
return this.create(Gitana.ConversionTriggerMap, warehouse, object);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// APPLICATION
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
settings: function(application, object)
{
return this.create(Gitana.Settings, application, object);
},
settingsMap: function(application, object)
{
return this.create(Gitana.SettingsMap, application, object);
},
registration: function(application, object)
{
return this.create(Gitana.Registration, application, object);
},
registrationMap: function(application, object)
{
return this.create(Gitana.RegistrationMap, application, object);
},
pageRendition: function(application, object)
{
return this.create(Gitana.PageRendition, application, object);
},
pageRenditionMap: function(application, object)
{
return this.create(Gitana.PageRenditionMap, application, object);
},
email: function(application, object)
{
return this.create(Gitana.Email, application, object);
},
emailMap: function(application, object)
{
return this.create(Gitana.EmailMap, application, object);
},
emailProvider: function(application, object)
{
return this.create(Gitana.EmailProvider, application, object);
},
emailProviderMap: function(application, object)
{
return this.create(Gitana.EmailProviderMap, application, object);
}
});
// static methods for registration
Gitana.ObjectFactory.registry = { };
Gitana.ObjectFactory.register = function(qname, objectClass)
{
Gitana.ObjectFactory.registry[qname] = objectClass;
};
})(window);