diff -r 000000000000 -r a02c979e8dfd srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/core/job/SeekMetaXMLFilesJob.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srcanaapps/apiquerytool/com.nokia.s60tools.apiquery.cache/src/com/nokia/s60tools/apiquery/cache/core/job/SeekMetaXMLFilesJob.java Sat Jan 09 10:04:11 2010 +0530 @@ -0,0 +1,359 @@ +/* +* Copyright (c) 2007 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.apiquery.cache.core.job; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Collection; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import com.nokia.s60tools.apiquery.cache.configuration.CacheEntry; +import com.nokia.s60tools.apiquery.cache.configuration.CacheEntryStorage; +import com.nokia.s60tools.apiquery.cache.resources.Messages; +import com.nokia.s60tools.apiquery.shared.datatypes.config.DuplicateEntryException; +import com.nokia.s60tools.apiquery.shared.datatypes.config.EntryNotFoundException; +import com.nokia.s60tools.apiquery.shared.datatypes.config.IConfigurationChangedListener; +import com.nokia.s60tools.apiquery.shared.job.AbstractJob; +import com.nokia.s60tools.apiquery.shared.job.JobCancelledByUserException; +import com.nokia.s60tools.apiquery.shared.ui.dialogs.APIQueryMessageBox; +import com.nokia.s60tools.apiquery.shared.util.console.APIQueryConsole; +import com.nokia.s60tools.apiquery.ui.views.main.MainView; +import com.nokia.s60tools.sdk.SdkInformation; +import com.nokia.s60tools.util.resource.FileFinder; +import com.nokia.s60tools.util.resource.FileUtils; +import com.nokia.s60tools.util.resource.IFileFinderObserver; + +/** + * Job for seeking .metaxml files from under SDK ({@link SdkInformation}) given. + */ +public class SeekMetaXMLFilesJob extends AbstractJob implements IFileFinderObserver { + + /** + * Metaxml file type + */ + private static final String METAXML_FILE_SUFFIX = ".metaxml"; //$NON-NLS-1$ + + /** + * s60 folder name in R&D SDK + */ + private static final String S60 = "s60"; //$NON-NLS-1$ + + /*** + * SF folder + * + */ + private static final String SF = "sf"; //$NON-NLS-1$ + + /** + * Information about selected SDK + */ + private final SdkInformation sdkInformation; + + /** + * Total steps as double, to be able to count percentages. + */ + double stepsAsDouble = 1; + + /** + * Folders where to seek .metaxml files under selected SDK + */ + private static final String [] FOLDERS_TO_SEEK_META_FILES = new String [] { + "osext", //$NON-NLS-1$ + "mw", //$NON-NLS-1$ + "app", + "os" }; //$NON-NLS-1$ + + + /** + * Create a Job to seek .metaxml files under selected SDK. + * @param name + * @param sdkInformation + */ + public SeekMetaXMLFilesJob(String name, SdkInformation sdkInformation) { + super(name); + this.sdkInformation = sdkInformation; + setUser(true); + } + + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) + */ + protected IStatus run(IProgressMonitor monitor) { + + + + setMonitor(monitor); + + reportStartTime(); + try { + MainView.enablePropTabcontents(false); + FileFinder finder = new FileFinder(APIQueryConsole.getInstance()); + + String epocRoot = sdkInformation.getEpocRootDir(); + + //System.out.println("epoc 32 " + epocRoot); + + String message = Messages.getString("SeekMetaXMLFilesJob.StartJobMsg_Part1") //$NON-NLS-1$ + +METAXML_FILE_SUFFIX +Messages.getString("SeekMetaXMLFilesJob.StartJobMsg_Part2") +sdkInformation.getSdkId() //$NON-NLS-1$ + +Messages.getString("SeekMetaXMLFilesJob.StartJobMsg_Part3") +epocRoot +"'."; //$NON-NLS-1$ //$NON-NLS-2$ + APIQueryConsole.getInstance().println(message); + + String [] folders = new String[FOLDERS_TO_SEEK_META_FILES.length]; + + boolean isS60 = true; + //try to check if s60 is present + File directoryOfPdfs = new File(epocRoot ); + + if(directoryOfPdfs.isDirectory()) { // check to make sure it is a directory + String filenames[] = directoryOfPdfs.list(); //make array of filenames. + for(int i =0 ;i files) { + + try { + + if(isCanceled() || exitValue == IStatus.CANCEL){ + interrupted(Messages.getString("SeekMetaXMLFilesJob.CancelledByUser")); //$NON-NLS-1$ + } + else if(exitValue == IStatus.OK){ + handleSeekCompleatedOK(files); + } + else{ + handleSeekCompleatedError(exitValue); + } + reportEndTime(); + } catch (Exception e) { + //Handle file not found e.g. errors. + e.printStackTrace(); + handleSeekCompleatedError(e); + } + finally{ + MainView.enablePropTabcontents(true); + + + } + } + + /** + * Handle Error situations after getting data + * @param e + */ + private void handleSeekCompleatedError(Exception e) { + String message = Messages.getString("SeekMetaXMLFilesJob.SeekCompleatedErrorMsg") +sdkInformation.getSdkId(); //$NON-NLS-1$ + APIQueryConsole.getInstance().println(message, APIQueryConsole.MSG_ERROR); + IStatus status = new Status( + Status.ERROR,Platform.PI_RUNTIME, + Status.ERROR,message, e); + + done(status); + } + + /** + * Handle error return values + * @param exitValue + */ + private void handleSeekCompleatedError(int exitValue) { + String message = Messages.getString("SeekMetaXMLFilesJob.SeekCompleatedErrorMsg") +sdkInformation.getSdkId() +Messages.getString("SeekMetaXMLFilesJob.SeekCompleatedExitValueErrorMsg") +exitValue; //$NON-NLS-1$ //$NON-NLS-2$ + APIQueryConsole.getInstance().println(message, APIQueryConsole.MSG_ERROR); + IStatus status = new Status( + Status.ERROR,Platform.PI_RUNTIME, + Status.ERROR,message, null); + + done(status); + } + + /** + * If status was OK, handling completed situation + * @param files + * @throws FileNotFoundException + * @throws IOException + */ + private void handleSeekCompleatedOK(Collection files) throws FileNotFoundException, IOException { + + //We are pretty much done, so marking that we are in 100% of progress, updating storage does not really take any time + progress(steps, Messages.getString("SeekMetaXMLFilesJob.UpdatingDB_ProgressMsg")); //$NON-NLS-1$ + + CacheEntryStorage storage = CacheEntryStorage.getInstance(); + + try { + + + + //set to data store that all are deselected + storage.deselectAll(true);//When SDK is changed, all entries is deselected + + for (File file : files) { + //Read the File , get the API Name + //System.out.println("file path" + file.getAbsolutePath()); + StringBuffer buf = FileUtils.loadDataFromFile(file.getAbsolutePath()); + int startIndex = buf.indexOf(""); + String apiName = buf.substring(startIndex+6, buf.indexOf("",startIndex )); + System.out.println("api name while seeking" + apiName); + + CacheEntry entry = new CacheEntry( + file.getAbsolutePath(), file.getName(), sdkInformation.getSdkId(), + true, file.length(), file.lastModified(),apiName.trim()); + try { + + if(isCanceled()){ + interrupted(Messages.getString("SeekMetaXMLFilesJob.CancelledByUser")); //$NON-NLS-1$ + return; + } + if(storage.contains(entry)){ + storage.updateEntry(entry, true); + }else{ + storage.addEntry(entry, true); + } + } catch (DuplicateEntryException e) { + // Should not be able to occur, because if(storage.contains(entry)) check before adding + e.printStackTrace(); + } + catch (EntryNotFoundException e) { + // Should not be able to occur, because if(storage.contains(entry)) check before update + e.printStackTrace(); + } + + } + + reportStartTime(); + storage.loadAllSelectedDatasToMemory(getMonitor());//There can be parsing errors, so listeners must be notified afterwards + + //Notifying listeners, only one notifying should be enaugh. + storage.notifyConfigurationChangeListeners(IConfigurationChangedListener.ALL_ENTRYS_UPDATED); + + //If there was some load errors. + if(storage.isLoadErros()){ + JobMessageUtils.showLoadErrorDialog(); + } + reportEndTime(); + + + if(files == null || files.size()==0){ + showNoMetadatasWarning(); + } + + done(Status.OK_STATUS); + + } catch (JobCancelledByUserException e) { + e.printStackTrace(); + //return original map + done(Status.CANCEL_STATUS); + } + } + + /** + * Show warning dialog when no metadata found from selected sdk + */ + private void showNoMetadatasWarning() { + Runnable showWarning = new Runnable(){ + + public void run() { + APIQueryMessageBox msg = new APIQueryMessageBox( + Messages.getString("SeekMetaXMLFilesJob.MetadataNotFoundWarningMsg_Part1") //$NON-NLS-1$ + +sdkInformation.getSdkId() + +Messages.getString("SeekMetaXMLFilesJob.MetadataNotFoundWarningMsg_Part2") , //$NON-NLS-1$ + SWT.OK| SWT.ICON_WARNING ); + msg.open(); + } + }; + Display.getDefault().asyncExec(showWarning); + } + + public void interrupted(String reasonMsg) { + done(Status.CANCEL_STATUS); + super.cancel(); + } + + /* (non-Javadoc) + * @see com.nokia.s60tools.util.resource.IFileFinderObserver#isCancelled() + */ + public boolean isCanceled(){ + return getMonitor().isCanceled(); + } + + /* (non-Javadoc) + * @see com.nokia.s60tools.util.resource.IFileFinderObserver#beginTask(java.lang.String, int) + */ + public void beginTask(String name, int steps) { + + //Its not allowed to dived with "0" + if(steps < 1){ + steps = 1; + } + this.steps = steps; + stepsAsDouble = new Double(steps).doubleValue(); + + getMonitor().beginTask(name, PROGRESS_COMPLETED_PERCENTAGE); + } + + /* (non-Javadoc) + * @see com.nokia.s60tools.apiquery.shared.job.AbstractJob#progress(int, java.lang.String) + */ + public void progress(int stepsCompleated, String prosessing) { + + try { + int persentage = (new Double( stepsCompleated / stepsAsDouble * 100)).intValue(); + + super.progress(persentage, prosessing); + } catch (JobCancelledByUserException e) { + e.printStackTrace(); + done(Status.CANCEL_STATUS); + } + } + + +}