PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/bundles/plugins-trunk/XML/xml/translate/BuffersOutputDirectory.java

#
Java | 184 lines | 124 code | 28 blank | 32 comment | 6 complexity | 72ac2489107c46d862ab5486a0e5dfbf MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * BuffersOutputDirectory.java - Trang output to jEdit buffers
  3. * :folding=explicit:collapseFolds=1:
  4. *
  5. * Copyright (C) 2010 Eric Le Lay
  6. *
  7. * The XML plugin is licensed under the GNU General Public License, with
  8. * the following exception:
  9. *
  10. * "Permission is granted to link this code with software released under
  11. * the Apache license version 1.1, for example used by the Xerces XML
  12. * parser package."
  13. *
  14. */
  15. package xml.translate;
  16. // {{{ Imports
  17. import java.io.IOException;
  18. import java.io.UnsupportedEncodingException;
  19. import java.io.StringWriter;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import org.gjt.sp.jedit.jEdit;
  23. import org.gjt.sp.jedit.View;
  24. import org.gjt.sp.jedit.Buffer;
  25. import org.gjt.sp.jedit.Mode;
  26. import org.gjt.sp.jedit.MiscUtilities;
  27. import org.gjt.sp.jedit.syntax.ModeProvider;
  28. import org.gjt.sp.util.Log;
  29. import org.gjt.sp.jedit.io.VFSManager;
  30. import com.thaiopensource.relaxng.output.OutputDirectory;
  31. import com.thaiopensource.xml.out.CharRepertoire;
  32. // }}}
  33. /**
  34. * channels Trang output to jEdit buffers.
  35. * For each file Trang wants to write to, a jEdit buffer is opened.
  36. * FIXME: If the file is read-only, writing to it will fail.
  37. */
  38. public class BuffersOutputDirectory implements OutputDirectory
  39. {
  40. private View view;
  41. // maps URIs to filenames
  42. private final Map<String, String> uriMap;
  43. private final String mainInputExtension;
  44. private final String outputExtension;
  45. private final String outputDirectory;
  46. private int outputCount;
  47. private int indent;
  48. private int lineLength;
  49. public BuffersOutputDirectory(View view, String mainInput, String mainOutput){
  50. this.view = view;
  51. this.uriMap = new HashMap<String, String>();
  52. this.mainInputExtension = MiscUtilities.getFileExtension(mainInput);
  53. this.outputDirectory = MiscUtilities.getParentOfPath(mainOutput);
  54. this.outputExtension = MiscUtilities.getFileExtension(mainOutput);
  55. uriMap.put(mainInput,MiscUtilities.getFileName(mainOutput));
  56. // init output properties
  57. Mode outputMode = ModeProvider.instance.getModeForFile(MiscUtilities.getFileName(mainOutput),"");
  58. if(outputMode == null)
  59. {
  60. outputMode = jEdit.getMode("text");
  61. }
  62. indent = ((Integer)outputMode.getProperty("indentSize")).intValue();
  63. lineLength = ((Integer)outputMode.getProperty("maxLineLen")).intValue();
  64. }
  65. public int getIndent()
  66. {
  67. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"getIndent()");
  68. return indent;
  69. }
  70. public int getLineLength(){
  71. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"getLineLength()");
  72. return lineLength;
  73. }
  74. public String getLineSeparator(){
  75. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"getLineSeparator()");
  76. return "\n";
  77. }
  78. public OutputDirectory.Stream open(String sourceUri, String ignoredEncoding)
  79. throws UnsupportedEncodingException
  80. {
  81. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"open("+sourceUri+","+ignoredEncoding+")");
  82. String newSourceURI = MiscUtilities.constructPath(
  83. null
  84. ,outputDirectory
  85. ,mapFilename(sourceUri)
  86. );
  87. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"===>"+newSourceURI);
  88. Buffer b = jEdit.openFile(view, newSourceURI);
  89. BufferWriter writer = new BufferWriter(b);
  90. String encoding = (String)b.getProperty(Buffer.ENCODING);
  91. CharRepertoire repertoire = CharRepertoire.getInstance(encoding);
  92. outputCount++;
  93. return new OutputDirectory.Stream(writer,encoding, repertoire);
  94. }
  95. public void setEncoding(String encoding){
  96. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"setEncoding("+encoding+")");
  97. // no-op
  98. }
  99. public void setIndent(int indent){
  100. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"setIndent("+indent+")");
  101. // no-op
  102. }
  103. public String reference(String fromSourceUri, String toSourceUri) {
  104. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"reference("+fromSourceUri+","+toSourceUri+")");
  105. Log.log(Log.DEBUG,BuffersOutputDirectory.class,"===>"+mapFilename(toSourceUri)+")");
  106. return mapFilename(toSourceUri);
  107. }
  108. public int getOutputCount(){
  109. return outputCount;
  110. }
  111. // {{{ private members
  112. private String mapFilename(String sourceUri) {
  113. String filename = uriMap.get(sourceUri);
  114. if (filename == null) {
  115. filename = chooseFilename(sourceUri);
  116. uriMap.put(sourceUri, filename);
  117. }
  118. return filename;
  119. }
  120. private String chooseFilename(String sourceUri) {
  121. String filename = MiscUtilities.getFileName(sourceUri);
  122. String base;
  123. if (filename.endsWith(mainInputExtension))
  124. base = filename.substring(0, filename.length() - mainInputExtension.length());
  125. else
  126. base = filename;
  127. filename = base + outputExtension;
  128. for (int i = 1; uriMap.containsValue(filename); i++)
  129. filename = base + Integer.toString(i) + outputExtension;
  130. return filename;
  131. }
  132. // }}}
  133. // {{{ BufferWriter class
  134. /**
  135. * writes to a Buffer upon close()
  136. */
  137. public static class BufferWriter extends StringWriter
  138. {
  139. private Buffer targetBuffer;
  140. public BufferWriter(Buffer targetBuffer)
  141. {
  142. super();
  143. this.targetBuffer = targetBuffer;
  144. }
  145. public void close() throws IOException
  146. {
  147. super.close();
  148. VFSManager.waitForRequests();
  149. targetBuffer.beginCompoundEdit();
  150. targetBuffer.remove(0,targetBuffer.getLength());
  151. targetBuffer.insert(0,this.toString());
  152. targetBuffer.endCompoundEdit();
  153. }
  154. }
  155. // }}}
  156. }