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<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();
+ }
+ }
+
+
+}