Refactoring model elements

To refactor an element in a model, use the com.nomagic.magicdraw.uml.Refactoring class.

Example #1: Converting an element to an interface

Element elementToConvert = ...;
Project project = ...;
SessionManager sessionManager = SessionManager.getInstance();
sessionManager.createSession(project, "Convert");
// Converts the element to an interface.
ConvertElementInfo info = new ConvertElementInfo(Interface.class);
// Preserves the old element ID for the new element.
info.setPreserveElementID(true);
Element conversionTarget = Refactoring.Converting.convert(elementToConvert, info);
sessionManager.closeSession(project);

Example #2: Replacing an element with another element

Element elementToReplace = ...;
Project project = ...;
SessionManager sessionManager = SessionManager.getInstance();
sessionManager.createSession(project, "Replace");
ConvertElementInfo info = new ConvertElementInfo(elementToReplace.getClassType());
info.setConvertOnlyIncomingReferences(true);
Refactoring.Replacing.replace(element, elementToReplace, info);
sessionManager.closeSession(project);

Example #3: Extract refactoring

Use the com.nomagic.magicdraw.uml.Refactoring.Extracting class to create the extract manager for a symbol which you want to extract. Configure the extract refactoring by changing com.nomagic.magicdraw.uml.refactor.extract.ExtractSource and com.nomagic.magicdraw.uml.refactor.extract.ExtractTarget. Invoke the refactoring with com.nomagic.magicdraw.uml.refactor.extract.ExtractManager.extract(). Review refactoring results by inspecting ExtractSource and ExtractTarget.

// Creates an extract refactor manager.
ExtractManager extractManager = Refactoring.Extracting.createExtractManager(symbols);
if (extractManager != null)
{
Project project = ...;
// A session has to be started before refactoring.
SessionManager sessionManager = SessionManager.getInstance();
sessionManager.createSession(project, "Extract Refactor Symbols");
// We may control the extract refactor result by modifying extract target.
ExtractTarget extractTarget = extractManager.getExtractTarget();
// Create a namespace to which we are going to refactor.
Project project = Project.getProject(symbols[0]);
Package package1 = project.getElementsFactory().createPackageInstance();
package1.setOwner(project.getPrimaryModel());
 
 
// Set the namespace to which the extract result should go.
extractTarget.setTargetNamespace(package1);
// Choose target diagram type from allowed diagram types if the default type does not suite.
List<String> allowedTargetDiagramTypes = extractTarget.getAllowedTargetDiagramTypes();
extractTarget.setTargetDiagramType(allowedTargetDiagramTypes.get(0));
// Modify reference names which link the extract refactor source to the target.
List<? extends ExtractReference> references = extractTarget.getReferences();
for (int i = 0; i < references.size(); i++)
{
ExtractReference reference = references.get(i);
reference.setName(Integer.toString(i));
}
// We may control the extract refactor source by modifying the extract source.
ExtractSource extractSource = extractManager.getExtractSource();
extractSource.setElementName("sourceElementName");
 
 
// Perform actual refactoring.
extractManager.extract();
sessionManager.closeSession(project);
 
 
// The element which was created in the source during refactoring.
Element sourceElement = extractSource.getElement();
 
 
// The element which was created in the target during refactoring.
Element targetElement = extractTarget.getElement();
 
 
// The diagram which was created in the target during refactoring.
DiagramPresentationElement targetDiagram = extractTarget.getDiagram();
}

Example #4: Reverse relationship refactoring

The relation reverse refactoring can be done using the com.nomagic.magicdraw.uml.Refactoring.RelationReversing.reverseRelationDirection(Element) method.

// We have an arbitrary element or symbol which represents a relationship.
BaseElement baseElement = ...;
Project project = ...;
// Relationship reversing should be wrapped with session create/close calls.
SessionManager sessionManager = SessionManager.getInstance();
sessionManager.createSession(project, "Reverse relation");
// Reverse the relationship.
Refactoring.RelationReversing.reverseRelationDirection(baseElement);
// Close the session.
sessionManager.closeSession(project);

Example #5: Moving element with connected relationships to other owner

Use com.nomagic.magicdraw.uml.Refactoring.Moving.moveElementsWithRelation(java.util.Collection<Element>, Element) to move com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element and all connected com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Relationship(s) to a new owner.

You can find the code examples in <modeling tool installation directory>\openapi\examples\refactor