El siguiente código de ejemplo se escribe en C# y provee una implementación de la validación del modelo del esquema que puede desear usar como punto de partida al escribir sus propias reglas de validación del modelo.
Main.cs
using System;
namespace myAddin
{
public class Main
{
public Rules theRules;
public Main()
{
theRules = new Rules();
}
public string EA_Connect(EA.Repository Repository)
{
return "";
}
public void EA_Disconnect()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
private bool IsProjectOpen(EA.Repository Repository)
{
try
{
EA.Collection c = Repository.Models;
return true;
}
catch
{
return false;
}
}
public object EA_GetMenuItems(EA.Repository Repository, string MenuLocation, string MenuName)
{
switch (MenuName)
{
case "":
return "-&myAddin";
case "-&myAddin":
string[] ar = { "&Test" };
return ar;
}
return "";
}
public void EA_GetMenuState(EA.Repository Repository, string MenuLocation, string MenuName, string ItemName, ref bool IsEnabled, ref bool IsChecked)
{
// if no open project, disable all menu options
if (IsProjectOpen(Repository))
IsEnabled = true;
else
IsEnabled = false;
}
public void EA_MenuClick(EA.Repository Repository, string MenuLocation, string MenuName, string ItemName)
{
switch (ItemName)
{
case "&Test":
DoTest(Repository);
break;
}
}
public void EA_OnInitializeUserRules(EA.Repository Repository)
{
if (Repository != null)
{
theRules.ConfigureCategories(Repository);
theRules.ConfigureRules(Repository);
}
}
public void EA_OnRunElementRule(EA.Repository Repository, string RuleID, EA.Element element)
{
theRules.RunElementRule(Repository, RuleID, element);
}
public void EA_OnRunDiagramRule(EA.Repository Repository, string RuleID, long lDiagramID)
{
theRules.RunDiagramRule(Repository, RuleID, lDiagramID);
}
public void EA_OnRunConnectorRule(EA.Repository Repository, string RuleID, long lConnectorID)
{
theRules.RunConnectorRule(Repository, RuleID, lConnectorID);
}
public void EA_OnRunAttributeRule(EA.Repository Repository, string RuleID, string AttGUID, long lObjectID)
{
return;
}
public void EA_OnDeleteTechnology(EA.Repository Repository, EA.EventProperties Info)
{
return;
}
public void EA_OnImportTechnology(EA.Repository Repository, EA.EventProperties Info)
{
return;
}
private void DoTest(EA.Repository Rep)
{
// TODO: insert test code here
}
}
}
Rules.cs
using System;
using System.Collections;
namespace myAddin
{
public class Rules
{
private string m_sCategoryID;
private System.Collections.ArrayList m_RuleIDs;
private System.Collections.ArrayList m_RuleIDEx;
private const string cRule01 = "Rule01";
private const string cRule02 = "Rule02";
private const string cRule03 = "Rule03";
// TODO: expand this list as much as necessary
public Rules()
{
m_RuleIDs = new System.Collections.ArrayList();
m_RuleIDEx = new System.Collections.ArrayList();
}
private string LookupMap(string sKey)
{
return DoLookupMap(sKey, m_RuleIDs, m_RuleIDEx);
}
private string LookupMapEx(string sRule)
{
return DoLookupMap(sRule, m_RuleIDEx, m_RuleIDs);
}
private string DoLookupMap(string sKey, ArrayList arrValues, ArrayList arrKeys)
{
if (arrKeys.Contains(sKey))
return arrValues[arrKeys.IndexOf(sKey)].ToString();
else
return "";
}
private void AddToMap(string sRuleID, string sKey)
{
m_RuleIDs.Add(sRuleID);
m_RuleIDEx.Add(sKey);
}
private string GetRuleStr(string sRuleID)
{
switch (sRuleID)
{
case cRule01:
return "Error Message 01";
case cRule02:
return "Error Message 02";
case cRule03:
return "Error Message 03";
// TODO: add extra cases as much as necessary
}
return "";
}
public void ConfigureCategories(EA.Repository Repository)
{
EA.Project Project = Repository.GetProjectInterface();
m_sCategoryID = Project.DefineRuleCategory("Enterprise Collaboration Architecture (ECA) Rules");
}
public void ConfigureRules(EA.Repository Repository)
{
EA.Project Project = Repository.GetProjectInterface();
AddToMap(Project.DefineRule(m_sCategoryID, EA.EnumMVErrorType.mvError, GetRuleStr(cRule01)), cRule01);
AddToMap(Project.DefineRule(m_sCategoryID, EA.EnumMVErrorType.mvError, GetRuleStr(cRule02)), cRule02);
AddToMap(Project.DefineRule(m_sCategoryID, EA.EnumMVErrorType.mvError, GetRuleStr(cRule03)), cRule03);
// TODO: expand this list
}
public void RunConnectorRule(EA.Repository Repository, string sRuleID, long lConnectorID)
{
EA.Connector Connector = Repository.GetConnectorByID((int)lConnectorID);
if (Connector != null)
{
switch (LookupMapEx(sRuleID))
{
case cRule02:
// TODO: perform rule 2 check
break;
// TODO: add more cases
}
}
}
public void RunDiagramRule(EA.Repository Repository, string sRuleID, long lDiagramID)
{
EA.Diagram Diagram = Repository.GetDiagramByID((int)lDiagramID);
if (Diagram != null)
{
switch (LookupMapEx(sRuleID))
{
case cRule03:
// TODO: perform rule 3 check
break;
// TODO: add more cases
}
}
}
public void RunElementRule(EA.Repository Repository, string sRuleID, EA.Element Element)
{
if (Element != null)
{
switch (LookupMapEx(sRuleID))
{
case cRule01:
DoRule01(Repository, Element);
break;
// TODO: add more cases
}
}
}
private void DoRule01(EA.Repository Repository, EA.Element Element)
{
if (Element.Stereotype != "myStereotype")
return;
// TODO: validation logic here
// report validation errors
EA.Project Project = Repository.GetProjectInterface();
Project.PublishResult(LookupMap(cRule01), EA.EnumMVErrorType.mvError, GetRuleStr(cRule01));
}
}
}
|