sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/model/MemSpyFileManager.java
author Matti Laitinen <matti.t.laitinen@nokia.com>
Wed, 21 Apr 2010 20:01:08 +0300
changeset 7 8e12a575a9b5
permissions -rw-r--r--
MemSpy Carbide Extension 1.6.0

/*
* Copyright (c) 2009 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: 
*
*/


package com.nokia.s60tools.memspy.model;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.ILock;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.widgets.Display;

import com.nokia.s60tools.memspy.interfaces.INewMemSpyFilesObserver;


/**
 * This class is responsible for providing MemSpy files to MainView's content provider.
 * This class read workspace specific files from disk and prepares them for main view. 
 */
public class MemSpyFileManager extends Job {
	private List<MemSpyFileBundle> memSpyFiles = null;
	private INewMemSpyFilesObserver filesObserver = null;
	private ILock accessLock = null;
	private boolean restart = false;
	private boolean jobRunning = false;
	
	
	/**
	 * Constructor.
	 * @param observer, which is notified when reading is finished.
	 */
	public MemSpyFileManager( INewMemSpyFilesObserver observer ) {
		super("MemSpy - Reading Files");
		filesObserver = observer;
		memSpyFiles = null;
		accessLock = Job.getJobManager().newLock();
	}


	/*
	 * (non-Javadoc)
	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
	 */
	protected IStatus run(IProgressMonitor monitor) {
		accessLock.acquire();
		try {
			jobRunning = true;
			if (memSpyFiles == null) {
				memSpyFiles = new ArrayList<MemSpyFileBundle>();
			} else {
				
				// remove no longer existing files
				for (int i = 0; i < memSpyFiles.size(); i++) {
					MemSpyFileBundle file = memSpyFiles.get(i);
					if (!file.exists()) {
						memSpyFiles.remove(i);
						i--;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			accessLock.release();
		}
		
		//get directory
		File cFilesFolder = new File( MemSpyFileOperations.getImportedDirectory() );
		
		if (cFilesFolder.exists() && cFilesFolder.isDirectory()) {
			
			// get folders and files in imported directory
			File[] folders = cFilesFolder.listFiles();
			if (folders != null) {
				for (int j = 0; j < folders.length; j++) {
					File cFolder = folders[j];
					if (cFolder.isDirectory()) {
						accessLock.acquire();
						try {

							MemSpyFileBundle dummy = MemSpyFileBundle.createDummyBundle(cFolder.getAbsolutePath());
							if (!memSpyFiles.contains(dummy)) {
								accessLock.release();
								MemSpyFileBundle bundle = new MemSpyFileBundle(cFolder.getAbsolutePath());
								if (bundle.hasFiles()) {
									accessLock.acquire();
									memSpyFiles.add(bundle);
								}
							} 
							else {
								accessLock.release();
								MemSpyFileBundle bundle = new MemSpyFileBundle(cFolder.getAbsolutePath());
								if (bundle.hasFiles()) {
									accessLock.acquire();
									memSpyFiles.remove(dummy);
									memSpyFiles.add(bundle);
								}
							}
						} 
						catch (Exception e) {
							e.printStackTrace();
						} 
						finally {
							accessLock.release();
						}
					}
				}
			}
		}
		
		filesObserver.memSpyFilesUpdated();
		
		accessLock.acquire();
		if (restart) {
			restart = false;
			accessLock.release();
			reSchedule();
		} 
		else {
			jobRunning = false;
			accessLock.release();
		}
		
		return Status.OK_STATUS;
	}

	/**
	 * Re schelude this job
	 * @see Job#schedule()
	 */
	void reSchedule() {
		Runnable refreshRunnable = new Runnable(){
			public void run(){
				schedule(100);
			}
		};
		
		Display.getDefault().asyncExec(refreshRunnable);        		
	}
	
	/**
	 * Get all MemSpy files for main view to use
	 * @return files
	 */
	public MemSpyFileBundle[] getmemSpyFiles() {
		// files have not yet been read, start reading process
		if (memSpyFiles == null) {
			if(jobRunning == false){
				jobRunning = true;
				setPriority(Job.LONG);
				setUser(false);
				schedule(100);
			}
			MemSpyFileBundle[] cFiles = new MemSpyFileBundle[1];
			cFiles[0] = new MemSpyFileBundle(false);
			return cFiles;
		}
		else{
			return memSpyFiles.toArray(new MemSpyFileBundle[memSpyFiles.size()]);
		}
		
	}
	
	
	/**
	 * Refresh content. Reads files from disk again.
	 * @see MemSpyFileManager#run(IProgressMonitor)
	 */
	public void refresh() {
		
		accessLock.acquire();
		try {
		if (jobRunning) {
			restart = true;
		} else {
				setPriority(Job.LONG);
				setUser(false);
				schedule(100);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			accessLock.release();
		}
	}


}