tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/ProjectEngine.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 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
* Trace project file manager
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.engine.project;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.io.File;
hgs
parents:
diff changeset
    22
import java.io.IOException;
hgs
parents:
diff changeset
    23
import java.io.OutputStream;
hgs
parents:
diff changeset
    24
import java.util.Enumeration;
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
import com.nokia.tracecompiler.engine.TraceCompilerEngineBase;
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.engine.plugin.TraceAPIPluginManager;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.file.FileUtils;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.project.GroupNames;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.project.ProjectUtils;
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
/**
hgs
parents:
diff changeset
    36
 * Trace project engine
hgs
parents:
diff changeset
    37
 * 
hgs
parents:
diff changeset
    38
 */
hgs
parents:
diff changeset
    39
public final class ProjectEngine extends TraceCompilerEngineBase {
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
	/**
hgs
parents:
diff changeset
    42
	 * Parameters for create project
hgs
parents:
diff changeset
    43
	 */
hgs
parents:
diff changeset
    44
	private class CreateProjectParameters {
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
		/**
hgs
parents:
diff changeset
    47
		 * Trace project path
hgs
parents:
diff changeset
    48
		 */
hgs
parents:
diff changeset
    49
		String traceProjectPath;
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
		/**
hgs
parents:
diff changeset
    52
		 * Trace project name
hgs
parents:
diff changeset
    53
		 */
hgs
parents:
diff changeset
    54
		String traceProjectName;
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
		/**
hgs
parents:
diff changeset
    57
		 * Trace project ID
hgs
parents:
diff changeset
    58
		 */
hgs
parents:
diff changeset
    59
		int traceProjectID;
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
	}
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
	/**
hgs
parents:
diff changeset
    64
	 * Default project ID
hgs
parents:
diff changeset
    65
	 */
hgs
parents:
diff changeset
    66
	private static final int DEFAULT_PROJECT_ID = 0x0; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
	/**
hgs
parents:
diff changeset
    69
	 * Trace model
hgs
parents:
diff changeset
    70
	 */
hgs
parents:
diff changeset
    71
	private TraceModel model;
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
	/**
hgs
parents:
diff changeset
    74
	 * Trace directory name
hgs
parents:
diff changeset
    75
	 */
hgs
parents:
diff changeset
    76
	public static String traceFolderName;
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
	/**
hgs
parents:
diff changeset
    79
	 * Constructor
hgs
parents:
diff changeset
    80
	 * 
hgs
parents:
diff changeset
    81
	 * @param model
hgs
parents:
diff changeset
    82
	 *            the trace model
hgs
parents:
diff changeset
    83
	 */
hgs
parents:
diff changeset
    84
	public ProjectEngine(TraceModel model) {
hgs
parents:
diff changeset
    85
		this.model = model;
hgs
parents:
diff changeset
    86
	}
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
	/**
hgs
parents:
diff changeset
    89
	 * Opens trace project
hgs
parents:
diff changeset
    90
	 * 
hgs
parents:
diff changeset
    91
	 * @param projectPath
hgs
parents:
diff changeset
    92
	 *            the path to the project to be opened
hgs
parents:
diff changeset
    93
	 * @param modelName
hgs
parents:
diff changeset
    94
	 *            the name for the model or null to use directory name
hgs
parents:
diff changeset
    95
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
    96
	 *             if opening fails
hgs
parents:
diff changeset
    97
	 */
hgs
parents:
diff changeset
    98
	public void openTraceProject(String projectPath, String modelName)
hgs
parents:
diff changeset
    99
			throws TraceCompilerException {
hgs
parents:
diff changeset
   100
		if (projectPath != null) {
hgs
parents:
diff changeset
   101
			CreateProjectParameters parameters = createParameters(projectPath,
hgs
parents:
diff changeset
   102
					modelName);
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
			// Create empty project
hgs
parents:
diff changeset
   105
			if (model.getExtension(TraceCompilerProject.class) == null) {
hgs
parents:
diff changeset
   106
				createEmptyProjectFile(parameters);
hgs
parents:
diff changeset
   107
			}
hgs
parents:
diff changeset
   108
		} else {
hgs
parents:
diff changeset
   109
			
hgs
parents:
diff changeset
   110
			// If fileName is null, there's no open source files. In
hgs
parents:
diff changeset
   111
			// that the project cannot be created
hgs
parents:
diff changeset
   112
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   113
					TraceCompilerErrorCode.SOURCE_NOT_OPEN);
hgs
parents:
diff changeset
   114
		}
hgs
parents:
diff changeset
   115
	}
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
	/*
hgs
parents:
diff changeset
   118
	 * (non-Javadoc)
hgs
parents:
diff changeset
   119
	 * 
hgs
parents:
diff changeset
   120
	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectOpened()
hgs
parents:
diff changeset
   121
	 */
hgs
parents:
diff changeset
   122
	@Override
hgs
parents:
diff changeset
   123
	public void projectOpened() {
hgs
parents:
diff changeset
   124
	}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
	/*
hgs
parents:
diff changeset
   127
	 * (non-Javadoc)
hgs
parents:
diff changeset
   128
	 * 
hgs
parents:
diff changeset
   129
	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectClosed()
hgs
parents:
diff changeset
   130
	 */
hgs
parents:
diff changeset
   131
	@Override
hgs
parents:
diff changeset
   132
	public void projectClosed() {
hgs
parents:
diff changeset
   133
		model.removeExtensions(TraceCompilerProject.class);
hgs
parents:
diff changeset
   134
		model.removeExtensions(TraceIDCache.class);
hgs
parents:
diff changeset
   135
	}
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
	/*
hgs
parents:
diff changeset
   138
	 * (non-Javadoc)
hgs
parents:
diff changeset
   139
	 * 
hgs
parents:
diff changeset
   140
	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#exportProject()
hgs
parents:
diff changeset
   141
	 */
hgs
parents:
diff changeset
   142
	@Override
hgs
parents:
diff changeset
   143
	public void exportProject() {
hgs
parents:
diff changeset
   144
		try {
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
			// The fixed id definitions file is updated even there are no traces
hgs
parents:
diff changeset
   147
			// in case that old fixed id definitions file exist
hgs
parents:
diff changeset
   148
			syncFixedIdDefinitionsFile();
hgs
parents:
diff changeset
   149
		} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   150
		}
hgs
parents:
diff changeset
   151
	}
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
	/**
hgs
parents:
diff changeset
   154
	 * Updated fixed id definitions file
hgs
parents:
diff changeset
   155
	 * 
hgs
parents:
diff changeset
   156
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   157
	 *             if update fails
hgs
parents:
diff changeset
   158
	 */
hgs
parents:
diff changeset
   159
	private void syncFixedIdDefinitionsFile() throws TraceCompilerException {
hgs
parents:
diff changeset
   160
		TraceIDCache cache = model.getExtension(TraceIDCache.class);
hgs
parents:
diff changeset
   161
		// Create trace Id cache if it does not exist
hgs
parents:
diff changeset
   162
		if (cache == null) {
hgs
parents:
diff changeset
   163
			String path = ProjectUtils.getLocationForFile(model,
hgs
parents:
diff changeset
   164
					ProjectEngine.traceFolderName,
hgs
parents:
diff changeset
   165
					ProjectConstants.FIXED_ID_DEFINITIONS_FILE_NAME, false);
hgs
parents:
diff changeset
   166
			if (path != null) {
hgs
parents:
diff changeset
   167
				cache = new TraceIDCache(new File(path).getParent());
hgs
parents:
diff changeset
   168
				model.addExtension(cache);
hgs
parents:
diff changeset
   169
			}
hgs
parents:
diff changeset
   170
		}
hgs
parents:
diff changeset
   171
		if (cache != null) {
hgs
parents:
diff changeset
   172
			File cacheFile = new File(cache.getAbsolutePath());
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
			// The fixed id definitions file is updated in case that there are
hgs
parents:
diff changeset
   175
			// traces in model
hgs
parents:
diff changeset
   176
			if (model.hasTraces()) {
hgs
parents:
diff changeset
   177
				// Try to save Ids to fixed Id definition file
hgs
parents:
diff changeset
   178
				try {
hgs
parents:
diff changeset
   179
					SortedProperties ids = new SortedProperties();
hgs
parents:
diff changeset
   180
					// Save Ids from model to fixed Id properties
hgs
parents:
diff changeset
   181
					model.saveIDs(ids);
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
					// If there are some fixed Ids in that are not used anymore,
hgs
parents:
diff changeset
   184
					// keep also those Ids in defininiton file, but mark those
hgs
parents:
diff changeset
   185
					// ids as obsolete
hgs
parents:
diff changeset
   186
					ids = handleObsoleteIds(ids);
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
					// Rewrites the trace Id cache file
hgs
parents:
diff changeset
   189
					OutputStream fos = FileUtils.createOutputStream(cacheFile);
hgs
parents:
diff changeset
   190
					ids.store(fos,
hgs
parents:
diff changeset
   191
							ProjectConstants.FIXED_ID_DEFINITION_FILE_TITLE);
hgs
parents:
diff changeset
   192
					fos.close();
hgs
parents:
diff changeset
   193
					cache.postFileWrittenEvent(cache.getAbsolutePath());
hgs
parents:
diff changeset
   194
				} catch (IOException e) {
hgs
parents:
diff changeset
   195
					cacheFile.delete();
hgs
parents:
diff changeset
   196
				}
hgs
parents:
diff changeset
   197
			}
hgs
parents:
diff changeset
   198
		}
hgs
parents:
diff changeset
   199
	}
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
	/**
hgs
parents:
diff changeset
   202
	 * Handle obsolete Ids
hgs
parents:
diff changeset
   203
	 * 
hgs
parents:
diff changeset
   204
	 * @param ids
hgs
parents:
diff changeset
   205
	 *            Ids
hgs
parents:
diff changeset
   206
	 */
hgs
parents:
diff changeset
   207
	private SortedProperties handleObsoleteIds(SortedProperties ids) {
hgs
parents:
diff changeset
   208
		SortedProperties fixedIds = model.getFixedIds();
hgs
parents:
diff changeset
   209
		if (fixedIds != null) {
hgs
parents:
diff changeset
   210
			Enumeration<Object> fixedIdKeys = fixedIds.keys();
hgs
parents:
diff changeset
   211
			while (fixedIdKeys.hasMoreElements()) {
hgs
parents:
diff changeset
   212
				String fixedIdKey = (String) fixedIdKeys.nextElement();
hgs
parents:
diff changeset
   213
				if (!ids.containsKey(fixedIdKey)) {
hgs
parents:
diff changeset
   214
					String value = fixedIds.getProperty(fixedIdKey);
hgs
parents:
diff changeset
   215
					boolean markAsObsolete = true;
hgs
parents:
diff changeset
   216
					// In case of groups we only mark user defined
hgs
parents:
diff changeset
   217
					// groups as obsolete
hgs
parents:
diff changeset
   218
					if (fixedIdKey.startsWith(model.GROUP_PROPERTY_PREFIX)) {
hgs
parents:
diff changeset
   219
						int valueAsInt = 0;
hgs
parents:
diff changeset
   220
						try {
hgs
parents:
diff changeset
   221
							valueAsInt = Integer.decode(value).intValue();
hgs
parents:
diff changeset
   222
						} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   223
							// Corrupted.
hgs
parents:
diff changeset
   224
							valueAsInt = 0;
hgs
parents:
diff changeset
   225
						}
hgs
parents:
diff changeset
   226
						if (valueAsInt < GroupNames.USER_GROUP_ID_FIRST) {
hgs
parents:
diff changeset
   227
							markAsObsolete = false;
hgs
parents:
diff changeset
   228
						}
hgs
parents:
diff changeset
   229
					}
hgs
parents:
diff changeset
   230
					if (markAsObsolete) {
hgs
parents:
diff changeset
   231
						// If OBSOLETE tag text already exit, do not
hgs
parents:
diff changeset
   232
						// add that again
hgs
parents:
diff changeset
   233
						if (fixedIdKey
hgs
parents:
diff changeset
   234
								.startsWith(model.OBSOLETE_PROPERTY_PREFIX)) {
hgs
parents:
diff changeset
   235
							ids.setProperty(fixedIdKey, value);
hgs
parents:
diff changeset
   236
						} else {
hgs
parents:
diff changeset
   237
							ids.setProperty(model.OBSOLETE_PROPERTY_PREFIX
hgs
parents:
diff changeset
   238
									+ fixedIdKey, value);
hgs
parents:
diff changeset
   239
						}
hgs
parents:
diff changeset
   240
					}
hgs
parents:
diff changeset
   241
				}
hgs
parents:
diff changeset
   242
			}
hgs
parents:
diff changeset
   243
		}
hgs
parents:
diff changeset
   244
		return ids;
hgs
parents:
diff changeset
   245
	}
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
	/**
hgs
parents:
diff changeset
   248
	 * Creates the parameters for new project
hgs
parents:
diff changeset
   249
	 * 
hgs
parents:
diff changeset
   250
	 * @param projectPath
hgs
parents:
diff changeset
   251
	 *            the project path
hgs
parents:
diff changeset
   252
	 * @param projectName
hgs
parents:
diff changeset
   253
	 *            the name for the project
hgs
parents:
diff changeset
   254
	 * @return the parameters
hgs
parents:
diff changeset
   255
	 */
hgs
parents:
diff changeset
   256
	private CreateProjectParameters createParameters(String projectPath,
hgs
parents:
diff changeset
   257
			String projectName) {
hgs
parents:
diff changeset
   258
		CreateProjectParameters queryData = new CreateProjectParameters();
hgs
parents:
diff changeset
   259
		queryData.traceProjectPath = projectPath + File.separator
hgs
parents:
diff changeset
   260
				+ ProjectEngine.traceFolderName;
hgs
parents:
diff changeset
   261
		queryData.traceProjectName = projectName;
hgs
parents:
diff changeset
   262
		queryData.traceProjectID = DEFAULT_PROJECT_ID;
hgs
parents:
diff changeset
   263
		return queryData;
hgs
parents:
diff changeset
   264
	}
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
	/**
hgs
parents:
diff changeset
   267
	 * Creates the project file from query results
hgs
parents:
diff changeset
   268
	 * 
hgs
parents:
diff changeset
   269
	 * @param queryData
hgs
parents:
diff changeset
   270
	 *            the query result
hgs
parents:
diff changeset
   271
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   272
	 */
hgs
parents:
diff changeset
   273
	private void createEmptyProjectFile(CreateProjectParameters queryData) throws TraceCompilerException {
hgs
parents:
diff changeset
   274
		model.setName(queryData.traceProjectName);
hgs
parents:
diff changeset
   275
		model.setID(queryData.traceProjectID);
hgs
parents:
diff changeset
   276
		String componentName = model.getName();
hgs
parents:
diff changeset
   277
		TraceCompilerProject file = new TraceCompilerProject(
hgs
parents:
diff changeset
   278
				queryData.traceProjectPath, componentName);
hgs
parents:
diff changeset
   279
		createAPI(file);
hgs
parents:
diff changeset
   280
	}
hgs
parents:
diff changeset
   281
hgs
parents:
diff changeset
   282
	/**
hgs
parents:
diff changeset
   283
	 * Creates the project API
hgs
parents:
diff changeset
   284
	 * 
hgs
parents:
diff changeset
   285
	 * @param file
hgs
parents:
diff changeset
   286
	 *            the project file
hgs
parents:
diff changeset
   287
	 */
hgs
parents:
diff changeset
   288
	private void createAPI(TraceCompilerProject file) {
hgs
parents:
diff changeset
   289
		model.addExtension(file);
hgs
parents:
diff changeset
   290
		TraceAPIPluginManager plugin = model
hgs
parents:
diff changeset
   291
				.getExtension(TraceAPIPluginManager.class);
hgs
parents:
diff changeset
   292
		plugin.createDefaultAPI();
hgs
parents:
diff changeset
   293
	}
hgs
parents:
diff changeset
   294
}