민서네집

이클립스 플러그인 개발 환경(PDE) - OMA DM Simulator 본문

Java

이클립스 플러그인 개발 환경(PDE) - OMA DM Simulator

브라이언7 2013. 3. 27. 09:36


Koneki OMA DM Simulator



Maven에서 osgi 환경의 프로젝트의 build를 쉽게 하기 위해서 Tycho 플러그인을 사용한다.



Target Platform 을 설정한다.






이클립스에서 Debug Configuration 은 다음과 같다.





Simulator 플러그인 소스 안에서 Platform.getProduct() 가 null 이 나오는 문제 해결법


1) Window > Preferences > target platform > Edit... > Content 탭 > springsource로 검색해서

org.springsource.sts 를 체크하고, 검색창에서 글자 지우고, Add Required 버튼을 누른다.

그럼 이것과 관련된 bundle이 자동으로 추가됨.


2) Debug Configurations 에서 Eclipse Application > Arguments 탭 > VM arguments

-Declipse.product=org.springsource.sts.ide

라고 써야함.


그럼 Platform.getProduct() 가 null 이 나오는 문제는 해결됩니다.


그런데, Dashboard 탭에서 Connect 버튼을 누르면 No DMSimulator are available. 메시지 박스가 나옴.





디버깅 상태(Target Platform으로 실행시킨 상태)와 플러그인으로 설치해서 RUN 시킬 때와 로그가 다름. (로그를 파일로 저장하도록 했다.)


=== 디버그 아닌 상태 (플러그인 실행 모드) ===


14:44:39 dashboard: null

[14:45:05] org.eclipse.koneki.simulators.omadm.internal.Activator start() called... context: org.eclipse.osgi.framework.internal.core.BundleContextImpl@f1c9c6

[14:45:05] org.eclipse.koneki.simulators.omadm.editor.internal.Activator - start() called... context: org.eclipse.osgi.framework.internal.core.BundleContextImpl@1364135

[14:45:05] DMBasicSimulatorComponent activate() ctxt: org.eclipse.equinox.internal.ds.impl.ComponentContextImpl@166e448

[14:45:05] org.eclipse.koneki.simulators.omadm.Log.printStackTrace(Log.java:43)

org.eclipse.koneki.simulators.omadm.internal.DMBasicSimulatorComponent.activate(DMBasicSimulatorComponent.java:40)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

java.lang.reflect.Method.invoke(Unknown Source)

org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:235)

org.eclipse.equinox.internal.ds.model.ServiceComponentProp.activate(ServiceComponentProp.java:146)

org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:345)

org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:620)

org.eclipse.equinox.internal.ds.ServiceReg.getService(ServiceReg.java:53)

org.eclipse.osgi.internal.serviceregistry.ServiceUse$1.run(ServiceUse.java:141)

java.security.AccessController.doPrivileged(Native Method)

org.eclipse.osgi.internal.serviceregistry.ServiceUse.getService(ServiceUse.java:139)

org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:468)

org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:467)

org.eclipse.osgi.framework.internal.core.BundleContextImpl.getService(BundleContextImpl.java:594)

org.osgi.util.tracker.ServiceTracker.addingService(ServiceTracker.java:411)

org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932)

org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)

org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)

org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)

org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:317)

org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:261)

org.eclipse.koneki.simulators.omadm.editor.internal.Activator.start(Activator.java:68)

org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)

java.security.AccessController.doPrivileged(Native Method)

org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)

org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)

org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)

org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:300)

org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440)

org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:263)

org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107)

org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:469)

org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)

org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:395)

org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:464)

org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)

org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)

org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)

java.lang.ClassLoader.loadClass(Unknown Source)

org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:340)

org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229)

org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1212)

org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174)

org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905)

org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)

org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)

org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:268)

org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)

org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:264)

org.eclipse.ui.internal.registry.EditorDescriptor.createEditor(EditorDescriptor.java:235)

org.eclipse.ui.internal.EditorManager.createPart(EditorManager.java:875)

org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:609)

org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465)

org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)

org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:315)

org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180)

org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270)

org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65)

org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473)

org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1245)

org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:1198)

org.eclipse.ui.internal.PartStack.presentationSelectionChanged(PartStack.java:834)

org.eclipse.ui.internal.PartStack.access$1(PartStack.java:823)

org.eclipse.ui.internal.PartStack$1.selectPart(PartStack.java:137)

org.eclipse.ui.internal.presentations.BasicPartList.gotoSelectedElement(BasicPartList.java:326)

org.eclipse.ui.internal.presentations.AbstractTableInformationControl$4.mouseUp(AbstractTableInformationControl.java:326)

org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:220)

org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)

org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)

org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)

org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)

org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701)

org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665)

org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499)

org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679)

org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)

org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668)

org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)

org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)

org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)

org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)

org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)

org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)

org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

java.lang.reflect.Method.invoke(Unknown Source)

org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)

org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)

org.eclipse.equinox.launcher.Main.run(Main.java:1438)


[14:45:05] DMBasicSimulatorComponent activate() execHandler: org.eclipse.koneki.simulators.omadm.fumo.manual.internal.DMFumoManualExecHandler@6f3e5b

[14:45:05] DMBasicSimulatorComponent activate() execHandler: org.eclipse.koneki.simulators.omadm.fumo.automatic.internal.DMFumoAutomaticExecHandler@1e0f0bd

[14:45:05] org.eclipse.koneki.simulators.omadm.editor.internal.Activator - this.tracker.open() called...


=== 디버그 상태(Target Platform으로 실행시킨 상태) ===

[14:40:21] org.eclipse.koneki.simulators.omadm.internal.Activator start() called... context: org.eclipse.osgi.framework.internal.core.BundleContextImpl@f5ebcc

[14:40:21] org.eclipse.koneki.simulators.omadm.editor.internal.Activator - start() called... context: org.eclipse.osgi.framework.internal.core.BundleContextImpl@9d4a90

[14:40:21] org.eclipse.koneki.simulators.omadm.editor.internal.Activator - this.tracker.open() called...

14:40:26 dashboard: null


/aggregator/omadm/bundles/org.eclipse.koneki.simulators.omadm.editor/src/org/eclipse/koneki/simulators/omadm/editor/internal/Activator.java 파일에서


Public DMSimulator getDMSimulator () {

return (DMSimulator) this.tracker.getService();

}


디버그 환경에서는 getDMSimulator () 반환값이 null 이 됨.


같은 파일 안의 start() 메서드에서 


public void start(BundleContext context) throws Exception {

super.start(context);

plugin = this;

this.tracker = new ServiceTracker(context, DMSimulator.class.getName(), null);

this.tracker.open();

}


start() 메서드의 맨 마지막 부분에서 getDMSimulator() 를 반환받아 로그를 찍어 봤는데,

디버그로 실행할 때는 null 값이 찍힘.


위 로그에서 알 수 있듯이 플러그인으로 실행할 때는 this.tracker.open(); 할 때, DMBasicSimulatorComponent 클래스에서 activate() 메서드가 실행되고, 디버그로 실행할 때(Target Platform으로 실행할 때)는 activate() 메서드가 실행되지 않음.


원인이 뭘까? 궁금궁금...


< OMA-DM Simulator - Eclipse >


http://www.eclipse.org/koneki/omadm-simulator/


위 URL에는 시뮬레이터의 소스(koneki.simulators-master.zip)만 있다.


org.eclipse.koneki.commons-0.8_RC3.zip 와 org.eclipse.koneki.protocols-0.8_RC3.zip 의 소스는 다음 URL에서 받았다.


이클립스 DM Simulator의 소스 위치: http://git.eclipse.org/c/koneki


시뮬레이터 소스만 있어도 mvn package 명령으로 build 가 success 되지만, 이클립스에서 디버깅을 해보려면


org.eclipse.koneki.commons-0.8_RC3.zip 와 org.eclipse.koneki.protocols-0.8_RC3.zip 도 압축을 풀어서


Maven Project 로 import 해야했다. (import 하는 project의 이름이 겹치치 않도록 하려면 중복된 프로젝트 이름은 rename 필요)


(이름이 중복되는 프로젝트들은 이클립스에서 프로젝트를 지워도 된다. contents 까지 지우게 되면 실제 소스도 지워지므로 project contents를 지우라는 체크 박스에는 체크 하면 안됨. )


(실제적으로 RUN 시킬때 필요한 프로젝트는 org.eclipse.koneki 로 시작하는 프로젝트만 있으면 된다.)


(명령 프롬프트에서 이클립스에서 Maven Import 한 디렉터리로 가서 mvn package 명령을 주면 target 디렉터리 안에 이클립스에서 install 할 수 있는 repository.zip 파일이 생긴다. D:\dev\maven_project\org.eclipse.koneki.simulators-0.8_RC3\omadm\repository\target\repository.zip)


어떤 파일에서 Invalid Character 에러가 나는 것은 해당 프로젝트의 속성에서 Encoding을 UTF-8 로 바꿔주면 됨.

(Windows 인코딩인 MS949가 디폴트로 선택되었기 때문에 encoding error가 발생한 것이다.)


그리고 나서 import 구문에서 에러 나는 것은 Target Platform 을 편집해서 플러그인을 추가해줌.


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * 
 * [2013-03-26] hskang Log를 D:/temp/koneki_simulator.log 파일에 남긴다.
 */

public class Log {

	public static void write(String msg) {
		try {
			Calendar cal = Calendar.getInstance();
			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
			String timeStr = "[" + sdf.format(cal.getTime()) + "]";
			BufferedWriter out = new BufferedWriter(new FileWriter(
					"D:/temp/koneki_simulator.log", true));
			out.write(timeStr + " " + msg);
			out.newLine();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void printStackTrace() {
		String lineSep = System.getProperty("line.separator");
		StringBuffer stacktrace = new StringBuffer();
		StackTraceElement[] stackTrace = new Exception().getStackTrace();

		for (int x = 0; x < stackTrace.length; x++) {
			stacktrace.append(stackTrace[x].toString()).append(lineSep);
		}

		write(stacktrace.toString());
	}
}

[2013-03-28] 에러 해결함.


Target Platform 으로 Debug 시킨 상태에서 Help > About Spring Tool Suite > Installation Details 버튼 클릭


에러가 나면서 창이 안뜸.


이 상태에서 Target Platform으로 실행시킨 이클립스(STS) application을 종료시켰더니 

org.eclipse.core.runtime.CoreException: Provisioning agent not found

이런 에러 발생.


구글에서 검색해봤더니


http://stackoverflow.com/questions/10232930/provisioning-agent-not-found-when-closing-eclipse-runtime


Target Platform 에 org.eclipse.equinox.ds 플러그인이 없어서 그렇다고 함.


Target Platform에 org.eclipse.equinox.ds 플러그인을 추가하고, Add Required 버튼을 눌러서 필요한 의존된 플러그인을 추가한다.


[2013-04-02] 


내 Mac Book Pro 노트북(JVM 64 bit)에서도 STS 64비트용을 설치해보고, 

내 Windows 8 Desktop(OS와 JVM도 64비트)에서도 설치해 봄. (eclipse-jee-juno-SR2-win32-x86_64)


중요한 것은 Help > Eclipse Market Place... 에서 'm2m' 으로 검색해서


Koneki OMA DM Simulator 플러그인을 설치해야 한다는 것.


아마도 Koneki OMA DM Simulator 플러그인 소스를 컴파일 하기 위해서 의존적인 플러그인이 Market Place에서 이 플러그인을 설치해야 깔리는 듯 하다.



Program to Run 항목에서 Run a product 를 선택해도 되고, Run an application 을 선택해도 되는데,


Run an application을 선택하는 경우는 두번째 탭은 Arguments 에서 아래와 같이



VM arguments 항목에서 -Declipse.product=... 를 정의하지 않으면 Null Pointer Exception 이 난다.


이 항목값은 eclipse.ini 에서 -product 라고 써진 것을 copy 해서 넣으면 된다.


그리고 가끔 OutOfMemory: PermGem space 에러가 나므로, VM arguments 항목에 -XX:MaxPermSize=256m 를 써 주면 된다.


eclipse.ini 에 이런 설정이 있지만, Target Platform 에서 새로 띄우는 것이므로 eclipse.ini 파일의 내용은 적용되지 않는다.


Target Platform 을 만들때 현재 이클립스에 설치된 플러그인을 모두 선택하고, OutOfMemory: PermGem space 에러가 나면 -XX:MaxPermSize=256m 를 써 주면 된다. 





Comments