26
26
import org .eclipse .esmf .ExternalResolverMixin ;
27
27
import org .eclipse .esmf .LoggingMixin ;
28
28
import org .eclipse .esmf .aspect .AspectEditCommand ;
29
- import org .eclipse .esmf .aspectmodel .AspectModelBuilder ;
30
29
import org .eclipse .esmf .aspectmodel .AspectModelFile ;
31
30
import org .eclipse .esmf .aspectmodel .edit .AspectChangeContext ;
32
31
import org .eclipse .esmf .aspectmodel .edit .AspectChangeContextConfig ;
36
35
import org .eclipse .esmf .aspectmodel .edit .ChangeReportFormatter ;
37
36
import org .eclipse .esmf .aspectmodel .edit .change .MoveElementToExistingFile ;
38
37
import org .eclipse .esmf .aspectmodel .edit .change .MoveElementToNewFile ;
38
+ import org .eclipse .esmf .aspectmodel .edit .change .MoveElementToOtherNamespaceExistingFile ;
39
+ import org .eclipse .esmf .aspectmodel .edit .change .MoveElementToOtherNamespaceNewFile ;
40
+ import org .eclipse .esmf .aspectmodel .loader .AspectModelLoader ;
39
41
import org .eclipse .esmf .aspectmodel .serializer .AspectSerializer ;
40
42
import org .eclipse .esmf .aspectmodel .urn .AspectModelUrn ;
41
43
import org .eclipse .esmf .exception .CommandException ;
42
44
import org .eclipse .esmf .metamodel .AspectModel ;
43
45
import org .eclipse .esmf .metamodel .ModelElement ;
46
+ import org .eclipse .esmf .metamodel .Namespace ;
47
+ import org .eclipse .esmf .metamodel .impl .DefaultNamespace ;
44
48
45
49
import picocli .CommandLine ;
46
50
@@ -116,93 +120,137 @@ public class AspectEditMoveCommand extends AbstractCommand {
116
120
public void run () {
117
121
final String input = parentCommand .parentCommand .getInput ();
118
122
123
+ // Move to other/new file in same namespace
119
124
if ( targetNamespace == null ) {
120
125
final File targetFileRelativeToInput = getInputFile ( input ).toPath ().getParent ().resolve ( targetFile ).toFile ();
121
126
if ( targetFileRelativeToInput .exists () ) {
122
- moveElementToExistingFile ();
127
+ moveElementToExistingFile ( targetFileRelativeToInput );
123
128
} else {
124
129
moveElementToNewFile ();
125
130
}
131
+ return ;
132
+ }
133
+
134
+ // Move to other/new file in other namespace
135
+ final File inputFile = getInputFile ( input );
136
+ final AspectModelUrn targetNamespaceUrn = AspectModelUrn .from ( targetNamespace )
137
+ .getOrElseThrow ( () -> new CommandException ( "Target namespace is invalid: " + targetNamespace ) );
138
+ final File targetFileInOtherNamespace = modelsRootForFile ( inputFile )
139
+ .resolve ( targetNamespaceUrn .getNamespaceMainPart () )
140
+ .resolve ( targetNamespaceUrn .getVersion () )
141
+ .resolve ( targetFile )
142
+ .toFile ();
143
+ if ( targetFileInOtherNamespace .exists () ) {
144
+ moveElementToOtherNamespaceExistingFile ( targetNamespaceUrn , targetFileInOtherNamespace );
126
145
} else {
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 ();
137
- } else {
138
- moveElementToOtherNamespaceNewFile ();
139
- }
146
+ moveElementToOtherNamespaceNewFile ( targetNamespaceUrn , targetFileInOtherNamespace );
140
147
}
141
148
}
142
149
143
150
/**
144
- * Supports the case {@code samm aspect Aspect.ttl edit move : MyAspect newFile.ttl}
151
+ * Supports the case {@code samm aspect Aspect.ttl edit move MyAspect newFile.ttl}
145
152
*/
146
153
private void moveElementToNewFile () {
147
154
final String input = parentCommand .parentCommand .getInput ();
148
155
final AspectModel aspectModel = loadAspectModelOrFail ( input , customResolver );
149
156
150
157
// Do refactoring
151
158
final ModelElement modelElement = determineModelElementToMove ( aspectModel );
159
+ if ( targetFile .contains ( File .separator ) ) {
160
+ throw new CommandException ( "The target file name should not contain a path; only a file name." );
161
+ }
152
162
final URI targetFileUri = getInputFile ( input ).toPath ().getParent ().resolve ( targetFile ).toUri ();
153
163
final List <String > headerCommentForNewFile = copyHeader
154
164
? modelElement .getSourceFile ().headerComment ()
155
165
: List .of ();
156
166
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 );
167
+ performRefactoring ( aspectModel , move ). ifPresent ( changeContext -> {
168
+ // Check & write changes to file system
169
+ checkFilesystemConsistency ( changeContext );
170
+ performFileSystemWrite ( changeContext );
171
+ } );
162
172
}
163
173
164
174
/**
165
- * Supports the case {@code samm aspect Aspect.ttl edit move : MyAspect existingFile .ttl urn:samm:com.example.othernamespace:1.0.0}
175
+ * Supports the case {@code samm aspect Aspect.ttl edit move MyAspect newFile .ttl urn:samm:com.example.othernamespace:1.0.0}
166
176
*/
167
- private void moveElementToOtherNamespaceExistingFile () {
168
- // TODO
177
+ private void moveElementToOtherNamespaceNewFile ( final AspectModelUrn targetNamespaceUrn , final File targetFileInNewNamespace ) {
178
+ final String input = parentCommand .parentCommand .getInput ();
179
+ final AspectModel aspectModel = loadAspectModelOrFail ( input , customResolver );
180
+
181
+ // Do refactoring
182
+ final ModelElement modelElement = determineModelElementToMove ( aspectModel );
183
+ if ( targetFile .contains ( File .separator ) ) {
184
+ throw new CommandException ( "The target file name should not contain a path; only a file name: " + targetFile );
185
+ }
186
+
187
+ final Namespace namespace = new DefaultNamespace ( targetNamespaceUrn , List .of (), Optional .empty () );
188
+ final List <String > headerCommentForNewFile = copyHeader
189
+ ? modelElement .getSourceFile ().headerComment ()
190
+ : List .of ();
191
+
192
+ final Change move = new MoveElementToOtherNamespaceNewFile ( modelElement , namespace , headerCommentForNewFile ,
193
+ Optional .of ( targetFileInNewNamespace .toURI () ) );
194
+ performRefactoring ( aspectModel , move ).ifPresent ( changeContext -> {
195
+ // Check & write changes to file system
196
+ checkFilesystemConsistency ( changeContext );
197
+ performFileSystemWrite ( changeContext );
198
+ } );
169
199
}
170
200
171
201
/**
172
- * Supports the case {@code samm aspect Aspect.ttl edit move : MyAspect newFile .ttl urn:samm:com.example.othernamespace:1.0.0 }
202
+ * Support the case {@code samm aspect Aspect.ttl edit move MyAspect existingFile .ttl}
173
203
*/
174
- private void moveElementToOtherNamespaceNewFile () {
175
- // TODO
204
+ private void moveElementToExistingFile ( final File targetFileRelativeToInput ) {
205
+ final AspectModel sourceAspectModel = loadAspectModelOrFail ( parentCommand .parentCommand .getInput (), customResolver );
206
+ final AspectModel targetAspectModel = loadAspectModelOrFail ( targetFileRelativeToInput , customResolver , false );
207
+
208
+ // Create a consistent in-memory representation of both the source and target models.
209
+ // On this Aspect Model we can perform the refactoring operation
210
+ final AspectModel aspectModel = AspectModelLoader .merge ( sourceAspectModel , targetAspectModel );
211
+
212
+ // Find the loaded AspectModelFile that corresponds to the input targetFile
213
+ final ModelElement modelElement = determineModelElementToMove ( aspectModel );
214
+ final AspectModelFile targetAspectModelFile = determineTargetAspectModelFile ( aspectModel , modelElement .getSourceFile ().namespace () );
215
+
216
+ // Do refactoring
217
+ final Change move = new MoveElementToExistingFile ( modelElement , targetAspectModelFile );
218
+ performRefactoring ( aspectModel , move ).ifPresent ( changeContext -> {
219
+ // Check & write changes to file system
220
+ checkFilesystemConsistency ( changeContext );
221
+ performFileSystemWrite ( changeContext );
222
+ } );
176
223
}
177
224
178
225
/**
179
- * Support the case {@code samm aspect Aspect.ttl edit move MyAspect existingFile.ttl}
226
+ * Supports the case {@code samm aspect Aspect.ttl edit move MyAspect existingFile.ttl urn:samm:com.example.othernamespace:1.0.0 }
180
227
*/
181
- private void moveElementToExistingFile ( ) {
228
+ private void moveElementToOtherNamespaceExistingFile ( final AspectModelUrn targetNamespaceUrn , final File targetFileInOtherNamespace ) {
182
229
final AspectModel sourceAspectModel = loadAspectModelOrFail ( parentCommand .parentCommand .getInput (), customResolver );
183
- final AspectModel targetAspectModel = loadAspectModelOrFail ( targetFile , customResolver );
230
+ final AspectModel targetAspectModel = loadAspectModelOrFail ( targetFileInOtherNamespace , customResolver , false );
184
231
185
232
// Create a consistent in-memory representation of both the source and target models.
186
233
// On this Aspect Model we can perform the refactoring operation
187
- final AspectModel aspectModel = AspectModelBuilder .merge ( sourceAspectModel , targetAspectModel );
234
+ final AspectModel aspectModel = AspectModelLoader .merge ( sourceAspectModel , targetAspectModel );
188
235
189
236
// Find the loaded AspectModelFile that corresponds to the input targetFile
190
- final AspectModelFile targetAspectModelFile = determineTargetAspectModelFile ( aspectModel );
237
+ final Namespace namespace = new DefaultNamespace ( targetNamespaceUrn , List .of (), Optional .empty () );
238
+ final AspectModelFile targetAspectModelFile = determineTargetAspectModelFile ( aspectModel , namespace );
191
239
192
240
// Do refactoring
193
241
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 );
242
+ final Change move = new MoveElementToOtherNamespaceExistingFile ( modelElement , targetAspectModelFile , namespace );
243
+ performRefactoring ( aspectModel , move ). ifPresent ( changeContext -> {
244
+ // Check & write changes to file system
245
+ checkFilesystemConsistency ( changeContext );
246
+ performFileSystemWrite ( changeContext );
247
+ } );
200
248
}
201
249
202
- private AspectModelFile determineTargetAspectModelFile ( final AspectModel aspectModel ) {
203
- final URI targetFileUri = getInputFile ( targetFile ).toURI ();
250
+ private AspectModelFile determineTargetAspectModelFile ( final AspectModel aspectModel , final Namespace targetNamespace ) {
204
251
return aspectModel .files ().stream ()
205
- .filter ( file -> file .sourceLocation ().map ( uri -> uri .equals ( targetFileUri ) ).orElse ( false ) )
252
+ .filter ( file -> file .namespace ().urn ().equals ( targetNamespace .urn () )
253
+ && file .sourceLocation ().map ( uri -> Paths .get ( uri ).toFile ().getName ().equals ( targetFile ) ).orElse ( false ) )
206
254
.findFirst ()
207
255
.orElseThrow ( () -> new CommandException ( "Could not determine target file" ) );
208
256
}
@@ -227,7 +275,7 @@ private ModelElement determineModelElementToMove( final AspectModel aspectModel
227
275
return potentialElements .get ( 0 );
228
276
}
229
277
230
- private AspectChangeContext performRefactoring ( final AspectModel aspectModel , final Change change ) {
278
+ private Optional < AspectChangeContext > performRefactoring ( final AspectModel aspectModel , final Change change ) {
231
279
final AspectChangeContextConfig config = AspectChangeContextConfigBuilder .builder ()
232
280
.detailedChangeReport ( details )
233
281
.build ();
@@ -237,9 +285,9 @@ private AspectChangeContext performRefactoring( final AspectModel aspectModel, f
237
285
System .out .println ( "Changes to be performed" );
238
286
System .out .println ( "=======================" );
239
287
System .out .println ( ChangeReportFormatter .INSTANCE .apply ( changeReport , config ) );
240
- System . exit ( 0 );
288
+ return Optional . empty ( );
241
289
}
242
- return changeContext ;
290
+ return Optional . of ( changeContext ) ;
243
291
}
244
292
245
293
private void performFileSystemWrite ( final AspectChangeContext changeContext ) {
0 commit comments