| 1 | /*******************************************************************************\r |
| 2 | * Copyright (c) 2011 Ericsson\r |
| 3 | * \r |
| 4 | * All rights reserved. This program and the accompanying materials are\r |
| 5 | * made available under the terms of the Eclipse Public License v1.0 which\r |
| 6 | * accompanies this distribution, and is available at\r |
| 7 | * http://www.eclipse.org/legal/epl-v10.html\r |
| 8 | * \r |
| 9 | * Contributors:\r |
| 10 | * Bernd Hufmann - Initial API and implementation\r |
| 11 | * \r |
| 12 | *******************************************************************************/\r |
| 13 | package org.eclipse.linuxtools.lttng.ui.tracecontrol.wizards;\r |
| 14 | \r |
| 15 | import java.io.File;\r |
| 16 | \r |
| 17 | import org.eclipse.jface.wizard.WizardPage;\r |
| 18 | import org.eclipse.linuxtools.lttng.core.tracecontrol.model.TraceResource;\r |
| 19 | import org.eclipse.linuxtools.lttng.core.tracecontrol.model.TraceResource.TraceState;\r |
| 20 | import org.eclipse.linuxtools.lttng.core.tracecontrol.model.config.TraceConfig;\r |
| 21 | import org.eclipse.linuxtools.lttng.ui.tracecontrol.TraceControlConstants;\r |
| 22 | import org.eclipse.linuxtools.lttng.ui.tracecontrol.Messages;\r |
| 23 | import org.eclipse.linuxtools.lttng.ui.tracecontrol.subsystems.TraceSubSystem;\r |
| 24 | import org.eclipse.rse.services.clientserver.messages.SystemMessageException;\r |
| 25 | import org.eclipse.rse.ui.SystemBasePlugin;\r |
| 26 | import org.eclipse.swt.SWT;\r |
| 27 | import org.eclipse.swt.events.VerifyEvent;\r |
| 28 | import org.eclipse.swt.events.VerifyListener;\r |
| 29 | import org.eclipse.swt.layout.GridData;\r |
| 30 | import org.eclipse.swt.layout.GridLayout;\r |
| 31 | import org.eclipse.swt.widgets.Button;\r |
| 32 | import org.eclipse.swt.widgets.Composite;\r |
| 33 | import org.eclipse.swt.widgets.DirectoryDialog;\r |
| 34 | import org.eclipse.swt.widgets.Display;\r |
| 35 | import org.eclipse.swt.widgets.Event;\r |
| 36 | import org.eclipse.swt.widgets.Group;\r |
| 37 | import org.eclipse.swt.widgets.Label;\r |
| 38 | import org.eclipse.swt.widgets.Listener;\r |
| 39 | import org.eclipse.swt.widgets.Text;\r |
| 40 | \r |
| 41 | /**\r |
| 42 | * <b><u>UstTraceChannelConfigurationPage</u></b>\r |
| 43 | * <p>\r |
| 44 | * Wizard page implementation to configure a trace (Kernel and UST).\r |
| 45 | * </p>\r |
| 46 | */\r |
| 47 | public class TraceConfigurationPage extends WizardPage {\r |
| 48 | \r |
| 49 | // ------------------------------------------------------------------------\r |
| 50 | // Attributes\r |
| 51 | // ------------------------------------------------------------------------\r |
| 52 | private ConfigureTraceWizard fWizard;\r |
| 53 | private String fTraceName;\r |
| 54 | private String fTraceTransport;\r |
| 55 | private String fTracePath;\r |
| 56 | private int fMode;\r |
| 57 | private int fNumChannel;\r |
| 58 | private boolean fIsAppend;\r |
| 59 | private boolean fIsNetwork;\r |
| 60 | private Text fNameText;\r |
| 61 | private Text fTransportText;\r |
| 62 | private Text fPathText;\r |
| 63 | private Text fNumLttdThreadsText;\r |
| 64 | private Button fHostButton;\r |
| 65 | private Button fTargetButton;\r |
| 66 | private Button fIsAppendButton;\r |
| 67 | private Button fFlightRecorderButton;\r |
| 68 | private Button fNormalButton;\r |
| 69 | private Display fDisplay;\r |
| 70 | private String fTraceNameError;\r |
| 71 | private String fTracePathError;\r |
| 72 | private Button fBrowseButton;\r |
| 73 | \r |
| 74 | private TraceResource fTraceResource;\r |
| 75 | private TraceConfig fOldTraceConfig;\r |
| 76 | private TraceSubSystem fSubSystem;\r |
| 77 | \r |
| 78 | // ------------------------------------------------------------------------\r |
| 79 | // Constructors\r |
| 80 | // ------------------------------------------------------------------------\r |
| 81 | \r |
| 82 | /**\r |
| 83 | * Constructore\r |
| 84 | * \r |
| 85 | * @param wizard\r |
| 86 | */\r |
| 87 | public TraceConfigurationPage(ConfigureTraceWizard wizard) {\r |
| 88 | super("TraceConfigurationPage"); //$NON-NLS-1$\r |
| 89 | setTitle(Messages.ConfigureTraceDialog_Title);\r |
| 90 | // setDescription("set description..."); \r |
| 91 | this.fWizard = wizard;\r |
| 92 | setPageComplete(false);\r |
| 93 | fTraceNameError = ""; //$NON-NLS-1$\r |
| 94 | fTracePathError = ""; //$NON-NLS-1$\r |
| 95 | fTraceResource = this.fWizard.getSelectedTrace();\r |
| 96 | fOldTraceConfig = fTraceResource.getTraceConfig();\r |
| 97 | fSubSystem = (TraceSubSystem)this.fWizard.getSelectedTrace().getSubSystem();\r |
| 98 | }\r |
| 99 | \r |
| 100 | // ------------------------------------------------------------------------\r |
| 101 | // Operations\r |
| 102 | // ------------------------------------------------------------------------\r |
| 103 | \r |
| 104 | /*\r |
| 105 | * (non-Javadoc)\r |
| 106 | * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)\r |
| 107 | */\r |
| 108 | @Override\r |
| 109 | public void createControl(Composite parent) {\r |
| 110 | GridData griddata = new GridData();\r |
| 111 | \r |
| 112 | griddata = new GridData();\r |
| 113 | Composite composite1 = new Composite(parent, SWT.NONE);\r |
| 114 | GridLayout compositeLayout1 = new GridLayout(4, false);\r |
| 115 | composite1.setSize(520, 300);\r |
| 116 | composite1.setLayout(compositeLayout1);\r |
| 117 | griddata.horizontalSpan = 3;\r |
| 118 | griddata.widthHint = 520;\r |
| 119 | griddata.minimumWidth = 520;\r |
| 120 | composite1.setLayoutData(griddata);\r |
| 121 | fDisplay = this.getShell().getDisplay();\r |
| 122 | setControl(composite1);\r |
| 123 | Label nameLabel = new Label(composite1, SWT.NULL);\r |
| 124 | nameLabel.setText(Messages.NewTraceDialog_TraceName + ":"); //$NON-NLS-1$\r |
| 125 | griddata = new GridData();\r |
| 126 | griddata.verticalIndent = 20;\r |
| 127 | nameLabel.setLayoutData(griddata);\r |
| 128 | \r |
| 129 | fNameText = new Text(composite1, SWT.SINGLE | SWT.BORDER);\r |
| 130 | if (fTraceResource.isUst()) {\r |
| 131 | fNameText.setText(TraceControlConstants.Lttng_Ust_TraceName);\r |
| 132 | fNameText.setEnabled(false);\r |
| 133 | }\r |
| 134 | \r |
| 135 | griddata = new GridData();\r |
| 136 | griddata.horizontalAlignment = SWT.FILL;\r |
| 137 | griddata.grabExcessHorizontalSpace = true;\r |
| 138 | griddata.verticalIndent = 20;\r |
| 139 | griddata.horizontalSpan = 3;\r |
| 140 | fNameText.setLayoutData(griddata);\r |
| 141 | fNameText.setText(fTraceResource.getName());\r |
| 142 | fNameText.setEnabled(false);\r |
| 143 | \r |
| 144 | Label transportLabel = new Label(composite1, SWT.NULL);\r |
| 145 | transportLabel.setText(Messages.ConfigureTraceDialog_Trace_Transport + ":"); //$NON-NLS-1$\r |
| 146 | griddata = new GridData();\r |
| 147 | transportLabel.setLayoutData(griddata);\r |
| 148 | \r |
| 149 | fTransportText = new Text(composite1, SWT.SINGLE | SWT.BORDER);\r |
| 150 | griddata = new GridData();\r |
| 151 | griddata.horizontalAlignment = SWT.FILL;\r |
| 152 | griddata.grabExcessHorizontalSpace = true;\r |
| 153 | griddata.horizontalSpan = 3;\r |
| 154 | fTransportText.setLayoutData(griddata);\r |
| 155 | fTransportText.setText(TraceControlConstants.Lttng_Trace_Transport_Relay);\r |
| 156 | fTransportText.setEnabled(false); // relay is the only allowed value\r |
| 157 | if (fOldTraceConfig != null) {\r |
| 158 | fTransportText.setText(fOldTraceConfig.getTraceTransport());\r |
| 159 | }\r |
| 160 | \r |
| 161 | griddata = new GridData();\r |
| 162 | Group composite21 = new Group(composite1, SWT.SHADOW_OUT);\r |
| 163 | composite21.setSize(300, 300);\r |
| 164 | composite21.setText(Messages.ConfigureTraceDialog_Trace_Location);\r |
| 165 | griddata.horizontalAlignment = SWT.FILL;\r |
| 166 | griddata.horizontalSpan = 4;\r |
| 167 | griddata.verticalIndent = 10;\r |
| 168 | griddata.widthHint = 300;\r |
| 169 | griddata.minimumWidth = 300;\r |
| 170 | composite21.setLayoutData(griddata);\r |
| 171 | GridLayout compositeLayout21 = new GridLayout(4, false);\r |
| 172 | composite21.setLayout(compositeLayout21);\r |
| 173 | fTargetButton = new Button(composite21, SWT.RADIO);\r |
| 174 | fTargetButton.setText(Messages.ConfigureTraceDialog_Target);\r |
| 175 | fTargetButton.setSelection(true);\r |
| 176 | fIsNetwork = false;\r |
| 177 | fHostButton = new Button(composite21, SWT.RADIO);\r |
| 178 | fHostButton.setText(Messages.ConfigureTraceDialog_Host);\r |
| 179 | griddata = new GridData();\r |
| 180 | griddata.horizontalSpan = 3;\r |
| 181 | fHostButton.setLayoutData(griddata);\r |
| 182 | fHostButton.addListener(SWT.Selection, new Listener() {\r |
| 183 | @Override\r |
| 184 | public void handleEvent(Event e) {\r |
| 185 | if (fHostButton.getSelection()) {\r |
| 186 | fBrowseButton.setEnabled(true);\r |
| 187 | } else {\r |
| 188 | fBrowseButton.setEnabled(false);\r |
| 189 | }\r |
| 190 | fIsNetwork = fHostButton.getSelection();\r |
| 191 | validatePathName(fPathText.getText());\r |
| 192 | validate();\r |
| 193 | }\r |
| 194 | });\r |
| 195 | \r |
| 196 | Label pathLabel = new Label(composite21, SWT.NULL);\r |
| 197 | pathLabel.setText(Messages.ConfigureTraceDialog_Trace_Path);\r |
| 198 | griddata = new GridData();\r |
| 199 | griddata.verticalIndent = 10;\r |
| 200 | pathLabel.setLayoutData(griddata);\r |
| 201 | \r |
| 202 | fPathText = new Text(composite21, SWT.SINGLE | SWT.BORDER);\r |
| 203 | griddata = new GridData();\r |
| 204 | griddata.horizontalAlignment = SWT.FILL;\r |
| 205 | griddata.grabExcessHorizontalSpace = true;\r |
| 206 | griddata.verticalIndent = 10;\r |
| 207 | fPathText.setLayoutData(griddata);\r |
| 208 | fPathText.setData(""); //$NON-NLS-1$\r |
| 209 | \r |
| 210 | fBrowseButton = new Button(composite21, SWT.PUSH);\r |
| 211 | fBrowseButton.setText(Messages.ConfigureTraceDialog_Browse + "..."); //$NON-NLS-1$\r |
| 212 | griddata = new GridData();\r |
| 213 | griddata.grabExcessHorizontalSpace = false;\r |
| 214 | griddata.widthHint = 100;\r |
| 215 | griddata.verticalIndent = 10;\r |
| 216 | fBrowseButton.setLayoutData(griddata);\r |
| 217 | fBrowseButton.setEnabled(false);\r |
| 218 | fBrowseButton.addListener(SWT.Selection, new Listener() {\r |
| 219 | @Override\r |
| 220 | public void handleEvent(Event event) {\r |
| 221 | DirectoryDialog dialog = new DirectoryDialog(fDisplay.getActiveShell());\r |
| 222 | String newPath = dialog.open();\r |
| 223 | if (newPath != null) {\r |
| 224 | fPathText.setText(newPath);\r |
| 225 | }\r |
| 226 | }\r |
| 227 | });\r |
| 228 | \r |
| 229 | fNameText.addListener(SWT.Modify, new Listener() {\r |
| 230 | @Override\r |
| 231 | public void handleEvent(Event event) {\r |
| 232 | validateTraceName(fNameText.getText());\r |
| 233 | validate();\r |
| 234 | }\r |
| 235 | });\r |
| 236 | \r |
| 237 | fTransportText.addListener(SWT.Modify, new Listener() {\r |
| 238 | @Override\r |
| 239 | public void handleEvent(Event event) {\r |
| 240 | validate();\r |
| 241 | }\r |
| 242 | });\r |
| 243 | \r |
| 244 | fPathText.addListener(SWT.Modify, new Listener() {\r |
| 245 | @Override\r |
| 246 | public void handleEvent(Event event) {\r |
| 247 | if (!fPathText.isEnabled()) {\r |
| 248 | return;\r |
| 249 | }\r |
| 250 | validatePathName(fPathText.getText());\r |
| 251 | validate();\r |
| 252 | }\r |
| 253 | });\r |
| 254 | \r |
| 255 | griddata = new GridData();\r |
| 256 | Composite composite2 = new Composite(composite1, SWT.NONE);\r |
| 257 | GridLayout compositeLayout2 = new GridLayout(2, false);\r |
| 258 | composite2.setLayout(compositeLayout2);\r |
| 259 | griddata.horizontalSpan = 4;\r |
| 260 | griddata.widthHint = 500;\r |
| 261 | griddata.minimumWidth = 500;\r |
| 262 | composite2.setLayoutData(griddata);\r |
| 263 | \r |
| 264 | Label numLttdThreadsLabel = new Label(composite2, SWT.NULL);\r |
| 265 | numLttdThreadsLabel.setText(Messages.ConfigureTraceDialog_Num_Lttd_Threads + ":"); //$NON-NLS-1$);\r |
| 266 | griddata = new GridData();\r |
| 267 | griddata.verticalIndent = 10;\r |
| 268 | numLttdThreadsLabel.setLayoutData(griddata);\r |
| 269 | \r |
| 270 | fNumLttdThreadsText = new Text(composite2, SWT.SINGLE | SWT.BORDER);\r |
| 271 | griddata = new GridData();\r |
| 272 | griddata.horizontalAlignment = SWT.BEGINNING;\r |
| 273 | griddata.verticalIndent = 10;\r |
| 274 | griddata.widthHint = 50;\r |
| 275 | griddata.minimumWidth = 50;\r |
| 276 | fNumLttdThreadsText.setLayoutData(griddata);\r |
| 277 | if (fTraceResource.isUst()) {\r |
| 278 | fNumLttdThreadsText.setText("1"); //$NON-NLS-1$\r |
| 279 | fNumLttdThreadsText.setEnabled(false);\r |
| 280 | } else {\r |
| 281 | fNumLttdThreadsText.setText("2"); //$NON-NLS-1$\r |
| 282 | }\r |
| 283 | \r |
| 284 | fNumLttdThreadsText.addVerifyListener(new VerifyListener() {\r |
| 285 | @Override\r |
| 286 | public void verifyText(VerifyEvent e) {\r |
| 287 | e.doit = e.text.matches("[0-9]*"); //$NON-NLS-1$\r |
| 288 | }\r |
| 289 | });\r |
| 290 | \r |
| 291 | fNumLttdThreadsText.addListener(SWT.Modify, new Listener() {\r |
| 292 | @Override\r |
| 293 | public void handleEvent(Event event) {\r |
| 294 | validate();\r |
| 295 | }\r |
| 296 | });\r |
| 297 | \r |
| 298 | fIsAppendButton = new Button(composite1, SWT.CHECK);\r |
| 299 | fIsAppendButton.setText(Messages.ConfigureTraceDialog_Append);\r |
| 300 | griddata = new GridData();\r |
| 301 | griddata.horizontalAlignment = SWT.BEGINNING;\r |
| 302 | griddata.horizontalSpan = 4;\r |
| 303 | griddata.verticalIndent = 10;\r |
| 304 | fIsAppendButton.setLayoutData(griddata);\r |
| 305 | fIsAppend = false;\r |
| 306 | fIsAppendButton.addListener(SWT.Selection, new Listener() {\r |
| 307 | @Override\r |
| 308 | public void handleEvent(Event e) {\r |
| 309 | fIsAppend = fIsAppendButton.getSelection();\r |
| 310 | }\r |
| 311 | });\r |
| 312 | if (fTraceResource.isUst()) {\r |
| 313 | fIsAppendButton.setEnabled(false);\r |
| 314 | }\r |
| 315 | \r |
| 316 | griddata = new GridData();\r |
| 317 | Group composite22 = new Group(composite1, SWT.SHADOW_OUT);\r |
| 318 | composite22.setText(Messages.ConfigureTraceDialog_Trace_Mode);\r |
| 319 | griddata.horizontalSpan = 4;\r |
| 320 | griddata.verticalIndent = 10;\r |
| 321 | composite22.setLayoutData(griddata);\r |
| 322 | GridLayout compositeLayout22 = new GridLayout(2, false);\r |
| 323 | composite22.setLayout(compositeLayout22);\r |
| 324 | fNormalButton = new Button(composite22, SWT.RADIO);\r |
| 325 | fNormalButton.setText(Messages.ConfigureTraceDialog_Mode_Normal);\r |
| 326 | fFlightRecorderButton = new Button(composite22, SWT.RADIO);\r |
| 327 | fFlightRecorderButton.setText(Messages.ConfigureTraceDialog_Mode_Flight_Recorder);\r |
| 328 | fMode = TraceConfig.NORMAL_MODE;\r |
| 329 | fNormalButton.setSelection(true);\r |
| 330 | fNormalButton.addListener(SWT.Selection, new Listener() {\r |
| 331 | @Override\r |
| 332 | public void handleEvent(Event e) {\r |
| 333 | if (fNormalButton.getSelection()) {\r |
| 334 | fMode = TraceConfig.NORMAL_MODE;\r |
| 335 | }\r |
| 336 | }\r |
| 337 | });\r |
| 338 | fFlightRecorderButton.addListener(SWT.Selection, new Listener() {\r |
| 339 | @Override\r |
| 340 | public void handleEvent(Event e) {\r |
| 341 | if (fFlightRecorderButton.getSelection()) {\r |
| 342 | fMode = TraceConfig.FLIGHT_RECORDER_MODE;\r |
| 343 | }\r |
| 344 | }\r |
| 345 | });\r |
| 346 | if (fTraceResource.isUst()) {\r |
| 347 | fFlightRecorderButton.setEnabled(false);\r |
| 348 | fNormalButton.setEnabled(false);\r |
| 349 | }\r |
| 350 | \r |
| 351 | if(fOldTraceConfig != null) {\r |
| 352 | fPathText.setText(fOldTraceConfig.getTracePath());\r |
| 353 | fTargetButton.setSelection(!fOldTraceConfig.isNetworkTrace());\r |
| 354 | fHostButton.setSelection(fOldTraceConfig.isNetworkTrace());\r |
| 355 | fIsNetwork = fOldTraceConfig.isNetworkTrace();\r |
| 356 | fBrowseButton.setEnabled(true);\r |
| 357 | fNumLttdThreadsText.setText(String.valueOf(fOldTraceConfig.getNumChannel()));\r |
| 358 | fIsAppendButton.setSelection(fOldTraceConfig.getIsAppend());\r |
| 359 | fIsAppend = fOldTraceConfig.getIsAppend();\r |
| 360 | fFlightRecorderButton.setSelection(fOldTraceConfig.getMode() == TraceConfig.FLIGHT_RECORDER_MODE);\r |
| 361 | fNormalButton.setSelection(fOldTraceConfig.getMode() == TraceConfig.NORMAL_MODE);\r |
| 362 | }\r |
| 363 | \r |
| 364 | // Depending on the state disable fields, it's only informational then\r |
| 365 | if ((fTraceResource.getTraceState() == TraceState.STARTED) || (fTraceResource.getTraceState() == TraceState.PAUSED)) {\r |
| 366 | fPathText.setEnabled(false);\r |
| 367 | fBrowseButton.setEnabled(false);\r |
| 368 | fTargetButton.setEnabled(false);\r |
| 369 | fHostButton.setEnabled(false);\r |
| 370 | fIsAppendButton.setEnabled(false);\r |
| 371 | fNumLttdThreadsText.setEnabled(false);\r |
| 372 | fFlightRecorderButton.setEnabled(false);\r |
| 373 | fNormalButton.setEnabled(false);\r |
| 374 | }\r |
| 375 | \r |
| 376 | validate();\r |
| 377 | \r |
| 378 | fDisplay.getActiveShell().addListener(SWT.Traverse, new Listener() {\r |
| 379 | @Override\r |
| 380 | public void handleEvent(Event event) {\r |
| 381 | if (event.detail == SWT.TRAVERSE_ESCAPE) {\r |
| 382 | event.doit = false;\r |
| 383 | }\r |
| 384 | }\r |
| 385 | });\r |
| 386 | }\r |
| 387 | \r |
| 388 | /*\r |
| 389 | * (non-Javadoc)\r |
| 390 | * @see org.eclipse.jface.dialogs.DialogPage#dispose()\r |
| 391 | */\r |
| 392 | @Override\r |
| 393 | public void dispose() {\r |
| 394 | super.dispose();\r |
| 395 | }\r |
| 396 | \r |
| 397 | /* (non-Javadoc)\r |
| 398 | * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)\r |
| 399 | */\r |
| 400 | @Override\r |
| 401 | public void setVisible(boolean visible) {\r |
| 402 | if (visible) {\r |
| 403 | validate();\r |
| 404 | }\r |
| 405 | super.setVisible(visible);\r |
| 406 | }\r |
| 407 | \r |
| 408 | /*\r |
| 409 | * Validates the trace name which has to be unique.\r |
| 410 | */\r |
| 411 | protected boolean validateTraceName(String name) {\r |
| 412 | if (name.length() > 0) {\r |
| 413 | TraceResource[] traces = new TraceResource[0];\r |
| 414 | try {\r |
| 415 | traces = fSubSystem.getAllTraces();\r |
| 416 | } catch (SystemMessageException e) {\r |
| 417 | SystemBasePlugin.logError("TraceConfigurationPage ", e); //$NON-NLS-1$\r |
| 418 | }\r |
| 419 | for (int i = 0; i < traces.length; i++) {\r |
| 420 | if (traces[i].getName().compareTo(name) == 0) {\r |
| 421 | fTraceNameError = Messages.NewTraceDialog_Error_Already_Exists;\r |
| 422 | setErrorMessage(fTraceNameError);\r |
| 423 | return false;\r |
| 424 | }\r |
| 425 | }\r |
| 426 | final char[] chars = name.toCharArray();\r |
| 427 | for (int x = 0; x < chars.length; x++) {\r |
| 428 | final char c = chars[x];\r |
| 429 | if ((x == 0) && !(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')))) {\r |
| 430 | fTraceNameError = Messages.NewTraceDialog_Error_Invalid_First_Char;\r |
| 431 | setErrorMessage(fTraceNameError);\r |
| 432 | return false;\r |
| 433 | } else if (x != 0) {\r |
| 434 | if (!((c >= 'a') && (c <= 'z')) && !((c >= 'A') && (c <= 'Z')) && !((c >= '0') && (c <= '9'))) {\r |
| 435 | fTraceNameError = Messages.NewTraceDialog_Error_Invalid_Name;\r |
| 436 | setErrorMessage(fTraceNameError);\r |
| 437 | return false;\r |
| 438 | }\r |
| 439 | }\r |
| 440 | }\r |
| 441 | }\r |
| 442 | if (fTracePathError.length() > 0) {\r |
| 443 | setErrorMessage(fTracePathError);\r |
| 444 | } else {\r |
| 445 | setErrorMessage(null);\r |
| 446 | }\r |
| 447 | fTraceNameError = ""; //$NON-NLS-1$\r |
| 448 | return true;\r |
| 449 | }\r |
| 450 | \r |
| 451 | /*\r |
| 452 | * Validates the trace path.\r |
| 453 | */\r |
| 454 | private boolean validatePathName(String path) {\r |
| 455 | if (path.length() > 0) {\r |
| 456 | final char c0 = path.charAt(0);\r |
| 457 | if (c0 != '/') {\r |
| 458 | fTracePathError = Messages.ConfigureTraceDialog_Error_Invalid_Path;\r |
| 459 | setErrorMessage(fTracePathError);\r |
| 460 | return false;\r |
| 461 | } else {\r |
| 462 | String[] folders = path.split("/"); //$NON-NLS-1$\r |
| 463 | for (int i = 0; i < folders.length; i++) {\r |
| 464 | final char[] chars = folders[i].toCharArray();\r |
| 465 | for (int x = 0; x < chars.length; x++) {\r |
| 466 | final char c = chars[x];\r |
| 467 | if ((c >= 'a') && (c <= 'z')) {\r |
| 468 | continue; // lowercase\r |
| 469 | }\r |
| 470 | if ((c >= 'A') && (c <= 'Z')) {\r |
| 471 | continue; // uppercase\r |
| 472 | }\r |
| 473 | if ((c >= '0') && (c <= '9')) {\r |
| 474 | continue; // numeric\r |
| 475 | }\r |
| 476 | fTracePathError = Messages.ConfigureTraceDialog_Error_Invalid_Folder;\r |
| 477 | setErrorMessage(fTracePathError);\r |
| 478 | return false;\r |
| 479 | }\r |
| 480 | }\r |
| 481 | if (path.length() > 1) {\r |
| 482 | for (int i = 0; i < path.length() - 1; i++) {\r |
| 483 | if ((path.charAt(i) == '/') && (path.charAt(i + 1) == '/')) {\r |
| 484 | fTracePathError = Messages.ConfigureTraceDialog_Error_Multiple_Seps;\r |
| 485 | setErrorMessage(fTracePathError);\r |
| 486 | return false;\r |
| 487 | }\r |
| 488 | }\r |
| 489 | }\r |
| 490 | }\r |
| 491 | if (fHostButton.getSelection()) {\r |
| 492 | File file = new File(path);\r |
| 493 | if (file.isFile()) {\r |
| 494 | fTracePathError = Messages.ConfigureTraceDialog_Error_File_Exists;\r |
| 495 | setErrorMessage(fTracePathError);\r |
| 496 | return false;\r |
| 497 | }\r |
| 498 | if (path.length() > 1 && !file.getParentFile().canWrite()) {\r |
| 499 | fTracePathError = Messages.ConfigureTraceDialog_Error_Can_Not_Write;\r |
| 500 | setErrorMessage(fTracePathError);\r |
| 501 | return false;\r |
| 502 | }\r |
| 503 | }\r |
| 504 | }\r |
| 505 | if (fTraceNameError.length() > 0) {\r |
| 506 | setErrorMessage(fTraceNameError);\r |
| 507 | } else {\r |
| 508 | setErrorMessage(null);\r |
| 509 | }\r |
| 510 | fTracePathError = ""; //$NON-NLS-1$\r |
| 511 | return true;\r |
| 512 | }\r |
| 513 | \r |
| 514 | /*\r |
| 515 | * Validates all input values.\r |
| 516 | */\r |
| 517 | private void validate() {\r |
| 518 | if ((fNameText.getText() == null) || (fTransportText.getText() == null) || (fTransportText.getText().length() == 0) || (fNameText.getText().length() == 0)\r |
| 519 | || (fNumLttdThreadsText.getText().length() == 0) || (fNumLttdThreadsText.getText().length() == 0)) {\r |
| 520 | setPageComplete(false);\r |
| 521 | return;\r |
| 522 | }\r |
| 523 | if (fPathText.getText().length() == 0) {\r |
| 524 | setPageComplete(false);\r |
| 525 | return;\r |
| 526 | }\r |
| 527 | if ((fTracePathError.length() > 0) || (fTraceNameError.length() > 0)) {\r |
| 528 | setPageComplete(false);\r |
| 529 | return;\r |
| 530 | }\r |
| 531 | fTraceName = fNameText.getText();\r |
| 532 | fTraceTransport = fTransportText.getText();\r |
| 533 | fTracePath = fPathText.getText();\r |
| 534 | fNumChannel = Integer.parseInt(fNumLttdThreadsText.getText());\r |
| 535 | \r |
| 536 | if (fTraceNameError.length() == 0) {\r |
| 537 | setErrorMessage(null);\r |
| 538 | setPageComplete(true);\r |
| 539 | } else {\r |
| 540 | setErrorMessage(fTraceNameError);\r |
| 541 | setPageComplete(false);\r |
| 542 | }\r |
| 543 | }\r |
| 544 | \r |
| 545 | /**\r |
| 546 | * Gets the trace configuration. \r |
| 547 | * \r |
| 548 | * @return trace configuration\r |
| 549 | */\r |
| 550 | public TraceConfig getTraceConfig() {\r |
| 551 | TraceConfig newTraceConfig = new TraceConfig();\r |
| 552 | newTraceConfig.setTraceName(fTraceName);\r |
| 553 | newTraceConfig.setTraceTransport(fTraceTransport);\r |
| 554 | newTraceConfig.setTracePath(fTracePath);\r |
| 555 | newTraceConfig.setNetworkTrace(fIsNetwork);\r |
| 556 | newTraceConfig.setIsAppend(fIsAppend);\r |
| 557 | newTraceConfig.setMode(fMode);\r |
| 558 | newTraceConfig.setNumChannel(fNumChannel);\r |
| 559 | \r |
| 560 | return newTraceConfig;\r |
| 561 | }\r |
| 562 | \r |
| 563 | /**\r |
| 564 | * Gets if trace is a local trace (i.e. if trace output is stored on host \r |
| 565 | * where client is running)\r |
| 566 | * \r |
| 567 | * @return isLocalTrace\r |
| 568 | */\r |
| 569 | public boolean isLocalTrace() {\r |
| 570 | return fHostButton.getSelection();\r |
| 571 | }\r |
| 572 | }\r |