diff -r f65f740e69f9 -r 8e12a575a9b5 sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/model/MemSpyFileManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/model/MemSpyFileManager.java Wed Apr 21 20:01:08 2010 +0300 @@ -0,0 +1,207 @@ +/* +* 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 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(); + } 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(); + } + } + + +}