Как сканировать папку, содержащую ресурс EMF, на наличие одноуровневых ресурсов

Я разработал DSL с xText и недавно добавил расширенное завершение. В редакторе, сгенерированном xText, при вызове завершения с помощью Ctrl-Space обработчик завершения должен выполнить сканирование папки для поиска символов в другом текстовом файле того же DSL. Точка входа:

public class TypesProposalProvider extends AbstractTypesProposalProvider
{
   public void completeQualifiedName_Path(
      EObject                     model,
      Assignment                  assignment,
      ContentAssistContext        context,
      ICompletionProposalAcceptor acceptor )
   {
      super.completeQualifiedName_Path( model, assignment, context, acceptor );

Я использую:

      Model root = (Model) context.getRootModel();
      Resource rootRc = root.eResource();

чтобы получить контейнер модели emf.ecore.

И теперь, как я могу искать одноуровневые ресурсы, другие файлы в той же папке, с точки зрения ресурса ecore?

С другими ресурсами я вызову Resource.load(), чтобы заполнить базовую модель emf.ecore братьев и сестер.

Надеюсь, вы понимаете мой приблизительный английский (я француз)...


person Aubin    schedule 10.10.2012    source источник


Ответы (2)


Я предполагаю, что родственные модели не ссылаются друг на друга. В этом случае вы можете использовать WorkspaceSynchronizer для получения файла из ресурса.

Пример

Resource rootRc = root.eResource();
IFile file = WorkspaceSynchronizer.getFile(rootRc);

IResource parent = file.getParent();

Iresource[] childern = parent.members();

for(<iterate over children>)
     load the children resources. 

Надеюсь это поможет.

person bhatanant2    schedule 11.10.2012
comment
«WorkspaceSynchronizer» не распознается в моей версии Eclipse Juno/JDT. - person Aubin; 11.10.2012
comment
Вам нужно добавить плагин org.eclipse.emf.workspace в свои зависимости. - person bhatanant2; 12.10.2012

Вот окончательный вариант, как всегда компактный ;-) :

Resource   rootRc = root.eResource();
String     rcPath = rootRc.getURI().toPlatformString( true );
IFile      file   = (IFile)ResourcesPlugin.getWorkspace().getRoot().findMember( rcPath );
IContainer parent = file.getParent();
for( IResource member : parent.members())
{
   String ext = member.getFileExtension();
   if( ext != null && ext.equals( "types" ))
   {
      String prefix     = member.getName();
      String path       = member.getLocation().toString();
      URI    uriSibling = URI.createFileURI( path );
      prefix = prefix.substring( 0, prefix.length() - ".types".length());
      if( ! rcPath.endsWith( '/' + prefix + ".types" )
         && ( context.getPrefix().isEmpty() || prefix.startsWith( cntxtPrefix )))
      {
         Resource types  = rs.createResource( uriSibling );
         types.load( null );
         for( EObject rc : types.getContents())
         {
            ...
         }
      }
   }
}
person Aubin    schedule 11.10.2012