~ubuntu-branches/ubuntu/vivid/eclipse-linuxtools/vivid-proposed

« back to all changes in this revision

Viewing changes to lttng/org.eclipse.linuxtools.lttng2.control.ui/src/org/eclipse/linuxtools/internal/lttng2/control/ui/views/model/impl/TargetNodeComponent.java

  • Committer: Package Import Robot
  • Author(s): Jakub Adam, Jakub Adam, tony mancill
  • Date: 2014-10-11 11:44:05 UTC
  • mfrom: (1.2.4)
  • Revision ID: package-import@ubuntu.com-20141011114405-yazjvxfzzhmi5sgj
Tags: 3.1.0-1
[ Jakub Adam ]
* New upstream release (Closes: #761524).
* Refreshed d/patches.
* Don't build removed feature org.eclipse.linuxtools.tools.launch
  - merged into org.eclipse.linuxtools.profiling.
* Use javac target 1.7.
* Build new feature org.eclipse.linuxtools.dataviewers.feature
  - required by Valgrind integration.
* Build-depend on eclipse-remote-services-api and eclipse-cdt-autotools.
* Bump Standards-Version to 3.9.6.
* Override incompatible-java-bytecode-format - linuxtools needs Java 7.
* Remove unused codeless-jar override.

[ tony mancill ]
* Tweak short package description to make lintian happy.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**********************************************************************
 
2
 * Copyright (c) 2012, 2013 Ericsson
 
3
 *
 
4
 * All rights reserved. This program and the accompanying materials are
 
5
 * made available under the terms of the Eclipse Public License v1.0 which
 
6
 * accompanies this distribution, and is available at
 
7
 * http://www.eclipse.org/legal/epl-v10.html
 
8
 *
 
9
 * Contributors:
 
10
 *   Bernd Hufmann - Initial API and implementation
 
11
 *   Bernd Hufmann - Updated for support of LTTng Tools 2.1
 
12
 **********************************************************************/
 
13
package org.eclipse.linuxtools.internal.lttng2.control.ui.views.model.impl;
 
14
 
 
15
import java.util.List;
 
16
 
 
17
import org.eclipse.core.commands.ExecutionException;
 
18
import org.eclipse.core.runtime.IProgressMonitor;
 
19
import org.eclipse.core.runtime.IStatus;
 
20
import org.eclipse.core.runtime.Status;
 
21
import org.eclipse.core.runtime.jobs.Job;
 
22
import org.eclipse.jface.dialogs.ErrorDialog;
 
23
import org.eclipse.linuxtools.internal.lttng2.control.core.model.TargetNodeState;
 
24
import org.eclipse.linuxtools.internal.lttng2.control.ui.Activator;
 
25
import org.eclipse.linuxtools.internal.lttng2.control.ui.views.messages.Messages;
 
26
import org.eclipse.linuxtools.internal.lttng2.control.ui.views.model.ITraceControlComponent;
 
27
import org.eclipse.linuxtools.internal.lttng2.control.ui.views.property.TargetNodePropertySource;
 
28
import org.eclipse.linuxtools.internal.lttng2.control.ui.views.remote.ICommandShell;
 
29
import org.eclipse.linuxtools.internal.lttng2.control.ui.views.remote.IRemoteSystemProxy;
 
30
import org.eclipse.linuxtools.internal.lttng2.control.ui.views.remote.RemoteSystemProxy;
 
31
import org.eclipse.linuxtools.internal.lttng2.control.ui.views.service.ILttngControlService;
 
32
import org.eclipse.linuxtools.internal.lttng2.control.ui.views.service.LTTngControlServiceFactory;
 
33
import org.eclipse.rse.core.RSECorePlugin;
 
34
import org.eclipse.rse.core.model.IHost;
 
35
import org.eclipse.rse.core.model.IRSECallback;
 
36
import org.eclipse.rse.core.model.ISystemRegistry;
 
37
import org.eclipse.rse.core.subsystems.CommunicationsEvent;
 
38
import org.eclipse.rse.core.subsystems.ICommunicationsListener;
 
39
import org.eclipse.swt.graphics.Image;
 
40
import org.eclipse.swt.widgets.Display;
 
41
import org.eclipse.ui.PlatformUI;
 
42
import org.eclipse.ui.views.properties.IPropertySource;
 
43
 
 
44
/**
 
45
 * <p>
 
46
 * Implementation of the trace node component.
 
47
 * </p>
 
48
 *
 
49
 * @author Bernd Hufmann
 
50
 */
 
51
public class TargetNodeComponent extends TraceControlComponent implements ICommunicationsListener {
 
52
 
 
53
    // ------------------------------------------------------------------------
 
54
    // Constants
 
55
    // ------------------------------------------------------------------------
 
56
 
 
57
    /**
 
58
     * Path to icon file for this component (state connected).
 
59
     */
 
60
    public static final String TARGET_NODE_CONNECTED_ICON_FILE = "icons/obj16/target_connected.gif"; //$NON-NLS-1$
 
61
    /**
 
62
     * Path to icon file for this component (state disconnected).
 
63
     */
 
64
    public static final String TARGET_NODE_DISCONNECTED_ICON_FILE = "icons/obj16/target_disconnected.gif"; //$NON-NLS-1$
 
65
 
 
66
    // ------------------------------------------------------------------------
 
67
    // Attributes
 
68
    // ------------------------------------------------------------------------
 
69
 
 
70
    /**
 
71
     * The node connection state.
 
72
     */
 
73
    private TargetNodeState fState = TargetNodeState.DISCONNECTED;
 
74
    /**
 
75
     * The image to be displayed in state disconnected.
 
76
     */
 
77
    private Image fDisconnectedImage = null;
 
78
    /**
 
79
     * The connection implementation.
 
80
     */
 
81
    private IHost fHost = null;
 
82
    /**
 
83
     * The remote proxy implementation.
 
84
     */
 
85
    private IRemoteSystemProxy fRemoteProxy = null;
 
86
    /**
 
87
     * The control service for LTTng specific commands.
 
88
     */
 
89
    private ILttngControlService fService = null;
 
90
    /**
 
91
     * The command shell for issuing commands.
 
92
     */
 
93
    private ICommandShell fShell = null;
 
94
 
 
95
    // ------------------------------------------------------------------------
 
96
    // Constructors
 
97
    // ------------------------------------------------------------------------
 
98
 
 
99
    /**
 
100
     * Constructor
 
101
     * @param name - the name of the component
 
102
     * @param parent - the parent of the component
 
103
     * @param host - the host connection implementation
 
104
     * @param proxy - the remote proxy implementation
 
105
     */
 
106
    public TargetNodeComponent(String name, ITraceControlComponent parent, IHost host, IRemoteSystemProxy proxy) {
 
107
        super(name, parent);
 
108
        setImage(TARGET_NODE_CONNECTED_ICON_FILE);
 
109
        fDisconnectedImage = Activator.getDefault().loadIcon(TARGET_NODE_DISCONNECTED_ICON_FILE);
 
110
        fHost = host;
 
111
        fRemoteProxy = proxy;
 
112
        setToolTip(fHost.getHostName());
 
113
    }
 
114
 
 
115
    /**
 
116
     * Constructor (using default proxy)
 
117
     * @param name - the name of the component
 
118
     * @param parent - the parent of the component
 
119
     * @param host - the host connection implementation
 
120
     */
 
121
    public TargetNodeComponent(String name, ITraceControlComponent parent, IHost host) {
 
122
        this(name, parent, host, new RemoteSystemProxy(host));
 
123
    }
 
124
 
 
125
    // ------------------------------------------------------------------------
 
126
    // Accessors
 
127
    // ------------------------------------------------------------------------
 
128
 
 
129
    @Override
 
130
    public Image getImage() {
 
131
        if (fState == TargetNodeState.CONNECTED) {
 
132
            return super.getImage();
 
133
        }
 
134
        return fDisconnectedImage;
 
135
    }
 
136
 
 
137
    @Override
 
138
    public TargetNodeState getTargetNodeState() {
 
139
        return fState;
 
140
    }
 
141
 
 
142
    @Override
 
143
    public void setTargetNodeState(TargetNodeState state) {
 
144
        fState = state;
 
145
        fireComponentChanged(TargetNodeComponent.this);
 
146
    }
 
147
 
 
148
    @Override
 
149
    public ILttngControlService getControlService() {
 
150
        return fService;
 
151
    }
 
152
 
 
153
    @Override
 
154
    public void setControlService(ILttngControlService service) {
 
155
        fService = service;
 
156
    }
 
157
 
 
158
    @Override
 
159
    public Object getAdapter(Class adapter) {
 
160
        if (adapter == IPropertySource.class) {
 
161
            return new TargetNodePropertySource(this);
 
162
        }
 
163
        return null;
 
164
    }
 
165
 
 
166
    /**
 
167
     * @return remote host name
 
168
     */
 
169
    public String getHostName() {
 
170
        return fHost.getHostName();
 
171
    }
 
172
 
 
173
    /**
 
174
     * @return remote system proxy implementation
 
175
     */
 
176
    public IRemoteSystemProxy getRemoteSystemProxy() {
 
177
        return fRemoteProxy;
 
178
    }
 
179
 
 
180
    /**
 
181
     * @return port of IP connection (shell) to be used
 
182
     */
 
183
    public int getPort() {
 
184
        return fRemoteProxy.getPort();
 
185
    }
 
186
 
 
187
    /**
 
188
     * Sets the port of the IP connections of the shell
 
189
     * @param port - the IP port to set
 
190
     */
 
191
    public void setPort(int port) {
 
192
        fRemoteProxy.setPort(port);
 
193
    }
 
194
 
 
195
    /**
 
196
     * @return all available sessions.
 
197
     */
 
198
    public TraceSessionComponent[] getSessions() {
 
199
        List<ITraceControlComponent> compenents = getChildren(TraceSessionGroup.class);
 
200
        if (compenents.size() > 0) {
 
201
            TraceSessionGroup group = (TraceSessionGroup)compenents.get(0);
 
202
            List<ITraceControlComponent> sessions = group.getChildren(TraceSessionComponent.class);
 
203
            return sessions.toArray(new TraceSessionComponent[sessions.size()]);
 
204
        }
 
205
        return new TraceSessionComponent[0];
 
206
    }
 
207
 
 
208
    /**
 
209
     * @return node version
 
210
     */
 
211
    public String getNodeVersion() {
 
212
        // Control service is null during connection to node
 
213
        if (getControlService() != null) {
 
214
            return getControlService().getVersion();
 
215
        }
 
216
        return ""; //$NON-NLS-1$
 
217
    }
 
218
 
 
219
    /**
 
220
     * Returns if node supports filtering of events
 
221
     * @return <code>true</code> if node supports filtering else <code>false</code>
 
222
     */
 
223
    public boolean isEventFilteringSupported() {
 
224
        return getControlService().isVersionSupported("2.1.0"); //$NON-NLS-1$
 
225
    }
 
226
 
 
227
    /**
 
228
     * Returns if node supports networks streaming or not
 
229
     * @return <code>true</code> if node supports filtering else <code>false</code>
 
230
     *
 
231
     */
 
232
    public boolean isNetworkStreamingSupported() {
 
233
        return getControlService().isVersionSupported("2.1.0"); //$NON-NLS-1$
 
234
    }
 
235
 
 
236
    /**
 
237
     * Returns if node supports configuring buffer type  or not
 
238
     * @return <code>true</code> if node supports buffer type configuration else <code>false</code>
 
239
     */
 
240
    public boolean isBufferTypeConfigSupported() {
 
241
        return getControlService().isVersionSupported("2.2.0"); //$NON-NLS-1$
 
242
    }
 
243
 
 
244
    /**
 
245
     * Returns if node supports trace file rotation or not
 
246
     * @return <code>true</code> if node supports trace file rotation else <code>false</code>
 
247
     */
 
248
    public boolean isTraceFileRotationSupported() {
 
249
        return getControlService().isVersionSupported("2.2.0"); //$NON-NLS-1$
 
250
    }
 
251
 
 
252
    /**
 
253
     * Returns if node supports periodical flush for metadata or not
 
254
     * @return <code>true</code> if node supports periodical flush for metadata else <code>false</code>
 
255
     */
 
256
    public boolean isPeriodicalMetadataFlushSupported() {
 
257
        return getControlService().isVersionSupported("2.2.0"); //$NON-NLS-1$
 
258
    }
 
259
    /**
 
260
     * Returns if node supports snapshots or not
 
261
     * @return <code>true</code> if it supports snapshots else <code>false</code>
 
262
     *
 
263
     */
 
264
    public boolean isSnapshotSupported() {
 
265
        return getControlService().isVersionSupported("2.3.0"); //$NON-NLS-1$
 
266
    }
 
267
    /**
 
268
     * Returns if node supports live or not
 
269
     * @return <code>true</code> if it supports live else <code>false</code>
 
270
     *
 
271
     */
 
272
    public boolean isLiveSupported() {
 
273
        return getControlService().isVersionSupported("2.4.0"); //$NON-NLS-1$;
 
274
    }
 
275
    /**
 
276
     * Returns if node supports adding contexts on event
 
277
     * @return <code>true</code> if it supports adding contexts on events else <code>false</code>
 
278
     *
 
279
     */
 
280
    public boolean isContextOnEventSupported() {
 
281
        return !getControlService().isVersionSupported("2.2.0"); //$NON-NLS-1$
 
282
    }
 
283
 
 
284
    // ------------------------------------------------------------------------
 
285
    // Operations
 
286
    // ------------------------------------------------------------------------
 
287
 
 
288
   @Override
 
289
   public void communicationsStateChange(CommunicationsEvent e) {
 
290
       if (e.getState() == CommunicationsEvent.AFTER_DISCONNECT ||
 
291
               e.getState() == CommunicationsEvent.CONNECTION_ERROR) {
 
292
           handleDisconnected();
 
293
       } if ((e.getState() == CommunicationsEvent.AFTER_CONNECT) && (fState != TargetNodeState.CONNECTING)) {
 
294
           handleConnected();
 
295
       }
 
296
   }
 
297
 
 
298
   @Override
 
299
   public boolean isPassiveCommunicationsListener() {
 
300
       return true;
 
301
   }
 
302
 
 
303
   @Override
 
304
   public void dispose() {
 
305
       fRemoteProxy.removeCommunicationListener(this);
 
306
   }
 
307
 
 
308
   /**
 
309
    * Method to connect this node component to the remote target node.
 
310
    */
 
311
   public void connect() {
 
312
       if (fState == TargetNodeState.DISCONNECTED) {
 
313
           try {
 
314
               setTargetNodeState(TargetNodeState.CONNECTING);
 
315
               fRemoteProxy.connect(new IRSECallback() {
 
316
                   @Override
 
317
                   public void done(IStatus status, Object result) {
 
318
                       // Note: result might be null!
 
319
                       if(status.isOK()) {
 
320
                           handleConnected();
 
321
                       } else {
 
322
                           handleDisconnected();
 
323
                       }
 
324
                   }
 
325
               });
 
326
           } catch (Exception e) {
 
327
               setTargetNodeState(TargetNodeState.DISCONNECTED);
 
328
               Activator.getDefault().logError(Messages.TraceControl_ConnectionFailure + " (" + getName() + "). \n", e); //$NON-NLS-1$ //$NON-NLS-2$
 
329
           }
 
330
       }
 
331
    }
 
332
 
 
333
   /**
 
334
    * Method to disconnect this node component to the remote target node.
 
335
    */
 
336
    public void disconnect() {
 
337
        if (fState == TargetNodeState.CONNECTED) {
 
338
            try {
 
339
                setTargetNodeState(TargetNodeState.DISCONNECTING);
 
340
                fRemoteProxy.disconnect();
 
341
            } catch (Exception e) {
 
342
                Activator.getDefault().logError(Messages.TraceControl_DisconnectionFailure + " (" + getName() + "). \n", e); //$NON-NLS-1$ //$NON-NLS-2$
 
343
            } finally {
 
344
                handleDisconnected();
 
345
            }
 
346
        }
 
347
    }
 
348
 
 
349
    /**
 
350
     * Retrieves the trace configuration from the target node and populates the
 
351
     * information in the tree model. The execution is done in a own job.
 
352
     */
 
353
    public void getConfigurationFromNode() {
 
354
        Job job = new Job(Messages.TraceControl_RetrieveNodeConfigurationJob) {
 
355
            @Override
 
356
            protected IStatus run(IProgressMonitor monitor) {
 
357
 
 
358
                try {
 
359
                    // Get provider information from node
 
360
                    TraceProviderGroup providerGroup = new TraceProviderGroup(Messages.TraceControl_ProviderDisplayName, TargetNodeComponent.this);
 
361
                    addChild(providerGroup);
 
362
                    providerGroup.getProviderFromNode(monitor);
 
363
 
 
364
                    // Get session information from node
 
365
                    TraceSessionGroup sessionGroup = new TraceSessionGroup(Messages.TraceControl_AllSessionsDisplayName, TargetNodeComponent.this);
 
366
                    addChild(sessionGroup);
 
367
                    sessionGroup.getSessionsFromNode(monitor);
 
368
                } catch (ExecutionException e) {
 
369
                    removeAllChildren();
 
370
                    return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.TraceControl_RetrieveNodeConfigurationFailure, e);
 
371
                }
 
372
 
 
373
                return Status.OK_STATUS;
 
374
            }
 
375
        };
 
376
        job.setUser(true);
 
377
        job.schedule();
 
378
    }
 
379
 
 
380
    /**
 
381
     * Refresh the node configuration
 
382
     */
 
383
    public void refresh() {
 
384
        removeAllChildren();
 
385
        getConfigurationFromNode();
 
386
    }
 
387
 
 
388
    /**
 
389
     * Deregisters host from registry.
 
390
     */
 
391
    public void deregister() {
 
392
        ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry();
 
393
        // Don't remove local host because it cannot be recreated by
 
394
        // LTTng NewConnection Dialog
 
395
        if (!fRemoteProxy.isLocal()) {
 
396
            registry.deleteHost(fHost);
 
397
        }
 
398
    }
 
399
 
 
400
    // ------------------------------------------------------------------------
 
401
    // Helper function
 
402
    // ------------------------------------------------------------------------
 
403
 
 
404
    /**
 
405
     * @return returns the control service for LTTng specific commands.
 
406
     * @throws ExecutionException
 
407
     */
 
408
    private ILttngControlService createControlService() throws ExecutionException {
 
409
        if (fShell == null) {
 
410
            fShell = fRemoteProxy.createCommandShell();
 
411
            fRemoteProxy.addCommunicationListener(this);
 
412
        }
 
413
        fService = LTTngControlServiceFactory.getInstance().getLttngControlService(fShell);
 
414
        return fService;
 
415
    }
 
416
 
 
417
    /**
 
418
     * Handles the connected event.
 
419
     */
 
420
    private void handleConnected() {
 
421
        setTargetNodeState(TargetNodeState.CONNECTED);
 
422
        try {
 
423
            createControlService();
 
424
            getConfigurationFromNode();
 
425
        } catch (final ExecutionException e) {
 
426
            // Disconnect only if no control service, otherwise stay connected.
 
427
            if (getControlService() == null) {
 
428
                disconnect();
 
429
            }
 
430
 
 
431
            // Notify user
 
432
            Display.getDefault().asyncExec(new Runnable() {
 
433
                @Override
 
434
                public void run() {
 
435
                    ErrorDialog er = new ErrorDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
 
436
                            Messages.TraceControl_ErrorTitle, Messages.TraceControl_RetrieveNodeConfigurationFailure,
 
437
                            new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e),
 
438
                            IStatus.ERROR);
 
439
                    er.open();
 
440
                }
 
441
            });
 
442
            Activator.getDefault().logError(Messages.TraceControl_RetrieveNodeConfigurationFailure + " (" + getName() + "). \n", e); //$NON-NLS-1$ //$NON-NLS-2$
 
443
        }
 
444
    }
 
445
 
 
446
    /**
 
447
     * Handles the disconnected event.
 
448
     */
 
449
    private void handleDisconnected() {
 
450
        removeAllChildren();
 
451
        setTargetNodeState(TargetNodeState.DISCONNECTED);
 
452
        fShell = null;
 
453
        fService = null;
 
454
    }
 
455
}