tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/ProjectEngine.java
branchRCL_3
changeset 20 ca8a1b6995f6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/project/ProjectEngine.java	Tue Aug 31 16:45:49 2010 +0300
@@ -0,0 +1,294 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+* Trace project file manager
+*
+*/
+package com.nokia.tracecompiler.engine.project;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Enumeration;
+
+import com.nokia.tracecompiler.engine.TraceCompilerEngineBase;
+import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
+import com.nokia.tracecompiler.engine.plugin.TraceAPIPluginManager;
+import com.nokia.tracecompiler.file.FileUtils;
+import com.nokia.tracecompiler.model.TraceCompilerException;
+import com.nokia.tracecompiler.model.TraceModel;
+import com.nokia.tracecompiler.project.GroupNames;
+import com.nokia.tracecompiler.project.ProjectUtils;
+
+/**
+ * Trace project engine
+ * 
+ */
+public final class ProjectEngine extends TraceCompilerEngineBase {
+
+	/**
+	 * Parameters for create project
+	 */
+	private class CreateProjectParameters {
+
+		/**
+		 * Trace project path
+		 */
+		String traceProjectPath;
+
+		/**
+		 * Trace project name
+		 */
+		String traceProjectName;
+
+		/**
+		 * Trace project ID
+		 */
+		int traceProjectID;
+
+	}
+
+	/**
+	 * Default project ID
+	 */
+	private static final int DEFAULT_PROJECT_ID = 0x0; // CodForChk_Dis_Magic
+
+	/**
+	 * Trace model
+	 */
+	private TraceModel model;
+
+	/**
+	 * Trace directory name
+	 */
+	public static String traceFolderName;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param model
+	 *            the trace model
+	 */
+	public ProjectEngine(TraceModel model) {
+		this.model = model;
+	}
+
+	/**
+	 * Opens trace project
+	 * 
+	 * @param projectPath
+	 *            the path to the project to be opened
+	 * @param modelName
+	 *            the name for the model or null to use directory name
+	 * @throws TraceCompilerException
+	 *             if opening fails
+	 */
+	public void openTraceProject(String projectPath, String modelName)
+			throws TraceCompilerException {
+		if (projectPath != null) {
+			CreateProjectParameters parameters = createParameters(projectPath,
+					modelName);
+
+			// Create empty project
+			if (model.getExtension(TraceCompilerProject.class) == null) {
+				createEmptyProjectFile(parameters);
+			}
+		} else {
+			
+			// If fileName is null, there's no open source files. In
+			// that the project cannot be created
+			throw new TraceCompilerException(
+					TraceCompilerErrorCode.SOURCE_NOT_OPEN);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectOpened()
+	 */
+	@Override
+	public void projectOpened() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectClosed()
+	 */
+	@Override
+	public void projectClosed() {
+		model.removeExtensions(TraceCompilerProject.class);
+		model.removeExtensions(TraceIDCache.class);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#exportProject()
+	 */
+	@Override
+	public void exportProject() {
+		try {
+
+			// The fixed id definitions file is updated even there are no traces
+			// in case that old fixed id definitions file exist
+			syncFixedIdDefinitionsFile();
+		} catch (TraceCompilerException e) {
+		}
+	}
+
+	/**
+	 * Updated fixed id definitions file
+	 * 
+	 * @throws TraceCompilerException
+	 *             if update fails
+	 */
+	private void syncFixedIdDefinitionsFile() throws TraceCompilerException {
+		TraceIDCache cache = model.getExtension(TraceIDCache.class);
+		// Create trace Id cache if it does not exist
+		if (cache == null) {
+			String path = ProjectUtils.getLocationForFile(model,
+					ProjectEngine.traceFolderName,
+					ProjectConstants.FIXED_ID_DEFINITIONS_FILE_NAME, false);
+			if (path != null) {
+				cache = new TraceIDCache(new File(path).getParent());
+				model.addExtension(cache);
+			}
+		}
+		if (cache != null) {
+			File cacheFile = new File(cache.getAbsolutePath());
+
+			// The fixed id definitions file is updated in case that there are
+			// traces in model
+			if (model.hasTraces()) {
+				// Try to save Ids to fixed Id definition file
+				try {
+					SortedProperties ids = new SortedProperties();
+					// Save Ids from model to fixed Id properties
+					model.saveIDs(ids);
+
+					// If there are some fixed Ids in that are not used anymore,
+					// keep also those Ids in defininiton file, but mark those
+					// ids as obsolete
+					ids = handleObsoleteIds(ids);
+
+					// Rewrites the trace Id cache file
+					OutputStream fos = FileUtils.createOutputStream(cacheFile);
+					ids.store(fos,
+							ProjectConstants.FIXED_ID_DEFINITION_FILE_TITLE);
+					fos.close();
+					cache.postFileWrittenEvent(cache.getAbsolutePath());
+				} catch (IOException e) {
+					cacheFile.delete();
+				}
+			}
+		}
+	}
+
+	/**
+	 * Handle obsolete Ids
+	 * 
+	 * @param ids
+	 *            Ids
+	 */
+	private SortedProperties handleObsoleteIds(SortedProperties ids) {
+		SortedProperties fixedIds = model.getFixedIds();
+		if (fixedIds != null) {
+			Enumeration<Object> fixedIdKeys = fixedIds.keys();
+			while (fixedIdKeys.hasMoreElements()) {
+				String fixedIdKey = (String) fixedIdKeys.nextElement();
+				if (!ids.containsKey(fixedIdKey)) {
+					String value = fixedIds.getProperty(fixedIdKey);
+					boolean markAsObsolete = true;
+					// In case of groups we only mark user defined
+					// groups as obsolete
+					if (fixedIdKey.startsWith(model.GROUP_PROPERTY_PREFIX)) {
+						int valueAsInt = 0;
+						try {
+							valueAsInt = Integer.decode(value).intValue();
+						} catch (NumberFormatException e) {
+							// Corrupted.
+							valueAsInt = 0;
+						}
+						if (valueAsInt < GroupNames.USER_GROUP_ID_FIRST) {
+							markAsObsolete = false;
+						}
+					}
+					if (markAsObsolete) {
+						// If OBSOLETE tag text already exit, do not
+						// add that again
+						if (fixedIdKey
+								.startsWith(model.OBSOLETE_PROPERTY_PREFIX)) {
+							ids.setProperty(fixedIdKey, value);
+						} else {
+							ids.setProperty(model.OBSOLETE_PROPERTY_PREFIX
+									+ fixedIdKey, value);
+						}
+					}
+				}
+			}
+		}
+		return ids;
+	}
+
+	/**
+	 * Creates the parameters for new project
+	 * 
+	 * @param projectPath
+	 *            the project path
+	 * @param projectName
+	 *            the name for the project
+	 * @return the parameters
+	 */
+	private CreateProjectParameters createParameters(String projectPath,
+			String projectName) {
+		CreateProjectParameters queryData = new CreateProjectParameters();
+		queryData.traceProjectPath = projectPath + File.separator
+				+ ProjectEngine.traceFolderName;
+		queryData.traceProjectName = projectName;
+		queryData.traceProjectID = DEFAULT_PROJECT_ID;
+		return queryData;
+	}
+
+	/**
+	 * Creates the project file from query results
+	 * 
+	 * @param queryData
+	 *            the query result
+	 * @throws TraceCompilerException 
+	 */
+	private void createEmptyProjectFile(CreateProjectParameters queryData) throws TraceCompilerException {
+		model.setName(queryData.traceProjectName);
+		model.setID(queryData.traceProjectID);
+		String componentName = model.getName();
+		TraceCompilerProject file = new TraceCompilerProject(
+				queryData.traceProjectPath, componentName);
+		createAPI(file);
+	}
+
+	/**
+	 * Creates the project API
+	 * 
+	 * @param file
+	 *            the project file
+	 */
+	private void createAPI(TraceCompilerProject file) {
+		model.addExtension(file);
+		TraceAPIPluginManager plugin = model
+				.getExtension(TraceAPIPluginManager.class);
+		plugin.createDefaultAPI();
+	}
+}