001 /****************************************************************************** 002 * Copyright (C) MActor Developers. All rights reserved. * 003 * ---------------------------------------------------------------------------* 004 * This file is part of MActor. * 005 * * 006 * MActor is free software; you can redistribute it and/or modify * 007 * it under the terms of the GNU General Public License as published by * 008 * the Free Software Foundation; either version 2 of the License, or * 009 * (at your option) any later version. * 010 * * 011 * MActor is distributed in the hope that it will be useful, * 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 014 * GNU General Public License for more details. * 015 * * 016 * You should have received a copy of the GNU General Public License * 017 * along with MActor; if not, write to the Free Software * 018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * 019 ******************************************************************************/ 020 package org.mactor.ui.gui.project; 021 022 import java.io.File; 023 import java.io.FileReader; 024 import java.io.IOException; 025 import java.util.Map; 026 import java.util.zip.CRC32; 027 028 import org.dom4j.Document; 029 import org.dom4j.DocumentException; 030 import org.dom4j.Element; 031 import org.dom4j.io.SAXReader; 032 import org.mactor.framework.MactorException; 033 import org.mactor.framework.spec.ProjectContext; 034 035 public class XmlFileProjectTreeNode extends XmlProjectTreeNode { 036 File sourceFile; 037 boolean isConfigFile; 038 long checksum; 039 private XmlFileProjectTreeNode(ProjectNodeType nodeType, Element modelElement, Map<String, ProjectNodeType> nodeTypeDictionary) { 040 super(nodeType, modelElement, nodeTypeDictionary); 041 checksum = computeChecksum(modelElement.getDocument()); 042 } 043 public static XmlProjectTreeNode buildFromFile(File sourceFile, Map<String, ProjectNodeType> nodeTypeDictionary, boolean isConfigFile) throws MactorException { 044 try { 045 return buildFromDocument(sourceFile, new SAXReader().read(new FileReader(sourceFile)), nodeTypeDictionary, isConfigFile); 046 } catch (IOException ioe) { 047 throw new MactorException(ioe); 048 } catch (DocumentException de) { 049 throw new MactorException(de); 050 } 051 } 052 public static XmlProjectTreeNode buildFromDocument(File sourceFile, Document doc, Map<String, ProjectNodeType> nodeTypeDictionary, boolean isConfigFile) { 053 Element element = doc.getRootElement(); 054 ProjectNodeType type = nodeTypeDictionary.get(element.getName()); 055 if (type == null) 056 return null; 057 XmlFileProjectTreeNode node = new XmlFileProjectTreeNode(type, element, nodeTypeDictionary); 058 node.sourceFile = sourceFile; 059 node.isConfigFile = isConfigFile; 060 return node; 061 } 062 @Override 063 protected void model_delete() throws MactorException { 064 ProjectContext.getGlobalInstance().deleteFile(sourceFile); 065 if (ProjectNodeType.MBC_MESSAGE_BROKERS.equals(getNodeType())) 066 ProjectContext.getGlobalInstance().setDirty(true); 067 } 068 @Override 069 protected boolean model_rename(String newName) throws MactorException { 070 if (!newName.endsWith(".xml")) 071 newName = newName + ".xml"; 072 this.sourceFile = ProjectContext.getGlobalInstance().renameFile(sourceFile, newName); 073 return true; 074 } 075 @Override 076 protected String model_getName() { 077 return sourceFile.getName(); 078 } 079 @Override 080 protected ProjectTreeNode copy() throws MactorException { 081 try { 082 File newFile = ProjectContext.getGlobalInstance().duplicateFile(sourceFile); 083 XmlProjectTreeNode newNode = buildFromDocument(newFile, new SAXReader().read(new FileReader(newFile)), super.nodeTypeDictionary, isConfigFile); 084 if (ProjectNodeType.MBC_MESSAGE_BROKERS.equals(getNodeType())) 085 ProjectContext.getGlobalInstance().setDirty(true); 086 return newNode; 087 } catch (IOException ioe) { 088 throw new MactorException(ioe); 089 } catch (DocumentException de) { 090 throw new MactorException(de); 091 } 092 } 093 @Override 094 protected void model_save() throws MactorException { 095 long newChecksum = computeChecksum(getModelElement().getDocument()); 096 if (newChecksum != checksum) { 097 checksum = newChecksum; 098 ProjectContext.getGlobalInstance().writeDocumentToFile(sourceFile, getModelElement().getDocument()); 099 if (ProjectNodeType.MBC_MESSAGE_BROKERS.equals(getNodeType())) 100 ProjectContext.getGlobalInstance().setDirty(true); 101 } 102 } 103 @Override 104 protected void model_detatch() throws MactorException { 105 ProjectContext.getGlobalInstance().deleteFile(sourceFile); 106 if (ProjectNodeType.MBC_MESSAGE_BROKERS.equals(getNodeType())) 107 ProjectContext.getGlobalInstance().setDirty(true); 108 } 109 private static long computeChecksum(Document doc) { 110 CRC32 c = new CRC32(); 111 c.update(doc.asXML().getBytes()); 112 return c.getValue(); 113 } 114 }