Как получить доступ к настройкам проекта из моего валидатора Xtext? - PullRequest
3 голосов
/ 03 апреля 2012

Я хочу, чтобы мой валидатор Xtext конфигурировался с помощью нескольких параметров, но я не смог найти способ сделать это.

Есть ли где-нибудь пример, как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 04 апреля 2012

Это не так просто, как кажется:

import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.emf.common.util.URI;
import com.google.inject.Singleton;

@Singleton
public class I18nPreferences {

    private final static Logger log = Logger.getLogger( I18nPreferences.class );

    public final static String I18N_QUALIFIER = "com.pany.eclipse.dsl.Dsl"; // name of the prefs file without extension
    public final static String VALIDATION_IGNORE_PATTERN_KEY = "validation.ignore";

    /** Get validation configuration for a resource */
    public ValidationConfiguration validationConfiguration( URI uri ) {

        // URI looks like this: 
        // platform:/resource/project/src/.../file.dsl
        log.debug( "Search config for " + uri );
        ValidationConfiguration config = new ValidationConfiguration();

        IPreferencesService service = Platform.getPreferencesService();
        if( null == service ) {
            // Probably not running under Eclipse
            log.debug( "No IPreferencesService" );
            return config;
        }

        String platformString = uri.toPlatformString( true );
        if( null == platformString ) {
            // Probably not running from the Eclipse UI. Might be a unit test or something
            return config;
        }

        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        String s = uri.isPlatformResource() ? uri.toPlatformString( true ) : uri.toString();
        Path path = new Path( s );
        IResource resource = workspace.getRoot().getFile( path );

        IProject project = null == resource ? null : resource.getProject();
        if( null == resource || null == project ) {
            log.debug( "Can't locate project " + uri + " in workspace" );
            return config;
        }

        log.debug( "Loading preferences for " + project.getName() );

        IScopeContext[] contexts = { new ProjectScope( resource.getProject() ) };

        String defaultValue = "";
        String patterns = service.getString( I18N_QUALIFIER, VALIDATION_IGNORE_PATTERN_KEY, defaultValue, contexts );
        log.debug( "Found pattern: " + patterns );

        config.setIgnoreString( patterns );

        return config;
    }
}
0 голосов
/ 04 апреля 2012

Есть как минимум две возможности:

  1. Переместите валидатор в проект пользовательского интерфейса и напрямую используйте настройки.

  2. Создайте интерфейс, такой как ValidatorGuard, с #isEnabled (..) в проекте времени выполнения с реализацией по умолчанию, которая возвращает «true» / использует некоторые свойства. Внедрите этот интерфейс в свой проект пользовательского интерфейса, чтобы вы могли прочитать информацию из PreferenceStore, чтобы принять решение о состоянии включения определенных проверок.

...