tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/project/ProjectUtils.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) 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
* Project file utilities
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.project;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.io.File;
hgs
parents:
diff changeset
    22
import java.util.ArrayList;
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
hgs
parents:
diff changeset
    25
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
hgs
parents:
diff changeset
    26
import com.nokia.tracecompiler.engine.project.ProjectEngine;
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.source.SymbianConstants;
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
/**
hgs
parents:
diff changeset
    32
 * Project file utilities
hgs
parents:
diff changeset
    33
 *
hgs
parents:
diff changeset
    34
 */
hgs
parents:
diff changeset
    35
public final class ProjectUtils {
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
	/**
hgs
parents:
diff changeset
    39
	 * Tries to locate existing file with given extension and if not found,
hgs
parents:
diff changeset
    40
	 * proposes a new location for that file. The new location will be
hgs
parents:
diff changeset
    41
	 * <i>createPath</i> or if that is null, the directory where the trace
hgs
parents:
diff changeset
    42
	 * project file (.tbprj) resides. Trace project must be open before this can
hgs
parents:
diff changeset
    43
	 * be called
hgs
parents:
diff changeset
    44
	 *
hgs
parents:
diff changeset
    45
	 * @param model
hgs
parents:
diff changeset
    46
	 *            the trace model
hgs
parents:
diff changeset
    47
	 * @param createPath
hgs
parents:
diff changeset
    48
	 *            the path to create if existing file is not found
hgs
parents:
diff changeset
    49
	 * @param fileName
hgs
parents:
diff changeset
    50
	 *            the name for the new file
hgs
parents:
diff changeset
    51
	 * @param appendProjectName
hgs
parents:
diff changeset
    52
	 *            true if the name is appended to end of model name
hgs
parents:
diff changeset
    53
	 * @return the project file path for the new file
hgs
parents:
diff changeset
    54
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
    55
	 *             if the model does not have any project files
hgs
parents:
diff changeset
    56
	 */
hgs
parents:
diff changeset
    57
	public static String getLocationForFile(TraceModel model,
hgs
parents:
diff changeset
    58
			String createPath, String fileName, boolean appendProjectName)
hgs
parents:
diff changeset
    59
			throws TraceCompilerException {
hgs
parents:
diff changeset
    60
		TraceProjectFile projectFile = model
hgs
parents:
diff changeset
    61
				.getExtension(TraceProjectFile.class);
hgs
parents:
diff changeset
    62
		if (projectFile == null) {
hgs
parents:
diff changeset
    63
			throw new TraceCompilerException(
hgs
parents:
diff changeset
    64
					TraceCompilerErrorCode.MODEL_NOT_READY);
hgs
parents:
diff changeset
    65
		}
hgs
parents:
diff changeset
    66
		String projectName = ""; //$NON-NLS-1$
hgs
parents:
diff changeset
    67
		if (appendProjectName) {
hgs
parents:
diff changeset
    68
			projectName = projectFile.getProjectName();
hgs
parents:
diff changeset
    69
		}
hgs
parents:
diff changeset
    70
		return getLocationForFile(projectFile.getPath(), projectName,
hgs
parents:
diff changeset
    71
				createPath, fileName);
hgs
parents:
diff changeset
    72
	}
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
	/**
hgs
parents:
diff changeset
    75
	 * Tries to locate existing file with given extension and if not found,
hgs
parents:
diff changeset
    76
	 * proposes a new location for that file. The new location will be
hgs
parents:
diff changeset
    77
	 * <i>createPath</i> or if that is null, the directory where the trace
hgs
parents:
diff changeset
    78
	 * project file resides. Trace project must be open before this can
hgs
parents:
diff changeset
    79
	 * be called
hgs
parents:
diff changeset
    80
	 *
hgs
parents:
diff changeset
    81
	 * @param projectPath
hgs
parents:
diff changeset
    82
	 *            path to the project
hgs
parents:
diff changeset
    83
	 * @param projectName
hgs
parents:
diff changeset
    84
	 *            name of the project
hgs
parents:
diff changeset
    85
	 * @param createPath
hgs
parents:
diff changeset
    86
	 *            the path to create if existing file is not found
hgs
parents:
diff changeset
    87
	 * @param extension
hgs
parents:
diff changeset
    88
	 *            the file extension for the new file
hgs
parents:
diff changeset
    89
	 * @return the project file path for the new file
hgs
parents:
diff changeset
    90
	 */
hgs
parents:
diff changeset
    91
	public static String getLocationForFile(String projectPath,
hgs
parents:
diff changeset
    92
			String projectName, String createPath, String extension) {
hgs
parents:
diff changeset
    93
		ArrayList<String> searchPaths = new ArrayList<String>();
hgs
parents:
diff changeset
    94
		if (createPath != null && createPath.length() > 0) {
hgs
parents:
diff changeset
    95
			// If create path is explicitly specified, it is added to the search
hgs
parents:
diff changeset
    96
			// path list
hgs
parents:
diff changeset
    97
			searchPaths.add(createPath);
hgs
parents:
diff changeset
    98
		}
hgs
parents:
diff changeset
    99
		// Default directories are always included into search
hgs
parents:
diff changeset
   100
		searchPaths.add(ProjectEngine.traceFolderName);
hgs
parents:
diff changeset
   101
		searchPaths.add(SymbianConstants.GROUP_DIRECTORY);
hgs
parents:
diff changeset
   102
		searchPaths.add(SymbianConstants.INCLUDE_DIRECTORY);
hgs
parents:
diff changeset
   103
		String[] pathArr = new String[searchPaths.size()];
hgs
parents:
diff changeset
   104
		searchPaths.toArray(pathArr);
hgs
parents:
diff changeset
   105
		return getLocationForFile(projectPath, projectName, pathArr,
hgs
parents:
diff changeset
   106
				createPath, extension);
hgs
parents:
diff changeset
   107
	}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
	/**
hgs
parents:
diff changeset
   110
	 * Tries to locate existing file and if not found, proposes a new location
hgs
parents:
diff changeset
   111
	 * for that file. The search starts from <i>projectPath</i>. If
hgs
parents:
diff changeset
   112
	 * <i>checkParents</i> is true, the parent directories are also checked if
hgs
parents:
diff changeset
   113
	 * the file is not found
hgs
parents:
diff changeset
   114
	 *
hgs
parents:
diff changeset
   115
	 * @param projectPath
hgs
parents:
diff changeset
   116
	 *            path where to start the search
hgs
parents:
diff changeset
   117
	 * @param projectName
hgs
parents:
diff changeset
   118
	 *            the name of the project
hgs
parents:
diff changeset
   119
	 * @param searchPaths
hgs
parents:
diff changeset
   120
	 *            the sub-paths to be searched
hgs
parents:
diff changeset
   121
	 * @param createPath
hgs
parents:
diff changeset
   122
	 *            the sub-path to create if file is not found
hgs
parents:
diff changeset
   123
	 * @param fileName
hgs
parents:
diff changeset
   124
	 *            extension of the file to be located
hgs
parents:
diff changeset
   125
	 * @return the project file path for the new file
hgs
parents:
diff changeset
   126
	 */
hgs
parents:
diff changeset
   127
	private static String getLocationForFile(String projectPath,
hgs
parents:
diff changeset
   128
			String projectName, String[] searchPaths, String createPath,
hgs
parents:
diff changeset
   129
			String fileName) {
hgs
parents:
diff changeset
   130
		// If the project file is in one of the search paths, the path is
hgs
parents:
diff changeset
   131
		// changed to its parent
hgs
parents:
diff changeset
   132
		File projectPathFile = new File(projectPath);
hgs
parents:
diff changeset
   133
		String projectPathName = projectPathFile.getName();
hgs
parents:
diff changeset
   134
		for (int i = 0; i < searchPaths.length; i++) {
hgs
parents:
diff changeset
   135
			if (searchPaths[i].equals(projectPathName)) {
hgs
parents:
diff changeset
   136
				projectPath = projectPathFile.getParent();
hgs
parents:
diff changeset
   137
				i = searchPaths.length;
hgs
parents:
diff changeset
   138
			}
hgs
parents:
diff changeset
   139
		}
hgs
parents:
diff changeset
   140
		// Tries to find an existing file based on project path and project name
hgs
parents:
diff changeset
   141
		String filePath = findProjectFile(projectPath, projectName,
hgs
parents:
diff changeset
   142
				searchPaths, fileName, false);
hgs
parents:
diff changeset
   143
		if (filePath == null) {
hgs
parents:
diff changeset
   144
			// If file is not found, this returns a new path
hgs
parents:
diff changeset
   145
			filePath = projectPath + File.separator + createPath
hgs
parents:
diff changeset
   146
					+ File.separator + projectName + fileName;
hgs
parents:
diff changeset
   147
		}
hgs
parents:
diff changeset
   148
		return filePath;
hgs
parents:
diff changeset
   149
	}
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
	/**
hgs
parents:
diff changeset
   152
	 * Finds a project file or directory based on a file or directory
hgs
parents:
diff changeset
   153
	 *
hgs
parents:
diff changeset
   154
	 * @param startPath
hgs
parents:
diff changeset
   155
	 *            the file name or path where to start search
hgs
parents:
diff changeset
   156
	 * @param projectName
hgs
parents:
diff changeset
   157
	 *            the name of the project file
hgs
parents:
diff changeset
   158
	 * @param searchDirectories
hgs
parents:
diff changeset
   159
	 *            the directories to search
hgs
parents:
diff changeset
   160
	 * @param fileExtension
hgs
parents:
diff changeset
   161
	 *            the file extension to be located or null if locating one of
hgs
parents:
diff changeset
   162
	 *            the search directories
hgs
parents:
diff changeset
   163
	 * @param checkParents
hgs
parents:
diff changeset
   164
	 *            true if parent directories should be checked
hgs
parents:
diff changeset
   165
	 * @return the file or directory path if found or null if not
hgs
parents:
diff changeset
   166
	 */
hgs
parents:
diff changeset
   167
	private static String findProjectFile(String startPath, String projectName,
hgs
parents:
diff changeset
   168
			String[] searchDirectories, String fileExtension,
hgs
parents:
diff changeset
   169
			boolean checkParents) {
hgs
parents:
diff changeset
   170
		String foundFile = null;
hgs
parents:
diff changeset
   171
		if (startPath != null) {
hgs
parents:
diff changeset
   172
			File file = new File(startPath);
hgs
parents:
diff changeset
   173
			if (!file.isDirectory()) {
hgs
parents:
diff changeset
   174
				file = file.getParentFile();
hgs
parents:
diff changeset
   175
			}
hgs
parents:
diff changeset
   176
			if (file != null) {
hgs
parents:
diff changeset
   177
				do {
hgs
parents:
diff changeset
   178
					for (int i = 0; i < searchDirectories.length
hgs
parents:
diff changeset
   179
							&& foundFile == null; i++) {
hgs
parents:
diff changeset
   180
						foundFile = findProjectFile(searchDirectories[i],
hgs
parents:
diff changeset
   181
								projectName, fileExtension, file);
hgs
parents:
diff changeset
   182
					}
hgs
parents:
diff changeset
   183
					file = file.getParentFile();
hgs
parents:
diff changeset
   184
				} while (file != null && foundFile == null && checkParents);
hgs
parents:
diff changeset
   185
			}
hgs
parents:
diff changeset
   186
		}
hgs
parents:
diff changeset
   187
		return foundFile;
hgs
parents:
diff changeset
   188
	}
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
	/**
hgs
parents:
diff changeset
   191
	 * Searches a single directory for a project file
hgs
parents:
diff changeset
   192
	 *
hgs
parents:
diff changeset
   193
	 * @param searchDirectory
hgs
parents:
diff changeset
   194
	 *            the directory to search
hgs
parents:
diff changeset
   195
	 * @param fileExtension
hgs
parents:
diff changeset
   196
	 *            the file extension to be located or null if locating one of
hgs
parents:
diff changeset
   197
	 *            the search directories
hgs
parents:
diff changeset
   198
	 * @param projectName
hgs
parents:
diff changeset
   199
	 *            the name of the project file
hgs
parents:
diff changeset
   200
	 * @param file
hgs
parents:
diff changeset
   201
	 *            the current file
hgs
parents:
diff changeset
   202
	 * @return the file or directory path if found or null if not
hgs
parents:
diff changeset
   203
	 */
hgs
parents:
diff changeset
   204
	private static String findProjectFile(String searchDirectory,
hgs
parents:
diff changeset
   205
			String projectName, String fileExtension, File file) {
hgs
parents:
diff changeset
   206
		String foundFile = null;
hgs
parents:
diff changeset
   207
		File projectPath = new File(file.getAbsolutePath() + File.separator
hgs
parents:
diff changeset
   208
				+ searchDirectory + File.separator);
hgs
parents:
diff changeset
   209
		if (projectPath.exists()) {
hgs
parents:
diff changeset
   210
			if (fileExtension == null) {
hgs
parents:
diff changeset
   211
				foundFile = projectPath.getAbsolutePath();
hgs
parents:
diff changeset
   212
			} else {
hgs
parents:
diff changeset
   213
				foundFile = findProjectFileFromDirectory(projectPath,
hgs
parents:
diff changeset
   214
					projectName, fileExtension);
hgs
parents:
diff changeset
   215
			}
hgs
parents:
diff changeset
   216
		}
hgs
parents:
diff changeset
   217
		return foundFile;
hgs
parents:
diff changeset
   218
	}
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
	/**
hgs
parents:
diff changeset
   221
	 * Gets the first file with given extension from given directory
hgs
parents:
diff changeset
   222
	 *
hgs
parents:
diff changeset
   223
	 * @param path
hgs
parents:
diff changeset
   224
	 *            the path to search
hgs
parents:
diff changeset
   225
	 * @param projectName
hgs
parents:
diff changeset
   226
	 *            the name of the project file
hgs
parents:
diff changeset
   227
	 * @param fileExtension
hgs
parents:
diff changeset
   228
	 *            the file extension
hgs
parents:
diff changeset
   229
	 * @return the file name if found or null if not
hgs
parents:
diff changeset
   230
	 */
hgs
parents:
diff changeset
   231
	private static String findProjectFileFromDirectory(File path,
hgs
parents:
diff changeset
   232
			String projectName, String fileExtension) {
hgs
parents:
diff changeset
   233
		String proposal = null;
hgs
parents:
diff changeset
   234
		File[] files = path.listFiles();
hgs
parents:
diff changeset
   235
		if (projectName != null) {
hgs
parents:
diff changeset
   236
			// If project name is specified, only the file that matches the name
hgs
parents:
diff changeset
   237
			// is returned
hgs
parents:
diff changeset
   238
			String nameFromProjectFile = projectName + fileExtension;
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
			// Check does user have access rights to the traces folder
hgs
parents:
diff changeset
   241
			if (path.canWrite() == false) {
hgs
parents:
diff changeset
   242
				TraceCompilerEngineGlobals
hgs
parents:
diff changeset
   243
						.getEvents()
hgs
parents:
diff changeset
   244
						.postErrorMessage(
hgs
parents:
diff changeset
   245
								Messages
hgs
parents:
diff changeset
   246
										.getString("ProjectUtils.accesRightErrorText"), null, true); //$NON-NLS-1$
hgs
parents:
diff changeset
   247
				System.exit(1);
hgs
parents:
diff changeset
   248
			}
hgs
parents:
diff changeset
   249
			
hgs
parents:
diff changeset
   250
			for (int i = 0; i < files.length && proposal == null; i++) {
hgs
parents:
diff changeset
   251
				String fname = files[i].getName();
hgs
parents:
diff changeset
   252
				if (fname.equals(nameFromProjectFile)) {
hgs
parents:
diff changeset
   253
					proposal = files[i].getAbsolutePath();
hgs
parents:
diff changeset
   254
				}
hgs
parents:
diff changeset
   255
			}
hgs
parents:
diff changeset
   256
		} else {
hgs
parents:
diff changeset
   257
			// If project name is not specified, this proposes the first file
hgs
parents:
diff changeset
   258
			// which ends with the file extension
hgs
parents:
diff changeset
   259
			for (int i = 0; i < files.length && proposal == null; i++) {
hgs
parents:
diff changeset
   260
				String fname = files[i].getName();
hgs
parents:
diff changeset
   261
				if (fname.length() > fileExtension.length()) {
hgs
parents:
diff changeset
   262
					int extstart = fname.length() - fileExtension.length();
hgs
parents:
diff changeset
   263
					if (fname.substring(extstart).equals(fileExtension)) {
hgs
parents:
diff changeset
   264
						proposal = files[i].getAbsolutePath();
hgs
parents:
diff changeset
   265
					}
hgs
parents:
diff changeset
   266
				}
hgs
parents:
diff changeset
   267
			}
hgs
parents:
diff changeset
   268
		}
hgs
parents:
diff changeset
   269
		return proposal;
hgs
parents:
diff changeset
   270
	}
hgs
parents:
diff changeset
   271
}