1 22 package org.gjt.sp.jedit; 23 24 import org.gjt.sp.util.Log; 25 import org.gjt.sp.util.XMLUtilities; 26 import org.gjt.sp.util.IOUtilities; 27 import org.xml.sax.helpers.DefaultHandler ; 28 import org.xml.sax.InputSource ; 29 import org.xml.sax.Attributes ; 30 31 import java.io.*; 32 33 37 public class JEditRegisterSaver implements RegisterSaver 38 { 39 public void loadRegisters() 41 { 42 String settingsDirectory = jEdit.getSettingsDirectory(); 43 if(settingsDirectory == null) 44 return; 45 46 File registerFile = new File(MiscUtilities.constructPath( 47 jEdit.getSettingsDirectory(),"registers.xml")); 48 if(!registerFile.exists()) 49 return; 50 51 registersModTime = registerFile.lastModified(); 52 53 Log.log(Log.MESSAGE,jEdit.class,"Loading registers.xml"); 54 55 RegistersHandler handler = new RegistersHandler(); 56 try 57 { 58 Registers.setLoading(true); 59 XMLUtilities.parseXML(new FileInputStream(registerFile), 60 handler); 61 } 62 catch (IOException ioe) 63 { 64 Log.log(Log.ERROR, Registers.class, ioe); 65 } 66 finally 67 { 68 Registers.setLoading(false); 69 } 70 } 72 public void saveRegisters() 74 { 75 76 Log.log(Log.MESSAGE,Registers.class,"Saving registers.xml"); 77 File file1 = new File(MiscUtilities.constructPath( 78 jEdit.getSettingsDirectory(), "#registers.xml#save#")); 79 File file2 = new File(MiscUtilities.constructPath( 80 jEdit.getSettingsDirectory(), "registers.xml")); 81 if(file2.exists() && file2.lastModified() != registersModTime) 82 { 83 Log.log(Log.WARNING,Registers.class,file2 + " changed" 84 + " on disk; will not save registers"); 85 return; 86 } 87 88 jEdit.backupSettingsFile(file2); 89 90 String lineSep = System.getProperty("line.separator"); 91 92 BufferedWriter out = null; 93 94 boolean ok = false; 95 96 try 97 { 98 out = new BufferedWriter(new FileWriter(file1)); 99 100 out.write("<?xml version=\"1.0\"?>"); 101 out.write(lineSep); 102 out.write("<!DOCTYPE REGISTERS SYSTEM \"registers.dtd\">"); 103 out.write(lineSep); 104 out.write("<REGISTERS>"); 105 out.write(lineSep); 106 107 Registers.Register[] registers = Registers.getRegisters(); 108 for(int i = 0; i < registers.length; i++) 109 { 110 Registers.Register register = registers[i]; 111 if(register == null || 112 i == '$' || 113 i == '%' || 114 register.toString().length() == 0 115 ) 116 continue; 117 118 out.write("<REGISTER NAME=\""); 119 if(i == '"') 120 out.write("""); 121 else 122 out.write((char)i); 123 out.write("\">"); 124 125 out.write(XMLUtilities.charsToEntities( 126 register.toString(), false)); 127 128 out.write("</REGISTER>"); 129 out.write(lineSep); 130 } 131 132 out.write("</REGISTERS>"); 133 out.write(lineSep); 134 135 ok = true; 136 } 137 catch(Exception e) 138 { 139 Log.log(Log.ERROR,Registers.class,e); 140 } 141 finally 142 { 143 IOUtilities.closeQuietly(out); 144 } 145 146 if(ok) 147 { 148 150 file2.delete(); 151 file1.renameTo(file2); 152 } 153 154 registersModTime = file2.lastModified(); 155 } 157 private static long registersModTime; 158 159 static class RegistersHandler extends DefaultHandler 161 { 162 public InputSource resolveEntity(String publicId, String systemId) 164 { 165 return XMLUtilities.findEntity(systemId, "registers.dtd", getClass()); 166 } 168 public void startElement(String uri, String localName, 170 String qName, Attributes attrs) 171 { 172 registerName = attrs.getValue("NAME"); 173 inRegister = "REGISTER".equals(qName); 174 } 176 public void endElement(String uri, String localName, String name) 178 { 179 if(name.equals("REGISTER")) 180 { 181 if(registerName == null || registerName.length() != 1) 182 Log.log(Log.ERROR,this,"Malformed NAME: " + registerName); 183 else 184 Registers.setRegister(registerName.charAt(0),charData.toString()); 185 inRegister = false; 186 charData.setLength(0); 187 } 188 } 190 public void characters(char[] ch, int start, int length) 192 { 193 if (inRegister) 194 charData.append(ch, start, length); 195 } 197 private String registerName; 199 private StringBuffer charData = new StringBuffer (); 200 private boolean inRegister; 201 } } 204 | Popular Tags |