Web-разработка, иностранные языки, Eclipse и разные разности

Zygo Profile

Санскрит - словоформы

Verbos Irregulares

Переменные в плагинах Eclipse. Интерфейсы IValueVariable и IDynamicVariable

22.10.2015
IValueVariable - переменные, которым присваивается какое-то конкретное значение и которые не принимают на вход аргументы.

 Чтобы создать такие переменные, можно указать в plugin.xml точку расширения "org.eclipse.core.variables.valueVariables": таким образом, заданы 2 переменные coffeevar и othervar

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<extension
     point="org.eclipse.core.variables.valueVariables">
  <variable
        initialValue="arabica"
        name="coffeevar"
        description="Some sort of coffee">
  </variable>
  <variable
        initialValue="другое значение"
        name="othervar"
        description="описание другой переменной">
  </variable>      
</extension>
(Аналогично, можно на вкладке "Extensions" при открытии plugin.xml добавить указанную точку расширения и добавить 2 указанные переменные)




В MANIFEST.MF необходимо добавить org.eclipse.core.variables в Require-Bundle 
Получить значения переменных из кода можно при помощи интерфейса IStringVariableManager:

1
IValueVariable varVal = VariablesPlugin.getDefault().getStringVariableManager().getValueVariable(myStr);

где myStr - значение поля "name" тега variable Пример доступа к значениям переменных:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
String[] strArray = { "coffeevar", "othervar", "nonexistent" };

for (String myStr : strArray) {
 IValueVariable varVal = VariablesPlugin.getDefault().getStringVariableManager().getValueVariable(myStr);
 if (varVal == null) {
  System.out.format("Переменная %s не существует\n", myStr);
 }else{
  System.out.format("Переменная %s = %s\n", myStr, varVal.getValue());    
 } 
} 

В результате получается:

Переменная coffeevar = arabica
Переменная othervar = другое значение
Переменная nonexistent не существует

 Значения переменных можно не только запрашивать, но и изменять. Например:

1
2
IValueVariable coffeeVal =VariablesPlugin.getDefault().getStringVariableManager().getValueVariable("coffeevar");
coffeeVal.setValue("Другой кофе");

В другом месте кода:

1
2
IValueVariable coffeeVal =VariablesPlugin.getDefault().getStringVariableManager().getValueVariable("coffeevar");
System.out.format("Новое значение переменной 'coffeevar': %s\n", coffeeVal.getValue()); 

В результате получается:

Новое значение переменной 'coffeevar': Другой кофе

Так же помимо интерфейса IValueVariable существует интерфейс IDynamicVariable IDynamicVariable - переменные, значения которых вычисляются "на лету" во время обращения к "resolver".

Динамические переменные могут принимать аргументы. Пример создания точки расширения "org.eclipse.core.variables.dynamicVariables":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
  <extension point="org.eclipse.core.variables.dynamicVariables">
    <variable 
       name="cona_time"
       resolver="com.zygo.CoffeeTimeResolver"
       description="Время для кофе кона"
       supportsArgument="true">
    </variable>
    <variable 
       name="arabica_time"
       resolver="com.zygo.CoffeeTimeResolver"
       description="Время для кофе арабика"
       supportsArgument="false">
    </variable>    
  </extension>

В данном примере создается 2 динамических переменных - cona_time, с поддержкой аргументов и arabica_time - без поддержки

Значение resolver - класс CoffeeTimeResolver, который осуществляет интерфейс IDynamicVariableResolver. Пример такого класса:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.zygo;

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.eclipse.core.variables.IDynamicVariable;
import org.eclipse.core.variables.IDynamicVariableResolver;

public class CoffeeTimeResolver implements IDynamicVariableResolver {

 // Для поддержки argument необходимо условие supportsArgument = true

 public String resolveValue(IDynamicVariable variable, String argument){
  
  DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  Date date = new Date();
  
  String selTime = "";
  
  if (variable.getName().equals("cona_time")){

   if (argument.equals("first")){

    selTime += "Суббота: ";

   }else if (argument.equals("second")){

    selTime += "Воскресение: ";
   }else{
    selTime += "Понедельник: ";
   }
   
  }else if(variable.getName().equals("arabica_time")){

   selTime += "Пятница: ";
  }else{
   // @Todo
  }
  
  return selTime + " (" + dateFormat.format(date) + ")";
  
 }
 
}

Пример доступа к значениям переменных dynamicVariables из кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
IDynamicVariable cona_time = VariablesPlugin.getDefault().getStringVariableManager().getDynamicVariable("cona_time");

IDynamicVariable arabica_time = VariablesPlugin.getDefault().getStringVariableManager().getDynamicVariable("arabica_time");
try {

 System.out.format("Первая чашка кофе коны: %s\n", cona_time.getValue("first"));
 System.out.format("Вторая чашка кофе коны: %s\n", cona_time.getValue("second"));
 
 System.out.format("Чашка кофе арабика: %s\n", arabica_time.getValue(null));

} catch (CoreException e) {

 e.printStackTrace();
}
В результате получается:

Первая чашка кофе коны: Суббота: (2015/10/22 19:18:26)
Вторая чашка кофе коны: Воскресение: (2015/10/22 19:18:26)
Чашка кофе арабика: Пятница: (2015/10/22 19:18:26)

Каждый раз, независимо от передаваемого параметра (argument), будет возвращаться новое значение переменной (в моем случае - в зависимости от текущего времени)

P.S:

Если я попробую задать не arabica_time.getValue(null), а arabica_time.getValue("first"), то получу ошибку:

org.eclipse.core.runtime.CoreException: Unsupported argument first specified for variable arabica_time 

поскольку в настройках переменной arabica_time указано supportsArgument="false"
Облако тегов
Меню
Архив
© Psytronica.ru. Блог существа SherZa. 2015-2017 Наверх