use of com.archimatetool.model.IArchimateConcept in project archi by archimatetool.
the class CSVImporterTests method testImportRelations.
@Test
public void testImportRelations() throws Exception {
importer.importElements(elements1File);
importer.importRelations(relations1File);
assertEquals(5, importer.newConcepts.size());
IArchimateRelationship relation = (IArchimateRelationship) importer.newConcepts.get("cdbfc933");
assertEquals(IArchimatePackage.eINSTANCE.getAssignmentRelationship(), relation.eClass());
assertEquals("cdbfc933", relation.getId());
assertEquals("Assignment relation", relation.getName());
assertEquals("Assignment documentation\r\nIs here \"hello\"", relation.getDocumentation());
IArchimateConcept source = relation.getSource();
assertNotNull(source);
assertEquals("f00aa5b4", source.getId());
IArchimateConcept target = relation.getTarget();
assertNotNull(target);
assertEquals("f6a18059", target.getId());
relation = (IArchimateRelationship) importer.newConcepts.get("5854f8a3");
assertEquals(IArchimatePackage.eINSTANCE.getCompositionRelationship(), relation.eClass());
assertEquals("5854f8a3", relation.getId());
assertEquals("Compo", relation.getName());
assertEquals("Here it is\r\nagain\r\n\r\n\r\n", relation.getDocumentation());
source = relation.getSource();
assertNotNull(source);
assertEquals("f00aa5b4", source.getId());
target = relation.getTarget();
assertNotNull(target);
assertEquals("d9fe8c17", target.getId());
}
use of com.archimatetool.model.IArchimateConcept in project archi by archimatetool.
the class CSVImporterTests method testImportModelElements.
@Test
public void testImportModelElements() throws Exception {
importer.importElements(elements1File);
assertEquals(3, importer.newConcepts.size());
IArchimateConcept concept = importer.newConcepts.get("f00aa5b4");
assertEquals(IArchimatePackage.eINSTANCE.getBusinessActor(), concept.eClass());
assertEquals("f00aa5b4", concept.getId());
assertEquals("Business Actor", concept.getName());
assertEquals("This is the Business Actor\r\nDocumentation\r\nHere \"\"\r\n", concept.getDocumentation());
concept = importer.newConcepts.get("d9fe8c17");
assertEquals(IArchimatePackage.eINSTANCE.getBusinessInterface(), concept.eClass());
assertEquals("d9fe8c17", concept.getId());
assertEquals("Business Interface", concept.getName());
assertEquals("", concept.getDocumentation());
concept = importer.newConcepts.get("f6a18059");
assertEquals(IArchimatePackage.eINSTANCE.getBusinessRole(), concept.eClass());
assertEquals("f6a18059", concept.getId());
assertEquals("Business Role", concept.getName());
assertEquals("Some more docs\r\nHere\r\n", concept.getDocumentation());
}
use of com.archimatetool.model.IArchimateConcept in project archi by archimatetool.
the class ArchimateDNDEditPolicy method getDropCommand.
@Override
protected Command getDropCommand(DiagramDropRequest request) {
if (!(request.getData() instanceof IStructuredSelection)) {
return null;
}
// XY drop point
Point pt = getDropLocation(request);
int origin = pt.x;
int x = pt.x;
int y = pt.y;
fElementsToAdd = new ArrayList<IArchimateElement>();
fRelationsToAdd = new ArrayList<IArchimateRelationship>();
fDiagramRefsToAdd = new ArrayList<IDiagramModel>();
// Gather an actual list of elements dragged onto the container, omitting duplicates and anything already on the diagram
Object[] objects = ((IStructuredSelection) request.getData()).toArray();
getElementsToAdd(objects);
// Store the Diagram Model Components that will be added in this list
List<IDiagramModelArchimateComponent> diagramComponentsThatWereAdded = new ArrayList<IDiagramModelArchimateComponent>();
// Create a Compound Command - it has to be Non-Notifying or it's too slow (tested with Bill's UoB model!)
CompoundCommand result = new NonNotifyingCompoundCommand(Messages.ArchimateDNDEditPolicy_0);
// Add the Commands adding the Elements first
for (IArchimateElement element : fElementsToAdd) {
// Add Diagram object
IDiagramModelArchimateObject dmo = ArchimateDiagramModelFactory.createDiagramModelArchimateObject(element);
// Set location
dmo.getBounds().setLocation(x, y);
// Store it
diagramComponentsThatWereAdded.add(dmo);
// Add Command
result.add(new AddDiagramObjectCommand(getTargetContainer(), dmo));
// Increase x,y
x += 150;
if (x > origin + 400) {
x = origin;
y += 100;
}
}
// Then any Diagram Model Ref Commands
for (IDiagramModel diagramModel : fDiagramRefsToAdd) {
result.add(new AddDiagramModelReferenceCommand(getTargetContainer(), diagramModel, x, y));
x += 150;
if (x > origin + 400) {
x = origin;
y += 100;
}
}
// Add selected Relations to create connections to those elements on the diagram that don't already have them
for (IArchimateRelationship relation : fRelationsToAdd) {
// Find existing source & target components on the diagram that the new connection will link to
List<IDiagramModelArchimateComponent> sources = DiagramModelUtils.findDiagramModelComponentsForArchimateConcept(getTargetDiagramModel(), relation.getSource());
List<IDiagramModelArchimateComponent> targets = DiagramModelUtils.findDiagramModelComponentsForArchimateConcept(getTargetDiagramModel(), relation.getTarget());
for (IDiagramModelComponent dcSource : sources) {
for (IDiagramModelComponent dcTarget : targets) {
if (dcSource instanceof IConnectable && dcTarget instanceof IConnectable) {
// Add a new connection between dcSource & dcTarget if there isn't already one on the diagram
if (dcTarget != dcSource && !DiagramModelUtils.hasDiagramModelArchimateConnection((IConnectable) dcSource, (IConnectable) dcTarget, relation)) {
// Check that source or target is not a hiden connection
if (!((dcSource instanceof IDiagramModelArchimateConnection && DiagramModelUtils.shouldBeHiddenConnection((IDiagramModelArchimateConnection) dcSource)) || (dcTarget instanceof IDiagramModelArchimateConnection && DiagramModelUtils.shouldBeHiddenConnection((IDiagramModelArchimateConnection) dcTarget)))) {
AddDiagramArchimateConnectionCommand cmd = new AddDiagramArchimateConnectionCommand((IConnectable) dcSource, (IConnectable) dcTarget, relation);
result.add(cmd);
// Store it
diagramComponentsThatWereAdded.add(cmd.getConnection());
}
}
}
}
}
}
// Whether to add connections to elements
Boolean value = (Boolean) request.getExtendedData().get(ArchimateDiagramTransferDropTargetListener.ADD_ELEMENT_CONNECTIONS);
boolean addConnectionsToElements = value != null && value.booleanValue();
// Newly added concepts will need new connections to both existing and newly added concepts
for (IDiagramModelArchimateComponent dmComponent : diagramComponentsThatWereAdded) {
IArchimateConcept archimateConcept = dmComponent.getArchimateConcept();
for (IArchimateRelationship relation : ArchimateModelUtils.getAllRelationshipsForConcept(archimateConcept)) {
/*
* If the user holds down the Copy key (Ctrl on win/lnx, Alt on Mac) then linked connections
* are not added on drag and drop. However, any selected relations' linked objects are added.
*/
if (!addConnectionsToElements && !fRelationsToAdd.contains(relation)) {
continue;
}
// Find existing objects
List<IDiagramModelArchimateComponent> sources = DiagramModelUtils.findDiagramModelComponentsForArchimateConcept(getTargetDiagramModel(), relation.getSource());
List<IDiagramModelArchimateComponent> targets = DiagramModelUtils.findDiagramModelComponentsForArchimateConcept(getTargetDiagramModel(), relation.getTarget());
// Add new ones too
for (IDiagramModelArchimateComponent dmComponent2 : diagramComponentsThatWereAdded) {
if (dmComponent != dmComponent2) {
IArchimateConcept archimateConcept2 = dmComponent2.getArchimateConcept();
if (archimateConcept2 == relation.getSource()) {
// Only need to add sources, not targets
sources.add(dmComponent2);
}
}
}
// Make the Commands...
for (IDiagramModelComponent dcSource : sources) {
if (dcSource instanceof IConnectable && archimateConcept == relation.getTarget()) {
result.add(new AddDiagramArchimateConnectionCommand((IConnectable) dcSource, (IConnectable) dmComponent, relation));
}
}
for (IDiagramModelComponent dcTarget : targets) {
if (dcTarget instanceof IConnectable && archimateConcept == relation.getSource()) {
result.add(new AddDiagramArchimateConnectionCommand((IConnectable) dmComponent, (IConnectable) dcTarget, relation));
}
}
}
}
// Then, if adding to an Archimate container type to create nesting, ask whether to add new relations if none exist...
if (ConnectionPreferences.createRelationWhenAddingModelTreeElement() && getTargetContainer() instanceof IDiagramModelArchimateObject) {
List<IDiagramModelArchimateObject> diagramObjectsThatWereAdded = new ArrayList<IDiagramModelArchimateObject>();
for (IDiagramModelArchimateComponent dmc : diagramComponentsThatWereAdded) {
if (dmc instanceof IDiagramModelArchimateObject) {
diagramObjectsThatWereAdded.add((IDiagramModelArchimateObject) dmc);
}
}
Command cmd = new CreateNestedArchimateConnectionsWithDialogCommand((IDiagramModelArchimateObject) getTargetContainer(), diagramObjectsThatWereAdded);
result.add(cmd);
}
// return the full compound command
return result;
}
use of com.archimatetool.model.IArchimateConcept in project archi by archimatetool.
the class ArchimateDiagramConnectionPolicy method isValidConnection.
/**
* @param source
* @param target
* @param relationshipType
* @return True if valid connection source/target for connection type
*/
static boolean isValidConnection(IConnectable source, IConnectable target, EClass relationshipType) {
/*
* Diagram Connection from/to notes/groups/diagram refs.
* Allowed between notes, visual groups, diagram refs and ArchiMate components
*/
if (relationshipType == IArchimatePackage.eINSTANCE.getDiagramModelConnection()) {
// Not circular
if (source == target) {
return false;
}
// Notes
if (source instanceof IDiagramModelNote || target instanceof IDiagramModelNote) {
return true;
}
// Groups
if (source instanceof IDiagramModelGroup || target instanceof IDiagramModelGroup) {
return !(source instanceof IDiagramModelArchimateComponent) && !(target instanceof IDiagramModelArchimateComponent);
}
// Diagram Refs
if (source instanceof IDiagramModelReference || target instanceof IDiagramModelReference) {
return !(source instanceof IDiagramModelArchimateComponent) && !(target instanceof IDiagramModelArchimateComponent);
}
return false;
}
// Connection from Archimate concept to Archimate concept (but not from relation to relation)
if ((source instanceof IDiagramModelArchimateComponent && target instanceof IDiagramModelArchimateComponent) && !(source instanceof IDiagramModelArchimateConnection && target instanceof IDiagramModelArchimateConnection)) {
// Special case if relationshipType == null. Means that the Magic connector is being used
if (relationshipType == null) {
return true;
}
IArchimateConcept sourceConcept = ((IDiagramModelArchimateComponent) source).getArchimateConcept();
IArchimateConcept targetConcept = ((IDiagramModelArchimateComponent) target).getArchimateConcept();
return ArchimateModelUtils.isValidRelationship(sourceConcept, targetConcept, relationshipType);
}
return false;
}
use of com.archimatetool.model.IArchimateConcept in project archi by archimatetool.
the class ArchimateDiagramConnectionPolicy method getReconnectCommand.
/**
* Create a ReconnectCommand
*/
protected Command getReconnectCommand(ReconnectRequest request, boolean isSourceCommand) {
IDiagramModelConnection connection = (IDiagramModelConnection) request.getConnectionEditPart().getModel();
// The re-connected object
IConnectable newObject = (IConnectable) getHost().getModel();
// Get the type of connection (plain) or relationship (if archimate connection) and check if it is valid
EClass type = connection.eClass();
if (connection instanceof IDiagramModelArchimateConnection) {
type = ((IDiagramModelArchimateConnection) connection).getArchimateRelationship().eClass();
}
if (isSourceCommand) {
if (!isValidConnection(newObject, connection.getTarget(), type)) {
return null;
}
} else {
if (!isValidConnection(connection.getSource(), newObject, type)) {
return null;
}
}
/*
* Re-connect ArchiMate Connection to Archimate Component
* In this case we have to check for matching occurences on all diagrams
*/
if (connection instanceof IDiagramModelArchimateConnection && newObject instanceof IDiagramModelArchimateComponent) {
IArchimateRelationship relationship = ((IDiagramModelArchimateConnection) connection).getArchimateRelationship();
IArchimateConcept newConcept = ((IDiagramModelArchimateComponent) newObject).getArchimateConcept();
// Compound Command
CompoundCommand result = new CompoundCommand();
// Check for matching connections in this and other diagrams
for (IDiagramModel diagramModel : newConcept.getArchimateModel().getDiagramModels()) {
for (IDiagramModelArchimateConnection matchingConnection : DiagramModelUtils.findDiagramModelConnectionsForRelation(diagramModel, relationship)) {
IDiagramModelArchimateComponent matchingComponent = null;
// Same Diagram so use the new target
if (newObject.getDiagramModel() == diagramModel) {
matchingComponent = (IDiagramModelArchimateComponent) newObject;
} else // Different Diagram so find a match
{
List<IDiagramModelArchimateComponent> list = DiagramModelUtils.findDiagramModelComponentsForArchimateConcept(diagramModel, newConcept);
if (!list.isEmpty()) {
matchingComponent = list.get(0);
}
}
// Does the new object exist on the diagram? Yes, reconnect
if (matchingComponent != null) {
ReconnectDiagramConnectionCommand cmd = new ReconnectDiagramConnectionCommand(matchingConnection);
if (isSourceCommand) {
cmd.setNewSource(matchingComponent);
} else {
cmd.setNewTarget(matchingComponent);
}
result.add(cmd);
} else // No, so delete the matching connection
{
result.add(DiagramCommandFactory.createDeleteDiagramConnectionCommand(matchingConnection));
}
}
}
return result.unwrap();
} else // Re-connect other cases
{
ReconnectDiagramConnectionCommand cmd = new ReconnectDiagramConnectionCommand(connection);
if (isSourceCommand) {
cmd.setNewSource(newObject);
} else {
cmd.setNewTarget(newObject);
}
return cmd;
}
}
Aggregations