tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerMain.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 41 tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompilerMain.java@838cdffd57ce
child 62 1c2bb2fc7c87
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 * TraceCompiler command-line main class
hgs
parents:
diff changeset
    17
 *
hgs
parents:
diff changeset
    18
 */
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.io.BufferedReader;
hgs
parents:
diff changeset
    22
import java.io.File;
hgs
parents:
diff changeset
    23
import java.io.IOException;
hgs
parents:
diff changeset
    24
import java.io.InputStreamReader;
hgs
parents:
diff changeset
    25
import java.net.URL;
hgs
parents:
diff changeset
    26
import java.util.ArrayList;
hgs
parents:
diff changeset
    27
import java.util.Arrays;
hgs
parents:
diff changeset
    28
import java.util.Iterator;
hgs
parents:
diff changeset
    29
import java.util.regex.Matcher;
hgs
parents:
diff changeset
    30
import java.util.regex.Pattern;
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.document.FileDocumentMonitor;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.document.StringDocumentFactory;
hgs
parents:
diff changeset
    34
import com.nokia.tracecompiler.engine.TraceCompilerEngineEvents;
hgs
parents:
diff changeset
    35
import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
hgs
parents:
diff changeset
    36
import com.nokia.tracecompiler.engine.TraceCompilerEngineInterface;
hgs
parents:
diff changeset
    37
import com.nokia.tracecompiler.engine.TraceLocationList;
hgs
parents:
diff changeset
    38
import com.nokia.tracecompiler.engine.project.ProjectEngine;
hgs
parents:
diff changeset
    39
import com.nokia.tracecompiler.file.FileUtils;
hgs
parents:
diff changeset
    40
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    41
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    42
import com.nokia.tracecompiler.plugin.TraceCompilerPlugin;
hgs
parents:
diff changeset
    43
import com.nokia.tracecompiler.project.GroupNames;
hgs
parents:
diff changeset
    44
import com.nokia.tracecompiler.source.SourceConstants;
hgs
parents:
diff changeset
    45
import com.nokia.tracecompiler.utils.DocumentFactory;
hgs
parents:
diff changeset
    46
import com.nokia.tracecompiler.utils.TraceCompilerVersion;
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
/**
hgs
parents:
diff changeset
    49
 * TraceCompiler command-line main class
hgs
parents:
diff changeset
    50
 * 
hgs
parents:
diff changeset
    51
 */
hgs
parents:
diff changeset
    52
public class TraceCompilerMain {
hgs
parents:
diff changeset
    53
	
hgs
parents:
diff changeset
    54
	/** line separator */
hgs
parents:
diff changeset
    55
	private static String LINE_SEPARATOR =  System.getProperty("line.separator"); //$NON-NLS-1$
hgs
parents:
diff changeset
    56
	
hgs
parents:
diff changeset
    57
	/**
hgs
parents:
diff changeset
    58
	 * Index of third character
hgs
parents:
diff changeset
    59
	 */
hgs
parents:
diff changeset
    60
	private static final int INDEX_OF_THIRD_CHARACTER = 2;
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
	/**
hgs
parents:
diff changeset
    63
	 * Index of first character
hgs
parents:
diff changeset
    64
	 */
hgs
parents:
diff changeset
    65
	private static final int INDEX_OF_FIRST_CHARACTER = 0;
hgs
parents:
diff changeset
    66
	
hgs
parents:
diff changeset
    67
	/**
hgs
parents:
diff changeset
    68
	 * TraceCompiler options
hgs
parents:
diff changeset
    69
	 */
hgs
parents:
diff changeset
    70
	
hgs
parents:
diff changeset
    71
	/**
hgs
parents:
diff changeset
    72
	 * UID : it is used to create the dictionary file
hgs
parents:
diff changeset
    73
	 */
hgs
parents:
diff changeset
    74
	private static final String UID_SWITCH = Messages.getString("TraceCompiler.UidStwich"); //$NON-NLS-1$
hgs
parents:
diff changeset
    75
	private static final String UID_SWITCH_TEXT = Messages.getString("TraceCompiler.UidText"); //$NON-NLS-1$
hgs
parents:
diff changeset
    76
	/**
hgs
parents:
diff changeset
    77
	 * project name : it is used to create the dictionary file
hgs
parents:
diff changeset
    78
	 */
hgs
parents:
diff changeset
    79
	private static final String PRJ_NAME_SWITCH = Messages.getString("TraceCompiler.ProjectSwitch");//$NON-NLS-1$
hgs
parents:
diff changeset
    80
	private static final String PRJ_NAME_SWITCH_TEXT = Messages.getString("TraceCompiler.ProjectText"); //$NON-NLS-1$
hgs
parents:
diff changeset
    81
	/**
hgs
parents:
diff changeset
    82
	 * mmp file path:  may be used to compute the traces folder
hgs
parents:
diff changeset
    83
	 */
hgs
parents:
diff changeset
    84
	private static final String MMP_PATH_SWITCH = Messages.getString("TraceCompiler.MmpSwitch");//$NON-NLS-1$
hgs
parents:
diff changeset
    85
	private static final String MMP_PATH_SWITCH_TEXT = Messages.getString("TraceCompiler.MmpText"); //$NON-NLS-1$
hgs
parents:
diff changeset
    86
	/**
hgs
parents:
diff changeset
    87
	 * traces folder: absolute or relative to the mmp folder
hgs
parents:
diff changeset
    88
	 */
hgs
parents:
diff changeset
    89
	private static final String TRACES_PATH_SWITCH = Messages.getString("TraceCompiler.TracesSwitch");//$NON-NLS-1$
hgs
parents:
diff changeset
    90
	private static final String TRACES_PATH_SWITCH_TEXT = Messages.getString("TraceCompiler.TracesText"); //$NON-NLS-1$
hgs
parents:
diff changeset
    91
	
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
	/**
hgs
parents:
diff changeset
    94
	 * Version option
hgs
parents:
diff changeset
    95
	 */
hgs
parents:
diff changeset
    96
	private static final String VERSION_OPTION = Messages.getString("TraceCompiler.VersionSwitchLong"); //$NON-NLS-1$
hgs
parents:
diff changeset
    97
	private static final String VERSION_OPTION_SF = Messages.getString("TraceCompiler.VersionSwitchShort"); //$NON-NLS-1$
hgs
parents:
diff changeset
    98
	private static final String VERSION_OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.VersionText"); //$NON-NLS-1$
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
	
hgs
parents:
diff changeset
   101
	/**
hgs
parents:
diff changeset
   102
	 * help option
hgs
parents:
diff changeset
   103
	 */
hgs
parents:
diff changeset
   104
	private static final String HELP_OPTION = Messages.getString("TraceCompiler.HelpSwicthLong"); //$NON-NLS-1$
hgs
parents:
diff changeset
   105
	private static final String HELP_OPTION_SF = Messages.getString("TraceCompiler.HelpSwitchShort"); //$NON-NLS-1$
hgs
parents:
diff changeset
   106
	private static final String HELP_OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.HelpText"); //$NON-NLS-1$
hgs
parents:
diff changeset
   107
	
hgs
parents:
diff changeset
   108
	/**
hgs
parents:
diff changeset
   109
	 * Verbose option
hgs
parents:
diff changeset
   110
	 */
hgs
parents:
diff changeset
   111
	private static final String VERBOSE_OPTION = Messages.getString("TraceCompiler.VerboseSwitchLong"); //$NON-NLS-1$
hgs
parents:
diff changeset
   112
	private static final String VERBOSE_OPTION_SF = Messages.getString("TraceCompiler.VerboseSwitchShort"); //$NON-NLS-1$
hgs
parents:
diff changeset
   113
	private static final String VERBOSE_OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.VerboseText"); //$NON-NLS-1$
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
	/**
hgs
parents:
diff changeset
   116
	 * keep going option
hgs
parents:
diff changeset
   117
	 */
hgs
parents:
diff changeset
   118
	private static final String STOP_ON_ERROR_OPTION = Messages.getString("TraceCompiler.StopSwitchLong"); //$NON-NLS-1$
hgs
parents:
diff changeset
   119
	private static final String STOP_ON_ERROR_OPTION_SF = Messages.getString("TraceCompiler.StopSwitchShort"); //$NON-NLS-1$
hgs
parents:
diff changeset
   120
	private static final String STOP_ON_ERROR_OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.StopText"); //$NON-NLS-1$
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
	
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
	/**
hgs
parents:
diff changeset
   125
	 * Version text
hgs
parents:
diff changeset
   126
	 */
hgs
parents:
diff changeset
   127
	private static final String VERSION_TEXT = Messages.getString("TraceCompiler.DisplayVersionText"); //$NON-NLS-1$
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
	/**
hgs
parents:
diff changeset
   130
	 * Option instruction text
hgs
parents:
diff changeset
   131
	 */
hgs
parents:
diff changeset
   132
	private static final String OPTION_INSTRUCTION_TEXT = Messages.getString("TraceCompiler.Options"); //$NON-NLS-1$
hgs
parents:
diff changeset
   133
	private static final String VALUE=Messages.getString("TraceCompiler.Value"); //$NON-NLS-1$
hgs
parents:
diff changeset
   134
	
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
	
hgs
parents:
diff changeset
   137
	private static final String USAGE = Messages.getString("TraceCompiler.Usage") + LINE_SEPARATOR + //$NON-NLS-1$
hgs
parents:
diff changeset
   138
	Messages.getString("TraceCompiler.UsageText") + LINE_SEPARATOR + //$NON-NLS-1$
hgs
parents:
diff changeset
   139
										"\t" + OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR + //$NON-NLS-1$
hgs
parents:
diff changeset
   140
										"\t" + HELP_OPTION_SF  + ", " + HELP_OPTION + ", " + HELP_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
hgs
parents:
diff changeset
   141
										"\t" + VERSION_OPTION_SF + ", " + VERSION_OPTION + "\t" +  VERSION_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
hgs
parents:
diff changeset
   142
										"\t" + VERBOSE_OPTION_SF + ", " + VERBOSE_OPTION + "\t\t" + VERBOSE_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
hgs
parents:
diff changeset
   143
										"\t" + STOP_ON_ERROR_OPTION_SF + ", " + STOP_ON_ERROR_OPTION + "\t" + STOP_ON_ERROR_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
hgs
parents:
diff changeset
   144
										"\t" + UID_SWITCH + "=" + VALUE + "\t" + UID_SWITCH_TEXT +  LINE_SEPARATOR + //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
hgs
parents:
diff changeset
   145
										"\t" + PRJ_NAME_SWITCH + "=" + VALUE + "\t" + PRJ_NAME_SWITCH_TEXT +  LINE_SEPARATOR + //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
hgs
parents:
diff changeset
   146
										"\t" + MMP_PATH_SWITCH + "=" + VALUE + "\t" + MMP_PATH_SWITCH_TEXT +  LINE_SEPARATOR + //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
hgs
parents:
diff changeset
   147
										"\t" + TRACES_PATH_SWITCH + "=" + VALUE + "\t" + TRACES_PATH_SWITCH_TEXT; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
	/**
hgs
parents:
diff changeset
   152
	 * End of source files tag
hgs
parents:
diff changeset
   153
	 */
hgs
parents:
diff changeset
   154
	private static final String ENDOFSOURCEFILES = Messages.getString("TraceCompiler.EndOfList"); //$NON-NLS-1$
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
	/**
hgs
parents:
diff changeset
   157
	 * MMP file extension
hgs
parents:
diff changeset
   158
	 */
hgs
parents:
diff changeset
   159
	private static final String MMP_FILE_TYPE = Messages.getString("TraceCompiler.MmpExtension"); //$NON-NLS-1$
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
	/**
hgs
parents:
diff changeset
   162
	 * Decode plugins path
hgs
parents:
diff changeset
   163
	 */
hgs
parents:
diff changeset
   164
	private String DECODE_PLUGINS_PATH = Messages.getString("TraceCompiler.PluginPath"); //$NON-NLS-1$
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
	/**
hgs
parents:
diff changeset
   167
	 * Decode plugin name tag
hgs
parents:
diff changeset
   168
	 */
hgs
parents:
diff changeset
   169
	private String DECODE_PLUGIN_NAME_TAG = Messages.getString("TraceCompiler.DecodeText1"); //$NON-NLS-1$
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
	/**
hgs
parents:
diff changeset
   172
	 * Decode plugin class name tag
hgs
parents:
diff changeset
   173
	 */
hgs
parents:
diff changeset
   174
	private String DECODE_PLUGIN_CLASS_NAME_TAG = Messages.getString("TraceCompiler.DecodeText2"); //$NON-NLS-1$
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
	/**
hgs
parents:
diff changeset
   177
	 * Decode plugin engine class name template
hgs
parents:
diff changeset
   178
	 */
hgs
parents:
diff changeset
   179
	private String ENGINE_CLASS_NAME_TEMPLATE = DECODE_PLUGIN_NAME_TAG
hgs
parents:
diff changeset
   180
			+ "Engine"; //$NON-NLS-1$
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
	/**
hgs
parents:
diff changeset
   183
	 * Decode plugin engine file name template
hgs
parents:
diff changeset
   184
	 */
hgs
parents:
diff changeset
   185
	private String ENGINE_FILE_NAME_TEMPLATE = DECODE_PLUGIN_CLASS_NAME_TAG
hgs
parents:
diff changeset
   186
			+ ".class"; //$NON-NLS-1$
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
	/**
hgs
parents:
diff changeset
   189
	 * Decode plugins class template
hgs
parents:
diff changeset
   190
	 */
hgs
parents:
diff changeset
   191
	private String CLASS_TEMPLATE = Messages.getString("TraceCompiler.DecodePluginsNameSpace") + DECODE_PLUGIN_NAME_TAG + "." + DECODE_PLUGIN_CLASS_NAME_TAG; //$NON-NLS-1$ //$NON-NLS-2$	
hgs
parents:
diff changeset
   192
	
hgs
parents:
diff changeset
   193
	//switch with value such as --uid=value
hgs
parents:
diff changeset
   194
	private Pattern valueSwitchPattern = Pattern.compile("(--\\S+)=(\\S+)"); //$NON-NLS-1$
hgs
parents:
diff changeset
   195
	//switches with no values such -v, --version
hgs
parents:
diff changeset
   196
	private Pattern singleSwitchPattern = Pattern.compile("-{1,2}([^=]+)"); //$NON-NLS-1$
hgs
parents:
diff changeset
   197
	
hgs
parents:
diff changeset
   198
	/**
hgs
parents:
diff changeset
   199
	 * list of source files
hgs
parents:
diff changeset
   200
	 */
hgs
parents:
diff changeset
   201
	private ArrayList<String> sources = new ArrayList<String>();
hgs
parents:
diff changeset
   202
	/**
hgs
parents:
diff changeset
   203
	 * traces path
hgs
parents:
diff changeset
   204
	 */
hgs
parents:
diff changeset
   205
	private String traces_path = null;
hgs
parents:
diff changeset
   206
	
hgs
parents:
diff changeset
   207
	
hgs
parents:
diff changeset
   208
	
hgs
parents:
diff changeset
   209
	
hgs
parents:
diff changeset
   210
	/**
hgs
parents:
diff changeset
   211
	 * Main function
hgs
parents:
diff changeset
   212
	 * 
hgs
parents:
diff changeset
   213
	 * @param args
hgs
parents:
diff changeset
   214
	 *            the command line arguments
hgs
parents:
diff changeset
   215
	 */
hgs
parents:
diff changeset
   216
	public static void main(String[] args) {
hgs
parents:
diff changeset
   217
		if (args.length == 0) {
hgs
parents:
diff changeset
   218
			printUsage();
hgs
parents:
diff changeset
   219
			return;
hgs
parents:
diff changeset
   220
		}
hgs
parents:
diff changeset
   221
		
hgs
parents:
diff changeset
   222
		ArrayList<String> list = null;
hgs
parents:
diff changeset
   223
		
hgs
parents:
diff changeset
   224
		//support spaces in switches, build a long string, clean it and convert it back to array - a bit expensive
hgs
parents:
diff changeset
   225
		String tmpString = "";  //$NON-NLS-1$
hgs
parents:
diff changeset
   226
		for (int i = 0; i < args.length; i++) {
hgs
parents:
diff changeset
   227
			tmpString = tmpString + " " + args[i];  //$NON-NLS-1$
hgs
parents:
diff changeset
   228
		}
hgs
parents:
diff changeset
   229
		tmpString = tmpString.replaceAll("\\s*=\\s*", "="); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   230
		tmpString = tmpString.replaceAll("\\s+", " "); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   231
		String[] split = tmpString.trim().split(" "); //$NON-NLS-1$
hgs
parents:
diff changeset
   232
		tmpString = null; // not needed anymore
hgs
parents:
diff changeset
   233
		
hgs
parents:
diff changeset
   234
		//rebuild array of arguments
hgs
parents:
diff changeset
   235
		if (split.length > 0) {
hgs
parents:
diff changeset
   236
			list = new ArrayList<String>(Arrays.asList(split));
hgs
parents:
diff changeset
   237
		}
hgs
parents:
diff changeset
   238
				
hgs
parents:
diff changeset
   239
		long startTime = System.currentTimeMillis();
hgs
parents:
diff changeset
   240
		//create a new session of TraceCompiler
hgs
parents:
diff changeset
   241
		TraceCompilerMain console = new TraceCompilerMain();
hgs
parents:
diff changeset
   242
		
hgs
parents:
diff changeset
   243
		try {
hgs
parents:
diff changeset
   244
			console.parseCommandLine(list);
hgs
parents:
diff changeset
   245
		} catch (Exception e) { //should cover IOException and TraceCompilerIllegalArgumentsException
hgs
parents:
diff changeset
   246
			//There is no point to continue if there are problems with the arguments.
hgs
parents:
diff changeset
   247
			TraceCompilerLogger.printError(e.getMessage());
hgs
parents:
diff changeset
   248
			printUsage();
hgs
parents:
diff changeset
   249
			System.exit(1);
hgs
parents:
diff changeset
   250
		}
hgs
parents:
diff changeset
   251
		
hgs
parents:
diff changeset
   252
		boolean error = false;
hgs
parents:
diff changeset
   253
		try {
hgs
parents:
diff changeset
   254
			if(list.size() != 0) {
hgs
parents:
diff changeset
   255
				console.createPlugins();
hgs
parents:
diff changeset
   256
				console.start();
hgs
parents:
diff changeset
   257
				console.buildTraceFiles();				
hgs
parents:
diff changeset
   258
			}
hgs
parents:
diff changeset
   259
		} catch (Exception e) {
hgs
parents:
diff changeset
   260
			if (e instanceof TraceCompilerRootException) {
hgs
parents:
diff changeset
   261
				TraceCompilerLogger.printError(e.getMessage()); 
hgs
parents:
diff changeset
   262
			} //else the error should have been reported earlier
hgs
parents:
diff changeset
   263
			error = true;
hgs
parents:
diff changeset
   264
		} finally {
hgs
parents:
diff changeset
   265
			try {
hgs
parents:
diff changeset
   266
				if (!error) { //check if errors have been logged by EventEngine
hgs
parents:
diff changeset
   267
					TraceCompilerEngineEvents events = TraceCompilerEngineGlobals.getEvents();
hgs
parents:
diff changeset
   268
					if (events != null && events.hasErrorHappened()) {
hgs
parents:
diff changeset
   269
						error = true;
hgs
parents:
diff changeset
   270
					}
hgs
parents:
diff changeset
   271
				}
hgs
parents:
diff changeset
   272
				console.shutdown();
hgs
parents:
diff changeset
   273
			} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   274
				error = true;
hgs
parents:
diff changeset
   275
			}
hgs
parents:
diff changeset
   276
		}
hgs
parents:
diff changeset
   277
hgs
parents:
diff changeset
   278
		if (console.projectName != null) {
hgs
parents:
diff changeset
   279
			TraceCompilerLogger.printMessage(console.projectName + Messages.getString("TraceCompiler.Took") //$NON-NLS-1$
hgs
parents:
diff changeset
   280
					+ (System.currentTimeMillis() - startTime) + Messages.getString("TraceCompiler.MS")); //$NON-NLS-1$
hgs
parents:
diff changeset
   281
		}
hgs
parents:
diff changeset
   282
		if (error) {
hgs
parents:
diff changeset
   283
			System.exit(1);
hgs
parents:
diff changeset
   284
		} else {
hgs
parents:
diff changeset
   285
			System.exit(0);
hgs
parents:
diff changeset
   286
		}	
hgs
parents:
diff changeset
   287
	}
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
	/**
hgs
parents:
diff changeset
   290
	 * With Eclipse, the plug-ins are loaded by Eclipse framework. Here they
hgs
parents:
diff changeset
   291
	 * must be manually created and started
hgs
parents:
diff changeset
   292
	 */
hgs
parents:
diff changeset
   293
	private ArrayList<TraceCompilerPlugin> plugIns = new ArrayList<TraceCompilerPlugin>();
hgs
parents:
diff changeset
   294
hgs
parents:
diff changeset
   295
	/**
hgs
parents:
diff changeset
   296
	 * Model listener
hgs
parents:
diff changeset
   297
	 */
hgs
parents:
diff changeset
   298
	private TraceCompilerModelListener modelListener;
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
	/**
hgs
parents:
diff changeset
   301
	 * Name of the component
hgs
parents:
diff changeset
   302
	 */
hgs
parents:
diff changeset
   303
	private String projectName = null;
hgs
parents:
diff changeset
   304
	
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
	/**
hgs
parents:
diff changeset
   307
	 * UID of the component
hgs
parents:
diff changeset
   308
	 */
hgs
parents:
diff changeset
   309
	private long componentUID = 0L;
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
	/**
hgs
parents:
diff changeset
   312
	 * Component path
hgs
parents:
diff changeset
   313
	 */
hgs
parents:
diff changeset
   314
	private String componentPath = null;
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
	/**
hgs
parents:
diff changeset
   317
	 * MMP file path
hgs
parents:
diff changeset
   318
	 */
hgs
parents:
diff changeset
   319
	private File mmpPath = null;
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
	/**
hgs
parents:
diff changeset
   322
	 * Constructor
hgs
parents:
diff changeset
   323
	 */
hgs
parents:
diff changeset
   324
	TraceCompilerMain() {
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
		// Creates listeners and preferences
hgs
parents:
diff changeset
   327
		modelListener = new TraceCompilerModelListener();
hgs
parents:
diff changeset
   328
	}
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
	/**
hgs
parents:
diff changeset
   331
	 * Creates the plug-ins to be registered with TraceCompiler
hgs
parents:
diff changeset
   332
	 * @throws TraceCompilerRootException if fail to create a valid plugins
hgs
parents:
diff changeset
   333
	 */
hgs
parents:
diff changeset
   334
	private void createPlugins() throws TraceCompilerRootException {
hgs
parents:
diff changeset
   335
		
hgs
parents:
diff changeset
   336
		// Get location of the TraceCompiler
hgs
parents:
diff changeset
   337
		URL path = getClass().getProtectionDomain().getCodeSource()
hgs
parents:
diff changeset
   338
				.getLocation();
hgs
parents:
diff changeset
   339
		String decodePluginsPath = path.getPath();
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
		// If first character is forward slash and it is located before drive
hgs
parents:
diff changeset
   342
		// letter remove it
hgs
parents:
diff changeset
   343
		if (decodePluginsPath.charAt(INDEX_OF_FIRST_CHARACTER) == SourceConstants.FORWARD_SLASH_CHAR
hgs
parents:
diff changeset
   344
				&& decodePluginsPath.charAt(INDEX_OF_THIRD_CHARACTER) == SourceConstants.COLON_CHAR) {
hgs
parents:
diff changeset
   345
			decodePluginsPath = decodePluginsPath.substring(1);
hgs
parents:
diff changeset
   346
		}
hgs
parents:
diff changeset
   347
		
hgs
parents:
diff changeset
   348
		// Concatenate decode plugins path
hgs
parents:
diff changeset
   349
		decodePluginsPath = decodePluginsPath.concat(DECODE_PLUGINS_PATH);
hgs
parents:
diff changeset
   350
		
hgs
parents:
diff changeset
   351
		// Replace slashes with correct separator character
hgs
parents:
diff changeset
   352
		decodePluginsPath = decodePluginsPath.replace(
hgs
parents:
diff changeset
   353
				SourceConstants.FORWARD_SLASH_CHAR, File.separatorChar);
hgs
parents:
diff changeset
   354
		decodePluginsPath = decodePluginsPath.replace(
hgs
parents:
diff changeset
   355
				SourceConstants.BACKSLASH_CHAR, File.separatorChar);
hgs
parents:
diff changeset
   356
		File decodePluginsDir = new File(decodePluginsPath);
hgs
parents:
diff changeset
   357
		String[] decodePlugins = decodePluginsDir.list();
hgs
parents:
diff changeset
   358
		if (decodePlugins != null) {
hgs
parents:
diff changeset
   359
			for (int i = 0; i < decodePlugins.length; i++) {
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
				// Get decode plugin name
hgs
parents:
diff changeset
   362
				String decodePluginName = decodePlugins[i];
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
				// Get decode plugin path
hgs
parents:
diff changeset
   365
				String decodePluginPath = decodePluginsPath
hgs
parents:
diff changeset
   366
						+ File.separatorChar + decodePluginName;
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
				// Decode plugin must be in own directory
hgs
parents:
diff changeset
   369
				Boolean isDirectory = (new File(decodePluginPath))
hgs
parents:
diff changeset
   370
						.isDirectory();
hgs
parents:
diff changeset
   371
				if (isDirectory) {
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
					// Construct decode plugin engine class name
hgs
parents:
diff changeset
   374
					String engineClassName = ENGINE_CLASS_NAME_TEMPLATE
hgs
parents:
diff changeset
   375
							.replaceFirst(DECODE_PLUGIN_NAME_TAG,
hgs
parents:
diff changeset
   376
									decodePluginName.substring(0, 1)
hgs
parents:
diff changeset
   377
											.toUpperCase()
hgs
parents:
diff changeset
   378
											+ decodePluginName.substring(1));
hgs
parents:
diff changeset
   379
hgs
parents:
diff changeset
   380
					// Construct decode plugin engine file name
hgs
parents:
diff changeset
   381
					String engineFileName = ENGINE_FILE_NAME_TEMPLATE
hgs
parents:
diff changeset
   382
							.replaceFirst(DECODE_PLUGIN_CLASS_NAME_TAG,
hgs
parents:
diff changeset
   383
									engineClassName);
hgs
parents:
diff changeset
   384
					String engineFileFullName = decodePluginPath
hgs
parents:
diff changeset
   385
							+ File.separatorChar + engineFileName;
hgs
parents:
diff changeset
   386
hgs
parents:
diff changeset
   387
					// Check does engine file exist
hgs
parents:
diff changeset
   388
					Boolean exists = (new File(engineFileFullName)).exists();
hgs
parents:
diff changeset
   389
					if (exists) {
hgs
parents:
diff changeset
   390
						String engineClassFullName = CLASS_TEMPLATE
hgs
parents:
diff changeset
   391
								.replaceFirst(DECODE_PLUGIN_NAME_TAG,
hgs
parents:
diff changeset
   392
										decodePluginName).replaceFirst(
hgs
parents:
diff changeset
   393
										DECODE_PLUGIN_CLASS_NAME_TAG,
hgs
parents:
diff changeset
   394
										engineClassName);
hgs
parents:
diff changeset
   395
						try {
hgs
parents:
diff changeset
   396
							Class<?> engineClass = Class
hgs
parents:
diff changeset
   397
									.forName(engineClassFullName);
hgs
parents:
diff changeset
   398
							TraceCompilerPlugin engine = (TraceCompilerPlugin) engineClass
hgs
parents:
diff changeset
   399
									.newInstance();
hgs
parents:
diff changeset
   400
							plugIns.add(engine);
hgs
parents:
diff changeset
   401
							TraceCompilerLogger.printInfo(Messages.getString(Messages.getString("TraceCompiler.DecodePlugin") + engineClassFullName + Messages.getString("TraceCompiler.Added"))); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   402
						} catch (Exception e) {
hgs
parents:
diff changeset
   403
							String msg = Messages.getString("TraceCompiler.DecodePlugin" + engineClassFullName + Messages.getString("TraceCompiler.AddingFailed")); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   404
							throw new TraceCompilerRootException(msg, e); 
hgs
parents:
diff changeset
   405
						}
hgs
parents:
diff changeset
   406
					} else {
hgs
parents:
diff changeset
   407
						String msg = Messages.getString("TraceCompiler.DecodePluginFile") + Messages.getString("TraceCompiler.EngineFullName") + engineFileFullName + Messages.getString("TraceCompiler.DoesNotExist"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
hgs
parents:
diff changeset
   408
						throw new TraceCompilerRootException(msg, null);
hgs
parents:
diff changeset
   409
					}
hgs
parents:
diff changeset
   410
				}
hgs
parents:
diff changeset
   411
			}
hgs
parents:
diff changeset
   412
		}
hgs
parents:
diff changeset
   413
	}
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
	/**
hgs
parents:
diff changeset
   416
	 * Parses the command line
hgs
parents:
diff changeset
   417
	 * 
hgs
parents:
diff changeset
   418
	 * @param args
hgs
parents:
diff changeset
   419
	 *            the arguments
hgs
parents:
diff changeset
   420
	 * @throws TraceCompilerRootException if arguments are invalid
hgs
parents:
diff changeset
   421
	 * @throws IOException 
hgs
parents:
diff changeset
   422
	 */
hgs
parents:
diff changeset
   423
	private void parseCommandLine(ArrayList<String> list) throws TraceCompilerIllegalArgumentsException, IOException {
hgs
parents:
diff changeset
   424
		TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.BuildingTracesMess")); //$NON-NLS-1$
hgs
parents:
diff changeset
   425
		Iterator<String> argIterator = list.iterator();
hgs
parents:
diff changeset
   426
		
hgs
parents:
diff changeset
   427
		if (list.size() == 0) {
hgs
parents:
diff changeset
   428
			printUsage();
hgs
parents:
diff changeset
   429
			System.exit(0);
hgs
parents:
diff changeset
   430
		}
hgs
parents:
diff changeset
   431
		while (argIterator.hasNext()) {
hgs
parents:
diff changeset
   432
			String element = argIterator.next().trim();
hgs
parents:
diff changeset
   433
			Matcher m = singleSwitchPattern.matcher(element);
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
			if (m.matches()) { //it's one of the single switches 
hgs
parents:
diff changeset
   436
				if (element.equalsIgnoreCase(HELP_OPTION) || element.equalsIgnoreCase(HELP_OPTION_SF)) {
hgs
parents:
diff changeset
   437
					printUsage();
hgs
parents:
diff changeset
   438
					System.exit(0);
hgs
parents:
diff changeset
   439
				}
hgs
parents:
diff changeset
   440
				if (element.equalsIgnoreCase(VERBOSE_OPTION) || element.equalsIgnoreCase(VERBOSE_OPTION_SF)) {
hgs
parents:
diff changeset
   441
					TraceCompilerGlobals.setVerbose(true);
hgs
parents:
diff changeset
   442
					TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.veboseEnabled")); //$NON-NLS-1$
hgs
parents:
diff changeset
   443
					continue;
hgs
parents:
diff changeset
   444
				}
hgs
parents:
diff changeset
   445
				if ( element.equalsIgnoreCase(VERSION_OPTION) || element.equalsIgnoreCase(VERSION_OPTION_SF)) {
hgs
parents:
diff changeset
   446
					TraceCompilerLogger.printMessage(VERSION_TEXT + TraceCompilerVersion.getVersion());
hgs
parents:
diff changeset
   447
					System.exit(0);
hgs
parents:
diff changeset
   448
				}
hgs
parents:
diff changeset
   449
				if (element.equalsIgnoreCase(STOP_ON_ERROR_OPTION) || element.equalsIgnoreCase(STOP_ON_ERROR_OPTION_SF)) {
hgs
parents:
diff changeset
   450
					TraceCompilerGlobals.setKeepGoing(false);
hgs
parents:
diff changeset
   451
					TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.StopOnErrorEnabled")); //$NON-NLS-1$
hgs
parents:
diff changeset
   452
					continue;
hgs
parents:
diff changeset
   453
				}
hgs
parents:
diff changeset
   454
				TraceCompilerLogger.printMessage(Messages.getString("TraceCompiler.UnsupportedSwitch")  + element); //$NON-NLS-1$
hgs
parents:
diff changeset
   455
			} else {
hgs
parents:
diff changeset
   456
				m = valueSwitchPattern.matcher(element.trim());
hgs
parents:
diff changeset
   457
				if (m.matches()) { //it's one of the swithes with values
hgs
parents:
diff changeset
   458
					if (m.group(1).equalsIgnoreCase(UID_SWITCH)) {
hgs
parents:
diff changeset
   459
						// UID
hgs
parents:
diff changeset
   460
						try {
hgs
parents:
diff changeset
   461
							componentUID = Long.parseLong(m.group(2),TraceCompilerConstants.HEX_RADIX);	
hgs
parents:
diff changeset
   462
							TraceCompilerLogger.printInfo("Component UID: 0x" + Long.toHexString(componentUID)); //$NON-NLS-1$
hgs
parents:
diff changeset
   463
							if (componentUID <= 0L) {
hgs
parents:
diff changeset
   464
								String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
hgs
parents:
diff changeset
   465
								throw new TraceCompilerIllegalArgumentsException(msg, null);
hgs
parents:
diff changeset
   466
							}
hgs
parents:
diff changeset
   467
						} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   468
							String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
hgs
parents:
diff changeset
   469
							throw new TraceCompilerIllegalArgumentsException(msg, null);
hgs
parents:
diff changeset
   470
						}
hgs
parents:
diff changeset
   471
					} else {
hgs
parents:
diff changeset
   472
						if (m.group(1).equalsIgnoreCase(PRJ_NAME_SWITCH)) {
hgs
parents:
diff changeset
   473
							// project name
hgs
parents:
diff changeset
   474
							projectName = m.group(2);
hgs
parents:
diff changeset
   475
							TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.CompNameSet") + projectName); //$NON-NLS-1$
hgs
parents:
diff changeset
   476
						} else {
hgs
parents:
diff changeset
   477
							if (m.group(1).equalsIgnoreCase(MMP_PATH_SWITCH)) {
hgs
parents:
diff changeset
   478
								//mmp path. for the moment only the mmp folder is used.
hgs
parents:
diff changeset
   479
								mmpPath = new File(m.group(2));
hgs
parents:
diff changeset
   480
								TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.MMPPathSet") + mmpPath); //$NON-NLS-1$
hgs
parents:
diff changeset
   481
							} else {
hgs
parents:
diff changeset
   482
								if (m.group(1).equalsIgnoreCase(TRACES_PATH_SWITCH)) {
hgs
parents:
diff changeset
   483
									//traces path
hgs
parents:
diff changeset
   484
									traces_path = m.group(2);
hgs
parents:
diff changeset
   485
								} else {
hgs
parents:
diff changeset
   486
									//unsupported switch
hgs
parents:
diff changeset
   487
									TraceCompilerLogger.printMessage(Messages.getString("TraceCompiler.UnsupportedSwitch") + element); //$NON-NLS-1$
hgs
parents:
diff changeset
   488
								}
hgs
parents:
diff changeset
   489
							}
hgs
parents:
diff changeset
   490
						}
hgs
parents:
diff changeset
   491
					}
hgs
parents:
diff changeset
   492
hgs
parents:
diff changeset
   493
				} else {
hgs
parents:
diff changeset
   494
					//it must be a file name
hgs
parents:
diff changeset
   495
					//it's a good time to stop TC here if the file does not exist
hgs
parents:
diff changeset
   496
					if (!(new File(element)).exists()) {
hgs
parents:
diff changeset
   497
						throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.sourceFileDoesNotExist") + element, null); //$NON-NLS-1$
hgs
parents:
diff changeset
   498
					}
hgs
parents:
diff changeset
   499
					sources.add(element);				
hgs
parents:
diff changeset
   500
				}	
hgs
parents:
diff changeset
   501
			}
hgs
parents:
diff changeset
   502
		}
hgs
parents:
diff changeset
   503
		
hgs
parents:
diff changeset
   504
		// by now, if the user wanted just help or version they would have got it and TC stopped
hgs
parents:
diff changeset
   505
		
hgs
parents:
diff changeset
   506
		if (componentUID <= 0L) {
hgs
parents:
diff changeset
   507
			String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
hgs
parents:
diff changeset
   508
			throw new TraceCompilerIllegalArgumentsException(msg, null);
hgs
parents:
diff changeset
   509
		}
hgs
parents:
diff changeset
   510
		
hgs
parents:
diff changeset
   511
		if (projectName == null) {
hgs
parents:
diff changeset
   512
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.projectNameMissing"), null); //$NON-NLS-1$
hgs
parents:
diff changeset
   513
		}
hgs
parents:
diff changeset
   514
		
hgs
parents:
diff changeset
   515
		//if files have not been provided , get them from stdin
hgs
parents:
diff changeset
   516
		if (sources.size() == 0) {
hgs
parents:
diff changeset
   517
			//get them from the stdin
hgs
parents:
diff changeset
   518
			readFromStdin();
hgs
parents:
diff changeset
   519
		}
hgs
parents:
diff changeset
   520
		
hgs
parents:
diff changeset
   521
		if (mmpPath == null ) {
hgs
parents:
diff changeset
   522
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.mmpPathMissing"), null); //$NON-NLS-1$
hgs
parents:
diff changeset
   523
		} else if (!isMmpValid()) {
hgs
parents:
diff changeset
   524
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.invalidMmpExceptionText") + mmpPath, null); //$NON-NLS-1$
hgs
parents:
diff changeset
   525
		}
hgs
parents:
diff changeset
   526
		
hgs
parents:
diff changeset
   527
		if (traces_path == null ) {
hgs
parents:
diff changeset
   528
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.tracesPathMissing"), null); //$NON-NLS-1$
hgs
parents:
diff changeset
   529
		} else {
hgs
parents:
diff changeset
   530
			computeTracesPath(traces_path);
hgs
parents:
diff changeset
   531
		}
hgs
parents:
diff changeset
   532
		
hgs
parents:
diff changeset
   533
		if (sources.size() == 0 ) {
hgs
parents:
diff changeset
   534
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.fileListMissing"), null); //$NON-NLS-1$
hgs
parents:
diff changeset
   535
		}
hgs
parents:
diff changeset
   536
		
hgs
parents:
diff changeset
   537
		//we have all parameters input and validated, register files.
hgs
parents:
diff changeset
   538
		registerSourceFiles(sources);		
hgs
parents:
diff changeset
   539
	}
hgs
parents:
diff changeset
   540
	
hgs
parents:
diff changeset
   541
	
hgs
parents:
diff changeset
   542
	/**
hgs
parents:
diff changeset
   543
	 * If traces path is relative, work out the full path relative to the location of the mmp file
hgs
parents:
diff changeset
   544
	 * @param path
hgs
parents:
diff changeset
   545
	 * @throws TraceCompilerIllegalArgumentsException
hgs
parents:
diff changeset
   546
	 */
hgs
parents:
diff changeset
   547
	private void computeTracesPath(String path) throws TraceCompilerIllegalArgumentsException {
hgs
parents:
diff changeset
   548
		String traces_pathString = path;
hgs
parents:
diff changeset
   549
		traces_pathString = traces_pathString.replace('/', File.separatorChar);
hgs
parents:
diff changeset
   550
		traces_pathString = traces_pathString.replace('\\', File.separatorChar);
hgs
parents:
diff changeset
   551
hgs
parents:
diff changeset
   552
		File traces_path = new File(traces_pathString);
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
		Pattern p = Pattern.compile("(([a-zA-Z]:[\\\\/])|([\\\\/])).*"); //$NON-NLS-1$
hgs
parents:
diff changeset
   555
		Matcher m = p.matcher(traces_pathString);
hgs
parents:
diff changeset
   556
hgs
parents:
diff changeset
   557
		if (!m.matches() /*  workaround for isAbsolute in java */) {
hgs
parents:
diff changeset
   558
			//traces path is relative to mmp location
hgs
parents:
diff changeset
   559
			traces_pathString = mmpPath.getAbsoluteFile().getParent() + File.separator + traces_pathString;
hgs
parents:
diff changeset
   560
		}
hgs
parents:
diff changeset
   561
hgs
parents:
diff changeset
   562
		traces_path = new File(traces_pathString);
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
		if (traces_path.isDirectory() && !traces_path.canWrite()) {
hgs
parents:
diff changeset
   565
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.TracesPathWriteProtected") + traces_path, null); //$NON-NLS-1$
hgs
parents:
diff changeset
   566
		}
hgs
parents:
diff changeset
   567
hgs
parents:
diff changeset
   568
		boolean dirExists = true;
hgs
parents:
diff changeset
   569
		if (!traces_path.exists()) {
hgs
parents:
diff changeset
   570
			dirExists = FileUtils.createDirectories(traces_path);
hgs
parents:
diff changeset
   571
		}
hgs
parents:
diff changeset
   572
		if (!dirExists) {
hgs
parents:
diff changeset
   573
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.mkdirFailed") + traces_path, null); //$NON-NLS-1$
hgs
parents:
diff changeset
   574
		}
hgs
parents:
diff changeset
   575
hgs
parents:
diff changeset
   576
		//set component path and trace folder
hgs
parents:
diff changeset
   577
		componentPath = traces_path.getParent();
hgs
parents:
diff changeset
   578
		ProjectEngine.traceFolderName = traces_path.getName();
hgs
parents:
diff changeset
   579
		TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.settingComponentPath") + componentPath); //$NON-NLS-1$
hgs
parents:
diff changeset
   580
		TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.settingTracesPath") + ProjectEngine.traceFolderName); //$NON-NLS-1$
hgs
parents:
diff changeset
   581
	}
hgs
parents:
diff changeset
   582
hgs
parents:
diff changeset
   583
	private static void printUsage() {
hgs
parents:
diff changeset
   584
		TraceCompilerLogger.printMessage(VERSION_TEXT + TraceCompilerVersion.getVersion());
hgs
parents:
diff changeset
   585
		TraceCompilerLogger.printMessage(USAGE);
hgs
parents:
diff changeset
   586
	}
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
	/**
hgs
parents:
diff changeset
   589
	 * Read information from STDIN
hgs
parents:
diff changeset
   590
	 * @throws IOException if fails to read the input
hgs
parents:
diff changeset
   591
	 * @throws TraceCompilerRootException if the list of files is empty
hgs
parents:
diff changeset
   592
	 */
hgs
parents:
diff changeset
   593
	private void readFromStdin() throws IOException, TraceCompilerIllegalArgumentsException {
hgs
parents:
diff changeset
   594
		TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.ReadingFilesMess")  + ENDOFSOURCEFILES); //$NON-NLS-1$
hgs
parents:
diff changeset
   595
		// Create reader
hgs
parents:
diff changeset
   596
		BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
			String line = stdin.readLine();
hgs
parents:
diff changeset
   599
						
hgs
parents:
diff changeset
   600
			while (line != null) {
hgs
parents:
diff changeset
   601
				line = line.trim();
hgs
parents:
diff changeset
   602
				if (line.length() > 0) {
hgs
parents:
diff changeset
   603
					// End of source files received
hgs
parents:
diff changeset
   604
					if (line.equals(ENDOFSOURCEFILES)) {
hgs
parents:
diff changeset
   605
						break;
hgs
parents:
diff changeset
   606
					}
hgs
parents:
diff changeset
   607
					line = line.replaceAll("\\s+", ""); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   608
					Matcher m = valueSwitchPattern.matcher(line.trim());
hgs
parents:
diff changeset
   609
					//because mmp path and traces path can be very long, we should allow them to be input'ed through stdin too.
hgs
parents:
diff changeset
   610
					if (m.matches()) { //it's one of the swithes with values
hgs
parents:
diff changeset
   611
						if (m.group(1).equalsIgnoreCase(MMP_PATH_SWITCH)) {
hgs
parents:
diff changeset
   612
							//mmp path. for the moment only the mmp folder is used.
hgs
parents:
diff changeset
   613
							mmpPath = new File(m.group(2));
hgs
parents:
diff changeset
   614
							TraceCompilerLogger.printInfo(Messages.getString("TraceCompiler.MMPPathSet") + mmpPath); //$NON-NLS-1$
hgs
parents:
diff changeset
   615
						} else {
hgs
parents:
diff changeset
   616
							if (m.group(1).equalsIgnoreCase(TRACES_PATH_SWITCH)) {
hgs
parents:
diff changeset
   617
								//traces path
hgs
parents:
diff changeset
   618
								traces_path = m.group(2);
hgs
parents:
diff changeset
   619
							} else {
hgs
parents:
diff changeset
   620
								//unsupported switch
hgs
parents:
diff changeset
   621
								TraceCompilerLogger.printMessage(Messages.getString("TraceCompiler.UnsupportedSwitch") + line); //$NON-NLS-1$
hgs
parents:
diff changeset
   622
							}
hgs
parents:
diff changeset
   623
						}
hgs
parents:
diff changeset
   624
					} else {
hgs
parents:
diff changeset
   625
hgs
parents:
diff changeset
   626
						//it must be a file name
hgs
parents:
diff changeset
   627
						//it's a good time to stop TC here if the file does not exist
hgs
parents:
diff changeset
   628
						if (!(new File(line)).exists()) {
hgs
parents:
diff changeset
   629
							throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.sourceFileDoesNotExist") + line, null); //$NON-NLS-1$
hgs
parents:
diff changeset
   630
						}
hgs
parents:
diff changeset
   631
						sources.add(line);
hgs
parents:
diff changeset
   632
					}
hgs
parents:
diff changeset
   633
				}
hgs
parents:
diff changeset
   634
				// Read new line from STDIN
hgs
parents:
diff changeset
   635
				line = stdin.readLine();				
hgs
parents:
diff changeset
   636
			}
hgs
parents:
diff changeset
   637
		stdin.close();
hgs
parents:
diff changeset
   638
	}
hgs
parents:
diff changeset
   639
hgs
parents:
diff changeset
   640
	/**
hgs
parents:
diff changeset
   641
	 * Registers source files
hgs
parents:
diff changeset
   642
	 * 
hgs
parents:
diff changeset
   643
	 * @param files
hgs
parents:
diff changeset
   644
	 */
hgs
parents:
diff changeset
   645
	private void registerSourceFiles(ArrayList<String> files) throws TraceCompilerIllegalArgumentsException {
hgs
parents:
diff changeset
   646
		if (sources.size() == 0) {
hgs
parents:
diff changeset
   647
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.noSourceFilesExceptionText"), null); //$NON-NLS-1$
hgs
parents:
diff changeset
   648
		}
hgs
parents:
diff changeset
   649
		if (files.size() > 0) {
hgs
parents:
diff changeset
   650
			String[] fileArr = new String[files.size()];
hgs
parents:
diff changeset
   651
			files.toArray(fileArr);
hgs
parents:
diff changeset
   652
hgs
parents:
diff changeset
   653
			// Sets the source files to the TraceCompiler document
hgs
parents:
diff changeset
   654
			// factory. It will create a document from each source in the array
hgs
parents:
diff changeset
   655
			FileDocumentMonitor.setFiles(fileArr);
hgs
parents:
diff changeset
   656
			DocumentFactory.registerDocumentFramework(
hgs
parents:
diff changeset
   657
					new FileDocumentMonitor(), StringDocumentFactory.class);
hgs
parents:
diff changeset
   658
		}
hgs
parents:
diff changeset
   659
	}
hgs
parents:
diff changeset
   660
hgs
parents:
diff changeset
   661
	/**
hgs
parents:
diff changeset
   662
	 * Initializes TraceCompiler
hgs
parents:
diff changeset
   663
	 * @throws TraceCompilerRootException if fail to initialize the plugins
hgs
parents:
diff changeset
   664
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   665
	 */
hgs
parents:
diff changeset
   666
	private void start() throws TraceCompilerRootException, TraceCompilerException {
hgs
parents:
diff changeset
   667
hgs
parents:
diff changeset
   668
		// Starts TraceCompiler. This is normally called from the Eclipse
hgs
parents:
diff changeset
   669
		// plug-in
hgs
parents:
diff changeset
   670
		// activator, but in console case that does not exist
hgs
parents:
diff changeset
   671
		TraceCompilerEngineGlobals.start();
hgs
parents:
diff changeset
   672
						
hgs
parents:
diff changeset
   673
		//Reads the GroupId values from opensystemtrace_types.h
hgs
parents:
diff changeset
   674
		//If this fails a message is logged and trace compiler stops
hgs
parents:
diff changeset
   675
		GroupNames.initialiseGroupName();
hgs
parents:
diff changeset
   676
hgs
parents:
diff changeset
   677
		
hgs
parents:
diff changeset
   678
		// Registers a view to TraceCompiler
hgs
parents:
diff changeset
   679
		TraceCompilerEngineGlobals
hgs
parents:
diff changeset
   680
				.setView(new TraceCompilerView(componentPath));
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
		// Registers all plug-in components
hgs
parents:
diff changeset
   683
		for (TraceCompilerPlugin plugin : plugIns) {
hgs
parents:
diff changeset
   684
			TraceCompilerEngineGlobals.registerPlugin(plugin);
hgs
parents:
diff changeset
   685
		}
hgs
parents:
diff changeset
   686
		// Adds a model event listener
hgs
parents:
diff changeset
   687
		TraceCompilerEngineGlobals.getTraceModel().addModelListener(
hgs
parents:
diff changeset
   688
				modelListener);
hgs
parents:
diff changeset
   689
		TraceCompilerEngineGlobals.getTraceModel().addExtensionListener(
hgs
parents:
diff changeset
   690
				modelListener);
hgs
parents:
diff changeset
   691
		TraceCompilerEngineGlobals.getTraceModel().getExtension(
hgs
parents:
diff changeset
   692
				TraceLocationList.class).addLocationListListener(modelListener);
hgs
parents:
diff changeset
   693
		TraceCompilerEngineGlobals.getTraceModel().addProcessingListener(modelListener);
hgs
parents:
diff changeset
   694
	}
hgs
parents:
diff changeset
   695
hgs
parents:
diff changeset
   696
	/**
hgs
parents:
diff changeset
   697
	 * Parses the sources and generates trace files
hgs
parents:
diff changeset
   698
	 * @throws Exception 
hgs
parents:
diff changeset
   699
	 */
hgs
parents:
diff changeset
   700
	private void buildTraceFiles() throws Exception {
hgs
parents:
diff changeset
   701
		TraceCompilerEngineInterface tbi = TraceCompilerEngineGlobals
hgs
parents:
diff changeset
   702
				.getTraceCompiler();
hgs
parents:
diff changeset
   703
		try {
hgs
parents:
diff changeset
   704
			// Opens a trace project
hgs
parents:
diff changeset
   705
hgs
parents:
diff changeset
   706
			// Set project path before opening project
hgs
parents:
diff changeset
   707
			TraceCompilerEngineGlobals.setProjectPath(componentPath);
hgs
parents:
diff changeset
   708
			tbi.openProject(projectName);
hgs
parents:
diff changeset
   709
			TraceModel model = TraceCompilerEngineGlobals.getTraceModel();
hgs
parents:
diff changeset
   710
			if (model.isValid()) {
hgs
parents:
diff changeset
   711
				model.setID((int) componentUID);
hgs
parents:
diff changeset
   712
hgs
parents:
diff changeset
   713
				// Location errors are printed after a file changes, but the
hgs
parents:
diff changeset
   714
				// last file is not detected by the listener
hgs
parents:
diff changeset
   715
				if (modelListener.getErrors().size() > 0) {
hgs
parents:
diff changeset
   716
					modelListener.printLocationErrors();
hgs
parents:
diff changeset
   717
					tbi.closeProject();
hgs
parents:
diff changeset
   718
					throw new TraceCompilerRootException(null, null);
hgs
parents:
diff changeset
   719
				}
hgs
parents:
diff changeset
   720
				tbi.exportProject();
hgs
parents:
diff changeset
   721
				tbi.closeProject();
hgs
parents:
diff changeset
   722
			} else {
hgs
parents:
diff changeset
   723
				String msg = Messages.getString("TraceCompiler.ProjectCancelledMess"); //$NON-NLS-1$
hgs
parents:
diff changeset
   724
				throw new TraceCompilerRootException(msg, null);
hgs
parents:
diff changeset
   725
			}
hgs
parents:
diff changeset
   726
		} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   727
			TraceCompilerEngineGlobals.getEvents().postError(e);
hgs
parents:
diff changeset
   728
			throw new TraceCompilerRootException(Messages.getString("TraceCompiler.BuildFailed"), e); //$NON-NLS-1$
hgs
parents:
diff changeset
   729
		}
hgs
parents:
diff changeset
   730
	}
hgs
parents:
diff changeset
   731
hgs
parents:
diff changeset
   732
	/**
hgs
parents:
diff changeset
   733
	 * Shuts down TraceCompiler
hgs
parents:
diff changeset
   734
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   735
	 */
hgs
parents:
diff changeset
   736
	private void shutdown() throws TraceCompilerException {
hgs
parents:
diff changeset
   737
		for (TraceCompilerPlugin plugin : plugIns) {
hgs
parents:
diff changeset
   738
			TraceCompilerEngineGlobals.unregisterPlugin(plugin);
hgs
parents:
diff changeset
   739
		}
hgs
parents:
diff changeset
   740
		TraceCompilerEngineGlobals.shutdown();
hgs
parents:
diff changeset
   741
	}
hgs
parents:
diff changeset
   742
hgs
parents:
diff changeset
   743
	/**
hgs
parents:
diff changeset
   744
	 * Checks if the MMP file is valid
hgs
parents:
diff changeset
   745
	 * 
hgs
parents:
diff changeset
   746
	 * @return true if MMP file is valid
hgs
parents:
diff changeset
   747
	 */
hgs
parents:
diff changeset
   748
	private boolean isMmpValid() {
hgs
parents:
diff changeset
   749
		boolean valid = false;
hgs
parents:
diff changeset
   750
		String pathStr = mmpPath.getAbsolutePath();
hgs
parents:
diff changeset
   751
hgs
parents:
diff changeset
   752
		if (mmpPath.exists() && pathStr.length() > MMP_FILE_TYPE.length()) {
hgs
parents:
diff changeset
   753
			String end = pathStr.substring(pathStr.length() - MMP_FILE_TYPE.length());
hgs
parents:
diff changeset
   754
			if (end.equalsIgnoreCase(MMP_FILE_TYPE)) {
hgs
parents:
diff changeset
   755
				valid = true;
hgs
parents:
diff changeset
   756
			} else {
hgs
parents:
diff changeset
   757
				TraceCompilerLogger.printError(Messages.getString("TraceCompiler.invalidMmpExceptionText") + mmpPath.getAbsolutePath()); //$NON-NLS-1$
hgs
parents:
diff changeset
   758
			}
hgs
parents:
diff changeset
   759
		} else {
hgs
parents:
diff changeset
   760
			TraceCompilerLogger.printError(Messages.getString("TraceCompiler.InvalidMMP2") + mmpPath.getAbsolutePath()); //$NON-NLS-1$
hgs
parents:
diff changeset
   761
		}
hgs
parents:
diff changeset
   762
		return valid;
hgs
parents:
diff changeset
   763
		
hgs
parents:
diff changeset
   764
	}
hgs
parents:
diff changeset
   765
hgs
parents:
diff changeset
   766
}