19
19
import java .nio .file .Paths ;
20
20
import java .util .ArrayList ;
21
21
import java .util .List ;
22
+ import java .util .Optional ;
22
23
import java .util .stream .Collectors ;
23
24
24
25
import org .eclipse .esmf .AbstractCommand ;
34
35
import org .eclipse .esmf .aspectmodel .edit .ChangeReport ;
35
36
import org .eclipse .esmf .aspectmodel .edit .ChangeReportFormatter ;
36
37
import org .eclipse .esmf .aspectmodel .edit .change .MoveElementToExistingFile ;
38
+ import org .eclipse .esmf .aspectmodel .edit .change .MoveElementToNewFile ;
37
39
import org .eclipse .esmf .aspectmodel .serializer .AspectSerializer ;
40
+ import org .eclipse .esmf .aspectmodel .urn .AspectModelUrn ;
38
41
import org .eclipse .esmf .exception .CommandException ;
39
42
import org .eclipse .esmf .metamodel .AspectModel ;
40
43
import org .eclipse .esmf .metamodel .ModelElement ;
@@ -111,16 +114,26 @@ public class AspectEditMoveCommand extends AbstractCommand {
111
114
112
115
@ Override
113
116
public void run () {
114
- final File file = new File ( targetFile );
115
- if ( file .exists () ) {
116
- if ( targetNamespace == null ) {
117
+ final String input = parentCommand .parentCommand .getInput ();
118
+
119
+ if ( targetNamespace == null ) {
120
+ final File targetFileRelativeToInput = getInputFile ( input ).toPath ().getParent ().resolve ( targetFile ).toFile ();
121
+ if ( targetFileRelativeToInput .exists () ) {
117
122
moveElementToExistingFile ();
118
123
} else {
119
- moveElementToOtherNamespaceExistingFile ();
124
+ moveElementToNewFile ();
120
125
}
121
126
} else {
122
- if ( targetNamespace == null ) {
123
- moveElementToNewFile ();
127
+ final File inputFile = getInputFile ( input );
128
+ final AspectModelUrn targetNamespaceUrn = AspectModelUrn .from ( targetNamespace )
129
+ .getOrElseThrow ( () -> new CommandException ( "Target namespace is invalid: " + targetNamespace ) );
130
+ final File targetFileInNewNamespace = modelsRootForFile ( inputFile )
131
+ .resolve ( targetNamespaceUrn .getNamespaceMainPart () )
132
+ .resolve ( targetNamespaceUrn .getVersion () )
133
+ .resolve ( targetFile )
134
+ .toFile ();
135
+ if ( targetFileInNewNamespace .exists () ) {
136
+ moveElementToOtherNamespaceExistingFile ();
124
137
} else {
125
138
moveElementToOtherNamespaceNewFile ();
126
139
}
@@ -131,7 +144,21 @@ public void run() {
131
144
* Supports the case {@code samm aspect Aspect.ttl edit move :MyAspect newFile.ttl}
132
145
*/
133
146
private void moveElementToNewFile () {
134
- // TODO
147
+ final String input = parentCommand .parentCommand .getInput ();
148
+ final AspectModel aspectModel = loadAspectModelOrFail ( input , customResolver );
149
+
150
+ // Do refactoring
151
+ final ModelElement modelElement = determineModelElementToMove ( aspectModel );
152
+ final URI targetFileUri = getInputFile ( input ).toPath ().getParent ().resolve ( targetFile ).toUri ();
153
+ final List <String > headerCommentForNewFile = copyHeader
154
+ ? modelElement .getSourceFile ().headerComment ()
155
+ : List .of ();
156
+ final Change move = new MoveElementToNewFile ( modelElement , headerCommentForNewFile , Optional .of ( targetFileUri ) );
157
+ final AspectChangeContext changeContext = performRefactoring ( aspectModel , move );
158
+
159
+ // Check & write changes to file system
160
+ checkFilesystemConsistency ( changeContext );
161
+ performFileSystemWrite ( changeContext );
135
162
}
136
163
137
164
/**
@@ -160,13 +187,27 @@ private void moveElementToExistingFile() {
160
187
final AspectModel aspectModel = AspectModelBuilder .merge ( sourceAspectModel , targetAspectModel );
161
188
162
189
// Find the loaded AspectModelFile that corresponds to the input targetFile
190
+ final AspectModelFile targetAspectModelFile = determineTargetAspectModelFile ( aspectModel );
191
+
192
+ // Do refactoring
193
+ final ModelElement modelElement = determineModelElementToMove ( aspectModel );
194
+ final Change move = new MoveElementToExistingFile ( modelElement , targetAspectModelFile );
195
+ final AspectChangeContext changeContext = performRefactoring ( aspectModel , move );
196
+
197
+ // Check & write changes to file system
198
+ checkFilesystemConsistency ( changeContext );
199
+ performFileSystemWrite ( changeContext );
200
+ }
201
+
202
+ private AspectModelFile determineTargetAspectModelFile ( final AspectModel aspectModel ) {
163
203
final URI targetFileUri = getInputFile ( targetFile ).toURI ();
164
- final AspectModelFile targetAspectModelFile = aspectModel .files ().stream ()
204
+ return aspectModel .files ().stream ()
165
205
.filter ( file -> file .sourceLocation ().map ( uri -> uri .equals ( targetFileUri ) ).orElse ( false ) )
166
206
.findFirst ()
167
207
.orElseThrow ( () -> new CommandException ( "Could not determine target file" ) );
208
+ }
168
209
169
- // Determine the URN for the element to move
210
+ private ModelElement determineModelElementToMove ( final AspectModel aspectModel ) {
170
211
final List <ModelElement > potentialElements = aspectModel .elements ().stream ()
171
212
.filter ( element -> !element .isAnonymous () )
172
213
.filter ( element -> element .urn ().toString ().endsWith ( elementName ) )
@@ -183,24 +224,22 @@ private void moveElementToExistingFile() {
183
224
+ "\n Please use the element's full URN." );
184
225
System .exit ( 1 );
185
226
}
227
+ return potentialElements .get ( 0 );
228
+ }
186
229
187
- // Perform the refactoring
230
+ private AspectChangeContext performRefactoring ( final AspectModel aspectModel , final Change change ) {
188
231
final AspectChangeContextConfig config = AspectChangeContextConfigBuilder .builder ()
189
232
.detailedChangeReport ( details )
190
233
.build ();
191
234
final AspectChangeContext changeContext = new AspectChangeContext ( config , aspectModel );
192
- final ModelElement modelElement = potentialElements .get ( 0 );
193
- final Change move = new MoveElementToExistingFile ( modelElement , targetAspectModelFile );
194
- final ChangeReport changeReport = changeContext .applyChange ( move );
235
+ final ChangeReport changeReport = changeContext .applyChange ( change );
195
236
if ( dryRun ) {
196
237
System .out .println ( "Changes to be performed" );
197
238
System .out .println ( "=======================" );
198
239
System .out .println ( ChangeReportFormatter .INSTANCE .apply ( changeReport , config ) );
199
240
System .exit ( 0 );
200
241
}
201
-
202
- checkFilesystemConsistency ( changeContext );
203
- performFileSystemWrite ( changeContext );
242
+ return changeContext ;
204
243
}
205
244
206
245
private void performFileSystemWrite ( final AspectChangeContext changeContext ) {
0 commit comments