[openrtm-commit:00028] r168 - in trunk/rtmtools: jp.go.aist.rtm.systemeditor jp.go.aist.rtm.systemeditor/META-INF jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/nl jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/action jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/editor jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/views jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/views/logview jp.go.aist.rtm.systemeditor.nl1 jp.go.aist.rtm.systemeditor.nl1/META-INF jp.go.aist.rtm.systemeditor.nl1/src/jp/go/aist/rtm/systemeditor/nl jp.go.aist.rtm.toolscommon jp.go.aist.rtm.toolscommon/META-INF jp.go.aist.rtm.toolscommon/idl jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/adapterfactory jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/nl jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/propertysource jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/validation jp.go.aist.rtm.toolscommon/text jp.go.aist.rtm.toolscommon.nl1/META-INF jp.go.aist.rtm.toolscommon.nl1/src/jp/go/aist/rtm/toolscommon/nl

openrtm @ openrtm.org openrtm @ openrtm.org
2011年 4月 28日 (木) 12:04:06 JST


Author: ta
Date: 2011-04-28 12:04:05 +0900 (Thu, 28 Apr 2011)
New Revision: 168

Added:
   trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/action/StartLoggingActionDelegate.java
   trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/views/logview/
   trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/views/logview/LogView.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/idl/Logger.idl
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaLogObserver.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaLogObserverImpl.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/CorbaObserverStore.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/RTCLogStore.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation/CorbaLogObserverValidator.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/propertysource/CorbaObserverPropertySource.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter/CorbaObserverWorkbenchAdapter.java
Modified:
   trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/META-INF/MANIFEST.MF
   trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/plugin_ja.properties
   trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/src/jp/go/aist/rtm/systemeditor/nl/messages_ja.properties
   trunk/rtmtools/jp.go.aist.rtm.systemeditor/META-INF/MANIFEST.MF
   trunk/rtmtools/jp.go.aist.rtm.systemeditor/plugin.properties
   trunk/rtmtools/jp.go.aist.rtm.systemeditor/plugin.xml
   trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/nl/messages.properties
   trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/editor/AbstractSystemDiagramContextMenuProvider.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon.nl1/META-INF/MANIFEST.MF
   trunk/rtmtools/jp.go.aist.rtm.toolscommon.nl1/src/jp/go/aist/rtm/toolscommon/nl/messages_ja.properties
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/META-INF/MANIFEST.MF
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/plugin.xml
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/adapterfactory/WorkbenchAdapterFactory.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component.ecore
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/ComponentFactory.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/ComponentPackage.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaComponent.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaObserver.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/ComponentFactoryImpl.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/ComponentPackageImpl.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaComponentImpl.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaObserverImpl.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaStatusObserverImpl.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/SystemDiagramImpl.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/ComponentAdapterFactory.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/ComponentSwitch.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation/CorbaComponentValidator.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/nl/messages.properties
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter/ComponentWorkbenchAdapter.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/validation/AbstractValidator.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/validation/ValidateException.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/validation/Validator.java
   trunk/rtmtools/jp.go.aist.rtm.toolscommon/text/description.txt
Log:
RTSE updates.

- support log observer.
- add logview.

Modified: trunk/rtmtools/jp.go.aist.rtm.systemeditor/META-INF/MANIFEST.MF
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor/META-INF/MANIFEST.MF	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor/META-INF/MANIFEST.MF	2011-04-28 03:04:05 UTC (rev 168)
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: jp.go.aist.rtm.systemeditor;singleton:=true
-Bundle-Version: 1.1.0.v20110411
+Bundle-Version: 1.1.0.v20110428
 Bundle-Activator: jp.go.aist.rtm.systemeditor.RTSystemEditorPlugin
 Bundle-Localization: plugin
 Require-Bundle: 

Modified: trunk/rtmtools/jp.go.aist.rtm.systemeditor/plugin.properties
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor/plugin.properties	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor/plugin.properties	2011-04-28 03:04:05 UTC (rev 168)
@@ -67,6 +67,7 @@
 Create_Composite_Component =Create Composite Component
 Decompose_Composite_Component =Decompose Composite Component
 Open_With_System_Diagram_Editor =Open With System Diagram Editor
+StartLogging.label =Start Logging
 
 All_Disconnect =All Disconnect
 

Modified: trunk/rtmtools/jp.go.aist.rtm.systemeditor/plugin.xml
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor/plugin.xml	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor/plugin.xml	2011-04-28 03:04:05 UTC (rev 168)
@@ -88,8 +88,8 @@
 			name="%RT_Log_View"
 			icon="icons/RT_icon.png"
 			category="rtse"
-			class="org.eclipse.ui.internal.console.ConsoleView"
-			id="jp.go.aist.rtm.systemeditor.ui.views.RTLogView">
+			class="jp.go.aist.rtm.systemeditor.ui.views.logview.LogView"
+			id="jp.go.aist.rtm.systemeditor.ui.views.logview.LogView">
 		</view>
 	</extension>
 	
@@ -201,7 +201,7 @@
 			</visibility>
 			<action id="jp.go.aist.rtm.systemeditor.ui.action.CombineActionDelegate"
 				label="%Create_Composite_Component"
-				menubarPath="additions"
+				menubarPath="composite"
 				class="jp.go.aist.rtm.systemeditor.ui.action.CombineActionDelegate">
 			</action>
 		</viewerContribution>
@@ -213,7 +213,7 @@
 			</visibility>
 			<action id="jp.go.aist.rtm.systemeditor.ui.action.CombineActionDelegate"
 				label="%Create_Composite_Component"
-				menubarPath="additions"
+				menubarPath="composite"
 				class="jp.go.aist.rtm.systemeditor.ui.action.CombineActionDelegate">
 			</action>
 		</viewerContribution>
@@ -276,7 +276,7 @@
 			<action id="jp.go.aist.rtm.systemeditor.ui.action.DecomposeComponentAction"
 				label="%Decompose_Composite_Component"
 				enablesFor="1"
-				menubarPath="additions"
+				menubarPath="composite"
 				class="jp.go.aist.rtm.systemeditor.ui.action.DecomposeComponentFormPopupMenuActionDelegate">
 			</action>
 		</objectContribution>
@@ -287,7 +287,7 @@
 			<action id="jp.go.aist.rtm.systemeditor.ui.action.OpenCompositeComponentAction"
 				label="%Open_With_System_Diagram_Editor"
 				enablesFor="1"
-				menubarPath="additions"
+				menubarPath="composite"
 				class="jp.go.aist.rtm.systemeditor.ui.action.OpenCompositeComponentFormPopupMenuActionDelegate">
 			</action>
 		</objectContribution>
@@ -311,6 +311,18 @@
 		           label="%Export">
 		     </action>
 		  </objectContribution>
+		<objectContribution
+			adaptable="true"
+			id="jp.go.aist.rtm.systemeditor.ui.objectContribution.Component"
+			objectClass="jp.go.aist.rtm.systemeditor.ui.editor.editpart.ComponentEditPart">
+			<action
+				class="jp.go.aist.rtm.systemeditor.ui.action.StartLoggingActionDelegate"
+				id="jp.go.aist.rtm.systemeditor.ui.action.StartLoggingAction"
+				label="%StartLogging.label"
+				enablesFor="1"
+				menubarPath="additions">
+			</action>
+		</objectContribution>
 	</extension>
 
 	<extension point = "org.eclipse.ui.actionSets"> 
@@ -438,7 +450,7 @@
 				relative="jp.go.aist.rtm.systemeditor.ui.views.configurationview.ConfigurationView">
 			</view>
 			<view
-				id="jp.go.aist.rtm.systemeditor.ui.views.RTLogView"
+				id="jp.go.aist.rtm.systemeditor.ui.views.logview.LogView"
 				relationship="stack"
 				relative="jp.go.aist.rtm.systemeditor.ui.views.configurationview.ConfigurationView">
 			</view>
@@ -447,7 +459,7 @@
 			<viewShortcut id="jp.go.aist.rtm.systemeditor.ui.views.managercontrolview.ManagerControlView"/>
 			<viewShortcut id="jp.go.aist.rtm.systemeditor.ui.views.compositecomponentview.CompositeComponentView"/>
 			<viewShortcut id="jp.go.aist.rtm.systemeditor.ui.views.executioncontextview.ExecutionContextView"/>
-			<viewShortcut id="jp.go.aist.rtm.systemeditor.ui.views.RTLogView"/>
+			<viewShortcut id="jp.go.aist.rtm.systemeditor.ui.views.logview.LogView"/>
 		</perspectiveExtension>
 	</extension>
 	

Modified: trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/nl/messages.properties
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/nl/messages.properties	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/nl/messages.properties	2011-04-28 03:04:05 UTC (rev 168)
@@ -320,3 +320,5 @@
 ExecutionContextView.12=Detach
 ExecutionContextView.13=Attach
 SelectAttachComponentDialog.1=Please select component attached to Context.
+StartLoggingActionDelegate.start=Start Logging
+StartLoggingActionDelegate.stop=Stop Logging

Added: trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/action/StartLoggingActionDelegate.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/action/StartLoggingActionDelegate.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/action/StartLoggingActionDelegate.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,86 @@
+package jp.go.aist.rtm.systemeditor.ui.action;
+
+import jp.go.aist.rtm.systemeditor.nl.Messages;
+import jp.go.aist.rtm.systemeditor.ui.editor.AbstractSystemDiagramEditor;
+import jp.go.aist.rtm.systemeditor.ui.editor.editpart.ComponentEditPart;
+import jp.go.aist.rtm.toolscommon.model.component.Component;
+import jp.go.aist.rtm.toolscommon.model.component.ComponentFactory;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaComponent;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver;
+import jp.go.aist.rtm.toolscommon.model.component.SystemDiagram;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+public class StartLoggingActionDelegate implements IObjectActionDelegate {
+
+	static final String ACTION_START_LOGGING = Messages
+			.getString("StartLoggingActionDelegate.start");
+	static final String ACTION_STOP_LOGGING = Messages
+			.getString("StartLoggingActionDelegate.stop");
+
+	SystemDiagram diagram;
+	CorbaComponent component;
+
+	@Override
+	public void run(IAction action) {
+		if (component == null) {
+			return;
+		}
+		//
+		if (component.getLogObserver() != null) {
+			component.getLogObserver().finish();
+		} else {
+			CorbaLogObserver obs = ComponentFactory.eINSTANCE
+					.createCorbaLogObserver();
+			obs.attachComponent(component);
+		}
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		component = null;
+		if (selection instanceof IStructuredSelection) {
+			Object part = ((IStructuredSelection) selection).getFirstElement();
+			if (part instanceof ComponentEditPart) {
+				Component model = ((ComponentEditPart) part).getModel();
+				if (model instanceof CorbaComponent) {
+					component = (CorbaComponent) model;
+				}
+			}
+		}
+		//
+		if (component == null || !component.supportedCorbaObserver()) {
+			action.setText(ACTION_START_LOGGING);
+			action.setEnabled(false);
+			return;
+		}
+		//
+		String actionName = ACTION_START_LOGGING;
+		if (component.getLogObserver() != null) {
+			actionName = ACTION_STOP_LOGGING;
+		}
+		action.setText(actionName);
+		action.setEnabled(canExecution());
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+		diagram = null;
+		if (targetPart instanceof AbstractSystemDiagramEditor) {
+			AbstractSystemDiagramEditor editor = (AbstractSystemDiagramEditor) targetPart;
+			if (editor.isOnline()) {
+				diagram = editor.getSystemDiagram();
+			}
+		}
+		action.setEnabled(canExecution());
+	}
+
+	boolean canExecution() {
+		return (diagram != null && component != null);
+	}
+
+}

Modified: trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/editor/AbstractSystemDiagramContextMenuProvider.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/editor/AbstractSystemDiagramContextMenuProvider.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/editor/AbstractSystemDiagramContextMenuProvider.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -34,6 +34,9 @@
 		menuManager.add(new Separator("executionContext_before"));
 		menuManager.add(new Separator("executionContext"));
 		menuManager.add(new Separator("executionContext_after"));
+		menuManager.add(new Separator("composite_before"));
+		menuManager.add(new Separator("composite"));
+		menuManager.add(new Separator("composite_after"));
 		menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
 				+ "_before"));
 		menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));

Added: trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/views/logview/LogView.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/views/logview/LogView.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor/src/jp/go/aist/rtm/systemeditor/ui/views/logview/LogView.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,634 @@
+package jp.go.aist.rtm.systemeditor.ui.views.logview;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import jp.go.aist.rtm.systemeditor.RTSystemEditorPlugin;
+import jp.go.aist.rtm.toolscommon.model.component.Component;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaComponent;
+import jp.go.aist.rtm.toolscommon.model.component.SystemDiagram;
+import jp.go.aist.rtm.toolscommon.model.component.SystemDiagramKind;
+import jp.go.aist.rtm.toolscommon.model.component.util.RTCLogStore;
+import jp.go.aist.rtm.toolscommon.util.AdapterUtil;
+
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableColorProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.ViewPart;
+
+public class LogView extends ViewPart {
+
+	static final OpenRTM.LogLevel[] LEVEL_LIST = new OpenRTM.LogLevel[] {
+			OpenRTM.LogLevel.ERROR, //
+			OpenRTM.LogLevel.WARN, //
+			OpenRTM.LogLevel.INFO, //
+			OpenRTM.LogLevel.NORMAL, //
+			OpenRTM.LogLevel.DEBUG, //
+			OpenRTM.LogLevel.TRACE, //
+			OpenRTM.LogLevel.VERBOSE, // 
+			OpenRTM.LogLevel.PARANOID //
+	};
+
+	static final int PROPERTY_DISP = 0;
+	static final int PROPERTY_RTC = 1;
+
+	static final int PROPERTY_TIME = 0;
+	static final int PROPERTY_LEVEL = 1;
+	static final int PROPERTY_COMP = 2;
+	static final int PROPERTY_LOGGER = 3;
+	static final int PROPERTY_BODY = 4;
+
+	TableViewer rtclistTableViewer;
+	Table rtclistTable;
+	TableViewer rtclogTableViewer;
+	Table rtclogTable;
+
+	SystemDiagram targetDiagram;
+
+	RTCStore rtcStore;
+	List<RTCLog> logList;
+
+	LogViewerFilter filter;
+
+	SimpleDateFormat df;
+
+	public LogView() {
+		this.df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+	}
+
+	public LogView getLogView() {
+		return this;
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+		GridLayout gl;
+		GridData gd;
+
+		gl = new GridLayout();
+		gl.numColumns = 3;
+		parent.setLayout(gl);
+
+		SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL);
+		gd = new GridData();
+		gd.horizontalAlignment = SWT.FILL;
+		gd.verticalAlignment = SWT.FILL;
+		gd.grabExcessHorizontalSpace = true;
+		gd.grabExcessVerticalSpace = true;
+		gd.horizontalSpan = 2;
+		sashForm.setLayoutData(gd);
+
+		createRTCListPart(sashForm);
+
+		createRTCLogPart(sashForm);
+
+		sashForm.setWeights(new int[] { 20, 80 });
+
+		setSiteSelection();
+	}
+
+	Composite createRTCListPart(SashForm sash) {
+		GridLayout gl;
+		GridData gd;
+
+		Composite composite = new Composite(sash, SWT.FILL);
+		gl = new GridLayout();
+		gl.marginWidth = 0;
+		gl.marginHeight = 0;
+		gl.numColumns = 1;
+		composite.setLayout(gl);
+
+		rtclistTableViewer = new TableViewer(composite, SWT.FULL_SELECTION
+				| SWT.SINGLE | SWT.BORDER);
+		rtclistTableViewer.setContentProvider(new ArrayContentProvider());
+
+		rtclistTable = rtclistTableViewer.getTable();
+		rtclistTable.setLinesVisible(true);
+		rtclistTable.setHeaderVisible(true);
+		gd = new GridData();
+		gd.verticalAlignment = SWT.FILL;
+		gd.horizontalAlignment = SWT.FILL;
+		gd.grabExcessVerticalSpace = true;
+		gd.grabExcessHorizontalSpace = true;
+		rtclistTable.setLayoutData(gd);
+
+		gl = new GridLayout(1, false);
+		gl.numColumns = 1;
+		rtclistTable.setLayout(gl);
+
+		TableViewerColumn col;
+		col = createColumn(rtclistTableViewer, "", 30);
+		col.setEditingSupport(new RTCEditingSupport(rtclistTableViewer,
+				PROPERTY_DISP));
+
+		createColumn(rtclistTableViewer, "component", 90);
+
+		rtclistTableViewer.setLabelProvider(new RTCLabelProvider());
+
+		Combo levelCombo = new Combo(composite, SWT.READ_ONLY);
+		gd = new GridData();
+		gd.horizontalAlignment = SWT.FILL;
+		gd.grabExcessHorizontalSpace = true;
+		levelCombo.setLayoutData(gd);
+
+		for (OpenRTM.LogLevel lv : LEVEL_LIST) {
+			levelCombo.add(RTCLogStore.toLevelName(lv));
+		}
+		levelCombo.select(0);
+		levelCombo.addModifyListener(new ModifyListener() {
+			@Override
+			public void modifyText(ModifyEvent e) {
+				Combo c = (Combo) e.widget;
+				if (c.getSelectionIndex() < 0) {
+					return;
+				}
+				OpenRTM.LogLevel lv = LEVEL_LIST[c.getSelectionIndex()];
+				filter.level = lv;
+			}
+		});
+
+		return composite;
+	}
+
+	Composite createRTCLogPart(SashForm sash) {
+		GridLayout gl;
+		GridData gd;
+
+		Composite composite = new Composite(sash, SWT.FILL);
+		gl = new GridLayout();
+		gl.numColumns = 2;
+		gl.marginWidth = 0;
+		gl.marginHeight = 0;
+		composite.setLayout(gl);
+
+		rtclogTableViewer = new TableViewer(composite, SWT.FULL_SELECTION
+				| SWT.SINGLE | SWT.BORDER);
+		rtclogTableViewer.setContentProvider(new ArrayContentProvider());
+
+		filter = new LogViewerFilter();
+		rtclogTableViewer.setFilters(new ViewerFilter[] { filter });
+		filter.rtcNames.add("ConsoleIn0");
+
+		rtclogTable = rtclogTableViewer.getTable();
+		rtclogTable.setLinesVisible(true);
+
+		gd = new GridData();
+		gd.verticalAlignment = SWT.FILL;
+		gd.horizontalAlignment = SWT.FILL;
+		gd.grabExcessVerticalSpace = true;
+		gd.grabExcessHorizontalSpace = true;
+		gd.horizontalSpan = 2;
+		rtclogTable.setLayoutData(gd);
+		rtclogTable.setHeaderVisible(true);
+
+		createColumn(rtclogTableViewer, "time", 80);
+		createColumn(rtclogTableViewer, "level", 60);
+		createColumn(rtclogTableViewer, "component", 90);
+		createColumn(rtclogTableViewer, "logger", 60);
+		createColumn(rtclogTableViewer, "message", 120);
+
+		rtclogTableViewer.setLabelProvider(new LogLabelProvider());
+
+		return composite;
+	}
+
+	TableViewerColumn createColumn(TableViewer viewer, String title, int width) {
+		TableViewerColumn col;
+		col = new TableViewerColumn(viewer, SWT.NONE);
+		col.getColumn().setText(title);
+		col.getColumn().setWidth(width);
+		return col;
+	}
+
+	/** 内部モデル(RTC一覧)を構築 */
+	void buildData() {
+		if (targetDiagram == null) {
+			return;
+		}
+		rtcStore = RTCStore.get(targetDiagram);
+
+		refreshData();
+	}
+
+	/** 内部モデル(ログ一覧)を構築 [非同期] */
+	void buildLogData() {
+		if (rtcStore == null) {
+			return;
+		}
+		if (logList == null) {
+			logList = new ArrayList<RTCLog>();
+		}
+		logList.clear();
+		//
+		List<String> id_list = new ArrayList<String>();
+		for (RTCStore.RTC rtc : rtcStore.rtcs) {
+			if (rtc.comp.getLogObserver() == null) {
+				continue;
+			}
+			id_list.add(rtc.comp.getLogObserver().getServiceProfile().id);
+		}
+		List<RTCLogStore.Record> records = RTCLogStore.eINSTANCE.find(id_list,
+				10000);
+		for (RTCLogStore.Record r : records) {
+			RTCLog rlog = new RTCLog(r);
+			logList.add(rlog);
+		}
+	}
+
+	/** 内部モデル(RTC一覧)から表示 */
+	void refreshData() {
+		rtclistTableViewer.setInput(Collections.EMPTY_LIST);
+		if (rtcStore != null) {
+			rtclistTableViewer.setInput(rtcStore.rtcs);
+			if (rtclistTable.getItemCount() <= 0) {
+				return;
+			}
+		}
+	}
+
+	/** 内部モデル(ログ一覧)から表示 [非同期] */
+	void refreshLogData() {
+		if (rtcStore == null) {
+			return;
+		}
+		filter.rtcNames.clear();
+		for (RTCStore.RTC rtc : rtcStore.rtcs) {
+			if (rtc.display) {
+				filter.rtcNames.add(rtc.comp.getInstanceNameL());
+			}
+		}
+		try {
+			rtclogTableViewer.getControl().getDisplay().asyncExec(
+					new Runnable() {
+						@Override
+						public void run() {
+							if (rtclogTableViewer.getControl().isDisposed()) {
+								return;
+							}
+							if (rtclogTableViewer.getInput() == null) {
+								rtclogTableViewer.setInput(logList);
+							}
+							rtclogTableViewer.refresh();
+						}
+					});
+		} catch (Exception e) {
+		}
+	}
+
+	@Override
+	public void dispose() {
+		if (refresher != null) {
+			refresher.end();
+		}
+		super.dispose();
+	}
+
+	@Override
+	public void setFocus() {
+		// TODO Auto-generated method stub
+	}
+
+	/** RTC一覧を表すクラス */
+	static class RTCStore {
+		static Map<SystemDiagram, RTCStore> store = new HashMap<SystemDiagram, RTCStore>();
+
+		public static RTCStore get(SystemDiagram diagram) {
+			RTCStore result = store.get(diagram);
+			if (result == null) {
+				result = new RTCStore();
+				store.put(diagram, result);
+			}
+			result.reset(diagram);
+			return result;
+		}
+
+		List<RTC> rtcs = new ArrayList<RTC>();
+
+		void reset(SystemDiagram diagram) {
+			List<String> pathes = new ArrayList<String>();
+			for (RTC rtc : rtcs) {
+				if (rtc.display) {
+					pathes.add(rtc.comp.getPathId());
+				}
+			}
+			rtcs.clear();
+			for (Component comp : diagram.getRegisteredComponents()) {
+				if (!(comp instanceof CorbaComponent)) {
+					continue;
+				}
+				CorbaComponent corbaComp = (CorbaComponent) comp;
+				if (corbaComp.getLogObserver() == null) {
+					continue;
+				}
+				RTC rtc = new RTC(corbaComp);
+				if (pathes.contains(comp.getPathId())) {
+					rtc.display = true;
+				}
+				rtcs.add(rtc);
+			}
+		}
+
+		static class RTC {
+			boolean display;
+			CorbaComponent comp;
+
+			RTC(CorbaComponent comp) {
+				this.comp = comp;
+				this.display = false;
+			}
+		}
+	}
+
+	/** RTCログを表すクラス */
+	static class RTCLog {
+		RTC.Time time;
+		OpenRTM.LogLevel level;
+		String levelName;
+		String rtcName;
+		String logger;
+		String message;
+
+		RTCLog(RTCLogStore.Record r) {
+			this.time = r.getTime();
+			this.level = r.getLevel();
+			this.levelName = r.getLevelName();
+			this.rtcName = r.getRtcName();
+			this.logger = r.getLoggerName();
+			this.message = r.getMessage();
+		}
+	}
+
+	/** RTC一覧表示のLabelProvider */
+	public class RTCLabelProvider extends LabelProvider implements
+			ITableLabelProvider {
+		@Override
+		public Image getColumnImage(Object element, int columnIndex) {
+			Image result = null;
+			RTCStore.RTC entry = (RTCStore.RTC) element;
+			if (columnIndex == 0) {
+				if (entry.display) {
+					result = RTSystemEditorPlugin
+							.getCachedImage("icons/checkbox_checked.png");
+				} else {
+					result = RTSystemEditorPlugin
+							.getCachedImage("icons/checkbox_unchecked.png");
+				}
+			}
+			return result;
+		}
+
+		@Override
+		public String getColumnText(Object element, int columnIndex) {
+			RTCStore.RTC entry = (RTCStore.RTC) element;
+			if (columnIndex == 1) {
+				return entry.comp.getInstanceNameL();
+			}
+			return null;
+		}
+	}
+
+	/** RTC一覧表示のEditingSupport */
+	public class RTCEditingSupport extends EditingSupport {
+		CellEditor editor;
+		int column;
+
+		public RTCEditingSupport(ColumnViewer viewer, int column) {
+			super(viewer);
+			// Create the correct editor based on the column index
+			switch (column) {
+			case PROPERTY_DISP:
+				editor = new CheckboxCellEditor(((TableViewer) viewer)
+						.getTable());
+				break;
+			default:
+				break;
+			}
+			this.column = column;
+		}
+
+		@Override
+		protected boolean canEdit(Object element) {
+			return true;
+		}
+
+		@Override
+		protected CellEditor getCellEditor(Object element) {
+			return editor;
+		}
+
+		@Override
+		protected Object getValue(Object element) {
+			if (!(element instanceof RTCStore.RTC))
+				return null;
+			RTCStore.RTC entry = (RTCStore.RTC) element;
+			switch (this.column) {
+			case PROPERTY_DISP:
+				return entry.display;
+			default:
+				break;
+			}
+			return null;
+		}
+
+		@Override
+		protected void setValue(Object element, Object value) {
+			if (element instanceof RTCStore.RTC == false)
+				return;
+			RTCStore.RTC entry = (RTCStore.RTC) element;
+			switch (this.column) {
+			case PROPERTY_DISP:
+				entry.display = ((Boolean) value).booleanValue();
+				break;
+			default:
+				break;
+			}
+			getViewer().update(element, null);
+		}
+	}
+
+	/** ログ一覧表示のViewerFilter */
+	public static class LogViewerFilter extends ViewerFilter {
+		List<String> rtcNames = new ArrayList<String>();
+		OpenRTM.LogLevel level = OpenRTM.LogLevel.ERROR;
+
+		@Override
+		public boolean select(Viewer viewer, Object parentElement,
+				Object element) {
+			RTCLog entry = (RTCLog) element;
+			if (!rtcNames.contains(entry.rtcName)) {
+				return false;
+			}
+			if (level.value() < entry.level.value()) {
+				return false;
+			}
+			return true;
+		}
+	}
+
+	/** ログ一覧表示のLabelProvider */
+	public class LogLabelProvider extends LabelProvider implements
+			ITableLabelProvider, ITableColorProvider {
+		@Override
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		@Override
+		public String getColumnText(Object element, int columnIndex) {
+			RTCLog entry = (RTCLog) element;
+			switch (columnIndex) {
+			case PROPERTY_TIME:
+				long milisec = (long) entry.time.sec * 1000;
+				Date date = new Date(milisec);
+				return String.format("%s.%09d", df.format(date),
+						entry.time.nsec);
+			case PROPERTY_LEVEL:
+				return entry.levelName;
+			case PROPERTY_COMP:
+				return entry.rtcName;
+			case PROPERTY_LOGGER:
+				return entry.logger;
+			case PROPERTY_BODY:
+				return entry.message;
+			default:
+				break;
+			}
+			return null;
+		}
+
+		@Override
+		public Color getBackground(Object element, int columnIndex) {
+			return null;
+		}
+
+		@Override
+		public Color getForeground(Object element, int columnIndex) {
+			return null;
+		}
+	}
+
+	static class Refresher extends Thread {
+		LogView view;
+		boolean running;
+
+		public Refresher(LogView view) {
+			this.view = view;
+		}
+
+		@Override
+		public void run() {
+			running = true;
+			while (running) {
+				try {
+					view.buildLogData();
+					view.refreshLogData();
+					//
+					Thread.sleep(1000);
+				} catch (InterruptedException e) {
+					running = false;
+				}
+			}
+		}
+
+		public void end() {
+			running = false;
+		}
+	}
+
+	Refresher refresher;
+
+	ISelectionListener selectionListener = new ISelectionListener() {
+		@Override
+		public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+			targetDiagram = null;
+			if (selection instanceof IStructuredSelection) {
+				IStructuredSelection ss = (IStructuredSelection) selection;
+				Object firstElement = ss.getFirstElement();
+				Object adapter = AdapterUtil.getAdapter(firstElement,
+						SystemDiagram.class);
+				if (adapter != null) {
+					SystemDiagram sd = (SystemDiagram) adapter;
+					if (SystemDiagramKind.ONLINE_LITERAL.equals(sd.getKind())) {
+						targetDiagram = sd;
+					}
+				}
+			}
+			buildData();
+			//
+			if (targetDiagram == null) {
+				if (refresher != null) {
+					refresher.end();
+				}
+				return;
+			}
+			if (refresher == null || !refresher.isAlive()) {
+				refresher = new Refresher(getLogView());
+				refresher.setDaemon(true);
+				refresher.start();
+			}
+		}
+	};
+
+	void setSiteSelection() {
+		if (getSite() == null) {
+			return;
+		}
+		getSite().getWorkbenchWindow().getSelectionService()
+				.addSelectionListener(selectionListener);
+
+		// SelectionProviderを登録(プロパティ・ビュー連携)
+		getSite().setSelectionProvider(new ISelectionProvider() {
+			public void addSelectionChangedListener(
+					ISelectionChangedListener listener) {
+			}
+
+			public ISelection getSelection() {
+				StructuredSelection result = null;
+				if (targetDiagram != null) {
+					result = new StructuredSelection(targetDiagram);
+				}
+				return result;
+			}
+
+			public void removeSelectionChangedListener(
+					ISelectionChangedListener listener) {
+			}
+
+			public void setSelection(ISelection selection) {
+			}
+		});
+	}
+
+}

Modified: trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/META-INF/MANIFEST.MF
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/META-INF/MANIFEST.MF	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/META-INF/MANIFEST.MF	2011-04-28 03:04:05 UTC (rev 168)
@@ -2,6 +2,6 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Graphical Editor for RT system Nl1 Fragment
 Bundle-SymbolicName: jp.go.aist.rtm.systemeditor.nl1
-Bundle-Version: 1.1.0.v20110411
+Bundle-Version: 1.1.0.v20110428
 Fragment-Host: jp.go.aist.rtm.systemeditor;bundle-version="0.0.0"
 Bundle-Vendor: AIST

Modified: trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/plugin_ja.properties
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/plugin_ja.properties	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/plugin_ja.properties	2011-04-28 03:04:05 UTC (rev 168)
@@ -67,6 +67,7 @@
 Create_Composite_Component = \u8907\u5408\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u4f5c\u6210
 Decompose_Composite_Component = \u8907\u5408\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u89e3\u9664
 Open_With_System_Diagram_Editor = \u30a8\u30c7\u30a3\u30bf\u3067\u958b\u304f
+StartLogging.label = \u30ed\u30b0\u53ce\u96c6\u3092\u958b\u59cb
 
 All_Disconnect =\u3059\u3079\u3066\u5207\u65ad
 

Modified: trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/src/jp/go/aist/rtm/systemeditor/nl/messages_ja.properties
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/src/jp/go/aist/rtm/systemeditor/nl/messages_ja.properties	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.systemeditor.nl1/src/jp/go/aist/rtm/systemeditor/nl/messages_ja.properties	2011-04-28 03:04:05 UTC (rev 168)
@@ -320,3 +320,5 @@
 ExecutionContextView.12=\u30c7\u30bf\u30c3\u30c1
 ExecutionContextView.13=\u30a2\u30bf\u30c3\u30c1
 SelectAttachComponentDialog.1=\u30a2\u30bf\u30c3\u30c1\u3059\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+StartLoggingActionDelegate.start=\u30ed\u30b0\u53ce\u96c6\u3092\u958b\u59cb
+StartLoggingActionDelegate.stop=\u30ed\u30b0\u53ce\u96c6\u3092\u505c\u6b62

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/META-INF/MANIFEST.MF
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/META-INF/MANIFEST.MF	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/META-INF/MANIFEST.MF	2011-04-28 03:04:05 UTC (rev 168)
@@ -2,12 +2,13 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: jp.go.aist.rtm.toolscommon; singleton:=true
-Bundle-Version: 1.1.0.v20110411
+Bundle-Version: 1.1.0.v20110428
 Bundle-ClassPath: .,
  lib/commons-lang-2.2.jar
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
-Export-Package: RTC,
+Export-Package: OpenRTM,
+ RTC,
  RTM,
  _SDOPackage,
  jp.go.aist.rtm.toolscommon,

Added: trunk/rtmtools/jp.go.aist.rtm.toolscommon/idl/Logger.idl
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/idl/Logger.idl	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/idl/Logger.idl	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,388 @@
+// -*- IDL -*-
+/*!
+ * @file Logger.idl
+ * @brief Component logger SDO service
+ * @date $Date$
+ * @author Noriaki Ando <n-ando at aist.go.jp>
+ *
+ * Copyright (C) 2011
+ *     Noriaki Ando
+ *     Intelligent Systems Research Institute,
+ *     National Institute of
+ *         Advanced Industrial Science and Technology (AIST), Japan
+ *     All rights reserved.
+ *
+ * $Id$
+ *
+ */
+
+#include <BasicDataType.idl>
+#include <SDOPackage11.idl>
+/*!
+ * @if jp
+ * @brief ƒRƒ“ƒ|[ƒlƒ“ƒgƒƒOŽûWƒT[ƒrƒXƒCƒ“ƒ^[ƒtƒF[ƒX
+ *
+ * ƒRƒ“ƒ|[ƒlƒ“ƒg‚̃ƒOî•ñ‚ðŠO•”‚©‚çŽæ“¾‚·‚邽‚߂̃Cƒ“ƒ^[ƒtƒF[ƒXBƒR
+ * ƒ“ƒ|[ƒlƒ“ƒg‚ɑ΂µ‚āA–{SDOƒT[ƒrƒXƒIƒuƒWƒFƒNƒg‚ðƒAƒ^ƒbƒ`‚·‚邱‚ƂŁA
+ * ƒRƒ“ƒ|[ƒlƒ“ƒg‚ªo—Í‚·‚郍ƒO‚ðŠO•”‚©‚çŽæ“¾‚·‚邱‚Æ‚ª‚Å‚«‚éB
+ * 
+ * @since 1.1
+ *
+ * @else
+ * @brief Component logging service interface
+ *
+ * This interface defines logging service of an RT-Component from
+ * outside. Attaching this service interface to an RT-Component, you
+ * can get logging information from the RT-Component.
+ *
+ * @since 1.1
+ * @endif
+ *
+ */
+module OpenRTM
+{
+  /*!
+   * @if jp
+   *
+   * @brief ƒƒOƒŒƒxƒ‹
+   * 
+   * ƒƒOƒŒƒxƒ‹BƒƒOƒŒƒxƒ‹‚Í9’iŠK‚ ‚èA‚»‚ꂼ‚êˆÈ‰º‚̈Ӗ¡‚ðŽ‚ÂB
+   * 
+   *  - SILENT  : ƒƒMƒ“ƒO‹@”\‚ðƒIƒt‚É‚·‚邽‚ß‚Ì‹^Ž—ƒŒƒxƒ‹
+   *  - ERROR   : ƒGƒ‰[‚ª”­¶‚µ‚½‚±‚Æ‚ðˆÓ–¡‚·‚郍ƒOƒŒƒxƒ‹
+   *  - WARN    : ƒGƒ‰[‚Å‚Í‚È‚¢‚ª’ˆÓ‚·‚ׂ«Œx‚ðˆÓ–¡‚·‚郍ƒOƒŒƒxƒ‹
+   *  - INFO    : •t‰Á“I‚ȏî•ñ‚ð’ñ‹Ÿ‚·‚邽‚߂̃ƒOƒŒƒxƒ‹
+   *  - NORMAL  : ’ʏí‚̏î•ñ‚ð’ñ‹Ÿ‚·‚邽‚߂̃ƒOƒŒƒxƒ‹
+   *  - DEBUG   : ƒfƒoƒbƒOî•ñ‚ð’ñ‹Ÿ‚·‚éÛ‚̃ƒOƒŒƒxƒ‹
+   *  - TRACE   : ƒgƒŒ[ƒXƒŒƒxƒ‹‚̏î•ñ‚ð’ñ‹Ÿ‚·‚éÛ‚̃ƒOƒŒƒxƒ‹
+   *  - VERBOSE : ƒgƒŒ[ƒXî•ñˆÈã‚ɏڍׂȏî•ñ‚ð’ñ‹Ÿ‚·‚éÛ‚̃ƒOƒŒƒxƒ‹
+   *  - PARANOID: ƒŠƒAƒ‹ƒ^ƒCƒ€ŽüŠúˆ—ŽÀsŽž“™‚̏î•ñ‚ð’ñ‹Ÿ‚·‚郍ƒOƒŒƒxƒ‹
+   * 
+   * @else
+   *
+   * @brief Log level
+   * 
+   * This enumeration defines log levels. The log level consists of
+   * nine levels, and each level means the following meaning.
+   * 
+   *  - SILENT  : Pseudo log level to stop logging function.
+   *  - ERROR   : This log level means that an error event is occurring.
+   *  - WARN    : This log level means that a warning event is occurring.
+   *  - INFO    : This log level used to notify information.
+   *  - NORMAL  : This log level means that an event is normal thing.
+   *  - DEBUG   : This log level used to notify debugging information.
+   *  - TRACE   : This log level used to notify trace information.
+   *  - VERBOSE : This log level used to notify more detailed information.
+   *  - PARANOID: This is used only to notify information in real-time loop.
+   *
+   * @endif
+   */
+  enum LogLevel
+  {
+    SILENT,
+    ERROR,
+    WARN,
+    INFO,
+    NORMAL,
+    DEBUG,
+    TRACE,
+    VERBOSE,
+    PARANOID
+  };
+
+  /*!
+   * @if jp
+   * @brief ƒƒOƒŒƒR[ƒh\‘¢‘Ì
+   *
+   * ƒƒOƒƒbƒZ[ƒW‚ðŠÜ‚ÞƒƒOî•ñ‚ð•ÛŽ‚·‚é\‘¢‘Ì
+   *
+   * @else
+   * @brief Log record structure
+   *
+   * This struct defines logging information including log message.
+   *
+   * @endif
+   *
+   */
+  struct LogRecord
+  {
+    /*!
+     * @if jp
+     * @brief Žž
+     * ƒ^ƒCƒ€ƒXƒ^ƒ“ƒv
+     * @else
+     * @brief Time
+     * Time stump.
+     * @endif
+     */
+    RTC::Time   time;
+
+    /*!
+     * @if jp
+     * @brief ƒƒK[–¼
+     * ƒƒO‚ð‘‚«‚±‚ñ‚¾ƒƒK[ƒIƒuƒWƒFƒNƒg–¼
+     * @else
+     * @brief logger name
+     * The logger name which writes this record.
+     * @endif
+     */
+    string loggername;
+
+    /*!
+     * @if jp
+     * @brief ƒƒOƒŒƒxƒ‹
+     * ‚±‚̃ŒƒR[ƒh‚̃ƒOƒŒƒxƒ‹
+     * @else
+     * @brief Log level
+     * The log level of this record
+     * @endif
+     */
+    LogLevel  level;
+
+    /*!
+     * @if jp
+     * @brief ƒƒbƒZ[ƒW
+     * ƒƒOƒƒbƒZ[ƒW
+     * @else
+     * @brief Message
+     * Log message.
+     * @endif
+     */
+    string message;
+  };
+
+
+  /*!
+   * @if jp
+   *
+   * @interface Logger ƒCƒ“ƒ^[ƒtƒF[ƒX
+   *
+   * ŒÂ•Ê‚ÌRTC‚̃ƒOî•ñ‚ðŽæ“¾‚·‚邽‚߂̃T[ƒrƒXƒCƒ“ƒ^[ƒtƒF[ƒXBSDO
+   * Service ‚Æ‚µ‚đΏۂƂȂéRTC/SDO‚ɑ΂µ‚ăAƒ^ƒbƒ`‚³‚êARTC/SDO‚̃ƒO
+   * î•ñ‚ðŠO•”‚©‚çŽæ“¾‚·‚éBŽÀÛ‚̏ˆ—ƒV[ƒPƒ“ƒX‚͈ȉº‚Ì’Ê‚è‚Å‚ ‚éB
+   *
+   * -# SDO::get_configuration() ‚É‚æ‚è Configuration ƒIƒuƒWƒFƒNƒg‚ðŽæ“¾
+   * -# Configuration::add_service_profile() ‚É‚æ‚èTool‘¤‚Ì
+   *     Logger ‚ð ServiceProfile ‚É‚æ‚è RTC ‚É—^‚¦‚éB
+   *     ServiceProfile ‚̃ƒ“ƒo[‚͈ȉº‚̂悤‚ɐݒ肷‚邱‚Æ
+   *   - id: UUID ‚ȂLjêˆÓ‚ÈID‚ðÝ’è‚·‚éBíœŽž‚É‚à•K—v‚É‚È‚é‚̂ŁATool
+   *     ‘¤‚Å‚ÍID‚ð•ÛŽ‚µ‚Ä‚¨‚©‚È‚¯‚ê‚΂Ȃç‚È‚¢B
+   *   - interface_type: “–ŠYƒT[ƒrƒX‚ÌIFR‚ÌID‚𕶎š—ñ‚Æ‚µ‚ÄŽw’èBRTC‘¤‚Å
+   *     ‚Í‚±‚Ì•¶Žš—ñ‚É‚æ‚è“–ŠYƒT[ƒrƒXƒIƒuƒWƒFƒNƒg‚ðŽó‚¯“ü‚ê‚é‚©Œˆ’è‚·
+   *     ‚邽‚ߎw’è‚Í•K{‚Æ‚È‚éB
+   *   - properties: RTC‘¤‚̃T[ƒrƒX‚̎󂯓ü‚ꑤ‚É’Ê’m‚·‚éƒvƒƒpƒeƒB‚ðÝ
+   *     ’è‚·‚éB‚±‚̃T[ƒrƒX‚ł́A‰º‹L‚̃ƒOƒŒƒxƒ‹ŠÖ˜A‚̃vƒƒpƒeƒB‚ð
+   *     Žw’è‚·‚éB
+   *    - service: SDOService ƒIƒuƒWƒFƒNƒg‚ÌŽQÆ‚ðŽw’è‚·‚éB
+   * -# RTC‘¤‚эƒK[‚ւ̏‘‚«ž‚Ý‚ª—L‚Á‚½ê‡‚É‚Í publish() ƒIƒyƒŒ[ƒVƒ‡ƒ“
+   *     ‚ª LogRecord \‘¢‘Ì‚Æ‚µ‚ăƒOƒƒbƒZ[ƒW‚âƒ^ƒCƒ€ƒXƒ^ƒ“ƒv‚ðƒT[
+   *     ƒrƒX‘¤‚É’Ê’m‚·‚éBƒT[ƒrƒX‚ð•ÛŽ‚·‚鑤‚ł́ALogRecord“à‚̏î•ñ
+   *     ‚ðƒtƒ@ƒCƒ‹‚ɏ‘‚«ž‚ށA•\Ž¦‚·‚é“™‚Ì•û–@‚Å—˜—p‚·‚邱‚Æ‚ª‚Å‚«‚éB
+   * -# RTC‘¤‚ªI—¹‚·‚é‚Æ‚«‚ɂ́Aclose() ƒIƒyƒŒ[ƒVƒ‡ƒ“‚ªŒÄ‚яo‚³‚ê‚é‚Ì
+   *    ‚ŁAƒT[ƒrƒX’ñ‹Ÿ‘¤‚Í“KØ‚ȏI—¹ˆ—‚ðs‚¤•K—v‚ª‚ ‚éBclose()‚ªŒÄ
+   *    ‚΂ꂽê‡‚́Aremove_service_profile() ‚É‚æ‚è–¾Ž¦“I‚ɃT[ƒrƒX‚ð
+   *    íœ‚·‚é•K—v‚Í‚È‚¢B‚Ü‚½RTC‘¤‚Å‚Íclose() ‚ðŒÄ‚ñ‚¾Œã‚́A“–ŠYƒT[
+   *    ƒrƒX‚ÉŠÖ‚·‚éî•ñ‚⃊ƒ\[ƒX‚ð“KØ‚ÉŠJ•ú‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢B
+   * -# ƒc[ƒ‹“™‚̃T[ƒrƒX’ñ‹Ÿ‘¤‚ªI—¹‚·‚éê‡‚Ȃǂ́A
+   *    remove_service_profile() ƒIƒyƒŒ[ƒVƒ‡ƒ“‚ðŒÄ‚яo‚µA“–ŠYRTCã‚Ì
+   *    ƒŠƒ\[ƒX‚ð“KØ‚ÉŠJ•ú‚·‚é•K—v‚ª‚ ‚éBRTC‘¤‚́A
+   *    remove_service_profile() ‚ªŒÄ‚яo‚³‚ꂽÛ‚ɂ́A“–ŠYƒƒMƒ“ƒO‚ÉŠÖ
+   *    ‚·‚郊ƒ\[ƒX‚ð“KØ‚ÉŠJ•ú‚·‚é•K—v‚ª‚ ‚éB
+   *
+   * ã‹L‚̃vƒƒZƒX‚ð‰º‹LƒV[ƒPƒ“ƒX}‚ÉŽ¦‚·B
+   *
+   * <pre>
+   * 
+   *   [RTC]    [Configuration]           [Logger]      [Tool]
+   *     |            |                       |            |
+   *     |            | get_configuration()   |            |
+   *     |<------------------------------------------------|
+   *     |            |                       |            |
+   *     |            | add_service_profile(prof)          |
+   *     |            |<-----------------------------------|
+   *     |            |                       |            |
+   *     |            | publish(logrecord)    |            |
+   *     |----------------------------------->|            |
+   *     |            | publish(logrecord)    |            |
+   *     |----------------------------------->|            |
+   *     |            |       :               |            |
+   *     |            |       :               |            |
+   *     |            | 1) RTC‚ªæ‚ɏI—¹‚·‚é‚Æ‚«           |
+   *     |            |       :               |            |
+   *     |            | [close()]             |            |
+   *     |----------------------------------->|            |
+   *     |            |       :               |            |
+   *     |            | 2) ƒc[ƒ‹‚ªƒƒMƒ“ƒO‚ðI—¹‚·‚é‚Æ‚«  |
+   *     |            |       :               |            |
+   *     |            | remove_service_profile(id)         |
+   *     |            |<-----------------------------------|
+   *     |            |                       |            |
+   *     |            |                       x            x
+   *
+   * </pre>
+   *
+   * ‚È‚¨AServiceProfile::properties ‚ÉŽw’è‚·‚éƒvƒƒpƒeƒB‚Æ‚µ‚ẮA
+   *
+   * - logger.log_level: (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE,
+   *                     PARANOID)
+   * - logger.filter: logger name or "ALL"
+   *
+   * ‚ª‚ ‚éA
+   *
+   * - logger.log_level: ERROR, WARN, INFO, NORMAL, DEBUG, TRACE,
+   *   VERBOSE ‚Ü‚½‚ÍPARANOID ‚Ì‚¤‚¿ˆê‚‚ðŽw’è‚·‚éB–³Žw’è‚̏ꍇ‚Í
+   *   NORMAL ‚Æ“¯“™‚Æ‚È‚éBŽw’肳‚ꂽƒŒƒxƒ‹‚Æ“¯“™‚ ‚é‚¢‚Í‚»‚ê‚æ‚èd—v
+   *   ‚ȏî•ñ‚ªƒƒMƒ“ƒO‚³‚ê‚éB‚·‚È‚í‚¿A‚»‚ꂼ‚ê‚̃ƒOƒŒƒxƒ‹‚ðŽw’肵‚½
+   *   Û‚ɏo—Í‚³‚ê‚郍ƒO‚͈ȉº‚ÌŠÖŒW‚É‚È‚éB
+   *   - ERROR   : (ERROR)
+   *   - WARN    : (ERROR, WARN)
+   *   - INFO    : (ERROR, WARN, INFO)
+   *   - NORMAL  : (ERROR, WARN, INFO, NORMAL)
+   *   - DEBUG   : (ERROR, WARN, INFO, NORMAL, DEBUG)
+   *   - TRACE   : (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE)
+   *   - VERBOSE : (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE)
+   *   - PARANOID: (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE, PARA)
+   * - logger.filter: RTC“à•”‚́ARTC–{‘́Aƒf[ƒ^ƒ|[ƒgAƒT[ƒrƒXƒ|[ƒg
+   *   “™‚»‚ꂼ‚ê‚̃IƒuƒWƒFƒNƒg‚ɃƒK[ƒIƒuƒWƒFƒNƒg‚ª‘¶Ý‚·‚éB‚±‚̃vƒ
+   *   ƒpƒeƒB‚̓ƒMƒ“ƒO‚·‚é‘Ώۂ̃ƒK[ƒIƒuƒWƒFƒNƒg‚ðƒJƒ“ƒ}‹æØ‚è‚ÅŽw’è
+   *   ‚·‚éB‚Ü‚½‚́AALL‚ðŽw’è‚·‚邱‚Æ‚ÅRTC”z‰º‚Ì‚·‚ׂẴƒMƒ“ƒOƒIƒuƒWƒF
+   *   ƒNƒg‚©‚ç‚̃ƒbƒZ[ƒW‚ðŽóM‚·‚éB–³Žw’è‚̏ꍇ‚ÍALL‚Æ“¯“™‚É‚È‚éB
+   *
+   * @else
+   * @class
+   *
+   * @interface Logger interface
+   *
+   * This interface defines logging service for each RT-Component.
+   * This service would be attached to a target RTC/SDO, and provides
+   * functionality to collect log information from remote
+   * applications.  Actual process sequences are the following.
+   *
+   * -# Get configuration object by SDO::get_configuration() 
+   * -# Attach Logger object with ServiceProfile by
+   *    Configuration::add_service_profile(). ServiceProfile should be
+   *    set as follows.
+   *   - id: An unique ID like UUID. This ID is used when this service
+   *         is removed. Tools or applications should keep the ID for
+   *         this.
+   *   - interface_type: Specify this service's IFR ID in string. This
+   *         string is used to search available service in the RTC,
+   *         and if it matches with available SDO services, this
+   *         service is accepted.
+   *   - properties: This member specifies properties to notify
+   *         information to the target RTC.  The following properties
+   *         for log level and others would be specified in this
+   *         properties.
+   *
+   *   - service: A SDOService object reference is specified.
+   * -# When logging occurs in the RTC side, the "publish()" operation
+   *    notifies a log message, time stump and so on to the service
+   *    provider as a LogRecord structure. The service provider can
+   *    use notified information for example writing to files and
+   *    showing them on the display.
+   * -# When RTC is terminated, the "close()" operation is called, and
+   *    the service provider has to terminate the logging service
+   *    properly.  In this case, tools and applications that have
+   *    service provider do not need to call remove_service_profile()
+   *    and remove the service explicitly. After calling close()
+   *    operation, the RTC has to release the service profile and
+   *    resources.
+   * -# When tools and applications terminate services, they have to
+   *    call remove_service_profile() operation, and have to release
+   *    resources in the target RTC. When remove_service_profile() is
+   *    called, the RTC have to release service profile and resources
+   *    for this service.
+   *
+   * The following diagram shows above mentioned sequence.
+   *
+   * <pre>
+   * 
+   *   [RTC]    [Configuration]           [Logger]      [Tool]
+   *     |            |                       |            |
+   *     |            | get_configuration()   |            |
+   *     |<------------------------------------------------|
+   *     |            |                       |            |
+   *     |            | add_service_profile(prof)          |
+   *     |            |<-----------------------------------|
+   *     |            |                       |            |
+   *     |            | publish(logrecord)    |            |
+   *     |----------------------------------->|            |
+   *     |            | publish(logrecord)    |            |
+   *     |----------------------------------->|            |
+   *     |            |       :               |            |
+   *     |            |       :               |            |
+   *     |            | 1) When RTC is terminated          |
+   *     |            |       :               |            |
+   *     |            | [close()]             |            |
+   *     |----------------------------------->|            |
+   *     |            |       :               |            |
+   *     |            | 2) When tool terminates logging    |
+   *     |            |       :               |            |
+   *     |            | remove_service_profile(id)         |
+   *     |            |<-----------------------------------|
+   *     |            |                       |            |
+   *     |            |                       x            x
+   *
+   * </pre>
+   *
+   * So far, the following properties for ServiceProfile::properties
+   * are available.
+   *
+   * - logger.log_level: (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE,
+   *                     PARANOID)
+   * - logger.filter: logger name or "ALL"
+   *
+   *
+   * - logger.log_level: One of ERROR, WARN, INFO, NORMAL, DEBUG,
+   *     TRACE, VERBOSE or PARANOID can be specified.  If no
+   *     properties are specified, it will be NORMAL.  Log messages
+   *     equals and/or more important specified log level would be
+   *     published.  The following list shows the relation between
+   *     specified level and published level.
+   *   - ERROR   : (ERROR)
+   *   - WARN    : (ERROR, WARN)
+   *   - INFO    : (ERROR, WARN, INFO)
+   *   - NORMAL  : (ERROR, WARN, INFO, NORMAL)
+   *   - DEBUG   : (ERROR, WARN, INFO, NORMAL, DEBUG)
+   *   - TRACE   : (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE)
+   *   - VERBOSE : (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE)
+   *   - PARANOID: (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE, PARA)
+   * - logger.filter: Some logger objects exist in some object of an
+   *     RTC such as RTC body, data port, service port and so on.
+   *     Some logger objects exist in some object of an RTC such as
+   *     RTC body, data port, service port and so on.  This properties
+   *     specify target logger names separated with commas.  If ALL is
+   *     specified, all the logger's messages under the target RTC's
+   *     logger would be published.  If no property is specified, all
+   *     the messages will be published.
+   *
+   * @endif
+   *
+   */
+  interface Logger
+    : SDOPackage::SDOService
+  {
+    /*!
+     * @if jp
+     * @brief ƒƒOƒƒbƒZ[ƒW”zM
+     * ƒƒOƒƒbƒZ[ƒW‚ð”zM‚·‚é
+     * @else
+     * @brief Publish log message
+     * This operation publishes log message.
+     * @endif
+     */
+    oneway void publish(in LogRecord record);
+
+    /*!
+     * @if jp
+     * @brief ƒT[ƒrƒX‚̏I—¹
+     * ƒƒMƒ“ƒOƒT[ƒrƒX‚̏I—¹‚ð’Ê’m‚·‚é
+     * @else
+     * @brief Terminate service
+     * This operation notifies logging service.
+     * @endif
+     */
+    void close();
+  };
+};
+

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/plugin.xml
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/plugin.xml	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/plugin.xml	2011-04-28 03:04:05 UTC (rev 168)
@@ -82,7 +82,7 @@
      </factory>
      <factory
             class="jp.go.aist.rtm.toolscommon.adapterfactory.WorkbenchAdapterFactory"
-            adaptableType="jp.go.aist.rtm.toolscommon.model.component.CorbaStatusObserver">
+            adaptableType="jp.go.aist.rtm.toolscommon.model.component.CorbaObserver">
                 <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
      </factory>
      <factory

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/adapterfactory/WorkbenchAdapterFactory.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/adapterfactory/WorkbenchAdapterFactory.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/adapterfactory/WorkbenchAdapterFactory.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -2,7 +2,7 @@
 
 import jp.go.aist.rtm.toolscommon.model.component.Component;
 import jp.go.aist.rtm.toolscommon.model.component.ContextHandler;
-import jp.go.aist.rtm.toolscommon.model.component.CorbaStatusObserver;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaObserver;
 import jp.go.aist.rtm.toolscommon.model.component.ExecutionContext;
 import jp.go.aist.rtm.toolscommon.model.component.InPort;
 import jp.go.aist.rtm.toolscommon.model.component.OutPort;
@@ -13,7 +13,7 @@
 import jp.go.aist.rtm.toolscommon.model.manager.RTCManager;
 import jp.go.aist.rtm.toolscommon.ui.workbenchadapter.ComponentWorkbenchAdapter;
 import jp.go.aist.rtm.toolscommon.ui.workbenchadapter.ContextHandlerWorkbenchAdapter;
-import jp.go.aist.rtm.toolscommon.ui.workbenchadapter.CorbaStatusObserverWorkbenchAdapter;
+import jp.go.aist.rtm.toolscommon.ui.workbenchadapter.CorbaObserverWorkbenchAdapter;
 import jp.go.aist.rtm.toolscommon.ui.workbenchadapter.ExecutionContextWorkbenchAdapter;
 import jp.go.aist.rtm.toolscommon.ui.workbenchadapter.InPortWorkbenchAdapter;
 import jp.go.aist.rtm.toolscommon.ui.workbenchadapter.OutPortWorkbenchAdapter;
@@ -50,8 +50,8 @@
 				return new ExecutionContextWorkbenchAdapter();
 			} else if (adaptable instanceof ContextHandler) {
 				return new ContextHandlerWorkbenchAdapter();
-			} else if (adaptable instanceof CorbaStatusObserver) {
-				return new CorbaStatusObserverWorkbenchAdapter();
+			} else if (adaptable instanceof CorbaObserver) {
+				return new CorbaObserverWorkbenchAdapter();
 			} else if (adaptable instanceof SystemDiagram) {
 				return new SystemDiagramWorkbenchAdapter();
 			} else if (adaptable instanceof RTCManager) {

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/ComponentFactory.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/ComponentFactory.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/ComponentFactory.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -135,6 +135,15 @@
 	CorbaStatusObserver createCorbaStatusObserver();
 
 	/**
+	 * Returns a new object of class '<em>Corba Log Observer</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Corba Log Observer</em>'.
+	 * @generated
+	 */
+	CorbaLogObserver createCorbaLogObserver();
+
+	/**
 	 * Returns a new object of class '<em>Specification</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/ComponentPackage.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/ComponentPackage.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/ComponentPackage.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -2160,13 +2160,22 @@
 	int CORBA_COMPONENT__STATUS_OBSERVER = COMPONENT_FEATURE_COUNT + 10;
 
 	/**
+	 * The feature id for the '<em><b>Log Observer</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CORBA_COMPONENT__LOG_OBSERVER = COMPONENT_FEATURE_COUNT + 11;
+
+	/**
 	 * The number of structural features of the '<em>Corba Component</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int CORBA_COMPONENT_FEATURE_COUNT = COMPONENT_FEATURE_COUNT + 11;
+	int CORBA_COMPONENT_FEATURE_COUNT = COMPONENT_FEATURE_COUNT + 12;
 
 	/**
 	 * The meta object id for the '{@link jp.go.aist.rtm.toolscommon.model.component.impl.CorbaPortSynchronizerImpl <em>Corba Port Synchronizer</em>}' class.
@@ -2725,6 +2734,43 @@
 	int CORBA_STATUS_OBSERVER_FEATURE_COUNT = CORBA_OBSERVER_FEATURE_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link jp.go.aist.rtm.toolscommon.model.component.impl.CorbaLogObserverImpl <em>Corba Log Observer</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.CorbaLogObserverImpl
+	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getCorbaLogObserver()
+	 * @generated
+	 */
+	int CORBA_LOG_OBSERVER = 24;
+
+	/**
+	 * The feature id for the '<em><b>Service Profile</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CORBA_LOG_OBSERVER__SERVICE_PROFILE = CORBA_OBSERVER__SERVICE_PROFILE;
+
+	/**
+	 * The feature id for the '<em><b>Servant</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CORBA_LOG_OBSERVER__SERVANT = CORBA_OBSERVER__SERVANT;
+
+	/**
+	 * The number of structural features of the '<em>Corba Log Observer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CORBA_LOG_OBSERVER_FEATURE_COUNT = CORBA_OBSERVER_FEATURE_COUNT + 0;
+
+	/**
 	 * The meta object id for the '{@link jp.go.aist.rtm.toolscommon.model.component.SystemDiagramKind <em>System Diagram Kind</em>}' enum.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2732,7 +2778,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getSystemDiagramKind()
 	 * @generated
 	 */
-	int SYSTEM_DIAGRAM_KIND = 24;
+	int SYSTEM_DIAGRAM_KIND = 25;
 
 	/**
 	 * The meta object id for the '<em>RTC Component Profile</em>' data type.
@@ -2742,7 +2788,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getRTCComponentProfile()
 	 * @generated
 	 */
-	int RTC_COMPONENT_PROFILE = 30;
+	int RTC_COMPONENT_PROFILE = 31;
 
 	/**
 	 * The meta object id for the '<em>RTCRT Object</em>' data type.
@@ -2752,7 +2798,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getRTCRTObject()
 	 * @generated
 	 */
-	int RTCRT_OBJECT = 29;
+	int RTCRT_OBJECT = 30;
 
 	/**
 	 * The meta object id for the '<em>List</em>' data type.
@@ -2762,7 +2808,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getList()
 	 * @generated
 	 */
-	int LIST = 37;
+	int LIST = 38;
 
 	/**
 	 * The meta object id for the '<em>Servant</em>' data type.
@@ -2772,7 +2818,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getServant()
 	 * @generated
 	 */
-	int SERVANT = 38;
+	int SERVANT = 39;
 
 	/**
 	 * The meta object id for the '<em>SDO Configuration</em>' data type.
@@ -2782,7 +2828,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getSDOConfiguration()
 	 * @generated
 	 */
-	int SDO_CONFIGURATION = 25;
+	int SDO_CONFIGURATION = 26;
 
 	/**
 	 * The meta object id for the '<em>SDO Configuration Set</em>' data type.
@@ -2792,7 +2838,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getSDOConfigurationSet()
 	 * @generated
 	 */
-	int SDO_CONFIGURATION_SET = 26;
+	int SDO_CONFIGURATION_SET = 27;
 
 	/**
 	 * The meta object id for the '<em>RTC Connector Profile</em>' data type.
@@ -2802,7 +2848,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getRTCConnectorProfile()
 	 * @generated
 	 */
-	int RTC_CONNECTOR_PROFILE = 31;
+	int RTC_CONNECTOR_PROFILE = 32;
 
 	/**
 	 * The meta object id for the '<em>RTC Port Profile</em>' data type.
@@ -2812,7 +2858,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getRTCPortProfile()
 	 * @generated
 	 */
-	int RTC_PORT_PROFILE = 32;
+	int RTC_PORT_PROFILE = 33;
 
 	/**
 	 * The meta object id for the '<em>RTC Execution Context</em>' data type.
@@ -2822,7 +2868,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getRTCExecutionContext()
 	 * @generated
 	 */
-	int RTC_EXECUTION_CONTEXT = 33;
+	int RTC_EXECUTION_CONTEXT = 34;
 
 	/**
 	 * The meta object id for the '<em>Property Change Listener</em>' data type.
@@ -2832,7 +2878,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getPropertyChangeListener()
 	 * @generated
 	 */
-	int PROPERTY_CHANGE_LISTENER = 35;
+	int PROPERTY_CHANGE_LISTENER = 36;
 
 	/**
 	 * The meta object id for the '<em>SDO Organization</em>' data type.
@@ -2842,7 +2888,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getSDOOrganization()
 	 * @generated
 	 */
-	int SDO_ORGANIZATION = 27;
+	int SDO_ORGANIZATION = 28;
 
 
 	/**
@@ -2853,7 +2899,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getSDOServiceProfile()
 	 * @generated
 	 */
-	int SDO_SERVICE_PROFILE = 28;
+	int SDO_SERVICE_PROFILE = 29;
 
 	/**
 	 * The meta object id for the '<em>Port Interface Profile</em>' data type.
@@ -2863,7 +2909,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getPortInterfaceProfile()
 	 * @generated
 	 */
-	int PORT_INTERFACE_PROFILE = 36;
+	int PORT_INTERFACE_PROFILE = 37;
 
 
 	/**
@@ -2874,7 +2920,7 @@
 	 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getRTCExecutionContextProfile()
 	 * @generated
 	 */
-	int RTC_EXECUTION_CONTEXT_PROFILE = 34;
+	int RTC_EXECUTION_CONTEXT_PROFILE = 35;
 
 
 	/**
@@ -3359,6 +3405,17 @@
 	EReference getCorbaComponent_StatusObserver();
 
 	/**
+	 * Returns the meta object for the reference '{@link jp.go.aist.rtm.toolscommon.model.component.CorbaComponent#getLogObserver <em>Log Observer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Log Observer</em>'.
+	 * @see jp.go.aist.rtm.toolscommon.model.component.CorbaComponent#getLogObserver()
+	 * @see #getCorbaComponent()
+	 * @generated
+	 */
+	EReference getCorbaComponent_LogObserver();
+
+	/**
 	 * Returns the meta object for class '{@link jp.go.aist.rtm.toolscommon.model.component.ComponentSpecification <em>Specification</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4275,6 +4332,16 @@
 	EClass getCorbaStatusObserver();
 
 	/**
+	 * Returns the meta object for class '{@link jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver <em>Corba Log Observer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Corba Log Observer</em>'.
+	 * @see jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver
+	 * @generated
+	 */
+	EClass getCorbaLogObserver();
+
+	/**
 	 * Returns the meta object for enum '{@link jp.go.aist.rtm.toolscommon.model.component.SystemDiagramKind <em>System Diagram Kind</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4819,6 +4886,14 @@
 		EReference CORBA_COMPONENT__STATUS_OBSERVER = eINSTANCE.getCorbaComponent_StatusObserver();
 
 		/**
+		 * The meta object literal for the '<em><b>Log Observer</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CORBA_COMPONENT__LOG_OBSERVER = eINSTANCE.getCorbaComponent_LogObserver();
+
+		/**
 		 * The meta object literal for the '{@link jp.go.aist.rtm.toolscommon.model.component.impl.ComponentSpecificationImpl <em>Specification</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -5541,6 +5616,16 @@
 		EClass CORBA_STATUS_OBSERVER = eINSTANCE.getCorbaStatusObserver();
 
 		/**
+		 * The meta object literal for the '{@link jp.go.aist.rtm.toolscommon.model.component.impl.CorbaLogObserverImpl <em>Corba Log Observer</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see jp.go.aist.rtm.toolscommon.model.component.impl.CorbaLogObserverImpl
+		 * @see jp.go.aist.rtm.toolscommon.model.component.impl.ComponentPackageImpl#getCorbaLogObserver()
+		 * @generated
+		 */
+		EClass CORBA_LOG_OBSERVER = eINSTANCE.getCorbaLogObserver();
+
+		/**
 		 * The meta object literal for the '{@link jp.go.aist.rtm.toolscommon.model.component.SystemDiagramKind <em>System Diagram Kind</em>}' enum.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaComponent.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaComponent.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaComponent.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -35,6 +35,7 @@
  *   <li>{@link jp.go.aist.rtm.toolscommon.model.component.CorbaComponent#getRTCRTObjects <em>RTCRT Objects</em>}</li>
  *   <li>{@link jp.go.aist.rtm.toolscommon.model.component.CorbaComponent#getIor <em>Ior</em>}</li>
  *   <li>{@link jp.go.aist.rtm.toolscommon.model.component.CorbaComponent#getStatusObserver <em>Status Observer</em>}</li>
+ *   <li>{@link jp.go.aist.rtm.toolscommon.model.component.CorbaComponent#getLogObserver <em>Log Observer</em>}</li>
  * </ul>
  * </p>
  *
@@ -288,11 +289,37 @@
 	void setStatusObserver(CorbaStatusObserver value);
 
 	/**
+	 * Returns the value of the '<em><b>Log Observer</b></em>' reference.
 	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Log Observer</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
 	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Log Observer</em>' reference.
+	 * @see #setLogObserver(CorbaLogObserver)
+	 * @see jp.go.aist.rtm.toolscommon.model.component.ComponentPackage#getCorbaComponent_LogObserver()
 	 * @model
 	 * @generated
 	 */
+	CorbaLogObserver getLogObserver();
+
+	/**
+	 * Sets the value of the '{@link jp.go.aist.rtm.toolscommon.model.component.CorbaComponent#getLogObserver <em>Log Observer</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Log Observer</em>' reference.
+	 * @see #getLogObserver()
+	 * @generated
+	 */
+	void setLogObserver(CorbaLogObserver value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
 	int startR();
 
 	/**
@@ -351,6 +378,14 @@
 	 */
 	RTObject getCorbaObjectInterface();
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean supportedCorbaObserver();
+
 	RTC.ExecutionContext getPrimaryRTCExecutionContext();
 
 	void activateAll();

Added: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaLogObserver.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaLogObserver.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaLogObserver.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,21 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id$
+ */
+package jp.go.aist.rtm.toolscommon.model.component;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Corba Log Observer</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see jp.go.aist.rtm.toolscommon.model.component.ComponentPackage#getCorbaLogObserver()
+ * @model
+ * @generated
+ */
+public interface CorbaLogObserver extends CorbaObserver {
+} // CorbaLogObserver

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaObserver.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaObserver.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/CorbaObserver.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -89,6 +89,14 @@
 	 * @model
 	 * @generated
 	 */
-	boolean detachComponent(CorbaComponent component);
+	boolean detachComponent();
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean finish();
+
 } // CorbaObserver

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/ComponentFactoryImpl.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/ComponentFactoryImpl.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/ComponentFactoryImpl.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -119,6 +119,7 @@
 			case ComponentPackage.CORBA_CONTEXT_HANDLER: return createCorbaContextHandler();
 			case ComponentPackage.CORBA_OBSERVER: return createCorbaObserver();
 			case ComponentPackage.CORBA_STATUS_OBSERVER: return createCorbaStatusObserver();
+			case ComponentPackage.CORBA_LOG_OBSERVER: return createCorbaLogObserver();
 			default:
 				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
 		}
@@ -360,6 +361,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public CorbaLogObserver createCorbaLogObserver() {
+		CorbaLogObserverImpl corbaLogObserver = new CorbaLogObserverImpl();
+		return corbaLogObserver;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public ComponentSpecification createComponentSpecification() {
 		ComponentSpecificationImpl componentSpecification = new ComponentSpecificationImpl();
 		return componentSpecification;

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/ComponentPackageImpl.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/ComponentPackageImpl.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/ComponentPackageImpl.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -22,6 +22,7 @@
 import jp.go.aist.rtm.toolscommon.model.component.CorbaConnectorProfile;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaContextHandler;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaExecutionContext;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaObserver;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaPortSynchronizer;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaStatusObserver;
@@ -234,6 +235,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass corbaLogObserverEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass componentSpecificationEClass = null;
 
 	/**
@@ -737,6 +745,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EReference getCorbaComponent_LogObserver() {
+		return (EReference)corbaComponentEClass.getEStructuralFeatures().get(10);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getExecutionContext() {
 		return executionContextEClass;
 	}
@@ -1538,6 +1555,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EClass getCorbaLogObserver() {
+		return corbaLogObserverEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getComponentSpecification() {
 		return componentSpecificationEClass;
 	}
@@ -1873,6 +1899,7 @@
 		createEAttribute(corbaComponentEClass, CORBA_COMPONENT__RTCRT_OBJECTS);
 		createEAttribute(corbaComponentEClass, CORBA_COMPONENT__IOR);
 		createEReference(corbaComponentEClass, CORBA_COMPONENT__STATUS_OBSERVER);
+		createEReference(corbaComponentEClass, CORBA_COMPONENT__LOG_OBSERVER);
 
 		corbaPortSynchronizerEClass = createEClass(CORBA_PORT_SYNCHRONIZER);
 		createEAttribute(corbaPortSynchronizerEClass, CORBA_PORT_SYNCHRONIZER__RTC_PORT_PROFILE);
@@ -1894,6 +1921,8 @@
 
 		corbaStatusObserverEClass = createEClass(CORBA_STATUS_OBSERVER);
 
+		corbaLogObserverEClass = createEClass(CORBA_LOG_OBSERVER);
+
 		// Create enums
 		systemDiagramKindEEnum = createEEnum(SYSTEM_DIAGRAM_KIND);
 
@@ -1975,6 +2004,7 @@
 		corbaObserverEClass.getESuperTypes().add(this.getIPropertyMap());
 		corbaObserverEClass.getESuperTypes().add(theCorePackage.getIAdaptable());
 		corbaStatusObserverEClass.getESuperTypes().add(this.getCorbaObserver());
+		corbaLogObserverEClass.getESuperTypes().add(this.getCorbaObserver());
 
 		// Initialize classes and features; add operations and parameters
 		initEClass(systemDiagramEClass, SystemDiagram.class, "SystemDiagram", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -2222,6 +2252,7 @@
 		initEAttribute(getCorbaComponent_RTCRTObjects(), this.getRTCRTObject(), "rTCRTObjects", "", 0, -1, CorbaComponent.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getCorbaComponent_Ior(), ecorePackage.getEString(), "ior", null, 0, 1, CorbaComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getCorbaComponent_StatusObserver(), this.getCorbaStatusObserver(), null, "statusObserver", null, 0, 1, CorbaComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getCorbaComponent_LogObserver(), this.getCorbaLogObserver(), null, "logObserver", null, 0, 1, CorbaComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		addEOperation(corbaComponentEClass, ecorePackage.getEInt(), "startR", 0, 1, IS_UNIQUE, IS_ORDERED);
 
@@ -2239,6 +2270,8 @@
 
 		addEOperation(corbaComponentEClass, this.getRTCRTObject(), "getCorbaObjectInterface", 0, 1, IS_UNIQUE, IS_ORDERED);
 
+		addEOperation(corbaComponentEClass, ecorePackage.getEBoolean(), "supportedCorbaObserver", 0, 1, IS_UNIQUE, IS_ORDERED);
+
 		initEClass(corbaPortSynchronizerEClass, CorbaPortSynchronizer.class, "CorbaPortSynchronizer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getCorbaPortSynchronizer_RTCPortProfile(), this.getRTCPortProfile(), "rTCPortProfile", null, 0, 1, CorbaPortSynchronizer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
@@ -2290,13 +2323,16 @@
 		op = addEOperation(corbaObserverEClass, ecorePackage.getEBoolean(), "attachComponent", 0, 1, IS_UNIQUE, IS_ORDERED);
 		addEParameter(op, this.getCorbaComponent(), "component", 0, 1, IS_UNIQUE, IS_ORDERED);
 
-		op = addEOperation(corbaObserverEClass, ecorePackage.getEBoolean(), "detachComponent", 0, 1, IS_UNIQUE, IS_ORDERED);
-		addEParameter(op, this.getCorbaComponent(), "component", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEOperation(corbaObserverEClass, ecorePackage.getEBoolean(), "detachComponent", 0, 1, IS_UNIQUE, IS_ORDERED);
 
+		addEOperation(corbaObserverEClass, ecorePackage.getEBoolean(), "finish", 0, 1, IS_UNIQUE, IS_ORDERED);
+
 		initEClass(corbaStatusObserverEClass, CorbaStatusObserver.class, "CorbaStatusObserver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
 		addEOperation(corbaStatusObserverEClass, ecorePackage.getEBoolean(), "isTimeOut", 0, 1, IS_UNIQUE, IS_ORDERED);
 
+		initEClass(corbaLogObserverEClass, CorbaLogObserver.class, "CorbaLogObserver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
 		// Initialize enums and add enum literals
 		initEEnum(systemDiagramKindEEnum, SystemDiagramKind.class, "SystemDiagramKind");
 		addEEnumLiteral(systemDiagramKindEEnum, SystemDiagramKind.ONLINE_LITERAL);

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaComponentImpl.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaComponentImpl.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaComponentImpl.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -19,6 +19,7 @@
 import jp.go.aist.rtm.toolscommon.model.component.ConfigurationSet;
 import jp.go.aist.rtm.toolscommon.model.component.ContextHandler;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaComponent;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaConfigurationSet;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaExecutionContext;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaPortSynchronizer;
@@ -28,6 +29,7 @@
 import jp.go.aist.rtm.toolscommon.model.component.Port;
 import jp.go.aist.rtm.toolscommon.model.component.SystemDiagram;
 import jp.go.aist.rtm.toolscommon.model.component.util.CorbaObjectStore;
+import jp.go.aist.rtm.toolscommon.model.component.util.CorbaObserverStore;
 import jp.go.aist.rtm.toolscommon.model.component.util.CorbaPropertyMap;
 import jp.go.aist.rtm.toolscommon.model.component.util.IPropertyMapUtil;
 import jp.go.aist.rtm.toolscommon.model.core.CorbaWrapperObject;
@@ -47,7 +49,6 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EDataTypeEList;
@@ -85,6 +86,7 @@
  *   <li>{@link jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl#getRTCRTObjects <em>RTCRT Objects</em>}</li>
  *   <li>{@link jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl#getIor <em>Ior</em>}</li>
  *   <li>{@link jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl#getStatusObserver <em>Status Observer</em>}</li>
+ *   <li>{@link jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl#getLogObserver <em>Log Observer</em>}</li>
  * </ul>
  * </p>
  *
@@ -271,6 +273,16 @@
 	 */
 	protected CorbaStatusObserver statusObserver;
 
+	/**
+	 * The cached value of the '{@link #getLogObserver() <em>Log Observer</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLogObserver()
+	 * @generated
+	 * @ordered
+	 */
+	protected CorbaLogObserver logObserver;
+
 	protected IPropertyMapUtil properties;
 
 	/**
@@ -509,19 +521,12 @@
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @generated
+	 * @generated NOT
 	 */
 	@Override
 	public CorbaStatusObserver getStatusObserver() {
-		if (statusObserver != null && statusObserver.eIsProxy()) {
-			InternalEObject oldStatusObserver = (InternalEObject)statusObserver;
-			statusObserver = (CorbaStatusObserver)eResolveProxy(oldStatusObserver);
-			if (statusObserver != oldStatusObserver) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ComponentPackage.CORBA_COMPONENT__STATUS_OBSERVER, oldStatusObserver, statusObserver));
-			}
-		}
-		return statusObserver;
+		return CorbaObserverStore.eINSTANCE
+				.findStatusObserver(getCorbaObjectInterface());
 	}
 
 	/**
@@ -536,16 +541,53 @@
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @generated
+	 * @generated NOT
 	 */
 	@Override
 	public void setStatusObserver(CorbaStatusObserver newStatusObserver) {
+		CorbaObserverStore.eINSTANCE.registStatusObserver(
+				getCorbaObjectInterface(), newStatusObserver);
+		//
 		CorbaStatusObserver oldStatusObserver = statusObserver;
 		statusObserver = newStatusObserver;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, ComponentPackage.CORBA_COMPONENT__STATUS_OBSERVER, oldStatusObserver, statusObserver));
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	public CorbaLogObserver getLogObserver() {
+		return CorbaObserverStore.eINSTANCE
+				.findLogObserver(getCorbaObjectInterface());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CorbaLogObserver basicGetLogObserver() {
+		return logObserver;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	public void setLogObserver(CorbaLogObserver newLogObserver) {
+		CorbaObserverStore.eINSTANCE.registLogObserver(
+				getCorbaObjectInterface(), newLogObserver);
+		//
+		CorbaLogObserver oldLogObserver = logObserver;
+		logObserver = newLogObserver;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ComponentPackage.CORBA_COMPONENT__LOG_OBSERVER, oldLogObserver, logObserver));
+	}
+
 	@Override
 	public RTC.RTObject getCorbaObjectInterface() {
 		return RTC.RTObjectHelper.narrow(getCorbaObject());
@@ -726,6 +768,9 @@
 			case ComponentPackage.CORBA_COMPONENT__STATUS_OBSERVER:
 				if (resolve) return getStatusObserver();
 				return basicGetStatusObserver();
+			case ComponentPackage.CORBA_COMPONENT__LOG_OBSERVER:
+				if (resolve) return getLogObserver();
+				return basicGetLogObserver();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -775,6 +820,9 @@
 			case ComponentPackage.CORBA_COMPONENT__STATUS_OBSERVER:
 				setStatusObserver((CorbaStatusObserver)newValue);
 				return;
+			case ComponentPackage.CORBA_COMPONENT__LOG_OBSERVER:
+				setLogObserver((CorbaLogObserver)newValue);
+				return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -820,6 +868,9 @@
 			case ComponentPackage.CORBA_COMPONENT__STATUS_OBSERVER:
 				setStatusObserver((CorbaStatusObserver)null);
 				return;
+			case ComponentPackage.CORBA_COMPONENT__LOG_OBSERVER:
+				setLogObserver((CorbaLogObserver)null);
+				return;
 		}
 		super.eUnset(featureID);
 	}
@@ -854,6 +905,8 @@
 				return IOR_EDEFAULT == null ? ior != null : !IOR_EDEFAULT.equals(ior);
 			case ComponentPackage.CORBA_COMPONENT__STATUS_OBSERVER:
 				return statusObserver != null;
+			case ComponentPackage.CORBA_COMPONENT__LOG_OBSERVER:
+				return logObserver != null;
 		}
 		return super.eIsSet(featureID);
 	}
@@ -1421,9 +1474,9 @@
 						if (oec != null) {
 							for (RTC.ExecutionContext ec : oec) {
 								// ec profile
-								cc.synchronizeRemote_EC_ECProfile(ec);
+								synchronizeRemote_EC_ECProfile(ec);
 								// ec state
-								cc.synchronizeRemote_EC_ECState(ec);
+								synchronizeRemote_EC_ECState(ec);
 								// component state
 								cc.synchronizeRemote_EC_ComponentState(ec);
 							}
@@ -1473,6 +1526,10 @@
 	/** RTC.ComponentProfileの同期 (CORBA=>オブジェクトDB) */
 	public void synchronizeRemote_RTCComponentProfile() {
 		RTC.RTObject ro = getCorbaObjectInterface();
+		synchronizeRemote_RTCComponentProfile(ro);
+	}
+
+	public static void synchronizeRemote_RTCComponentProfile(RTC.RTObject ro) {
 		try {
 			RTC.ComponentProfile prof = ro.get_component_profile();
 			CorbaObjectStore.eINSTANCE.registRTCProfile(ro, prof);
@@ -1484,6 +1541,11 @@
 	/** RTC.PortProfileの同期 (CORBA=>オブジェクトDB) */
 	public void synchronizeRemote_RTCPortProfile(String name) {
 		RTC.RTObject ro = getCorbaObjectInterface();
+		synchronizeRemote_RTCPortProfile(ro, name);
+	}
+
+	public static void synchronizeRemote_RTCPortProfile(RTC.RTObject ro,
+			String name) {
 		RTC.PortProfile prof = CorbaObjectStore.eINSTANCE.findRTCPortProfile(
 				ro, name);
 		if (prof != null) {
@@ -1510,6 +1572,10 @@
 	/** RTC.ExecutionContextの同期 (CORBA=>オブジェクトDB) */
 	public void synchronizeRemote_RTCExecutionContexts() {
 		RTC.RTObject ro = getCorbaObjectInterface();
+		synchronizeRemote_RTCExecutionContexts(ro);
+	}
+
+	public static void synchronizeRemote_RTCExecutionContexts(RTC.RTObject ro) {
 		boolean update = false;
 		try {
 			// owned context
@@ -1551,8 +1617,13 @@
 
 	/** RTC.ExecutionContextの同期(comp_state) (CORBA=>オブジェクトDB) */
 	public void synchronizeRemote_EC_ComponentState(RTC.ExecutionContext ec) {
+		RTC.RTObject ro = getCorbaObjectInterface();
+		synchronizeRemote_EC_ComponentState(ro, ec);
+	}
+
+	public static void synchronizeRemote_EC_ComponentState(RTC.RTObject ro,
+			RTC.ExecutionContext ec) {
 		try {
-			RTC.RTObject ro = getCorbaObjectInterface();
 			RTC.LifeCycleState state = ec.get_component_state(ro);
 			int stateValue = RTC_STATUS(state);
 			CorbaObjectStore.eINSTANCE.registComponentState(ec, ro, stateValue);
@@ -1562,7 +1633,7 @@
 	}
 
 	/** RTC.ExecutionContextの同期(ec_state) (CORBA=>オブジェクトDB) */
-	public void synchronizeRemote_EC_ECState(RTC.ExecutionContext ec) {
+	public static void synchronizeRemote_EC_ECState(RTC.ExecutionContext ec) {
 		try {
 			int ecStateValue = ExecutionContext.STATE_UNKNOWN;
 			if (ec.is_running()) {
@@ -1577,7 +1648,7 @@
 	}
 
 	/** RTC.ExecutionContextの同期(ec_profile) (CORBA=>オブジェクトDB) */
-	public void synchronizeRemote_EC_ECProfile(RTC.ExecutionContext ec) {
+	public static void synchronizeRemote_EC_ECProfile(RTC.ExecutionContext ec) {
 		try {
 			RTC.ExecutionContextProfile prof;
 			if (ec._is_a(RTC.ExecutionContextServiceHelper.id())) {
@@ -1647,8 +1718,12 @@
 	/** SDO.ConfigurationSetの同期 (CORBA=>オブジェクトDB) */
 	public void synchronizeRemote_ConfigurationSets() {
 		RTC.RTObject ro = getCorbaObjectInterface();
-		_SDOPackage.Configuration conf = getSDOConfiguration();
+		synchronizeRemote_ConfigurationSets(ro);
+	}
+
+	public static void synchronizeRemote_ConfigurationSets(RTC.RTObject ro) {
 		try {
+			_SDOPackage.Configuration conf = ro.get_configuration();
 			_SDOPackage.ConfigurationSet[] cs = conf.get_configuration_sets();
 			CorbaObjectStore.eINSTANCE.registConfigSet(ro, cs);
 		} catch (Exception e) {
@@ -1695,8 +1770,12 @@
 	/** SDO.ConfigurationSet(active)の同期 (CORBA=>オブジェクトDB) */
 	public void synchronizeRemote_ActiveConfigurationSet() {
 		RTC.RTObject ro = getCorbaObjectInterface();
-		_SDOPackage.Configuration conf = getSDOConfiguration();
+		synchronizeRemote_ActiveConfigurationSet(ro);
+	}
+
+	public static void synchronizeRemote_ActiveConfigurationSet(RTC.RTObject ro) {
 		try {
+			_SDOPackage.Configuration conf = ro.get_configuration();
 			_SDOPackage.ConfigurationSet cs = conf
 					.get_active_configuration_set();
 			CorbaObjectStore.eINSTANCE.registActiveConfigSet(ro, cs);
@@ -1711,6 +1790,10 @@
 		boolean update = false;
 		_SDOPackage.ConfigurationSet cs = CorbaObjectStore.eINSTANCE
 				.findActiveConfigSet(ro);
+		if (cs == null) {
+			setActiveConfigurationSet(null);
+			return;
+		}
 		if (!(getActiveConfigurationSet() instanceof CorbaConfigurationSet)) {
 			update = true;
 		} else {
@@ -1737,14 +1820,18 @@
 	/** RTC.RTObjectメンバの同期 (CORBA=>オブジェクトDB) */
 	public void synchronizeRemote_RTCRTObjects() {
 		RTC.RTObject ro = getCorbaObjectInterface();
-		Organization org = getSDOOrganization();
-		if (org == null) {
-			return;
-		}
+		synchronizeRemote_RTCRTObjects(ro);
+	}
+
+	public static void synchronizeRemote_RTCRTObjects(RTC.RTObject ro) {
 		List<RTC.RTObject> list = CorbaObjectStore.eINSTANCE
 				.getCompositeMemberList(ro);
 		try {
-			_SDOPackage.SDO[] sdo_list = org.get_members();
+			Organization[] orgs = ro.get_owned_organizations();
+			if (orgs.length == 0) {
+				return;
+			}
+			_SDOPackage.SDO[] sdo_list = orgs[0].get_members();
 			if (sdo_list == null) {
 				return;
 			}
@@ -1976,8 +2063,10 @@
 	}
 
 	static _SDOPackage.ServiceProfile dummyServiceProfile;
+	Boolean supportCorbaObserver = null;
 
-	boolean supportedCorbaObserver() {
+	@Override
+	public boolean supportedCorbaObserver() {
 		// OpenRTM-aistバージョンチェック
 		if (dummyServiceProfile == null) {
 			dummyServiceProfile = new _SDOPackage.ServiceProfile();
@@ -1985,14 +2074,17 @@
 			dummyServiceProfile.interface_type = "";
 			dummyServiceProfile.properties = new _SDOPackage.NameValue[0];
 		}
-		boolean result = true;
-		try {
-			result = !getSDOConfiguration().add_service_profile(
-					dummyServiceProfile);
-		} catch (Exception e) {
-			result = false;
+		if (supportCorbaObserver == null) {
+			boolean result = true;
+			try {
+				result = !getSDOConfiguration().add_service_profile(
+						dummyServiceProfile);
+			} catch (Exception e) {
+				result = false;
+			}
+			supportCorbaObserver = Boolean.valueOf(result);
 		}
-		return result;
+		return supportCorbaObserver.booleanValue();
 	}
 
 	@Override

Added: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaLogObserverImpl.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaLogObserverImpl.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaLogObserverImpl.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,168 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id$
+ */
+package jp.go.aist.rtm.toolscommon.model.component.impl;
+
+import java.util.logging.Logger;
+
+import jp.go.aist.rtm.toolscommon.ToolsCommonPlugin;
+import jp.go.aist.rtm.toolscommon.model.component.ComponentPackage;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaComponent;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver;
+import jp.go.aist.rtm.toolscommon.model.component.util.CorbaObserverStore;
+import jp.go.aist.rtm.toolscommon.model.component.util.RTCLogStore;
+
+import org.eclipse.emf.ecore.EClass;
+import org.omg.PortableServer.Servant;
+
+import static jp.go.aist.rtm.toolscommon.util.RTMixin.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Corba Log Observer</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class CorbaLogObserverImpl extends CorbaObserverImpl implements CorbaLogObserver {
+
+	static Logger log = ToolsCommonPlugin.getLogger();
+
+	public static final String[] LEVEL_NAMES = new String[] { "SILENT", //
+			"ERROR", //
+			"WARN", //
+			"INFO", //
+			"NORMAL", //
+			"DEBUG", //
+			"TRACE", //
+			"VERBOSE", //
+			"PARANOID", //
+	};
+
+	protected LoggerPOAImpl servant;
+
+	RTC.RTObject rtc;
+	String rtcName;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	protected CorbaLogObserverImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ComponentPackage.Literals.CORBA_LOG_OBSERVER;
+	}
+
+	@Override
+	public Servant getServant() {
+		if (servant == null) {
+			servant = new LoggerPOAImpl(this);
+		}
+		return servant;
+	}
+
+	@Override
+	public boolean attachComponent(CorbaComponent component) {
+		RTC.RTObject ro = component.getCorbaObjectInterface();
+		if (rtc == null) {
+			rtc = ro;
+			rtcName = component.getInstanceNameL();
+		}
+		if (!eql(rtc, ro)) {
+			return false;
+		}
+		CorbaLogObserver obs = CorbaObserverStore.eINSTANCE.findLogObserver(ro);
+		if (obs != null) {
+			return true;
+		} else {
+			serviceProfile = new _SDOPackage.ServiceProfile();
+			serviceProfile.interface_type = OpenRTM.LoggerHelper.id();
+			setProperty("logger.filter", "ALL");
+			//
+			activate();
+			try {
+				boolean result = addServiceProfile(rtc.get_configuration());
+				if (!result) {
+					deactivate();
+					return false;
+				}
+			} catch (Exception e) {
+				deactivate();
+				return false;
+			}
+			CorbaObserverStore.eINSTANCE.registLogObserver(ro, this);
+		}
+		return true;
+	}
+
+	@Override
+	public boolean detachComponent() {
+		if (rtc == null) {
+			return true;
+		}
+		if (!CorbaObserverStore.eINSTANCE.isEmptyComponentReference(rtc)) {
+			return true;
+		}
+		return finish();
+	}
+
+	@Override
+	public boolean finish() {
+		if (rtc == null) {
+			return true;
+		}
+		//
+		boolean result = false;
+		try {
+			result = removeServiceProfile(rtc.get_configuration());
+		} catch (Exception e) {
+		}
+		deactivate();
+		//
+		RTCLogStore.eINSTANCE.remove(serviceProfile.id);
+		CorbaObserverStore.eINSTANCE.removeLogObserver(rtc);
+		//
+		return result;
+	}
+
+	public void save(OpenRTM.LogRecord record) {
+		log.info("publish(" + LEVEL_NAMES[record.level.value()] + ", "
+				+ record.loggername + ", " + record.message + ")");
+		RTCLogStore.eINSTANCE.save(serviceProfile.id, rtcName, record);
+	}
+
+	static class LoggerPOAImpl extends OpenRTM.LoggerPOA {
+		CorbaLogObserverImpl parent;
+
+		public LoggerPOAImpl(CorbaLogObserverImpl parent) {
+			this.parent = parent;
+		}
+
+		@Override
+		public void publish(OpenRTM.LogRecord record) {
+			parent.save(record);
+		}
+
+		@Override
+		public void close() {
+			// TODO Auto-generated method stub
+
+		}
+	}
+
+} //CorbaLogObserverImpl

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaObserverImpl.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaObserverImpl.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaObserverImpl.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -6,8 +6,6 @@
  */
 package jp.go.aist.rtm.toolscommon.model.component.impl;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.UUID;
 import java.util.logging.Logger;
 
@@ -17,15 +15,16 @@
 import jp.go.aist.rtm.toolscommon.model.component.ComponentPackage;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaComponent;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaObserver;
-import jp.go.aist.rtm.toolscommon.model.component.SystemDiagram;
 import jp.go.aist.rtm.toolscommon.model.component.util.CorbaPropertyMap;
 import jp.go.aist.rtm.toolscommon.model.component.util.IPropertyMapUtil;
+import jp.go.aist.rtm.toolscommon.ui.propertysource.CorbaObserverPropertySource;
 
 import org.eclipse.emf.common.util.EList;
 
 import org.eclipse.emf.ecore.EClass;
 
 import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.ui.views.properties.IPropertySource;
 
 import org.omg.CORBA.ORB;
 import org.omg.CORBA.ORBPackage.InvalidName;
@@ -217,20 +216,15 @@
 		throw new UnsupportedOperationException();
 	}
 
-	protected boolean addServiceProfile(CorbaComponent component) {
-		boolean result;
-		try {
-			serviceProfile.id = UUID.randomUUID().toString();
-			result = component.getSDOConfiguration().add_service_profile(
-					serviceProfile);
-			//
-			log.info("add_service_profile:    id=" + serviceProfile.id
-					+ " ior=" + serviceProfile.service + " obs="
-					+ this.getClass());
-		} catch (Exception e) {
-			result = false;
-		}
-		return result;
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean detachComponent() {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
 	}
 
 	/**
@@ -238,21 +232,37 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean detachComponent(CorbaComponent component) {
+	public boolean finish() {
 		// TODO: implement this method
 		// Ensure that you remove @generated or mark it @generated NOT
 		throw new UnsupportedOperationException();
 	}
 
-	protected boolean removeServiceProfile(CorbaComponent component) {
+	protected boolean addServiceProfile(_SDOPackage.Configuration config) {
 		boolean result;
 		try {
-			result = component.getSDOConfiguration().remove_service_profile(
-					serviceProfile.id);
+			serviceProfile.id = UUID.randomUUID().toString();
+			result = config.add_service_profile(serviceProfile);
 			//
+			log.info("add_service_profile:    id=" + serviceProfile.id
+					+ " type=" + serviceProfile.interface_type + " ior="
+					+ serviceProfile.service + " obs="
+					+ this.getClass().getName());
+		} catch (Exception e) {
+			result = false;
+		}
+		return result;
+	}
+
+	protected boolean removeServiceProfile(_SDOPackage.Configuration config) {
+		boolean result;
+		try {
+			result = config.remove_service_profile(serviceProfile.id);
+			//
 			log.info("remove_service_profile: id=" + serviceProfile.id
-					+ " ior=" + serviceProfile.service + " obs="
-					+ this.getClass());
+					+ " type=" + serviceProfile.interface_type + " ior="
+					+ serviceProfile.service + " obs="
+					+ this.getClass().getName());
 		} catch (Exception e) {
 			result = false;
 		}
@@ -352,61 +362,11 @@
 	@SuppressWarnings("unchecked")
 	@Override
 	public Object getAdapter(Class adapter) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public boolean isCompositeMember(CorbaComponent component) {
-		if (component.eContainer() instanceof SystemDiagram) {
-			SystemDiagram sd = (SystemDiagram) component.eContainer();
-			if (sd.getCompositeComponent() != null) {
-				return true;
-			}
+		java.lang.Object result = null;
+		if (IPropertySource.class.equals(adapter)) {
+			result = new CorbaObserverPropertySource(this);
 		}
-		return false;
+		return result;
 	}
 
-	protected static class ComponentList {
-		List<CorbaComponent> components;
-
-		ComponentList() {
-			this.components = new ArrayList<CorbaComponent>();
-		}
-
-		public CorbaComponent get(int index) {
-			return components.get(index);
-		}
-
-		public boolean add(CorbaComponent component) {
-			return components.add(component);
-		}
-
-		public boolean contain(CorbaComponent component) {
-			for (CorbaComponent comp : components) {
-				if (comp == component) {
-					return true;
-				}
-			}
-			return false;
-		}
-
-		public boolean isEmpty() {
-			return components.isEmpty();
-		}
-
-		public CorbaComponent remove(CorbaComponent component) {
-			int index = -1;
-			for (int i = 0; i < components.size(); i++) {
-				if (components.get(i) == component) {
-					index = i;
-					break;
-				}
-			}
-			if (index != -1) {
-				return components.remove(index);
-			}
-			return null;
-		}
-	}
-
 } //CorbaObserverImpl

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaStatusObserverImpl.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaStatusObserverImpl.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/CorbaStatusObserverImpl.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -20,15 +20,24 @@
 import jp.go.aist.rtm.toolscommon.model.component.CorbaStatusObserver;
 import jp.go.aist.rtm.toolscommon.model.component.ExecutionContext;
 import jp.go.aist.rtm.toolscommon.model.component.util.CorbaObjectStore;
-import jp.go.aist.rtm.toolscommon.ui.propertysource.CorbaStatusObserverPropertySource;
+import jp.go.aist.rtm.toolscommon.model.component.util.CorbaObserverStore;
 
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.ui.views.properties.IPropertySource;
 import org.omg.PortableServer.Servant;
 
 import static jp.go.aist.rtm.toolscommon.util.RTMixin.*;
 import static jp.go.aist.rtm.toolscommon.manager.ToolsCommonPreferenceManager.*;
 
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_RTCComponentProfile;
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_RTCExecutionContexts;
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_RTCPortProfile;
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_RTCRTObjects;
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_EC_ComponentState;
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_EC_ECProfile;
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_EC_ECState;
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_ActiveConfigurationSet;
+import static jp.go.aist.rtm.toolscommon.model.component.impl.CorbaComponentImpl.synchronizeRemote_ConfigurationSets;
+
 /**
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Corba Status Observer</b></em>'.
@@ -55,9 +64,9 @@
 
 	RTC.RTObject rtc;
 
-	static Map<RTC.RTObject, _SDOPackage.ServiceProfile> profileMap;
+	PropertyChangeListener listener;
+
 	static Map<RTC.RTObject, HeartBeat> hbMap;
-	static Map<RTC.RTObject, ComponentList> componentListMap;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -66,15 +75,9 @@
 	 */
 	protected CorbaStatusObserverImpl() {
 		super();
-		if (profileMap == null) {
-			profileMap = new HashMap<RTC.RTObject, _SDOPackage.ServiceProfile>();
-		}
 		if (hbMap == null) {
 			hbMap = new HashMap<RTC.RTObject, HeartBeat>();
 		}
-		if (componentListMap == null) {
-			componentListMap = new HashMap<RTC.RTObject, ComponentList>();
-		}
 	}
 
 	/**
@@ -115,8 +118,6 @@
 		return servant;
 	}
 
-	PropertyChangeListener listener;
-
 	@Override
 	public boolean attachComponent(CorbaComponent component) {
 		RTC.RTObject ro = component.getCorbaObjectInterface();
@@ -126,9 +127,10 @@
 		if (!eql(rtc, ro)) {
 			return false;
 		}
-		_SDOPackage.ServiceProfile prof = profileMap.get(rtc);
-		if (prof != null) {
-			serviceProfile = prof;
+		CorbaStatusObserver obs = CorbaObserverStore.eINSTANCE
+				.findStatusObserver(ro);
+		if (obs != null) {
+			return true;
 		} else {
 			HeartBeat hb = new HeartBeat();
 			hbMap.put(rtc, hb);
@@ -151,58 +153,54 @@
 					.addPropertyChangeListener(listener);
 			//
 			activate();
-			boolean result = addServiceProfile(component);
-			if (!result) {
+			try {
+				boolean result = addServiceProfile(rtc.get_configuration());
+				if (!result) {
+					deactivate();
+					return false;
+				}
+			} catch (Exception e) {
 				deactivate();
 				return false;
 			}
-			profileMap.put(rtc, serviceProfile);
+			CorbaObserverStore.eINSTANCE.registStatusObserver(ro, this);
 		}
-		ComponentList components = getComponentList();
-		if (!components.contain(component)) {
-			components.add(component);
-			component.setStatusObserver(this);
-		}
 		return true;
 	}
 
 	@Override
-	public boolean detachComponent(CorbaComponent component) {
-		RTC.RTObject ro = component.getCorbaObjectInterface();
-		if (!eql(rtc, ro)) {
-			return false;
+	public boolean detachComponent() {
+		if (rtc == null) {
+			return true;
 		}
-		ComponentList components = getComponentList();
-		if (components.contain(component)) {
-			if (!isCompositeMember(component)) {
-				components.remove(component);
-				component.setStatusObserver(null);
-			}
+		if (!CorbaObserverStore.eINSTANCE.isEmptyComponentReference(rtc)) {
+			return true;
 		}
-		if (!components.isEmpty()) {
+		//
+		return finish();
+	}
+
+	@Override
+	public boolean finish() {
+		if (rtc == null) {
 			return true;
 		}
-		boolean result = removeServiceProfile(component);
+		//
+		boolean result = false;
+		try {
+			result = removeServiceProfile(rtc.get_configuration());
+		} catch (Exception e) {
+		}
 		deactivate();
-		profileMap.remove(rtc);
+		//
+		CorbaObserverStore.eINSTANCE.removeStatusObserver(rtc);
 		hbMap.remove(rtc);
 		ToolsCommonPreferenceManager.getInstance()
 				.removePropertyChangeListener(listener);
+		//
 		return result;
 	}
 
-	ComponentList getComponentList() {
-		if (rtc == null) {
-			return new ComponentList();
-		}
-		ComponentList result = componentListMap.get(rtc);
-		if (result == null) {
-			result = new ComponentList();
-			componentListMap.put(rtc, result);
-		}
-		return result;
-	}
-
 	public void notifyStatus(OpenRTM.StatusKind status_kind, String hint) {
 		if (OpenRTM.StatusKind.HEARTBEAT.equals(status_kind)) {
 			// H.B受信
@@ -217,14 +215,13 @@
 		log.info("update_status(" + TYPE_NAMES[status_kind.value()] + ", "
 				+ hint + ")");
 
-		ComponentList components = getComponentList();
-		if (components.isEmpty()) {
+		if (CorbaObserverStore.eINSTANCE.isEmptyComponentReference(rtc)) {
 			return;
 		}
-		CorbaComponentImpl ccImpl = (CorbaComponentImpl) components.get(0);
+		//
 		if (OpenRTM.StatusKind.COMPONENT_PROFILE.equals(status_kind)) {
 			// RTC.ComponentProfileの変更通知
-			ccImpl.synchronizeRemote_RTCComponentProfile();
+			synchronizeRemote_RTCComponentProfile(rtc);
 		}
 		if (OpenRTM.StatusKind.RTC_STATUS.equals(status_kind)) {
 			// RTC状態の変更通知
@@ -253,9 +250,9 @@
 			}
 			//
 			RTC.ExecutionContext ec = CorbaObjectStore.eINSTANCE.findContext(
-					ccImpl.getCorbaObjectInterface(), id);
-			CorbaObjectStore.eINSTANCE.registComponentState(ec, ccImpl
-					.getCorbaObjectInterface(), stateValue);
+					rtc, id);
+			CorbaObjectStore.eINSTANCE
+					.registComponentState(ec, rtc, stateValue);
 		}
 		if (OpenRTM.StatusKind.EC_STATUS.equals(status_kind)) {
 			// EC状態の変更通知
@@ -270,24 +267,41 @@
 			String id = ss[1];
 			//
 			if ("ATTACHED".equals(action) || "DETACHED".equals(action)) {
-				ccImpl.synchronizeRemote_RTCExecutionContexts();
-				RTC.ExecutionContext ec = CorbaObjectStore.eINSTANCE
-						.findContext(ccImpl.getCorbaObjectInterface(), id);
+				RTC.ExecutionContext oldEc = CorbaObjectStore.eINSTANCE
+						.findContext(rtc, id);
+				//
+				synchronizeRemote_RTCExecutionContexts(rtc);
+				//
+				RTC.ExecutionContext newEc = CorbaObjectStore.eINSTANCE
+						.findContext(rtc, id);
+				//
+				RTC.ExecutionContext ec = null;
+				if ("ATTACHED".equals(action)) {
+					ec = newEc;
+				} else if ("DETACHED".equals(action)) {
+					ec = oldEc;
+				}
 				if (ec != null) {
-					ccImpl.synchronizeRemote_EC_ECProfile(ec);
-					ccImpl.synchronizeRemote_EC_ComponentState(ec);
+					synchronizeRemote_EC_ECProfile(ec);
+					synchronizeRemote_EC_ComponentState(rtc, ec);
+					// 複合RTCの子情報の変更通知がないため、ECのアタッチ/デタッチ時にECオーナーを更新
+					RTC.ExecutionContextProfile ecprof = CorbaObjectStore.eINSTANCE
+							.findECProfile(ec);
+					if (ecprof != null && ecprof.owner != null) {
+						synchronizeRemote_RTCRTObjects(ecprof.owner);
+					}
 				}
 			} else if ("RATE_CHANGED".equals(action)) {
 				RTC.ExecutionContext ec = CorbaObjectStore.eINSTANCE
-						.findContext(ccImpl.getCorbaObjectInterface(), id);
+						.findContext(rtc, id);
 				if (ec != null) {
-					ccImpl.synchronizeRemote_EC_ECProfile(ec);
+					synchronizeRemote_EC_ECProfile(ec);
 				}
 			} else if ("STARTUP".equals(action) || "SHUTDOWN".equals(action)) {
 				RTC.ExecutionContext ec = CorbaObjectStore.eINSTANCE
-						.findContext(ccImpl.getCorbaObjectInterface(), id);
+						.findContext(rtc, id);
 				if (ec != null) {
-					ccImpl.synchronizeRemote_EC_ECState(ec);
+					synchronizeRemote_EC_ECState(ec);
 				}
 			}
 		}
@@ -304,9 +318,9 @@
 			String port_name = ss[1];
 			//
 			if ("CONNECT".equals(action) || "DISCONNECT".equals(action)) {
-				ccImpl.synchronizeRemote_RTCPortProfile(port_name);
+				synchronizeRemote_RTCPortProfile(rtc, port_name);
 			} else if ("ADD".equals(action) || "REMOVE".equals(action)) {
-				ccImpl.synchronizeRemote_RTCComponentProfile();
+				synchronizeRemote_RTCComponentProfile(rtc);
 			}
 		}
 		if (OpenRTM.StatusKind.CONFIGURATION.equals(status_kind)) {
@@ -315,9 +329,16 @@
 				return;
 			}
 			if ("ACTIVATE_CONFIG_SET".equals(hint)) {
-				ccImpl.synchronizeRemote_ActiveConfigurationSet();
+				synchronizeRemote_ActiveConfigurationSet(rtc);
 			} else {
-				ccImpl.synchronizeRemote_ConfigurationSets();
+				synchronizeRemote_ConfigurationSets(rtc);
+				// 複合RTCの公開ポート変更の通知がないので、ConfigurationSetの通知時にプロファイルを更新
+				RTC.ComponentProfile prof = CorbaObjectStore.eINSTANCE
+						.findRTCProfile(rtc);
+				if (prof != null && prof.category != null
+						&& prof.category.startsWith("composite.")) {
+					synchronizeRemote_RTCComponentProfile(rtc);
+				}
 			}
 		}
 	}
@@ -340,32 +361,19 @@
 			return;
 		}
 		HeartBeat hb = hbMap.get(rtc);
-		serviceProfile = profileMap.get(rtc);
 		if (hb == null || serviceProfile == null) {
 			return;
 		}
-		ComponentList components = getComponentList();
-		if (components.isEmpty()) {
-			return;
-		}
-		CorbaComponent component = components.get(0);
 		//
 		hb.updatePreference();
 		setProperty("heartbeat.enable", hb.getPropEnable());
 		setProperty("heartbeat.interval", hb.getPropInterval());
 		//
-		removeServiceProfile(component);
-		addServiceProfile(component);
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public Object getAdapter(Class adapter) {
-		java.lang.Object result = null;
-		if (IPropertySource.class.equals(adapter)) {
-			result = new CorbaStatusObserverPropertySource(this);
+		try {
+			removeServiceProfile(rtc.get_configuration());
+			addServiceProfile(rtc.get_configuration());
+		} catch (Exception e) {
 		}
-		return result;
 	}
 
 	static class ComponentObserverPOAImpl extends OpenRTM.ComponentObserverPOA {

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/SystemDiagramImpl.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/SystemDiagramImpl.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/impl/SystemDiagramImpl.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -15,11 +15,13 @@
 import java.util.Map;
 
 import jp.go.aist.rtm.toolscommon.model.component.Component;
+import jp.go.aist.rtm.toolscommon.model.component.ComponentFactory;
 import jp.go.aist.rtm.toolscommon.model.component.ComponentPackage;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaStatusObserver;
 import jp.go.aist.rtm.toolscommon.model.component.PortConnector;
 import jp.go.aist.rtm.toolscommon.model.component.SystemDiagram;
 import jp.go.aist.rtm.toolscommon.model.component.SystemDiagramKind;
+import jp.go.aist.rtm.toolscommon.model.component.util.CorbaObserverStore;
 import jp.go.aist.rtm.toolscommon.model.component.util.IPropertyMapUtil;
 import jp.go.aist.rtm.toolscommon.model.component.util.PropertyMap;
 import jp.go.aist.rtm.toolscommon.model.core.impl.ModelElementImpl;
@@ -434,25 +436,34 @@
 
 	@Override
 	public synchronized void removeComponent(Component component) {
-		if (component instanceof CorbaComponentImpl) {
-			CorbaComponentImpl corbaComp = (CorbaComponentImpl) component;
-			// 状態通知オブザーバ解除
-			if (corbaComp.getStatusObserver() != null) {
-				corbaComp.getStatusObserver().detachComponent(corbaComp);
-			}
-		}
+		removeObserver(component);
 		for (Component comp : component.getComponents()) {
-			if (comp instanceof CorbaComponentImpl) {
-				CorbaComponentImpl corbaComp = (CorbaComponentImpl) comp;
-				// 状態通知オブザーバ解除
-				if (corbaComp.getStatusObserver() != null) {
-					corbaComp.getStatusObserver().detachComponent(corbaComp);
-				}
-			}
+			removeObserver(comp);
 		}
+		//
 		getComponents().remove(component);
 	}
 
+	void removeObserver(Component component) {
+		if (!(component instanceof CorbaComponentImpl)) {
+			return;
+		}
+		if (isCompositeMember(component)) {
+			return;
+		}
+		CorbaComponentImpl corbaComp = (CorbaComponentImpl) component;
+		//
+		CorbaObserverStore.eINSTANCE.removeComponentReference(corbaComp);
+		// 状態通知オブザーバ解除
+		if (corbaComp.getStatusObserver() != null) {
+			corbaComp.getStatusObserver().detachComponent();
+		}
+		// ログ通知オブザーバ解除
+		if (corbaComp.getLogObserver() != null) {
+			corbaComp.getLogObserver().detachComponent();
+		}
+	}
+
 	@Override
 	public synchronized void removeComponents(List<Component> components) {
 		for (Component c : components) {
@@ -467,24 +478,11 @@
 
 	@Override
 	public synchronized void addComponent(int pos, Component component) {
-		if (component instanceof CorbaComponentImpl) {
-			CorbaComponentImpl corbaComp = (CorbaComponentImpl) component;
-			if (corbaComp.supportedCorbaObserver()) {
-				// 状態通知オブザーバ登録
-				CorbaStatusObserver ob = new CorbaStatusObserverImpl();
-				ob.attachComponent(corbaComp);
-			}
-		}
+		addObserver(component);
 		for (Component comp : component.getComponents()) {
-			if (comp instanceof CorbaComponentImpl) {
-				CorbaComponentImpl corbaComp = (CorbaComponentImpl) comp;
-				if (corbaComp.supportedCorbaObserver()) {
-					// 状態通知オブザーバ登録
-					CorbaStatusObserver ob = new CorbaStatusObserverImpl();
-					ob.attachComponent(corbaComp);
-				}
-			}
+			addObserver(comp);
 		}
+		//
 		if (pos == -1) {
 			getComponents().add(component);
 		} else {
@@ -492,6 +490,25 @@
 		}
 	}
 
+	void addObserver(Component component) {
+		if (!(component instanceof CorbaComponentImpl)) {
+			return;
+		}
+		if (isCompositeMember(component)) {
+			return;
+		}
+		CorbaComponentImpl corbaComp = (CorbaComponentImpl) component;
+		if (!corbaComp.supportedCorbaObserver()) {
+			return;
+		}
+		// 状態通知オブザーバ登録
+		CorbaStatusObserver ob = ComponentFactory.eINSTANCE
+				.createCorbaStatusObserver();
+		ob.attachComponent(corbaComp);
+		//
+		CorbaObserverStore.eINSTANCE.addComponentReference(corbaComp);
+	}
+
 	@Override
 	public synchronized void addComponents(List<Component> components) {
 		for (Component c : components) {
@@ -506,6 +523,16 @@
 		}
 	}
 
+	public boolean isCompositeMember(Component component) {
+		if (component.eContainer() instanceof SystemDiagram) {
+			SystemDiagram sd = (SystemDiagram) component.eContainer();
+			if (sd.getCompositeComponent() != null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
 	@Override
 	public SystemDiagram getRootDiagram() {
 		if (getParentSystemDiagram() == null) return this;

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/ComponentAdapterFactory.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/ComponentAdapterFactory.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/ComponentAdapterFactory.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -193,6 +193,10 @@
 				return createCorbaStatusObserverAdapter();
 			}
 			@Override
+			public Adapter caseCorbaLogObserver(CorbaLogObserver object) {
+				return createCorbaLogObserverAdapter();
+			}
+			@Override
 			public Adapter caseIAdaptable(IAdaptable object) {
 				return createIAdaptableAdapter();
 			}
@@ -471,6 +475,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver <em>Corba Log Observer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver
+	 * @generated
+	 */
+	public Adapter createCorbaLogObserverAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link jp.go.aist.rtm.toolscommon.model.component.ComponentSpecification <em>Specification</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/ComponentSwitch.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/ComponentSwitch.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/ComponentSwitch.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -353,6 +353,15 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case ComponentPackage.CORBA_LOG_OBSERVER: {
+				CorbaLogObserver corbaLogObserver = (CorbaLogObserver)theEObject;
+				T result = caseCorbaLogObserver(corbaLogObserver);
+				if (result == null) result = caseCorbaObserver(corbaLogObserver);
+				if (result == null) result = caseIPropertyMap(corbaLogObserver);
+				if (result == null) result = caseIAdaptable(corbaLogObserver);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			default: return defaultCase(theEObject);
 		}
 	}
@@ -613,6 +622,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Corba Log Observer</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Corba Log Observer</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseCorbaLogObserver(CorbaLogObserver object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Specification</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;

Added: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/CorbaObserverStore.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/CorbaObserverStore.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/CorbaObserverStore.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,172 @@
+package jp.go.aist.rtm.toolscommon.model.component.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import jp.go.aist.rtm.toolscommon.model.component.CorbaComponent;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaStatusObserver;
+
+public class CorbaObserverStore {
+
+	public static CorbaObserverStore eINSTANCE = new CorbaObserverStore();
+
+	// RTC.RTObj => ComponentList
+	Map<RTC.RTObject, ComponentList> compReferenceMap;
+	// RTC.RTObj => CorbaStatusObserver
+	Map<RTC.RTObject, CorbaStatusObserver> statusObserverMap;
+	// RTC.RTObj => CorbaLogObserver
+	Map<RTC.RTObject, CorbaLogObserver> logObserverMap;
+
+	public CorbaObserverStore() {
+		this.compReferenceMap = new HashMap<RTC.RTObject, ComponentList>();
+		this.statusObserverMap = new HashMap<RTC.RTObject, CorbaStatusObserver>();
+		this.logObserverMap = new HashMap<RTC.RTObject, CorbaLogObserver>();
+	}
+
+	/**
+	 * RTC.RTObjectを参照する CorbaComponentを追加します。
+	 */
+	public void addComponentReference(RTC.RTObject ro, CorbaComponent comp) {
+		ComponentList list = compReferenceMap.get(ro);
+		if (list == null) {
+			list = new ComponentList();
+			compReferenceMap.put(ro, list);
+		}
+		list.add(comp);
+	}
+
+	public void addComponentReference(CorbaComponent comp) {
+		addComponentReference(comp.getCorbaObjectInterface(), comp);
+	}
+
+	/**
+	 * RTC.RTObjectを参照する CorbaComponentを削除します。
+	 */
+	public void removeComponentReference(RTC.RTObject ro, CorbaComponent comp) {
+		ComponentList list = compReferenceMap.get(ro);
+		if (list == null) {
+			return;
+		}
+		list.remove(comp);
+	}
+
+	public void removeComponentReference(CorbaComponent comp) {
+		removeComponentReference(comp.getCorbaObjectInterface(), comp);
+	}
+
+	/**
+	 * RTC.RTObjectを参照する CorbaComponentの一覧を取得します。
+	 */
+	public ComponentList findComponentReferenceList(RTC.RTObject ro) {
+		ComponentList result = compReferenceMap.get(ro);
+		if (result == null) {
+			result = new ComponentList();
+		}
+		return result;
+	}
+
+	/**
+	 * RTC.RTObjectを参照する CorbaComponentが存在しない場合はtrue
+	 */
+	public boolean isEmptyComponentReference(RTC.RTObject ro) {
+		ComponentList list = compReferenceMap.get(ro);
+		if (list == null) {
+			return true;
+		}
+		return list.isEmpty();
+	}
+
+	/**
+	 * RTC.RTObjectをキーに CorbaStatusObserverを検索します。
+	 */
+	public CorbaStatusObserver findStatusObserver(RTC.RTObject ro) {
+		return statusObserverMap.get(ro);
+	}
+
+	/**
+	 * RTC.RTObjectをキーに CorbaStatusObserverを保存します。
+	 */
+	public synchronized CorbaStatusObserver registStatusObserver(
+			RTC.RTObject ro, CorbaStatusObserver observer) {
+		return statusObserverMap.put(ro, observer);
+	}
+
+	/**
+	 * RTC.RTObjectをキーに CorbaStatusObserverを削除します。
+	 */
+	public synchronized CorbaStatusObserver removeStatusObserver(RTC.RTObject ro) {
+		return statusObserverMap.remove(ro);
+	}
+
+	/**
+	 * RTC.RTObjectをキーに CorbaLogObserverを検索します。
+	 */
+	public CorbaLogObserver findLogObserver(RTC.RTObject ro) {
+		return logObserverMap.get(ro);
+	}
+
+	/**
+	 * RTC.RTObjectをキーに CorbaLogObserverを保存します。
+	 */
+	public synchronized CorbaLogObserver registLogObserver(RTC.RTObject ro,
+			CorbaLogObserver observer) {
+		return logObserverMap.put(ro, observer);
+	}
+
+	/**
+	 * RTC.RTObjectをキーに CorbaLogObserverを削除します。
+	 */
+	public synchronized CorbaLogObserver removeLogObserver(RTC.RTObject ro) {
+		return logObserverMap.remove(ro);
+	}
+
+	public static class ComponentList {
+		List<CorbaComponent> components;
+
+		ComponentList() {
+			this.components = new ArrayList<CorbaComponent>();
+		}
+
+		public CorbaComponent get(int index) {
+			return components.get(index);
+		}
+
+		public boolean add(CorbaComponent component) {
+			if (contain(component)) {
+				return true;
+			}
+			return components.add(component);
+		}
+
+		public boolean contain(CorbaComponent component) {
+			for (CorbaComponent comp : components) {
+				if (comp == component) {
+					return true;
+				}
+			}
+			return false;
+		}
+
+		public boolean isEmpty() {
+			return components.isEmpty();
+		}
+
+		public CorbaComponent remove(CorbaComponent component) {
+			int index = -1;
+			for (int i = 0; i < components.size(); i++) {
+				if (components.get(i) == component) {
+					index = i;
+					break;
+				}
+			}
+			if (index != -1) {
+				return components.remove(index);
+			}
+			return null;
+		}
+	}
+
+}

Added: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/RTCLogStore.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/RTCLogStore.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/util/RTCLogStore.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,132 @@
+package jp.go.aist.rtm.toolscommon.model.component.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static jp.go.aist.rtm.toolscommon.util.RTMixin.*;
+
+public class RTCLogStore {
+
+	public static RTCLogStore eINSTANCE = new RTCLogStore();
+
+	List<Record> store;
+
+	RTCLogStore() {
+		this.store = new ArrayList<Record>();
+	}
+
+	/**
+	 * ログ通知オブザーバのIDリストを指定して、対象の RTCログを検索します。
+	 */
+	public synchronized List<Record> find(List<String> id_list, int limit) {
+		List<Record> result = new ArrayList<Record>();
+		int count = 0;
+		for (Record r : store) {
+			if (!id_list.contains(r.observer_id)) {
+				continue;
+			}
+			result.add(r);
+			count++;
+			if (limit > 0 && count > limit) {
+				break;
+			}
+		}
+		return result;
+	}
+
+	public List<Record> find(List<String> id_list) {
+		return find(id_list, 0);
+	}
+
+	/**
+	 * ログ通知オブザーバのIDに関連付けて、RTCログを保存します。
+	 */
+	public synchronized void save(String id, String name,
+			OpenRTM.LogRecord record) {
+		Record r = new Record(id, name, record);
+		store.add(0, r);
+	}
+
+	/**
+	 * ログ通知オブザーバのIDを指定して、対象の RTCログを削除します。
+	 */
+	public synchronized void remove(String id) {
+		List<Record> unmodified = new ArrayList<Record>(store);
+		for (Record r : unmodified) {
+			if (eql(id, r.observer_id)) {
+				store.remove(r);
+			}
+		}
+	}
+
+	/**
+	 * ログレベルオブジェクトから文字列に変換します。
+	 */
+	public static String toLevelName(OpenRTM.LogLevel lv) {
+		if (OpenRTM.LogLevel.ERROR.equals(lv)) {
+			return "ERROR";
+		} else if (OpenRTM.LogLevel.WARN.equals(lv)) {
+			return "WARN";
+		} else if (OpenRTM.LogLevel.INFO.equals(lv)) {
+			return "INFO";
+		} else if (OpenRTM.LogLevel.NORMAL.equals(lv)) {
+			return "NORMAL";
+		} else if (OpenRTM.LogLevel.DEBUG.equals(lv)) {
+			return "DEBUG";
+		} else if (OpenRTM.LogLevel.TRACE.equals(lv)) {
+			return "TRACE";
+		} else if (OpenRTM.LogLevel.VERBOSE.equals(lv)) {
+			return "VERBOSE";
+		} else if (OpenRTM.LogLevel.PARANOID.equals(lv)) {
+			return "PARANOID";
+		}
+		return "UNKNOWN";
+	}
+
+	/**
+	 * RTCログを表すクラス
+	 */
+	public static class Record {
+		String observer_id;
+		String rtc_name;
+		String level_name;
+		OpenRTM.LogRecord r;
+
+		Record(String id, String name, OpenRTM.LogRecord record) {
+			this.observer_id = id;
+			this.rtc_name = name;
+			this.level_name = toLevelName(record.level);
+			this.r = record;
+		}
+
+		public String getObserverId() {
+			return observer_id;
+		}
+
+		public String getRtcName() {
+			return rtc_name;
+
+		}
+
+		public String getLevelName() {
+			return level_name;
+		}
+
+		public RTC.Time getTime() {
+			return r.time;
+		}
+
+		public OpenRTM.LogLevel getLevel() {
+			return r.level;
+		}
+
+		public String getLoggerName() {
+			return r.loggername;
+		}
+
+		public String getMessage() {
+			return r.message;
+		}
+	}
+
+}

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation/CorbaComponentValidator.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation/CorbaComponentValidator.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation/CorbaComponentValidator.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -8,6 +8,7 @@
 import _SDOPackage.Configuration;
 import _SDOPackage.ConfigurationSet;
 import _SDOPackage.Organization;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver;
 import jp.go.aist.rtm.toolscommon.model.component.CorbaStatusObserver;
 import org.eclipse.emf.common.util.EList;
 
@@ -41,4 +42,6 @@
 	boolean validateIor(String value);
 
 	boolean validateStatusObserver(CorbaStatusObserver value);
+
+	boolean validateLogObserver(CorbaLogObserver value);
 }
\ No newline at end of file

Added: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation/CorbaLogObserverValidator.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation/CorbaLogObserverValidator.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component/validation/CorbaLogObserverValidator.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,19 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id$
+ */
+package jp.go.aist.rtm.toolscommon.model.component.validation;
+
+
+/**
+ * A sample validator interface for {@link jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface CorbaLogObserverValidator {
+	boolean validate();
+
+}

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component.ecore
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component.ecore	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/model/component.ecore	2011-04-28 03:04:05 UTC (rev 168)
@@ -294,6 +294,7 @@
     <eOperations name="finalizeR" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
     <eOperations name="exitR" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
     <eOperations name="getCorbaObjectInterface" eType="#//RTCRTObject"/>
+    <eOperations name="supportedCorbaObserver" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="executionContextState"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt" transient="true"
         defaultValueLiteral="0"/>
@@ -313,6 +314,7 @@
         upperBound="-1" eType="#//RTCRTObject" transient="true" defaultValueLiteral=""/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="ior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="statusObserver" eType="#//CorbaStatusObserver"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="logObserver" eType="#//CorbaLogObserver"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="CorbaPortSynchronizer" eSuperTypes="core.ecore#//CorbaWrapperObject #//PortSynchronizer">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="rTCPortProfile" eType="#//RTCPortProfile"/>
@@ -360,9 +362,8 @@
     <eOperations name="attachComponent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
       <eParameters name="component" eType="#//CorbaComponent"/>
     </eOperations>
-    <eOperations name="detachComponent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
-      <eParameters name="component" eType="#//CorbaComponent"/>
-    </eOperations>
+    <eOperations name="detachComponent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    <eOperations name="finish" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="serviceProfile" eType="#//SDOServiceProfile"
         changeable="false"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="servant" eType="#//Servant"
@@ -371,5 +372,6 @@
   <eClassifiers xsi:type="ecore:EClass" name="CorbaStatusObserver" eSuperTypes="#//CorbaObserver">
     <eOperations name="isTimeOut" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="CorbaLogObserver" eSuperTypes="#//CorbaObserver"/>
   <eClassifiers xsi:type="ecore:EDataType" name="Servant" instanceClassName="org.omg.PortableServer.Servant"/>
 </ecore:EPackage>

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/nl/messages.properties
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/nl/messages.properties	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/nl/messages.properties	2011-04-28 03:04:05 UTC (rev 168)
@@ -44,9 +44,9 @@
 PortInterfaceProfilePropertySource.unknown=<UNKNOWN>
 PortInterfaceProfilePropertySource.polarity.provided=PROVIDED
 PortInterfaceProfilePropertySource.polarity.required=REQUIRED
-CorbaStatusObserverPropertySource.disp.interface_type=Interface Type
-CorbaStatusObserverPropertySource.disp.service=Service
-CorbaStatusObserverPropertySource.unknown=<UNKNOWN>
+CorbaObserverPropertySource.disp.interface_type=Interface Type
+CorbaObserverPropertySource.disp.service=Service
+CorbaObserverPropertySource.unknown=<UNKNOWN>
 SystemDiagramPropertySource.disp.system_id=System ID
 SystemDiagramPropertySource.disp.kind=Kind
 SystemDiagramPropertySource.disp.create_date=Create Date

Added: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/propertysource/CorbaObserverPropertySource.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/propertysource/CorbaObserverPropertySource.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/propertysource/CorbaObserverPropertySource.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,69 @@
+package jp.go.aist.rtm.toolscommon.ui.propertysource;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.go.aist.rtm.toolscommon.model.component.CorbaObserver;
+import jp.go.aist.rtm.toolscommon.nl.Messages;
+
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+/**
+ * CorbaObserverのIPropertySourceクラス
+ */
+public class CorbaObserverPropertySource extends AbstractPropertySource {
+
+	static final String ID = "ID";
+	static final String INTERFACE_TYPE = "INTERFACE_TYPE";
+	static final String SERVICE = "SERVICE";
+
+	static final String DISP_ID = "ID";
+	static final String DISP_INTERFACE_TYPE = Messages
+			.getString("CorbaObserverPropertySource.disp.interface_type");
+	static final String DISP_SERVICE = Messages
+			.getString("CorbaObserverPropertySource.disp.service");
+
+	static final String UNKNOWN = Messages
+			.getString("CorbaObserverPropertySource.unknown");
+
+	CorbaObserver observer;
+
+	public CorbaObserverPropertySource(CorbaObserver observer) {
+		this.observer = observer;
+	}
+
+	@Override
+	public IPropertyDescriptor[] getPropertyDescriptors() {
+		List<IPropertyDescriptor> result = new ArrayList<IPropertyDescriptor>();
+		result.add(new TextPropertyDescriptor(ID, DISP_ID));
+		result.add(new TextPropertyDescriptor(INTERFACE_TYPE,
+				DISP_INTERFACE_TYPE));
+		result.add(new TextPropertyDescriptor(SERVICE, DISP_SERVICE));
+		for (String key : observer.getPropertyKeys()) {
+			result.add(new TextPropertyDescriptor(new DynamicID("PROPERTIES",
+					key), key));
+		}
+		return (IPropertyDescriptor[]) result
+				.toArray(new IPropertyDescriptor[result.size()]);
+	}
+
+	@Override
+	public java.lang.Object getPropertyValue(java.lang.Object id) {
+		String result = UNKNOWN;
+		if (ID.equals(id)) {
+			result = observer.getServiceProfile().id;
+		} else if (INTERFACE_TYPE.equals(id)) {
+			result = observer.getServiceProfile().interface_type;
+		} else if (SERVICE.equals(id)) {
+			result = observer.getServiceProfile().service.toString();
+		} else if (id instanceof DynamicID) {
+			DynamicID dynamicId = (DynamicID) id;
+			if ("PROPERTIES".equals(dynamicId.categoryId)) {
+				return observer.getProperty(dynamicId.subId);
+			}
+		}
+		return result;
+	}
+
+}

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter/ComponentWorkbenchAdapter.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter/ComponentWorkbenchAdapter.java	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter/ComponentWorkbenchAdapter.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -41,6 +41,9 @@
 			if (cc.getStatusObserver() != null) {
 				result.add(cc.getStatusObserver());
 			}
+			if (cc.getLogObserver() != null) {
+				result.add(cc.getLogObserver());
+			}
 		}
 		return result.toArray();
 	}

Added: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter/CorbaObserverWorkbenchAdapter.java
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter/CorbaObserverWorkbenchAdapter.java	                        (rev 0)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/ui/workbenchadapter/CorbaObserverWorkbenchAdapter.java	2011-04-28 03:04:05 UTC (rev 168)
@@ -0,0 +1,29 @@
+package jp.go.aist.rtm.toolscommon.ui.workbenchadapter;
+
+import jp.go.aist.rtm.toolscommon.model.component.CorbaLogObserver;
+import jp.go.aist.rtm.toolscommon.model.component.CorbaStatusObserver;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+public class CorbaObserverWorkbenchAdapter extends ModelElementWorkbenchAdapter {
+	@Override
+	public ImageDescriptor getImageDescriptor(Object o) {
+		return null;
+	}
+
+	@Override
+	public String getLabel(Object o) {
+		if (o instanceof CorbaStatusObserver) {
+			return "StatusObserver";
+		} else if (o instanceof CorbaLogObserver) {
+			return "LogObserver";
+		}
+		return "Observer";
+	}
+
+	@Override
+	public Object[] getChildren(Object o) {
+		return null;
+	}
+
+}


Property changes on: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/validation/AbstractValidator.java
___________________________________________________________________
Deleted: svn:executable
   - *


Property changes on: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/validation/ValidateException.java
___________________________________________________________________
Deleted: svn:executable
   - *


Property changes on: trunk/rtmtools/jp.go.aist.rtm.toolscommon/src/jp/go/aist/rtm/toolscommon/validation/Validator.java
___________________________________________________________________
Deleted: svn:executable
   - *

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon/text/description.txt
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon/text/description.txt	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon/text/description.txt	2011-04-28 03:04:05 UTC (rev 168)
@@ -244,6 +244,7 @@
     Attribute rTCRTObjects : RTCRTObject<<0..*>>
     Attribute ior : EString
     Reference statusObserver : CorbaStatusObserver
+    Reference logObserver : CorbaLogObserver
     Operation startR() : EInt
     Operation stopR() : EInt
     Operation activateR() : EInt
@@ -252,6 +253,7 @@
     Operation finalizeR() : EInt
     Operation exitR() : EInt
     Operation getCorbaObjectInterface() : RTCRTObject
+    Operation supportedCorbaObserver() : EBoolean
 
   Class CorbaPortSynchronizer -> CorbaWrapperObject, PortSynchronizer
     Attribute rTCPortProfile : RTCPortProfile
@@ -282,11 +284,14 @@
     Operation activate() : void
     Operation deactivate() : void
     Operation attachComponent(CorbaComponent) : EBoolean
-    Operation detachComponent(CorbaComponent) : EBoolean
+    Operation detachComponent() : EBoolean
+    Operation finish() : EBoolean
 
   Class CorbaStatusObserver -> CorbaObserver
     Operation isTimeOut() : EBoolean
 
+  Class CorbaLogObserver -> CorbaObserver
+
   Enum SystemDiagramKind
     Literal ONLINE = 1
     Literal OFFLINE = 2

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon.nl1/META-INF/MANIFEST.MF
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon.nl1/META-INF/MANIFEST.MF	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon.nl1/META-INF/MANIFEST.MF	2011-04-28 03:04:05 UTC (rev 168)
@@ -2,5 +2,5 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Nl1 Fragment
 Bundle-SymbolicName: jp.go.aist.rtm.toolscommon.nl1
-Bundle-Version: 1.1.0.v20110411
+Bundle-Version: 1.1.0.v20110428
 Fragment-Host: jp.go.aist.rtm.toolscommon;bundle-version="0.0.0"

Modified: trunk/rtmtools/jp.go.aist.rtm.toolscommon.nl1/src/jp/go/aist/rtm/toolscommon/nl/messages_ja.properties
===================================================================
--- trunk/rtmtools/jp.go.aist.rtm.toolscommon.nl1/src/jp/go/aist/rtm/toolscommon/nl/messages_ja.properties	2011-04-12 04:08:48 UTC (rev 167)
+++ trunk/rtmtools/jp.go.aist.rtm.toolscommon.nl1/src/jp/go/aist/rtm/toolscommon/nl/messages_ja.properties	2011-04-28 03:04:05 UTC (rev 168)
@@ -44,9 +44,9 @@
 PortInterfaceProfilePropertySource.unknown=<UNKNOWN>
 PortInterfaceProfilePropertySource.polarity.provided=PROVIDED
 PortInterfaceProfilePropertySource.polarity.required=REQUIRED
-CorbaStatusObserverPropertySource.disp.interface_type=Interface Type
-CorbaStatusObserverPropertySource.disp.service=Service
-CorbaStatusObserverPropertySource.unknown=<UNKNOWN>
+CorbaObserverPropertySource.disp.interface_type=Interface Type
+CorbaObserverPropertySource.disp.service=Service
+CorbaObserverPropertySource.unknown=<UNKNOWN>
 SystemDiagramPropertySource.disp.system_id=System ID
 SystemDiagramPropertySource.disp.kind=Kind
 SystemDiagramPropertySource.disp.create_date=Create Date



openrtm-commit メーリングリストの案内