E4 Preference Initializer не вызывается

Я пытаюсь перенести свое приложение e3-rcp на приложение e4-rcp.

Поэтому мне нужно определить мои настройки по умолчанию. (Не Pref.Pages)

И, делая и пытаясь это сделать, я просто не могу вызвать свой Initializer. Вот мой класс инициализатора:

public class MyPreferenceInitializer extends AbstractPreferenceInitializer {

public MyPreferenceInitializer (){}

@Override
public void initializeDefaultPreferences() {

Preferences defaults = DefaultScope.INSTANCE.getNode(InspectIT.ID);
          // Set defaults using things like:
          defaults.put("DUMMY", "DUMMYCONTENT");
          try {
            defaults.flush();
        } catch (BackingStoreException e) {
            e.printStackTrace();
        }

          //And this other approach to make sure that one of them works
          IPreferenceStore store = InspectIT.getDefault().getPreferenceStore();
          store.setDefault("DUMMY", "DUMMYCONTENT");         
          try {
            ((Preferences) store).flush();
        } catch (BackingStoreException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //Dummy impl        
       default Preferences....,
    }

}

Я также получил класс Activator со следующей структурой: (Просто опубликуйте соответствующие методы (?))

 public class Activator implements BundleActivator {

        private static BundleContext context;

        static BundleContext getContext() {
            return context;
        }


        private static Activator plugin;

        private volatile ScopedPreferenceStore  preferenceStore;

        public void start(BundleContext context) throws Exception {
            plugin = this;
            Activator.context = context;
            locateRuntimeDir();     
            logListener = new LogListener();
            Platform.addLogListener(logListener);

//access to my initializor
        String text = getPreferenceStore().getDefaultString("DUMMY");
        String text2 = getPreferenceStore().getString("DUMMY");

        }

        public void stop(BundleContext context) throws Exception {

        Activator.context = null;
        plugin = null; 
    }

    public static <E> E getService(Class<E> clazz) {
        ServiceReference<E> reference = context.getServiceReference(clazz);
        if (null != reference) {  

            return context.getService(reference);
        }
        throw new RuntimeException("Requested service of the class " + clazz.getName() + " is not registered in the bundle.");
    }

    public ScopedPreferenceStore getPreferenceStore() {

        if (null == preferenceStore) {
            synchronized (this) {
                if (null == preferenceStore) { 


                    preferenceStore = new  ScopedPreferenceStore(ConfigurationScope.INSTANCE, ID); 
                } 
            } 
        } 
        return preferenceStore;
    }
}

ScopedPreferenceStore, который я использую, доступен по адресу: https://github.com/opcoach/e4Preferences/tree/master/com.opcoach.e4.preferences

Кроме того, я объявил расширение plugin.xml таким образом (мне это нужно, верно?)

...
 <extension
         point="org.eclipse.core.runtime.preferences">
      <initializer            class="MyApplication.rcp.preferences.MyPreferenceInitializer ">
      </initializer>
   </extension>
...

Я использую Eclipse 4.5.1 на win7 x64. Я много гуглил и нашел много тем по этому поводу, но я просто не могу найти свою ошибку =/. У кого-нибудь есть предложение, почему мой инициализатор настроек по умолчанию не вызывается?

заранее спасибо


person Elias S    schedule 25.11.2015    source источник
comment
Вам не нужен этот @PostConstruct в методе start. Активаторы не вводят.   -  person greg-449    schedule 25.11.2015
comment
Спасибо, я исправил это, но мой инициализатор Preference по-прежнему не вызывается.   -  person Elias S    schedule 25.11.2015


Ответы (2)


Вы по-прежнему должны использовать точку расширения org.eclipse.core.runtime.preferences для определения инициализатора предпочтений.

<extension
     point="org.eclipse.core.runtime.preferences">
  <initializer
        class="package.MyPreferenceInitializer">
  </initializer>
</extension>

В инициализаторе используйте:

@Override
public void initializeDefaultPreferences()
{
  Preferences defaults = DefaultScope.INSTANCE.getNode(Activator.ID);

  // Set defaults using things like:
  defaults.putInt("pref id", 0);
}
person greg-449    schedule 25.11.2015
comment
Спасибо за комментарий, я использую точку расширения (код просто вырезали, я отредактировал свой пост;) - person Elias S; 25.11.2015
comment
Как вы ссылаетесь на предпочтения? - person greg-449; 25.11.2015
comment
Я ссылаюсь на них в своем инициализаторе через хранилище IPreferenceStore = InspectIT.getDefault().getPreferenceStore(); Map‹String, String› initializationEntries = PreferenceSupplierDUMMY.getInitializationEntries(); for(Map.Entry‹String, String› entry : initializationEntries.entrySet()) { store.setDefault(entry.getKey(), entry.getValue()); } store.setDefault... и так далее, как я прочитал в этом: openchrom.wordpress.com/2014/01/11/ Но у меня даже не вызывается этот код - person Elias S; 25.11.2015
comment
Не уверен, что это сработает. Я добавил код, который я использую для инициализатора, который действительно работает. - person greg-449; 25.11.2015
comment
Я пробовал это, но инициализатор все еще не получает вызов. Как будто Eclipse просто пропускает весь урок. Не вызывается ни конструктор, ни метод init. - person Elias S; 25.11.2015
comment
Инициализатор вызывается только тогда, когда вы действительно делаете что-то, что ссылается на настройки. Что вы делаете, чтобы получить доступ к настройкам? - person greg-449; 25.11.2015
comment
О, это может быть проблемой. На самом деле я был на этапе миграции. Например, в E3-подходе приложения я пытаюсь получить Pref через String value = preferenceStore.getString(preferenceKey); а Preference Key — это строка со значением другого класса. - person Elias S; 25.11.2015
comment
Я отредактировал свой пост, чтобы показать, как я пытался получить доступ к настройкам по умолчанию. но до сих пор нет вызова инициализатора. Вот как я должен получить доступ к своим ценностям, верно? Через отладку: в RootPreferences метод getNode возвращается из-за EndIndex, равного -1 (что это значит?) - person Elias S; 26.11.2015
comment
Должно быть хорошо. Примечание. Инициализатор должен быть объявлен в plugin.xml для того же плагина, что и активатор. - person greg-449; 26.11.2015
comment
Хороший совет, мой продукт основан на стандартном приложении org.eclipse.e4.ui.workbench.swt.E4. Теперь у меня есть собственное приложение (через расширение) и класс приложения, который ничего не делает, кроме запуска приложения. Но до сих пор нет вызова - person Elias S; 26.11.2015
comment
Нужна ли мне отдельная реализация жизненного цикла помимо моего активатора? - person Elias S; 27.11.2015

Наконец-то я нашел решение этой проблемы. Случайно переболел этой проблемой снова и ошибка была в Активаторе. Я неправильно установил идентификатор на неправильное имя. Я сбросил его на имя моего проекта, и теперь он работает!

public ScopedPreferenceStore getPreferenceStore() {

    if (null == preferenceStore) {      
        synchronized (this) {
            if (null == preferenceStore) 
            preferenceStore = new ScopedPreferenceStore(ConfigurationScope.INSTANCE, ID); 
        }                   
    } 
    return preferenceStore;
}

ID = Имя проекта

person Elias S    schedule 07.01.2016