1183 lines
54 KiB
C#
Executable File

//
// MochaXMLDataFormat.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2020 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
using System.Linq;
using MBS.Framework;
using Mocha.Core;
using UniversalEditor.DataFormats.Markup.XML;
using UniversalEditor.ObjectModels.Markup;
using UniversalEditor.Plugins.Mocha.ObjectModels.MochaClassLibrary;
namespace UniversalEditor.Plugins.Mocha.DataFormats.MochaXML
{
public class MochaXMLDataFormat : XMLDataFormat
{
public MochaXMLDataFormat()
{
/*
this.Settings.Entities.Add("IDC_Class", KnownInstanceGuids.Classes.Class.ToString("B"));
this.Settings.Entities.Add("IDC_Attribute", "{F9CD7751-EF62-4F7C-8A28-EBE90B8F46AA}");
this.Settings.Entities.Add("IDC_BooleanAttribute", "{EA830448-A403-4ED9-A3D3-048D5D5C3A03}");
this.Settings.Entities.Add("IDC_NumericAttribute", "{9DE86AF1-EFD6-4B71-9DCC-202F247C94CB}");
this.Settings.Entities.Add("IDC_TextAttribute", "{C2F36542-60C3-4B9E-9A96-CA9B309C43AF}");
this.Settings.Entities.Add("IDC_DateAttribute", "{0B7B1812-DFB4-4F25-BF6D-CEB0E1DF8744}");
this.Settings.Entities.Add("IDC_Relationship", "{9B0A80F9-C325-4D36-997C-FB4106204648}");
this.Settings.Entities.Add("IDC_Instance", "{263C4882-945F-4DE9-AED8-E0D6516D4903}");
this.Settings.Entities.Add("IDC_InstanceSet", KnownInstanceGuids.Classes.InstanceSet.ToString("B"));
this.Settings.Entities.Add("IDC_InstanceDefinition", "{ee26f146-0b89-4cfe-a1af-ae6ac3533eae}");
this.Settings.Entities.Add("IDC_String", "");
this.Settings.Entities.Add("IDC_Module", "");
this.Settings.Entities.Add("IDC_Translation", "{04A53CC8-3206-4A97-99C5-464DB8CAA6E6}");
this.Settings.Entities.Add("IDC_TranslationValue", "{6D38E757-EC18-43AD-9C35-D15BB446C0E1}");
this.Settings.Entities.Add("IDC_Enumeration", "");
this.Settings.Entities.Add("IDC_StringComponent", "{F9E2B671-13F5-4172-A568-725ACD8BBFAB}");
this.Settings.Entities.Add("IDC_ExtractSingleInstanceStringComponent", "{FCECCE4E-8D05-485A-AE34-B1B45E766661}");
this.Settings.Entities.Add("IDC_InstanceAttributeStringComponent", "{623565D5-5AEE-49ED-A5A9-0CFE670507BC}");
this.Settings.Entities.Add("IDC_User", "{9C6871C1-9A7F-4A3A-900E-69D1D9E24486}");
this.Settings.Entities.Add("IDC_Report", KnownInstanceGuids.Classes.Report.ToString("B"));
this.Settings.Entities.Add("IDC_ReportColumn", KnownInstanceGuids.Classes.ReportColumn.ToString("B"));
this.Settings.Entities.Add("IDC_Page", "{D9626359-48E3-4840-A089-CD8DA6731690}");
this.Settings.Entities.Add("IDC_HeadingPageComponent", "{FD86551E-E4CE-4B8B-95CB-BEC1E6A0EE2B}");
this.Settings.Entities.Add("IDC_Element", KnownInstanceGuids.Classes.Element.ToString("B"));
this.Settings.Entities.Add("IDC_ElementContent", KnownInstanceGuids.Classes.ElementContent.ToString("B"));
this.Settings.Entities.Add("IDC_ElementContentDisplayOption", " ");
this.Settings.Entities.Add("IDC_Event", KnownInstanceGuids.Classes.Event.ToString("B"));
this.Settings.Entities.Add("IDC_WorkData", KnownInstanceGuids.Classes.WorkData.ToString("B"));
this.Settings.Entities.Add("IDC_WorkSet", KnownInstanceGuids.Classes.WorkSet.ToString("B"));
this.Settings.Entities.Add("IDC_AccessModifier", "");
this.Settings.Entities.Add("IDC_Method", KnownInstanceGuids.Classes.Method.ToString("B"));
this.Settings.Entities.Add("IDC_CalculateDateMethod", KnownInstanceGuids.Classes.CalculateDateMethod.ToString("B"));
this.Settings.Entities.Add("IDC_BuildAttributeMethod", KnownInstanceGuids.Classes.BuildAttributeMethod.ToString("B"));
this.Settings.Entities.Add("IDC_GetAttributeMethod", KnownInstanceGuids.Classes.GetAttributeMethod.ToString("B"));
this.Settings.Entities.Add("IDC_SelectFromInstanceSetMethod", KnownInstanceGuids.Classes.SelectFromInstanceSetMethod.ToString("B"));
this.Settings.Entities.Add("IDC_GetReferencedAttributeMethod", KnownInstanceGuids.Classes.GetReferencedAttributeMethod.ToString("B"));
this.Settings.Entities.Add("IDC_InstanceOpMethod", KnownInstanceGuids.Classes.InstanceOpMethod.ToString("B"));
this.Settings.Entities.Add("IDC_GetSpecifiedInstancesMethod", KnownInstanceGuids.Classes.GetSpecificInstancesMethod.ToString("B"));
this.Settings.Entities.Add("IDC_GetReferencedInstanceSetMethod", KnownInstanceGuids.Classes.GetReferencedInstanceSetMethod.ToString("B"));
this.Settings.Entities.Add("IDC_EvaluateBooleanExpressionMethod", "");
this.Settings.Entities.Add("IDC_GetRelationshipMethod", "{d53c9232-89ef-4cca-8520-261da6787450}");
this.Settings.Entities.Add("IDC_ConditionalSelectAttributeMethod", KnownInstanceGuids.Classes.ConditionalSelectAttributeMethod.ToString("B"));
this.Settings.Entities.Add("IDC_GetInstanceSetBySystemRoutineMethod", KnownInstanceGuids.Classes.GetInstanceSetBySystemRoutineMethod.ToString("B"));
this.Settings.Entities.Add("IDC_ConditionalMethodCase", KnownInstanceGuids.Classes.ConditionalMethodCase.ToString("B"));
this.Settings.Entities.Add("IDC_Executable", KnownInstanceGuids.Classes.Executable.ToString("B"));
this.Settings.Entities.Add("IDC_Parameter", global::Mocha.Core.KnownInstanceGuids.Classes.Parameter.ToString("B"));
this.Settings.Entities.Add("IDC_ReportObject", global::Mocha.Core.KnownInstanceGuids.Classes.ReportObject.ToString("B"));
this.Settings.Entities.Add("IDC_Validation", KnownInstanceGuids.Classes.Validation.ToString("B"));
this.Settings.Entities.Add("IDC_ValidationClassification", KnownInstanceGuids.Classes.ValidationClassification.ToString("B"));
this.Settings.Entities.Add("IDC_MethodBinding", "{CB36098E-B9BF-4D22-87FA-4186EC632C89}");
this.Settings.Entities.Add("IDC_ParameterAssignment", "");
this.Settings.Entities.Add("IDC_ReturnAttributeMethodBinding", "{30FB6BA6-2BBB-41D2-B91A-709C00A07790}");
this.Settings.Entities.Add("IDC_ReturnInstanceSetMethodBinding", "{AADC20F9-7559-429B-AEF0-97E059295C76}");
this.Settings.Entities.Add("IDC_PageComponent_TabContainerPageComponent", "");
this.Settings.Entities.Add("IDC_DetailPageComponent", "");
// FIXME: these should be `Report Field`.has source Method `GA - Get Attribute Method...` or `GSI - Get Specific Instance`... etc.
this.Settings.Entities.Add("IDC_ReportField", "{655A04D9-FE35-4F89-9AAB-B8FA34989D03}");
this.Settings.Entities.Add("IDC_AttributeReportField", "{C06E0461-A956-4599-9708-012C8FE04D94}");
this.Settings.Entities.Add("IDC_RelationshipReportField", "{FC4E3BB5-1EA7-44FF-B828-2EA54CDD4ABB}");
this.Settings.Entities.Add("IDC_StandardReport", "{FDF4A498-DE83-417D-BA01-707372125C8D}");
this.Settings.Entities.Add("IDC_Tenant", "{703F9D65-C584-4D9F-A656-D0E3C247FF1F}");
this.Settings.Entities.Add("IDC_AuditLine", "");
this.Settings.Entities.Add("IDC_Dashboard", KnownInstanceGuids.Classes.Dashboard.ToString("B"));
this.Settings.Entities.Add("IDC_DashboardContent", KnownInstanceGuids.Classes.DashboardContent.ToString("B"));
this.Settings.Entities.Add("IDC_Theme", KnownInstanceGuids.Classes.Theme.ToString("B"));
*/
this.Settings.Entities.Add("IDA_Name", "{9153A637-992E-4712-ADF2-B03F0D9EDEA6}");
this.Settings.Entities.Add("IDA_Abstract", "{A1C0255D-3E8D-47D7-A186-1C93C93D4667}");
this.Settings.Entities.Add("IDA_Value", "{041DD7FD-2D9C-412B-8B9D-D7125C166FE0}");
this.Settings.Entities.Add("IDA_DateAndTime", "{ea71cc92-a5e9-49c1-b487-8ad178b557d2}");
this.Settings.Entities.Add("IDA_Order", "{49423f66-8837-430d-8cac-7892ebdcb1fe}");
this.Settings.Entities.Add("IDA_Abbreviation", "{7ee78e44-e894-41a0-996b-d0f33c76e23b}");
this.Settings.Entities.Add("IDA_StartDate", "{F23CD242-64DB-4115-AB57-E9C70B0A38DC}");
this.Settings.Entities.Add("IDA_EndDate", "{B3AED59A-1977-4CE4-A2F9-891A1CACDEB8}");
this.Settings.Entities.Add("IDA_Static", "{9A3A0719-64C2-484F-A55E-22CD4597D9FD}");
this.Settings.Entities.Add("IDA_Verb", "{61345a5d-3397-4a96-8797-8863f03a476c}");
this.Settings.Entities.Add("IDA_Final", "{4028ec9a-7d7b-4bfb-8883-e450e797ca0e}");
this.Settings.Entities.Add("IDA_Required", KnownAttributeGuids.Boolean.Required.ToString("B"));
this.Settings.Entities.Add("IDA_Null", KnownAttributeGuids.Boolean.Null.ToString("B"));
this.Settings.Entities.Add("IDA_Visible", KnownAttributeGuids.Boolean.Visible.ToString("B"));
this.Settings.Entities.Add("IDA_UseAnyCondition", KnownAttributeGuids.Boolean.UseAnyCondition.ToString("B"));
this.Settings.Entities.Add("IDA_ValidateOnlyOnSubmit", KnownAttributeGuids.Boolean.ValidateOnlyOnSubmit.ToString("B"));
// class GUID loader
// first load top-level properties
Type[] types = typeof(KnownInstanceGuids).Assembly.GetTypes();
foreach (Type t in types)
{
object[] attrs = t.GetCustomAttributes(typeof(ExportEntitiesAttribute), false);
if (attrs.Length > 0)
{
ExportEntitiesAttribute attr = (ExportEntitiesAttribute)attrs[0];
if (attr.Prefix != null || attr.Suffix != null)
{
InitGuids(t, attr.Prefix, attr.Suffix, false);
}
}
}
// InitGuids(typeof(KnownInstanceGuids.Classes), "IDC");
// InitGuids(typeof(KnownInstanceGuids.MethodClasses), "IDC");
// InitGuids(typeof(KnownRelationshipGuids), "IDR", false);
this.Settings.Entities.Add("IDI_Module_MochaBaseSystem", "{3ffd3a31-208c-49c9-905d-2a69362902ca}");
this.Settings.Entities.Add("IDI_Language_English", "{68BB6038-A4B5-4EE1-AAE9-326494942062}");
this.Settings.Entities.Add("IDI_Language_Spanish", "{6dc357cb-37c3-43ed-ae13-6259fb109213}");
this.Settings.Entities.Add("IDI_Language_French", "{6bf0cf09-87c9-4e21-b360-7eb5a1c279de}");
this.Settings.Entities.Add("IDI_Language_German", "{c7c1d740-0d3c-493f-ab0b-fe1b42546d0a}");
this.Settings.Entities.Add("IDI_Language_Italian", "{cf165170-0680-4a41-8f88-88f34b2b1986}");
this.Settings.Entities.Add("IDI_Language_Chinese", "{6f908a9b-7464-4a16-aed9-7eccb8d39032}");
this.Settings.Entities.Add("IDI_Language_Japanese", "{1e16de9d-0e49-4a79-b690-4905c46a94cc}");
this.Settings.Entities.Add("IDI_Language_Korean", "{d03a795e-906b-49ee-87ea-c1bef4b8ee9a}");
}
private void InitGuids(Type type, string prefix, string suffix, bool nested)
{
Console.Error.WriteLine("debug: loading type {0}", type);
System.Reflection.PropertyInfo[] pis = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
foreach (System.Reflection.PropertyInfo pi in pis)
{
if (pi.PropertyType == typeof(Guid))
{
Guid value = (Guid)pi.GetValue(null, null);
string name = String.Format("{0}{1}{2}", prefix, pi.Name, suffix);
Console.Error.WriteLine("debug: mapped entity &{0}; to {1}", name, value.ToString("B"));
this.Settings.Entities.Add(name, value.ToString("B"));
}
}
if (nested)
{
Type[] subtypes = type.GetNestedTypes();
foreach (Type subtype in subtypes)
{
InitGuids(subtype, prefix, suffix, nested);
}
}
}
protected override void BeforeLoadInternal(Stack<ObjectModel> objectModels)
{
base.BeforeLoadInternal(objectModels);
objectModels.Push(new MarkupObjectModel() { Accessor = this.Accessor });
}
protected override void AfterLoadInternal(Stack<ObjectModel> objectModels)
{
base.AfterLoadInternal(objectModels);
MarkupObjectModel mom = (objectModels.Pop() as MarkupObjectModel);
MochaClassLibraryObjectModel mcl = (objectModels.Pop() as MochaClassLibraryObjectModel);
MarkupTagElement tagMocha = (mom.Elements["mocha"] as MarkupTagElement);
if (tagMocha == null) throw new InvalidDataFormatException("file does not contain top-level 'mocha' tag");
MarkupTagElement tagLibraries = (tagMocha.Elements["libraries"] as MarkupTagElement);
if (tagLibraries != null)
{
for (int i = 0; i < tagLibraries.Elements.Count; i++)
{
MochaLibrary library = LoadLibrary(mcl, tagLibraries.Elements[i] as MarkupTagElement);
if (library == null) continue;
mcl.Libraries.Merge(library);
}
}
MarkupTagElement tagTenants = (tagMocha.Elements["tenants"] as MarkupTagElement);
if (tagTenants != null)
{
foreach (MarkupTagElement tagTenant in tagTenants.Elements.OfType<MarkupTagElement>())
{
if (tagTenant == null) continue;
if (tagTenant.FullName != "tenant") continue;
MarkupAttribute attTenantID = tagTenant.Attributes["id"];
MarkupAttribute attTenantName = tagTenant.Attributes["name"];
if (attTenantID == null) continue;
Guid id = new Guid(attTenantID.Value);
MochaTenant tenant = mcl.Tenants[id];
if (tenant == null)
{
tenant = new MochaTenant();
tenant.ID = id;
mcl.Tenants.Add(tenant);
}
if (tenant.Name == null && attTenantName != null)
{
tenant.Name = attTenantName.Value;
}
MarkupTagElement tagLibraryReferences = tagTenant.Elements["libraryReferences"] as MarkupTagElement;
if (tagLibraryReferences != null)
{
foreach (MarkupTagElement tagLibraryReference in tagLibraryReferences.Elements.OfType<MarkupTagElement>())
{
MarkupAttribute attLibraryId = tagLibraryReference.Attributes["libraryId"];
if (attLibraryId == null) continue;
tenant.LibraryReferences.Add(new Guid(attLibraryId.Value));
}
}
MarkupTagElement tagInstances = tagTenant.Elements["instances"] as MarkupTagElement;
if (tagInstances != null)
{
foreach (MarkupTagElement tagInstance in tagInstances.Elements.OfType<MarkupTagElement>())
{
MochaInstance inst = LoadInstance(tenant, tagInstance);
tenant.Instances.Add(inst);
}
}
}
}
}
private MochaInstance ZqCompileMethod(IMochaStore library, MarkupTagElement tag)
{
MochaInstance inst = null;
MarkupAttribute attID = tag.Attributes["id"];
if (attID == null)
return null;
Guid id = new Guid(attID.Value);
Console.Error.WriteLine("zq: compiling method {0}", id);
MarkupAttribute attType = tag.Attributes["type"];
MarkupAttribute attName = tag.Attributes["name"];
MarkupAttribute attVerb = tag.Attributes["verb"];
if (attName == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "Missing 'name' attribute for method definition", "MCX0101", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber, "Method Compiler");
}
if (attVerb == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "Missing 'verb' attribute for method definition", "MCX0101", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber, "Method Compiler");
}
if (attType != null)
{
switch (attType.Value)
{
case "getAttribute":
{
inst = ZqCreateInstance(library, id, global::Mocha.Core.KnownInstanceGuids.MethodClasses.GetAttributeMethod);
break;
}
case "getInstanceSetBySystemRoutine":
{
inst = ZqCreateInstance(library, id, global::Mocha.Core.KnownInstanceGuids.MethodClasses.GetInstanceSetBySystemRoutineMethod);
break;
}
case "conditionalSelectAttribute":
{
inst = ZqCreateInstance(library, id, global::Mocha.Core.KnownInstanceGuids.MethodClasses.ConditionalSelectAttributeMethod);
if (!(tag.Elements["cases"] is MarkupTagElement tagCases))
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "Missing 'cases' element for SAC - Conditional Select Attribute Method", "MCX0101", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber, "Method Compiler");
}
else
{
foreach (MarkupElement elCase in tagCases.Elements)
{
MarkupTagElement tagCase = (elCase as MarkupTagElement);
if (tagCase == null) continue;
if (tagCase.FullName != "case") continue;
Guid caseId;
MarkupAttribute attCaseId = tagCase.Attributes["id"];
if (attCaseId != null)
{
caseId = Guid.Parse(attCaseId.Value);
}
MochaInstance instCase = ZqCreateInstance(library, caseId, KnownInstanceGuids.Classes.ConditionalEvaluationCase);
MarkupAttribute attUseAnyCondition = tagCase.Attributes["useAnyCondition"];
bool useAnyCondition = false;
if (attUseAnyCondition != null)
{
useAnyCondition = Boolean.Parse(attUseAnyCondition.Value);
}
MarkupAttribute attReturnAttributeMethodBindingId = tagCase.Attributes["returnAttributeMethodBindingId"];
MarkupTagElement tagTrueConditions = tagCase.Elements["trueConditions"] as MarkupTagElement;
MarkupTagElement tagFalseConditions = tagCase.Elements["falseConditions"] as MarkupTagElement;
ZqAssignAttribute(instCase, KnownAttributeGuids.Boolean.UseAnyCondition, useAnyCondition);
if (attReturnAttributeMethodBindingId != null)
{
Guid returnAttributeMethodId = Guid.Parse(attReturnAttributeMethodBindingId.Value);
ZqAssignRelationship(library, instCase.ID, KnownRelationshipGuids.Conditional_Method_Case__has_return_attribute__Method_Binding, new Guid[] { returnAttributeMethodId });
}
List<Guid> listTrueConditionsGuids = new List<Guid>();
List<Guid> listFalseConditionsGuids = new List<Guid>();
if (tagTrueConditions != null)
{
for (int j = 0; j < tagTrueConditions.Elements.Count; j++)
{
MarkupTagElement tagInstanceReference = tagTrueConditions.Elements[j] as MarkupTagElement;
if (tagInstanceReference == null) continue;
if (tagInstanceReference.FullName != "instanceReference") continue;
MarkupAttribute attInstanceId = tagInstanceReference.Attributes["instanceId"];
if (attInstanceId == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "instance ID not specified for relationship target instance", "MCX0107", tag.ParentObjectModel.Accessor.GetFileName(), tagInstanceReference.Definition.LineNumber, tagInstanceReference.Definition.ColumnNumber);
continue;
}
if (Guid.TryParse(attInstanceId.Value, out Guid instId))
{
listTrueConditionsGuids.Add(instId);
}
}
}
if (tagFalseConditions != null)
{
for (int j = 0; j < tagFalseConditions.Elements.Count; j++)
{
MarkupTagElement tagInstanceReference = tagFalseConditions.Elements[j] as MarkupTagElement;
if (tagInstanceReference == null) continue;
if (tagInstanceReference.FullName != "instanceReference") continue;
MarkupAttribute attInstanceId = tagInstanceReference.Attributes["instanceId"];
if (attInstanceId == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "instance ID not specified for relationship target instance", "MCX0107", tag.ParentObjectModel.Accessor.GetFileName(), tagInstanceReference.Definition.LineNumber, tagInstanceReference.Definition.ColumnNumber);
continue;
}
if (Guid.TryParse(attInstanceId.Value, out Guid instId))
{
listFalseConditionsGuids.Add(instId);
}
}
}
ZqAssignRelationship(library, instCase.ID, KnownRelationshipGuids.Conditional_Method_Case__has_true_condition__Method_Binding, listTrueConditionsGuids.ToArray());
ZqAssignRelationship(library, instCase.ID, KnownRelationshipGuids.Conditional_Method_Case__has_false_condition__Method_Binding, listFalseConditionsGuids.ToArray());
ZqAssignRelationship(library, inst.ID, KnownRelationshipGuids.Conditional_Method__has__Conditional_Method_Case, new Guid[] { instCase.ID });
ZqAssignRelationship(library, instCase.ID, KnownRelationshipGuids.Conditional_Method_Case__for__Conditional_Method, new Guid[] { inst.ID });
}
}
break;
}
default:
{
Console.Error.WriteLine("unknown ZQ method type {0}; ignoring", attType.Value);
break;
}
}
if (inst != null)
{
if (attName != null)
{
ZqAssignAttribute(inst, global::Mocha.Core.KnownAttributeGuids.Text.Name, attName.Value);
}
if (attVerb != null)
{
ZqAssignAttribute(inst, global::Mocha.Core.KnownAttributeGuids.Text.Verb, attVerb.Value);
}
SetupInstanceWithXML(library, inst, tag);
}
}
return inst;
}
private void ZqAssignAttribute(MochaInstance inst, Guid attributeInstanceId, object value)
{
inst.AttributeValues.Add(new MochaAttributeValue() { AttributeInstanceID = attributeInstanceId, Value = value });
}
private MochaInstance ZqCompileRelationship(IMochaStore library, MarkupTagElement tag)
{
MarkupAttribute attID = tag.Attributes["id"];
Guid instanceId = new Guid(attID.Value);
Console.Error.WriteLine("zq: compiling relationship {0}", instanceId);
MochaInstance inst = ZqCreateInstance(library, instanceId);
MarkupAttribute attSourceClassId = tag.Attributes["sourceClassId"];
MarkupAttribute attType = tag.Attributes["type"];
MarkupAttribute attDestinationClassId = tag.Attributes["destinationClassId"];
MarkupAttribute attSiblingRelationshipId = tag.Attributes["siblingRelationshipId"];
MarkupAttribute attSingular = tag.Attributes["singular"];
bool singular = false;
if (attSingular != null)
{
if (!Boolean.TryParse(attSingular.Value, out singular))
{
return null;
}
ZqAssignAttribute(inst, global::Mocha.Core.KnownAttributeGuids.Boolean.Singular, singular);
}
if (attType != null)
{
ZqAssignAttribute(inst, global::Mocha.Core.KnownAttributeGuids.Text.RelationshipType, attType.Value);
}
Guid sourceClassId, destinationClassId, siblingRelationshipId;
if (attSourceClassId != null)
{
if (Guid.TryParse(attSourceClassId.Value, out sourceClassId))
{
ZqAssignRelationship(library, instanceId, global::Mocha.Core.KnownRelationshipGuids.Relationship__has_source__Class, new Guid[] { sourceClassId });
}
else
{
}
}
if (attDestinationClassId != null)
{
if (Guid.TryParse(attDestinationClassId.Value, out destinationClassId))
{
ZqAssignRelationship(library, instanceId, global::Mocha.Core.KnownRelationshipGuids.Relationship__has_destination__Class, new Guid[] { destinationClassId });
}
else
{
}
}
if (attSiblingRelationshipId != null)
{
if (Guid.TryParse(attSiblingRelationshipId.Value, out siblingRelationshipId))
{
ZqAssignRelationship(library, instanceId, global::Mocha.Core.KnownRelationshipGuids.Relationship__has_sibling__Relationship, new Guid[] { siblingRelationshipId });
}
else
{
}
}
library.Relationships.Add(new MochaRelationship() { SourceInstanceID = sourceClassId, RelationshipInstanceID = KnownRelationshipGuids.Class__has__Relationship, DestinationInstanceIDs = new List<Guid>(new Guid[] { inst.ID }) });
SetParentClass(library, instanceId, global::Mocha.Core.KnownInstanceGuids.Classes.Relationship);
return inst;
}
private MochaInstance ZqCompileClass(IMochaStore library, MarkupTagElement tag)
{
MarkupAttribute attID = tag.Attributes["id"];
Guid instanceId = new Guid(attID.Value);
Console.Error.WriteLine("zq: compiling class {0}", instanceId);
MochaInstance inst = ZqCreateInstance(library, instanceId);
MarkupTagElement tagMethods = tag.Elements["methods"] as MarkupTagElement;
if (tagMethods != null)
{
foreach (MarkupElement elMethod in tagMethods.Elements)
{
MochaInstance instMethod = ZqCompileMethod(library, elMethod as MarkupTagElement);
if (instMethod != null)
{
ZqAssignRelationship(library, inst.ID, global::Mocha.Core.KnownRelationshipGuids.Class__has__Method, new Guid[] { instMethod.ID });
ZqAssignRelationship(library, instMethod.ID, global::Mocha.Core.KnownRelationshipGuids.Method__for__Class, new Guid[] { inst.ID });
}
}
}
SetParentClass(library, instanceId, global::Mocha.Core.KnownInstanceGuids.Classes.Class);
MarkupAttribute attSuperClassId = tag.Attributes["superClassId"];
if (attSuperClassId != null)
{
if (Guid.TryParse(tag.Attributes["superClassId"].Value, out Guid superClassId))
{
SetSuperClass(library, instanceId, superClassId);
}
}
else
{
SetSuperClass(library, instanceId, global::Mocha.Core.KnownInstanceGuids.Classes.Class);
}
SetOwner(library, inst.ID, global::Mocha.Core.KnownInstanceGuids.Users.XQEnvironments);
SetSource(library, inst.ID, library.DefaultObjectSourceID); // global::Mocha.Core.KnownInstanceGuids.ObjectSources.System);
SetupInstanceWithXML(library, inst, tag);
return inst;
}
private MochaInstance ZqCreateInstance(IMochaStore library, Guid instanceId, Guid classInstanceId = default(Guid))
{
MochaInstance inst = library.Instances[instanceId];
if (inst == null)
{
inst = new MochaInstance();
inst.ID = instanceId;
library.Instances.Add(inst);
}
if (classInstanceId != default(Guid))
{
SetParentClass(library, instanceId, classInstanceId);
}
return inst;
}
private MochaLibrary LoadLibrary(MochaClassLibraryObjectModel parent, MarkupTagElement tag)
{
if (tag == null) return null;
if (tag.FullName != "library") return null;
MarkupAttribute attGuid = tag.Attributes["id"];
if (attGuid == null) return null;
Guid id = new Guid(attGuid.Value);
MochaLibrary library = parent.Libraries[id];
if (library == null)
{
library = new MochaLibrary();
library.ID = id;
}
MarkupAttribute attDefaultObjectSourceId = tag.Attributes["defaultObjectSourceId"];
if (attDefaultObjectSourceId != null)
{
library.DefaultObjectSourceID = new Guid(attDefaultObjectSourceId.Value);
}
else
{
library.DefaultObjectSourceID = global::Mocha.Core.KnownInstanceGuids.ObjectSources.System;
}
MarkupTagElement tagMetadata = tag.Elements["metadata"] as MarkupTagElement;
if (tagMetadata != null)
{
for (int i = 0; i < tagMetadata.Elements.Count; i++)
{
MarkupTagElement tagMetadataItem = tagMetadata.Elements[i] as MarkupTagElement;
if (tagMetadataItem == null) continue;
library.Metadata.Add(new MochaLibraryMetadata(tagMetadataItem.Name, tagMetadataItem.Value));
}
}
MarkupTagElement tagLibraryReferences = tag.Elements["libraryReferences"] as MarkupTagElement;
if (tagLibraryReferences != null)
{
foreach (MarkupTagElement tagLibraryReference in tagLibraryReferences.Elements.OfType<MarkupTagElement>())
{
MarkupAttribute attLibraryId = tagLibraryReference.Attributes["libraryId"];
if (attLibraryId == null) continue;
library.LibraryReferences.Add(new Guid(attLibraryId.Value));
}
}
MarkupTagElement tagInstances = tag.Elements["instances"] as MarkupTagElement;
if (tagInstances != null)
{
for (int i = 0; i < tagInstances.Elements.Count; i++)
{
MochaInstance inst = LoadInstance(library, tagInstances.Elements[i] as MarkupTagElement);
if (inst == null) continue;
library.Instances.Add(inst);
}
}
return library;
}
private MochaInstance LoadInstance(IMochaStore library, MarkupTagElement tag)
{
if (tag == null) return null;
MarkupAttribute attID = tag.Attributes["id"];
string strInstanceId = attID?.Value;
if (strInstanceId == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "Missing GUID for instance declaration", "MCX0101", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber, "Instance Loader");
return null;
}
Guid instanceId;
if (!Guid.TryParse(strInstanceId, out instanceId))
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, String.Format("Invalid GUID for instance declaration '{0}'", strInstanceId), "MCX0101", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber, "Instance Loader");
return null;
}
MochaInstance inst = library.Instances[instanceId];
if (tag.FullName == "class")
{
inst = ZqCompileClass(library, tag);
return inst;
}
else if (tag.FullName == "method")
{
inst = ZqCompileMethod(library, tag);
return inst;
}
else if (tag.FullName == "relationship")
{
inst = ZqCompileRelationship(library, tag);
return inst;
}
else if (tag.FullName == "instanceSet")
{
inst = ZqCompileInstanceSet(library, tag);
return inst;
}
if (inst == null)
{
inst = new MochaInstance();
inst.ID = instanceId;
}
if (tag.FullName != "instance")
{
Console.Error.WriteLine("unhandled preprocess instance tag type '{0}'", tag.FullName);
return null;
}
MarkupAttribute attIndex = tag.Attributes["index"];
int? index = null;
if (attIndex != null)
{
if (Int32.TryParse(attIndex.Value, out int index2))
index = index2;
}
MarkupAttribute attClassInstanceId = tag.Attributes["classInstanceId"];
MarkupAttribute attSuperClassId = tag.Attributes["superClassId"];
inst.Index = index;
if (inst.Index != null)
{
SetIndex(library, inst);
}
if (attClassInstanceId != null)
{
if (Guid.TryParse(attClassInstanceId.Value, out Guid classInstanceId))
{
SetParentClass(library, inst.ID, classInstanceId);
}
else
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, String.Format("Bad GUID for classInstanceId: {0}", attClassInstanceId.Value), "MCX0102", tag.ParentObjectModel.Accessor.GetFileName(), attClassInstanceId.Definition.LineNumber, attClassInstanceId.Definition.ColumnNumber);
}
}
if (attSuperClassId != null)
{
if (Guid.TryParse(attSuperClassId.Value, out Guid superClassId))
{
Console.Error.WriteLine("creating class {0} inherits {1}", instanceId, superClassId);
SetClass(library, inst.ID);
SetOwner(library, inst.ID, global::Mocha.Core.KnownInstanceGuids.Users.XQEnvironments);
SetSource(library, inst.ID, library.DefaultObjectSourceID); // global::Mocha.Core.KnownInstanceGuids.ObjectSources.System);
SetSuperClass(library, inst.ID, superClassId);
}
else
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, String.Format("Bad GUID for superClassId '{0}'", attSuperClassId.Value), "MCX0902", tag.ParentObjectModel.Accessor.GetFileName(), attSuperClassId.Definition.LineNumber, attSuperClassId.Definition.ColumnNumber);
}
}
if (attClassInstanceId == null && attSuperClassId == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Warning, String.Format("neither classInstanceId nor superClassId specified for instance: {0}", inst.ID), "MCX0302", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber);
}
SetupInstanceWithXML(library, inst, tag);
return inst;
}
private MochaInstance ZqCompileInstanceSet(IMochaStore library, MarkupTagElement tag)
{
MarkupAttribute attID = tag.Attributes["id"];
Guid instanceId = new Guid(attID.Value);
MochaInstance instSet = ZqCreateInstance(library, instanceId, KnownInstanceGuids.Classes.InstanceSet);
MarkupTagElement tagInstances = (tag.Elements["instances"] as MarkupTagElement);
if (tagInstances != null)
{
MochaRelationship relInstanceSetHasInstance = new MochaRelationship() { SourceInstanceID = instSet.ID, RelationshipInstanceID = KnownRelationshipGuids.Instance_Set__has__Instance };
foreach (MarkupElement el in tagInstances.Elements)
{
MarkupTagElement tag1 = (el as MarkupTagElement);
if (tag1 == null) continue;
if (tag1.FullName != "instanceReference") continue;
MarkupAttribute attInstRefId = tag1.Attributes["instanceId"];
if (attInstRefId == null) continue;
if (Guid.TryParse(attInstRefId.Value, out Guid instRefId))
{
relInstanceSetHasInstance.DestinationInstanceIDs.Add(instRefId);
}
}
library.Relationships.Add(relInstanceSetHasInstance);
}
return instSet;
}
public bool WriteDebugInfo { get; set; } = true;
private void SetupInstanceWithXML(IMochaStore library, MochaInstance inst, MarkupTagElement tag)
{
if (WriteDebugInfo)
{
SetupInstanceWithXML__DebugInfo(library, inst, tag);
}
MarkupTagElement tagAttributeValues = tag.Elements["attributeValues"] as MarkupTagElement;
if (tagAttributeValues != null)
{
for (int i = 0; i < tagAttributeValues.Elements.Count; i++)
{
MochaAttributeValue attv = LoadAttributeValue(tagAttributeValues.Elements[i] as MarkupTagElement);
if (attv == null) continue;
inst.AttributeValues.Add(attv);
}
}
MarkupTagElement tagRelationships = tag.Elements["relationships"] as MarkupTagElement;
if (tagRelationships != null && tagRelationships.Elements.Count > 0)
{
for (int i = 0; i < tagRelationships.Elements.Count; i++)
{
MarkupTagElement tagRelationship = tagRelationships.Elements[i] as MarkupTagElement;
if (tagRelationship == null) continue;
if (tagRelationship.FullName != "relationship") continue;
MarkupAttribute attRelationshipInstanceId = tagRelationship.Attributes["relationshipInstanceId"];
string relationshipInstanceId = attRelationshipInstanceId?.Value;
if (String.IsNullOrEmpty(relationshipInstanceId))
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "relationshipInstanceId not specified for relationship", "MCX0902", tagRelationship.ParentObjectModel.Accessor.GetFileName(), tagRelationship.Definition.LineNumber, tagRelationship.Definition.ColumnNumber);
continue;
}
MochaRelationship rel = new MochaRelationship();
rel.SourceInstanceID = inst.ID;
if (Guid.TryParse(attRelationshipInstanceId.Value, out Guid id))
{
rel.RelationshipInstanceID = id;
}
else
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, String.Format("invalid GUID for relationship with instanceID '{0}'", attRelationshipInstanceId.Value), "MCX0903", tagRelationship.ParentObjectModel.Accessor.GetFileName(), tagRelationship.Definition.LineNumber, tagRelationship.Definition.ColumnNumber);
}
MarkupTagElement tagTargetInstances = tagRelationship.Elements["targetInstances"] as MarkupTagElement;
if (tagTargetInstances != null)
{
MarkupTagElement[] tagTargetInstancesElems = tagTargetInstances.GetElementsByTagName("instanceReference");
if (tagTargetInstancesElems.Length == 0)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Warning, "empty targetInstances for relationship", "MCX0901", tag.ParentObjectModel.Accessor.GetFileName(), tagTargetInstances.Definition.LineNumber, tagTargetInstances.Definition.ColumnNumber);
}
for (int j = 0; j < tagTargetInstancesElems.Length; j++)
{
MarkupTagElement tagInstanceReference = tagTargetInstancesElems[j] as MarkupTagElement;
if (tagInstanceReference == null) continue;
if (tagInstanceReference.FullName != "instanceReference") continue;
MarkupAttribute attInstanceId = tagInstanceReference.Attributes["instanceId"];
if (attInstanceId == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "instance ID not specified for relationship target instance", "MCX0107", tag.ParentObjectModel.Accessor.GetFileName(), tagInstanceReference.Definition.LineNumber, tagInstanceReference.Definition.ColumnNumber);
continue;
}
global::Mocha.Core.RelationshipKey thisRelKey = new global::Mocha.Core.RelationshipKey(rel.RelationshipInstanceID, global::Mocha.Core.KnownRelationshipGuids.Relationship__has_sibling__Relationship);
MochaRelationship siblingRelationship = library.Relationships[thisRelKey]; // FindRelationship(library, thisRelKey);
// FIXME: in order to link sibling relationships, we must be able to read all referenced libraries in at once
// this might be a job for the compiler...
if (Guid.TryParse(attInstanceId.Value, out Guid instId))
{
if (siblingRelationship != null)
{
global::Mocha.Core.RelationshipKey keysib = new global::Mocha.Core.RelationshipKey(instId, siblingRelationship.DestinationInstanceIDs[0]);
MochaRelationship relsib = library.Relationships[keysib];
if (relsib == null)
{
relsib = new MochaRelationship();
relsib.SourceInstanceID = keysib.SourceInstanceID;
relsib.RelationshipInstanceID = keysib.RelationshipID;
relsib.DestinationInstanceIDs.Add(inst.ID);
library.Relationships.Add(relsib);
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Message, String.Format("sibling relationship found empty {0} : {1}", siblingRelationship.SourceInstanceID, siblingRelationship.DestinationInstanceIDs[0]), "MCX0712", tagInstanceReference.ParentObjectModel.Accessor.GetFileName(), tagInstanceReference.Definition.LineNumber, tagInstanceReference.Definition.ColumnNumber);
}
else
{
Console.Error.WriteLine("sibling relationship found with targets {0} : {1} ", siblingRelationship.SourceInstanceID, siblingRelationship.DestinationInstanceIDs[0]);
}
}
else
{
Console.Error.WriteLine("no sibling relationship found for relationship {0}", rel.RelationshipInstanceID.ToString("B"));
}
rel.DestinationInstanceIDs.Add(instId);
}
else
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, String.Format("Bad GUID for instanceReference: {0}", attInstanceId.Value), "MCX0102", tag.ParentObjectModel.Accessor.GetFileName(), attInstanceId.Definition.LineNumber, attInstanceId.Definition.ColumnNumber);
}
}
}
else
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Warning, "missing targetInstances for relationship", "MCX0903", tagRelationship.ParentObjectModel.Accessor.GetFileName(), tagRelationship.Definition.LineNumber, tagRelationship.Definition.ColumnNumber);
}
library.Relationships.Add(rel);
}
}
else if (tagRelationships != null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Warning, "no 'relationship' tags specified in 'relationships' element", "MCX0909", tagRelationships.ParentObjectModel.Accessor.GetFileName(), tagRelationships.Definition.LineNumber, tagRelationships.Definition.ColumnNumber);
}
SetupInstanceWithXML__Translations(library, tag, inst);
SetupInstanceWithXML__IntegrationIDs(library, tag, inst);
if (tagAttributeValues == null && tagRelationships == null && (tag.Elements["translations"] as MarkupTagElement) == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Warning, String.Format("no attributes, relationships, or translations specified for instance '{0}'", inst.ID), "MCX0301", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber);
}
}
private void SetupInstanceWithXML__DebugInfo(IMochaStore library, MochaInstance inst, MarkupTagElement tag)
{
Guid guidDebugDefinition = Guid.NewGuid();
MochaInstance instDebugDefinition = ZqCreateInstance(library, guidDebugDefinition, KnownInstanceGuids.Classes.InstanceDefinition);
ZqAssignAttribute(instDebugDefinition, KnownAttributeGuids.Text.DebugDefinitionFileName, tag.ParentObjectModel.Accessor.GetFileName());
ZqAssignAttribute(instDebugDefinition, KnownAttributeGuids.Numeric.DebugDefinitionLineNumber, tag.Definition.LineNumber);
ZqAssignAttribute(instDebugDefinition, KnownAttributeGuids.Numeric.DebugDefinitionColumnNumber, tag.Definition.ColumnNumber);
ZqAssignRelationship(library, inst.ID, KnownRelationshipGuids.Instance__has__Instance_Definition, new Guid[] { instDebugDefinition.ID });
}
private void SetupInstanceWithXML__Translations(IMochaStore library, MarkupTagElement tag, MochaInstance inst)
{
MarkupTagElement tagTranslations = tag.Elements["translations"] as MarkupTagElement;
if (tagTranslations != null)
{
for (int i = 0; i < tagTranslations.Elements.Count; i++)
{
MarkupTagElement tagTranslation = (tagTranslations.Elements[i] as MarkupTagElement);
if (tagTranslation == null) continue;
if (tagTranslation.FullName != "translation") continue;
MarkupAttribute attRelationshipId = tagTranslation.Attributes["relationshipInstanceId"];
if (attRelationshipId == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "missing 'relationshipInstanceId' attribute for 'translation' element", "MCX0701", tagTranslation.ParentObjectModel.Accessor.GetFileName(), tagTranslation.Definition.LineNumber, tagTranslation.Definition.ColumnNumber);
continue;
}
MarkupTagElement tagTranslationValues = (tagTranslation.Elements["translationValues"] as MarkupTagElement);
if (tagTranslationValues == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "missing 'translationValues' subelement for 'translation' element", "MCX0702", tagTranslation.ParentObjectModel.Accessor.GetFileName(), tagTranslation.Definition.LineNumber, tagTranslation.Definition.ColumnNumber);
continue;
}
Guid relationshipInstanceId;
if (!Guid.TryParse(attRelationshipId.Value, out relationshipInstanceId))
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "invalid 'relationshipInstanceId' attribute for 'translation' element", "MCX0703", tagTranslation.ParentObjectModel.Accessor.GetFileName(), attRelationshipId.Definition.LineNumber, attRelationshipId.Definition.ColumnNumber);
continue;
}
MochaInstance instTTC = new MochaInstance();
instTTC.ID = Guid.NewGuid();
SetParentClass(library, instTTC.ID, global::Mocha.Core.KnownInstanceGuids.Classes.Translation);
MochaRelationship relInstance__has__Translatable_Text_Constant = new MochaRelationship();
relInstance__has__Translatable_Text_Constant.SourceInstanceID = inst.ID;
relInstance__has__Translatable_Text_Constant.RelationshipInstanceID = relationshipInstanceId;
relInstance__has__Translatable_Text_Constant.DestinationInstanceIDs.Add(instTTC.ID);
library.Relationships.Add(relInstance__has__Translatable_Text_Constant);
MochaRelationship relTranslatable_Text_Constant__has__Translatable_Text_Constant_Value = new MochaRelationship();
relTranslatable_Text_Constant__has__Translatable_Text_Constant_Value.SourceInstanceID = instTTC.ID;
relTranslatable_Text_Constant__has__Translatable_Text_Constant_Value.RelationshipInstanceID = global::Mocha.Core.KnownRelationshipGuids.Translation__has__Translation_Value;
if (tagTranslationValues.Elements.Count == 0)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Warning, "no translation values defined for translation element", "MCX0702", tagTranslationValues.ParentObjectModel.Accessor.GetFileName(), tagTranslationValues.Definition.LineNumber, tagTranslationValues.Definition.ColumnNumber);
}
for (int j = 0; j < tagTranslationValues.Elements.Count; j++)
{
MarkupTagElement tagTranslationValue = (tagTranslationValues.Elements[j] as MarkupTagElement);
if (tagTranslationValue?.FullName != "translationValue")
{
continue;
}
MarkupAttribute attLanguageInstanceID = tagTranslationValue.Attributes["languageInstanceId"];
MarkupAttribute attValue = tagTranslationValue.Attributes["value"];
if (attLanguageInstanceID == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "missing 'languageInstanceId' attribute for translation value", "MCX0702", tagTranslationValue.ParentObjectModel.Accessor.GetFileName(), tagTranslationValue.Definition.LineNumber, tagTranslationValue.Definition.ColumnNumber);
continue;
}
if (attValue == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "missing 'value' attribute for translation value", "MCX0702", tagTranslationValue.ParentObjectModel.Accessor.GetFileName(), tagTranslationValue.Definition.LineNumber, tagTranslationValue.Definition.ColumnNumber);
continue;
}
Guid languageInstanceId;
if (!Guid.TryParse(attLanguageInstanceID?.Value, out languageInstanceId))
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "invalid language instance ID for translation value", "MCX0705", tagTranslationValue.ParentObjectModel.Accessor.GetFileName(), tagTranslationValue.Definition.LineNumber, tagTranslationValue.Definition.ColumnNumber);
continue;
}
// create a new TTCValue instance
MochaInstance instTranslationValue = new MochaInstance();
instTranslationValue.ID = Guid.NewGuid();
SetParentClass(library, instTranslationValue.ID, global::Mocha.Core.KnownInstanceGuids.Classes.TranslationValue);
// associate the TTCValue with the Language
MochaRelationship relTranslatable_Text_Constant_Value__has__Language = new MochaRelationship();
relTranslatable_Text_Constant_Value__has__Language.SourceInstanceID = instTranslationValue.ID;
relTranslatable_Text_Constant_Value__has__Language.RelationshipInstanceID = global::Mocha.Core.KnownRelationshipGuids.Translation_Value__has__Language;
relTranslatable_Text_Constant_Value__has__Language.DestinationInstanceIDs.Add(new Guid(attLanguageInstanceID.Value));
library.Relationships.Add(relTranslatable_Text_Constant_Value__has__Language);
// set the Value attribute of the TTCValue
MochaAttributeValue mavValue = new MochaAttributeValue();
mavValue.AttributeInstanceID = global::Mocha.Core.KnownAttributeGuids.Text.Value;
mavValue.Value = attValue.Value;
instTranslationValue.AttributeValues.Add(mavValue);
// add the TTCValue to the instance list
library.Instances.Add(instTranslationValue);
// add the TTCValue to the TTC.has TTC Value relationship
relTranslatable_Text_Constant__has__Translatable_Text_Constant_Value.DestinationInstanceIDs.Add(instTranslationValue.ID);
}
library.Relationships.Add(relTranslatable_Text_Constant__has__Translatable_Text_Constant_Value);
library.Instances.Add(instTTC);
}
}
}
private void SetupInstanceWithXML__IntegrationIDs(IMochaStore library, MarkupTagElement tag, MochaInstance inst)
{
MarkupTagElement tagIntegrationIDs = (tag.Elements["integrationIds"] as MarkupTagElement);
if (tagIntegrationIDs != null)
{
IEnumerable<MarkupTagElement> tagIntegrationIDsElems = tagIntegrationIDs.Elements.OfType<MarkupTagElement>();
if (!tagIntegrationIDsElems.Any())
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Warning, String.Format("no 'integrationId' elements specified in 'integrationIds' for instance '{0}'", inst.ID.ToString("B")), "MCX0706", tagIntegrationIDs.ParentObjectModel.Accessor.GetFileName(), tagIntegrationIDs.Definition.LineNumber, tagIntegrationIDs.Definition.ColumnNumber);
}
else
{
foreach (MarkupTagElement tagIntegrationID in tagIntegrationIDsElems)
{
Guid id, typeId;
MarkupAttribute attValue = tagIntegrationID.Attributes["value"];
if (attValue == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "no 'value' attribute specified for integrationId", "MCX0713", tagIntegrationID.ParentObjectModel.Accessor.GetFileName(), tagIntegrationID.Definition.LineNumber, tagIntegrationID.Definition.ColumnNumber);
continue;
}
MarkupAttribute attIntegrationIDTypeID = tagIntegrationID.Attributes["typeId"];
if (!Guid.TryParse(attIntegrationIDTypeID?.Value, out typeId))
{
if (attIntegrationIDTypeID != null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, String.Format("bad GUID '{0}' for integrationId 'typeId' attribute", attIntegrationIDTypeID.Value), "MCX0712", tag.ParentObjectModel.Accessor.GetFileName(), attIntegrationIDTypeID.Definition.LineNumber, attIntegrationIDTypeID.Definition.ColumnNumber);
continue;
}
typeId = Guid.NewGuid();
}
MarkupAttribute attIntegrationIDID = tagIntegrationID.Attributes["id"];
if (!Guid.TryParse(attIntegrationIDID?.Value, out id))
{
if (attIntegrationIDID != null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Warning, String.Format("bad GUID '{0}' for integrationId 'id' attribute", attIntegrationIDID.Value), "MCX0712", tag.ParentObjectModel.Accessor.GetFileName(), attIntegrationIDID.Definition.LineNumber, attIntegrationIDID.Definition.ColumnNumber);
}
id = Guid.NewGuid();
}
MochaInstance instIntegrationID = ZqCreateInstance(library, id, global::Mocha.Core.KnownInstanceGuids.Classes.IntegrationID);
ZqAssignAttribute(instIntegrationID, global::Mocha.Core.KnownAttributeGuids.Text.Value, attValue?.Value);
ZqAssignRelationship(library, id, global::Mocha.Core.KnownRelationshipGuids.Integration_ID__has__Integration_ID_Usage, new Guid[] { typeId });
ZqAssignRelationship(library, typeId, global::Mocha.Core.KnownRelationshipGuids.Integration_ID_Usage__for__Integration_ID, new Guid[] { id });
MarkupAttribute attSingular = tagIntegrationID.Attributes["singular"];
if (attSingular != null)
{
ZqAssignAttribute(instIntegrationID, global::Mocha.Core.KnownAttributeGuids.Text.Value, Boolean.Parse(attSingular?.Value));
}
}
}
}
}
private void SetIndex(IMochaStore library, MochaInstance instance)
{
if (instance.Index == null)
return;
MochaAttributeValue mav = new MochaAttributeValue();
mav.AttributeInstanceID = global::Mocha.Core.KnownAttributeGuids.Numeric.Index;
mav.Value = (decimal) instance.Index.Value;
instance.AttributeValues.Add(mav);
}
private void SetSource(IMochaStore library, Guid instanceId, Guid sourceTypeId)
{
ZqAssignRelationship(library, instanceId, global::Mocha.Core.KnownRelationshipGuids.Class__has__Object_Source, new Guid[] { sourceTypeId });
ZqAssignRelationship(library, sourceTypeId, global::Mocha.Core.KnownRelationshipGuids.Object_Source__for__Class, new Guid[] { instanceId });
}
private void SetOwner(IMochaStore library, Guid instanceId, Guid ownerId)
{
ZqAssignRelationship(library, instanceId, global::Mocha.Core.KnownRelationshipGuids.Class__has_owner__User, new Guid[] { ownerId });
ZqAssignRelationship(library, ownerId, global::Mocha.Core.KnownRelationshipGuids.User__owner_for__Class, new Guid[] { instanceId });
}
private void SetClass(IMochaStore library, Guid id)
{
SetParentClass(library, id, global::Mocha.Core.KnownInstanceGuids.Classes.Class);
}
private void SetSuperClass(IMochaStore library, Guid sourceInstanceID, Guid parentClassID)
{
ZqAssignRelationship(library, sourceInstanceID, global::Mocha.Core.KnownRelationshipGuids.Class__has_super__Class, new Guid[] { parentClassID });
ZqAssignRelationship(library, parentClassID, global::Mocha.Core.KnownRelationshipGuids.Class__has_sub__Class, new Guid[] { sourceInstanceID });
}
private void SetParentClass(IMochaStore library, Guid sourceInstanceID, Guid parentClassID)
{
ZqAssignRelationship(library, sourceInstanceID, global::Mocha.Core.KnownRelationshipGuids.Instance__for__Class, new Guid[] { parentClassID });
ZqAssignRelationship(library, parentClassID, global::Mocha.Core.KnownRelationshipGuids.Class__has__Instance, new Guid[] { sourceInstanceID });
}
private void ZqAssignRelationship(IMochaStore library, Guid sourceInstanceID, Guid relationshipInstanceID, Guid[] destinationInstanceIds)
{
MochaRelationship rel = new MochaRelationship();
rel.SourceInstanceID = sourceInstanceID;
for (int i = 0; i < destinationInstanceIds.Length; i++)
{
rel.DestinationInstanceIDs.Add(destinationInstanceIds[i]);
}
if (!library.Instances.Contains(relationshipInstanceID))
{
// FIXME: this doesn't work because we don't know exactly what libraries we've referenced
// Console.Error.WriteLine("zq: assignRelationship: relationship not found {0}", relationshipInstanceID.ToString("B"));
}
rel.RelationshipInstanceID = relationshipInstanceID;
library.Relationships.Add(rel);
}
private MochaAttributeValue LoadAttributeValue(MarkupTagElement tag)
{
if (tag == null) return null;
if (tag.FullName != "attributeValue") return null;
MarkupAttribute attInstanceID = tag.Attributes["attributeInstanceId"];
MarkupAttribute attValue = tag.Attributes["value"];
if (attInstanceID == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "attributeInstanceId not specified for attributeValue", "MCX0302", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber);
return null;
}
Guid instanceId;
if (!Guid.TryParse(attInstanceID.Value, out instanceId))
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, String.Format("invalid GUID for attributeInstanceId: '{0}'", attInstanceID.Value), "MCX0302", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber);
return null;
}
if (attValue == null)
{
ConsoleExtensions.LogMSBuildMessage(MessageSeverity.Error, "value not specified for attributeValue", "MCX0303", tag.ParentObjectModel.Accessor.GetFileName(), tag.Definition.LineNumber, tag.Definition.ColumnNumber);
return null;
}
MochaAttributeValue item = new MochaAttributeValue();
item.AttributeInstanceID = instanceId;
item.Value = attValue.Value;
return item;
}
protected override void BeforeSaveInternal(Stack<ObjectModel> objectModels)
{
base.BeforeSaveInternal(objectModels);
MochaClassLibraryObjectModel mcl = (objectModels.Pop() as MochaClassLibraryObjectModel);
MarkupObjectModel mom = new MarkupObjectModel();
objectModels.Push(mom);
}
}
}