Preference

Preference는 IDE에서 흔히 볼 수 있는 환경설정을 의미한다. 우리가 어떤 특정 플러그인을 개발할 때, 그 플러그인에 특화된 환경설정이 필요한 경우가 있다. 예를 들어 설명하자면, 이전에 소개한 바 있지만 Esterel 언어는 소프트웨어 언어인 C로도 컴파일이 되고 하드웨어 언어인 Verilog로도 컴파일이 가능하다.

Preferences in Eclipse

Esterel 언어를 위한 개발환경에서 위와 같은 환경설정이 존재한다면 각 항목의 체크유무에 따라 소스코드의 컴파일시에 생성되는 아웃풋 파일의 종류를 결정할 수 있다. 이와 같은 작업을 위해서 알아야 할 확장점(Extension Point)에는 두가지가 있으며 이를 포함한 plugin.xml의 일부분의 내용은 다음과 같다.         

  <!– vicode preference page –>
  <extension
        point=”org.eclipse.ui.preferencePages“>
     <page
           class=”kr.ac.kaist.vicode.preference.VicodePreferencePage
           id=”kr.ac.kaist.vicode.preferencepage”
           name=”VICODE”/>
  </extension>
  <!– vicode preference initial data –>
  <extension
        point=”org.eclipse.core.runtime.preferences“>
     <initializer class=”kr.ac.kaist.vicode.preference.Defaults“/>
  </extension>

첫번째 확장점인 org.eclipse.ui.preferencePages을 이용해 Preference page에 기여할 수 있으며, 두번째 확장점인 org.eclipse.core.runtime.preferences에서는 환경설정의 기본값을 지정할 수 있다.

우선 첫번째 확장점을 위한 클래스인 VicodePreferencePage를 살펴보자. 이 클래스는 PreferencePage를 상속하며 UI를 만드는 createContents() 메서드, Restore Defaults 버튼을 눌렀을 때 호출되는 performDefaults(), OK 버튼을 눌렀을 때 호출되는 performOk() 메서드등으로 구성되어 있다. 메서드 이름만으로 각 메서드의 역할을 알 수 있을 것이다.

다음 생성자(Constructor)와 performOk() 메서드를 통해서 환경설정을 어떻게 이용하는지 알아보자.

public VicodePreferencePage() {
super();
setPreferenceStore(Activator.getDefault().getPreferenceStore());
setDescription(“Development environment settings for VICODE”);
fCheckBoxes = new ArrayList<Button>();
}

public boolean performOk() {
IPreferenceStore store = getPreferenceStore();
for (int i = 0; i < fCheckBoxes.size(); i++) {
  Button button = (Button) fCheckBoxes.get(i);
  String key = (String) button.getData();
  store.setValue(key, button.getSelection());
}
return super.performOk();
}

생성자에서는 setPreferenceStore() 메서드를 호출하여 preference page에서 사용할 preference 저장소를 지정한다. performOk() 메서드에서는 preference 저장소를 얻어와 여기에 setValue() 메서드를 이용해 <key, value>의쌍으로 환경설정을 저장한다. 저장할 수 있는 값들은 boolean, double, float, int, String, long 등의 simple data type중에 하나이어야 한다. 위의 예제는 플러그인이 UI에 기여하는 경우(Activator 클래스가 AbstractUIPlugin를 상속하는 경우)에 해당하며 그렇지 않은 경우(Plugin 클래스를 상속하는 경우)에는 getPluginPreferences 메서드를 사용해야 한다.

정리하면 생성자에서 preference 저장소를 지정한 후, createContents() 메서드에서 preference page에 들어가는 UI를 작성한다. 그리고 각 버튼에 해당하는 코드를 작성한다. 이는 UI에 입력된 정보를 환경설정에 저장하거나 그 반대의 일이 될 것이다.

지금부터는 환경설정의 기본값(Default)를 지정하기 위한 클래스인 Defaults를 살펴보자. 여기서는 간단히 initializeDefaultPreferences() 메서드에서 setDefault() 메서드를 호출해서 각 key에 해당하는 기본값을 지정하기만 하면 된다.

public void initializeDefaultPreferences() {
// TODO Auto-generated method stub
// get preference store
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
store.setDefault(“CDE_ESTEREL_C”, true);
store.setDefault(“CDE_ESTEREL_VERILOG”, true);
store.setDefault(“CDE_ESTEREL_BLIF”, false);
}

지금까지 Eclipse plug-in 개발시에 preference를 활용하는 방법을 살펴보았다. 아래 첨부한 소스코드를 읽어보면 쉽게 이해할 수 있을 것이다. 예제코드에서 UI 부분은 JDT의 JavaBasePreferencePage 클래스의 것을 응용하였다.

1201822046.java1126047004.java

Co-Design Environment

우리 연구실에서 하는 메인 프로젝트는 하드웨어/소프트웨어 동시설계 도구를 개발하는 것이다. 전체시스템을 하드웨어나 소프트웨어로 나누지 않고 하나의 표현으로 기술한 후, 적절한(?) 기준에 따라 나중에 분할하는 방법론에 대해서 연구하고 그 방법론이 녹아있는 도구를 개발하는 것이다.

분할된 하드웨어와 소프트웨어 사이의 인터페이스에 해당하는 부분을 생성하는 논문을 정한형과 함께 작성하여 EUC06에 제출하였고 오늘 accept 되었다는 사실을 알았다. 올해는 유난히 우리나라에서 열리는 학회가 많다. 국제학회이지만 개최장소는 건국대학교, 개최날짜는 8월 1일, 그 때는 서울에 집이 없겠지 …

학회는 일단 접어두고, 발등에 떨어진 불부터 꺼야한다. 6월 22일 부터 프로젝트 데모를 해야한다. 동시설계 프레임워크는 그동안 내가 맡아서 개발해왔는데, Java Swing으로 되어 있던 것을 올해 초 부터 Eclipse 플러그인 형태로 다시 개발하게 되었다.  그동안 <자바 개발자를 위한 이클립스 바이블> 이라는 두꺼운 책을 거의 다 공부하면서 나름 힘겨운 시간을 보냈다.

‘이게 과연 혼자서 가능할까?’ 싶은 생각이 들때면, ‘다 사람이 하는건데 뭐…’ 라고 스스로 다독였다. 그리고 …

Co-Design Environment
아직은 매우 단순하지만, 시스템 전체를 표현하고 그 것을 C코드로 컴파일 하는 것을 구현할 수 있었다. 책의 대부분을 한번 이상 공부한 지금은 처음에 비하면 꽤나 자신감이 붙어, 노력하면 충분히 할 수 있다고 생각하고 있다.  그리고 꼭 해내야한다. 대학원 컴파일러 수업의 논문 작성과 영어 발표 그리고 월드컵까지 겹쳐 쉽지 않은 5, 6월이 될 것 같다. 시간관리를 철저히 잘해서  살아남아야겠군!