tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceEngine.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
* Source engine manages source documents that are opened to Eclipse UI
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.engine.source;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.util.ArrayList;
hgs
parents:
diff changeset
    22
import java.util.Iterator;
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    25
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    26
import com.nokia.tracecompiler.source.SourceDocumentInterface;
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.source.SourceDocumentMonitor;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.source.SourceDocumentProcessor;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.utils.DocumentFactory;
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
/**
hgs
parents:
diff changeset
    32
 * Source engine manages source documents that are opened to Eclipse UI.
hgs
parents:
diff changeset
    33
 * 
hgs
parents:
diff changeset
    34
 */
hgs
parents:
diff changeset
    35
public class SourceEngine implements SourceDocumentProcessor,
hgs
parents:
diff changeset
    36
		Iterable<SourceProperties> {
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
	/**
hgs
parents:
diff changeset
    39
	 * Document monitor
hgs
parents:
diff changeset
    40
	 */
hgs
parents:
diff changeset
    41
	private SourceDocumentMonitor documentMonitor;
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
	/**
hgs
parents:
diff changeset
    44
	 * Trace model listener implementation
hgs
parents:
diff changeset
    45
	 */
hgs
parents:
diff changeset
    46
	private SourceEngineModelListener modelListener = new SourceEngineModelListener(
hgs
parents:
diff changeset
    47
			this);
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
	/**
hgs
parents:
diff changeset
    50
	 * Trace model extension listener
hgs
parents:
diff changeset
    51
	 */
hgs
parents:
diff changeset
    52
	private SourceEngineModelExtensionListener extensionListener = new SourceEngineModelExtensionListener(
hgs
parents:
diff changeset
    53
			this);
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	/**
hgs
parents:
diff changeset
    56
	 * The callback interfaces are notified about source file changes
hgs
parents:
diff changeset
    57
	 */
hgs
parents:
diff changeset
    58
	private ArrayList<SourceListener> listeners = new ArrayList<SourceListener>();
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	/**
hgs
parents:
diff changeset
    61
	 * Running flag
hgs
parents:
diff changeset
    62
	 */
hgs
parents:
diff changeset
    63
	private boolean running;
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
	/**
hgs
parents:
diff changeset
    66
	 * Trace model
hgs
parents:
diff changeset
    67
	 */
hgs
parents:
diff changeset
    68
	private TraceModel model;
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
	/**
hgs
parents:
diff changeset
    71
	 * Source list
hgs
parents:
diff changeset
    72
	 */
hgs
parents:
diff changeset
    73
	private ArrayList<SourceProperties> tempList = new ArrayList<SourceProperties>();
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
	/**
hgs
parents:
diff changeset
    76
	 * Read-only files
hgs
parents:
diff changeset
    77
	 */
hgs
parents:
diff changeset
    78
	private String[] READ_ONLY = { ".h" //$NON-NLS-1$
hgs
parents:
diff changeset
    79
	};
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
	/**
hgs
parents:
diff changeset
    82
	 * Non-source file list
hgs
parents:
diff changeset
    83
	 */
hgs
parents:
diff changeset
    84
	private ArrayList<String> nonSourceFiles = new ArrayList<String>();
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
	/**
hgs
parents:
diff changeset
    87
	 * Constructor
hgs
parents:
diff changeset
    88
	 * 
hgs
parents:
diff changeset
    89
	 * @param model
hgs
parents:
diff changeset
    90
	 *            the trace model
hgs
parents:
diff changeset
    91
	 */
hgs
parents:
diff changeset
    92
	public SourceEngine(TraceModel model) {
hgs
parents:
diff changeset
    93
		this.model = model;
hgs
parents:
diff changeset
    94
	}
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
	/**
hgs
parents:
diff changeset
    97
	 * Starts this engine. Does nothing if already running
hgs
parents:
diff changeset
    98
	 * @throws Exception 
hgs
parents:
diff changeset
    99
	 */
hgs
parents:
diff changeset
   100
	public void start() throws Exception {
hgs
parents:
diff changeset
   101
		if (!running) {
hgs
parents:
diff changeset
   102
			documentMonitor = DocumentFactory.getDocumentMonitor();
hgs
parents:
diff changeset
   103
			documentMonitor.startMonitor(this);
hgs
parents:
diff changeset
   104
			running = true;
hgs
parents:
diff changeset
   105
			model.addModelListener(modelListener);
hgs
parents:
diff changeset
   106
			model.addExtensionListener(extensionListener);
hgs
parents:
diff changeset
   107
		}
hgs
parents:
diff changeset
   108
	}
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
	/**
hgs
parents:
diff changeset
   111
	 * Shuts down the source engine. Does nothing if already stopped
hgs
parents:
diff changeset
   112
	 */
hgs
parents:
diff changeset
   113
	public void shutdown() {
hgs
parents:
diff changeset
   114
		if (running) {
hgs
parents:
diff changeset
   115
			documentMonitor.stopMonitor();
hgs
parents:
diff changeset
   116
			documentMonitor = null;
hgs
parents:
diff changeset
   117
			running = false;
hgs
parents:
diff changeset
   118
			model.removeModelListener(modelListener);
hgs
parents:
diff changeset
   119
			model.removeExtensionListener(extensionListener);
hgs
parents:
diff changeset
   120
		}
hgs
parents:
diff changeset
   121
	}
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
	/**
hgs
parents:
diff changeset
   124
	 * Adds source listener callback interface
hgs
parents:
diff changeset
   125
	 * 
hgs
parents:
diff changeset
   126
	 * @param listener
hgs
parents:
diff changeset
   127
	 *            the new listener
hgs
parents:
diff changeset
   128
	 */
hgs
parents:
diff changeset
   129
	public void addSourceListener(SourceListener listener) {
hgs
parents:
diff changeset
   130
		listeners.add(listener);
hgs
parents:
diff changeset
   131
	}
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
	/**
hgs
parents:
diff changeset
   134
	 * Removes a source listener
hgs
parents:
diff changeset
   135
	 * 
hgs
parents:
diff changeset
   136
	 * @param listener
hgs
parents:
diff changeset
   137
	 *            the listener to be removed
hgs
parents:
diff changeset
   138
	 */
hgs
parents:
diff changeset
   139
	public void removeSourceListener(SourceListener listener) {
hgs
parents:
diff changeset
   140
		listeners.remove(listener);
hgs
parents:
diff changeset
   141
	}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
	/**
hgs
parents:
diff changeset
   144
	 * Gets the sources
hgs
parents:
diff changeset
   145
	 * 
hgs
parents:
diff changeset
   146
	 * @return the sources
hgs
parents:
diff changeset
   147
	 */
hgs
parents:
diff changeset
   148
	public Iterator<SourceProperties> getSources() {
hgs
parents:
diff changeset
   149
		tempList.clear();
hgs
parents:
diff changeset
   150
		for (SourceDocumentInterface doc : documentMonitor) {
hgs
parents:
diff changeset
   151
			tempList.add((SourceProperties) doc.getOwner());
hgs
parents:
diff changeset
   152
		}
hgs
parents:
diff changeset
   153
		return tempList.iterator();
hgs
parents:
diff changeset
   154
	}
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
	/*
hgs
parents:
diff changeset
   157
	 * (non-Javadoc)
hgs
parents:
diff changeset
   158
	 * 
hgs
parents:
diff changeset
   159
	 * @see java.lang.Iterable#iterator()
hgs
parents:
diff changeset
   160
	 */
hgs
parents:
diff changeset
   161
	public Iterator<SourceProperties> iterator() {
hgs
parents:
diff changeset
   162
		return getSources();
hgs
parents:
diff changeset
   163
	}
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
	/*
hgs
parents:
diff changeset
   166
	 * (non-Javadoc)
hgs
parents:
diff changeset
   167
	 * 
hgs
parents:
diff changeset
   168
	 * @see com.nokia.tracecompiler.source.SourceDocumentProcessor#
hgs
parents:
diff changeset
   169
	 *      sourceOpened(com.nokia.tracecompiler.source.SourceDocumentInterface)
hgs
parents:
diff changeset
   170
	 */
hgs
parents:
diff changeset
   171
	public void sourceOpened(SourceDocumentInterface source) throws TraceCompilerException {
hgs
parents:
diff changeset
   172
		SourceProperties properties = new SourceProperties(model,
hgs
parents:
diff changeset
   173
				documentMonitor.getFactory(), source);
hgs
parents:
diff changeset
   174
		// Headers are marked read-only
hgs
parents:
diff changeset
   175
		for (String s : READ_ONLY) {
hgs
parents:
diff changeset
   176
			String fileName = properties.getFileName();
hgs
parents:
diff changeset
   177
			if (fileName != null && fileName.endsWith(s)) {
hgs
parents:
diff changeset
   178
				properties.setReadOnly(true);
hgs
parents:
diff changeset
   179
				break;
hgs
parents:
diff changeset
   180
			}
hgs
parents:
diff changeset
   181
		}
hgs
parents:
diff changeset
   182
		properties.sourceOpened();
hgs
parents:
diff changeset
   183
		source.setOwner(properties);
hgs
parents:
diff changeset
   184
		for (SourceListener l : listeners) {
hgs
parents:
diff changeset
   185
			l.sourceOpened(properties);
hgs
parents:
diff changeset
   186
		}
hgs
parents:
diff changeset
   187
	}
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
	/**
hgs
parents:
diff changeset
   190
	 * Adds a non-source file to this list.
hgs
parents:
diff changeset
   191
	 * 
hgs
parents:
diff changeset
   192
	 * @param filePath
hgs
parents:
diff changeset
   193
	 *            the non-source file path to added
hgs
parents:
diff changeset
   194
	 */
hgs
parents:
diff changeset
   195
	public void addNonSourceFile(String filePath) {
hgs
parents:
diff changeset
   196
		nonSourceFiles.add(filePath);
hgs
parents:
diff changeset
   197
	}
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
	/**
hgs
parents:
diff changeset
   200
	 * Removes a non-source file from this list
hgs
parents:
diff changeset
   201
	 * 
hgs
parents:
diff changeset
   202
	 * @param filePath
hgs
parents:
diff changeset
   203
	 *            the non-source file path to be removed
hgs
parents:
diff changeset
   204
	 * @return true if removed
hgs
parents:
diff changeset
   205
	 */
hgs
parents:
diff changeset
   206
	public boolean removeNonSourceFile(String filePath) {
hgs
parents:
diff changeset
   207
		boolean retVal = nonSourceFiles.remove(filePath);
hgs
parents:
diff changeset
   208
		return retVal;
hgs
parents:
diff changeset
   209
	}
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
	/**
hgs
parents:
diff changeset
   212
	 * Gets list of non-source files
hgs
parents:
diff changeset
   213
	 * 
hgs
parents:
diff changeset
   214
	 * @return the list of non-source file paths
hgs
parents:
diff changeset
   215
	 */
hgs
parents:
diff changeset
   216
	public ArrayList<String> getNonSourceFiles() {
hgs
parents:
diff changeset
   217
		return nonSourceFiles;
hgs
parents:
diff changeset
   218
	}
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
}