/// <summary>
/// Correct detected defect based on value in contentCorrect attribute
/// </summary>
/// <param name="element">Defected element</param>
/// <param name="model">Wrapper EA.Repository object</param>
/// <returns>true if correction was successful, else false</returns>
public bool correct(object element, Model model)
{
string[] correctCall = contentCorrect.Split('@');
for (int i = 0; i < correctCall.Length; i++)
{
try
{
if (correctCall[i].StartsWith("setName"))
{
string[] nameExpression = correctCall[i].Split('(', ')')[1].Split('.');
for (int j = 0; j < nameExpression.Length; j++)
{
if (nameExpression[j] == "dict")
{
Dictionary dict = new Dictionary();
if (nameExpression[j + 1].StartsWith("getBaseNoun"))
{
string attributeName = correctCall[i].Split('(', ')')[2];
string value = getStringAttributeValue(element, attributeName);
string word = dict.getBaseNoun(value);
if (word == "")
{
return false;
}
setStringAttributeValue(element, attributeName, word);
try
{
model.adviseChange((new ElementWrapper(model, (EA.Element)element)));
RuleService.active.Remove(getStringAttributeValue(element, "GUID"));
}
catch (Exception ex) { }
return true;
}
}
else
{
setStringAttributeValue(element, attributeType, nameExpression[j]);
try
{
if (element is EA.Connector)
{
model.adviseChange(new ConnectorWrapper(model, (EA.Connector)element));
}
else
{
model.adviseChange(new ElementWrapper(model, (EA.Element)element));
}
}
catch (Exception ex) { }
return true;
}
}
}
if (correctCall[i].StartsWith("setCardinalities"))
{
string nameExpression = correctCall[i].Split('(', ')')[1];
object objectClient = getAttributeValue(element, "ClientEnd");
string cardinalityClient = getStringAttributeValue(objectClient, "Cardinality");
object objectSupplier = getAttributeValue(element, "SupplierEnd");
string cardinalitySupplier = getStringAttributeValue(objectSupplier, "Cardinality");
if (String.IsNullOrEmpty(cardinalityClient))
{
setStringAttributeValue(objectClient, "Cardinality", nameExpression);
}
if (String.IsNullOrEmpty(cardinalitySupplier))
{
setStringAttributeValue(objectSupplier, "Cardinality", nameExpression);
}
try
{
model.adviseChange(new ConnectorWrapper(model, (EA.Connector)element));
}
catch (Exception ex) { }
}
if (correctCall[i].StartsWith("setExtensionPointsCount"))
{
string nameExpression = correctCall[i].Split('(', ')')[1];
if (nameExpression.StartsWith("Connector"))
{
string expr = nameExpression.Split('.')[1];
if (expr == "getStereotypeCount")
{
string stereotype = correctCall[i].Split('(', ')')[2];
int stereotypeCount = 0;
foreach (EA.Connector con in (EA.Collection)getAttributeValue(element, "Connectors"))
{
if (stereotype == con.Stereotype)
{
stereotypeCount++;
}
}
string extensionPoints = getStringAttributeValue(element, attributeType);
int num = Math.Abs(extensionPoints.Count(c => c == ',') - stereotypeCount);
if (num > 1) num--;
for (int k = 0; k < num; k++)
{
extensionPoints += "," + k + 1 + " extension point,";
}
setStringAttributeValue(element, attributeType, extensionPoints);
try
{
model.adviseChange((new ElementWrapper(model, (EA.Element)element)));
RuleService.active.Remove(getStringAttributeValue(element, "GUID"));
}
catch (Exception ex) { }
return true;
}
}
}
if (correctCall[i].StartsWith("setTransitionGuard"))
{
string nameExpression = correctCall[i].Split('(', ')')[1];
setStringAttributeValue(element, attributeType, nameExpression);
try
{
model.adviseChange(new ConnectorWrapper(model, (EA.Connector)element));
}
catch (Exception ex) { }
}
if (correctCall[i] == "createDecisionNode")
{
object owner = getConnectorOwner(element, model, "src");
object target = getConnectorOwner(element, model, "target");
EA.Collection collection = (EA.Collection)getAttributeValue(owner, "Connectors");
EA.Collection elements = model.getWrappedModel().GetPackageByID(Convert.ToInt32(getStringAttributeValue(owner, "PackageID"))).Elements;
EA.Collection connectors = model.getWrappedModel().GetPackageByID(Convert.ToInt32(getStringAttributeValue(owner, "PackageID"))).Connectors;
EA.Element decisionNode = (EA.Element)elements.AddNew("", "Decision");
decisionNode.Update();
elements.Refresh();
EA.Diagram diagram = model.getWrappedModel().GetCurrentDiagram();
EA.DiagramObject ownerDO = new Diagram(model, diagram).getdiagramObjectForElement(new ElementWrapper(model, (EA.Element)owner));
int l = ownerDO.left;
int b = ownerDO.bottom;
string coordinates = "l=" + (l + 20) + "r=" + (l + 60) + "t=" + (b - 50) + "b=" + (b - 90) + ";";
EA.DiagramObject displayElement = (EA.DiagramObject)diagram.DiagramObjects.AddNew(coordinates, "");
displayElement.ElementID = decisionNode.ElementID;
displayElement.Sequence = 1;
displayElement.Update();
diagram.DiagramObjects.Refresh();
diagram.Update();
EA.Connector connector = (EA.Connector)connectors.AddNew("", "ControlFlow");
connectors.Refresh();
connector.ClientID = Convert.ToInt32(getStringAttributeValue(owner, "ElementID"));
connector.SupplierID = decisionNode.ElementID;
connector.Update();
foreach (EA.Connector con in (EA.Collection)getAttributeValue(owner, "Connectors"))
{
if (con.ClientID == ((EA.Element)owner).ElementID)
{
con.ClientID = decisionNode.ElementID;
con.TransitionGuard = "guard";
con.Update();
}
}
model.refreshDiagram(new Diagram(model, diagram));
return true;
}
if (correctCall[i] == "createInitialNode")
{
EA.Diagram diagram = model.getWrappedModel().GetCurrentDiagram();
EA.Collection elements = model.getWrappedModel().GetPackageByID(Convert.ToInt32(getStringAttributeValue(diagram, "PackageID"))).Elements;
EA.Element initialNode = (EA.Element)elements.AddNew("", "StateNode");
initialNode.Subtype = 100;
initialNode.Name = "pociatocny uzol";
initialNode.Update();
elements.Refresh();
EA.DiagramObject displayElement = (EA.DiagramObject)diagram.DiagramObjects.AddNew("l=0;r=0;t=0;b=0;", "");
displayElement.ElementID = initialNode.ElementID;
displayElement.Sequence = 1;
displayElement.Update();
diagram.DiagramObjects.Refresh();
diagram.Update();
model.refreshDiagram(new Diagram(model, diagram));
return true;
}
if (correctCall[i] == "createFinalNode")
{
EA.Diagram diagram = model.getWrappedModel().GetCurrentDiagram();
EA.Collection elements = model.getWrappedModel().GetPackageByID(Convert.ToInt32(getStringAttributeValue(diagram, "PackageID"))).Elements;
EA.Element initialNode = (EA.Element)elements.AddNew("", "StateNode");
initialNode.Subtype = 101;
initialNode.Name = "koncovy uzol";
initialNode.Update();
elements.Refresh();
EA.DiagramObject displayElement = (EA.DiagramObject)diagram.DiagramObjects.AddNew("l=0;r=0;t=0;b=0;", "");
displayElement.ElementID = initialNode.ElementID;
displayElement.Sequence = 1;
displayElement.Update();
diagram.DiagramObjects.Refresh();
diagram.Update();
model.refreshDiagram(new Diagram(model, diagram));
return true;
}
if (correctCall[i] == "addIncludeToScenario")
{
EA.Collection scenarios = (EA.Collection)getAttributeValue(element, "Scenarios");
EA.Scenario scenario = (EA.Scenario)scenarios.GetAt(0);
XElement xElement = XElement.Parse(scenario.XMLContent);
try
{
EA.Collection connectors = (EA.Collection)getAttributeValue(element, "Connectors");
IEnumerable<XElement> max = from el in xElement.Elements("step") select el;
int maxLevel = max.Max(x => Convert.ToInt32((string)x.Attribute("level")));
foreach (EA.Connector con in connectors)
{
if (con.Stereotype == "include")
{
string targetName = getConnectorOwnerName(con, model, "target");
IEnumerable<XElement> steps = from el in xElement.Elements("step")
where ((string)el.Attribute("name")).Contains(targetName)
select el;
try
{
steps.First();
}
catch (Exception ex)
{
xElement.Add(new XElement("step", new XAttribute("name", "<include> " + targetName), new XAttribute("guid", "{" + Guid.NewGuid().ToString().ToUpper() + "}"),
new XAttribute("level", maxLevel + 1), new XAttribute("uses", ""), new XAttribute("useslist", ""), new XAttribute("result", ""), new XAttribute("state", ""),
new XAttribute("trigger", "0"), new XAttribute("link", "")));
scenario.XMLContent = xElement.ToString();
scenario.Update();
model.adviseChange(new ElementWrapper(model, (EA.Element)element));
return true;
}
}
}
}
catch (Exception ex) { }
}
if (correctCall[i] == "addExtendToScenario")
{
EA.Collection scenarios = (EA.Collection)getAttributeValue(element, "Scenarios");
EA.Scenario scenario = (EA.Scenario)scenarios.GetAt(0);
XElement xElement = XElement.Parse(scenario.XMLContent);
try
{
EA.Collection connectors = (EA.Collection)getAttributeValue(element, "Connectors");
IEnumerable<XElement> max = from el in xElement.Elements("step") select el;
int maxLevel = max.Max(x => Convert.ToInt32((string)x.Attribute("level")));
foreach (EA.Connector con in connectors)
{
if (con.Stereotype == "extend")
{
string sourceName = getConnectorOwnerName(con, model, "src");
IEnumerable<XElement> steps = from el in xElement.Elements("step")
where ((string)el.Attribute("name")).Contains(sourceName)
select el;
try
{
steps.First();
}
catch (Exception ex)
{
xElement.Add(new XElement("step", new XAttribute("name", "<extend> " + sourceName), new XAttribute("guid", "{" + Guid.NewGuid().ToString().ToUpper() + "}"),
new XAttribute("level", maxLevel + 1), new XAttribute("uses", ""), new XAttribute("useslist", ""), new XAttribute("result", ""), new XAttribute("state", ""),
new XAttribute("trigger", "0"), new XAttribute("link", "")));
scenario.XMLContent = xElement.ToString();
scenario.Update();
model.adviseChange(new ElementWrapper(model, (EA.Element)element));
return true;
}
}
}
}
catch (Exception ex) { }
}
if (correctCall[i] == "addIncludeDependency")
{
EA.Collection scenarios = (EA.Collection)getAttributeValue(element, "Scenarios");
EA.Scenario scenario = (EA.Scenario)scenarios.GetAt(0);
XElement xElement = XElement.Parse(scenario.XMLContent);
IEnumerable<XElement> steps = from el in xElement.Elements("step")
where ((string)el.Attribute("name")).ToLowerInvariant().Contains("<include>")
select el;
try
{
EA.Collection connectors = (EA.Collection)getAttributeValue(element, "Connectors");
bool rslt = false;
foreach (XElement e in steps)
{
string name = (string)e.Attribute("name");
if (findElementInCurDiagramtByName(model, name.Substring(name.IndexOf("UC"))) == null)
{
continue;
}
foreach (EA.Connector con in connectors)
{
if (con.Stereotype == "include" && con.ClientID == Convert.ToInt32(getAttributeValue(element, "ElementID")))
{
string targetName = getConnectorOwnerName(con, model, "target");
rslt |= targetName == name.Substring(name.IndexOf("UC"));
}
}
if (!rslt)
{
EA.Element el = findElementInCurDiagramtByName(model, name.Substring(name.IndexOf("UC")));
EA.Collection connectorsPcg = model.getWrappedModel().GetPackageByID(Convert.ToInt32(getStringAttributeValue(element, "PackageID"))).Connectors;
EA.Connector connector = (EA.Connector)connectors.AddNew("", "Dependency");
connector.Stereotype = "include";
connector.ClientID = Convert.ToInt32(getStringAttributeValue(element, "ElementID"));
connector.SupplierID = el.ElementID;
connector.Update();
connectors.Refresh();
model.refreshDiagram(new Diagram(model, model.getWrappedModel().GetCurrentDiagram()));
return true;
}
}
}
catch (Exception ex) { };
}
}
catch (Exception ex) { }
}
return false;
}