diff -r a151135b0cf9 -r aa2539c91954 tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileEngine.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/propertyfile/PropertyFileEngine.java Fri Oct 08 14:56:39 2010 +0300 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2008 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: +* +* Property file management engine +* +*/ +package com.nokia.tracecompiler.engine.propertyfile; + +import java.io.File; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import com.nokia.tracecompiler.engine.TraceCompilerEngineBase; +import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals; +import com.nokia.tracecompiler.engine.project.ProjectEngine; +import com.nokia.tracecompiler.file.FileUtils; +import com.nokia.tracecompiler.model.TraceCompilerException; +import com.nokia.tracecompiler.model.TraceModel; +import com.nokia.tracecompiler.project.ProjectUtils; +import com.nokia.tracecompiler.source.SourceConstants; + +/** + * Property file management engine + * + */ +public final class PropertyFileEngine extends TraceCompilerEngineBase { + + /** + * Trace model + */ + private TraceModel model; + + /** + * Constructor + * + * @param model + * the trace model + */ + public PropertyFileEngine(TraceModel model) { + this.model = model; + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectOpened() + */ + @Override + public void projectOpened() throws TraceCompilerException { + TracePropertyFile propertyFile = model + .getExtension(TracePropertyFile.class); + if (propertyFile == null) { + String fileName = null; + try { + fileName = ProjectUtils.getLocationForFile(model, + ProjectEngine.traceFolderName, + PropertyFileConstants.PROPERTY_FILE_NAME, false); + } catch (TraceCompilerException e) { + // Model should always be open when traceProjectOpened is + // called + } + if (fileName != null) { + propertyFile = parsePropertyFile(fileName); + } + } + if (propertyFile == null) { + String msg = Messages + .getString("PropertyFileEngine.FailedToAttachFile"); //$NON-NLS-1$ + TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg, null, true); + } + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#projectClosing() + */ + @Override + public void projectClosed() { + model.removeExtensions(TracePropertyFile.class); + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracecompiler.engine.TraceCompilerEngine#exportProject() + */ + @Override + public void exportProject() { + } + + /** + * Parses the property file + * + * @param fileName + * the file path + * @return the property file + */ + private TracePropertyFile parsePropertyFile(String fileName) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + DocumentBuilder builder; + TracePropertyFile propertyFile = null; + try { + builder = factory.newDocumentBuilder(); + File file = new File(fileName); + if (file.exists()) { + try { + PropertyFileParser parser = new PropertyFileParser(model, + fileName, builder); + parser.parse(); + propertyFile = new TracePropertyFile(file.getParent(), + parser.getDocument()); + } catch (TraceCompilerException e) { + // Problem parsing document -> Backup and create new + TraceCompilerEngineGlobals.getEvents().postError(e); + createBackup(fileName); + } + } + if (propertyFile == null) { + propertyFile = new TracePropertyFile(file.getParent(), builder + .newDocument()); + } + model.addExtension(propertyFile); + } catch (ParserConfigurationException e) { + } + return propertyFile; + } + + /** + * Creates a backup of the property file + * + * @param path + * the file to be backed up + */ + private void createBackup(String path) { + boolean backup = false; + File file = new File(path); + if (file.exists()) { + boolean allexist = true; + // Checks the existing backup files and renames the old file to + // largest available number starting from 0 + File f = null; + for (int i = 0; i < PropertyFileConstants.BACKUP_COUNT && allexist; i++) { + f = new File(path + i + PropertyFileConstants.BACKUP_EXTENSION); + if (!f.exists()) { + backup = FileUtils.copyFile(file, f); + allexist = false; + } + } + if (allexist) { + // If all backups from 0 to 9 exist, the old ones are moved + // back 1 step. The new file is renamed to *9.h + for (int i = 0; i < PropertyFileConstants.BACKUP_COUNT; i++) { + f = new File(path + i + + PropertyFileConstants.BACKUP_EXTENSION); + if (i == 0) { + f.delete(); + } else { + f.renameTo(new File(path + (i - 1) + + PropertyFileConstants.BACKUP_EXTENSION)); + } + } + f = new File(path + PropertyFileConstants.LAST_BACKUP); + backup = FileUtils.copyFile(file, f); + } + if (f != null && backup) { + String msg = Messages + .getString("PropertyFileEngine.PropertyFileBackUpPrefix") //$NON-NLS-1$ + + FileUtils.convertSeparators( + SourceConstants.FORWARD_SLASH_CHAR, f + .getAbsolutePath(), false); + TraceCompilerEngineGlobals.getEvents().postInfoMessage(msg, null); + } + } + } + +}