~ubuntu-branches/ubuntu/utopic/jing-trang/utopic

« back to all changes in this revision

Viewing changes to mod/rng-schema/src/main/com/thaiopensource/relaxng/output/LocalOutputDirectory.java

  • Committer: Bazaar Package Importer
  • Author(s): Samuel Thibault
  • Date: 2009-09-01 15:53:03 UTC
  • Revision ID: james.westby@ubuntu.com-20090901155303-2kweef05h5v9j3ni
Tags: upstream-20090818
ImportĀ upstreamĀ versionĀ 20090818

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package com.thaiopensource.relaxng.output;
 
2
 
 
3
import com.thaiopensource.xml.util.EncodingMap;
 
4
import com.thaiopensource.xml.out.CharRepertoire;
 
5
 
 
6
import java.io.IOException;
 
7
import java.io.File;
 
8
import java.io.OutputStreamWriter;
 
9
import java.io.BufferedOutputStream;
 
10
import java.io.FileOutputStream;
 
11
import java.util.Map;
 
12
import java.util.HashMap;
 
13
 
 
14
public class LocalOutputDirectory implements OutputDirectory {
 
15
  private final File mainOutputFile;
 
16
  private final String lineSeparator;
 
17
  private final String outputExtension;
 
18
  private String defaultEncoding;
 
19
  private boolean alwaysUseDefaultEncoding;
 
20
  private final int lineLength;
 
21
  // maps URIs to filenames
 
22
  private final Map<String, String> uriMap = new HashMap<String, String>();
 
23
  private final String mainInputExtension;
 
24
  private int indent;
 
25
 
 
26
  public LocalOutputDirectory(String mainSourceUri, File mainOutputFile, String extension,
 
27
                              String encoding, int lineLength, int indent) {
 
28
    this.mainOutputFile = mainOutputFile;
 
29
    this.outputExtension = extension;
 
30
    this.defaultEncoding = encoding;
 
31
    this.lineSeparator = System.getProperty("line.separator");
 
32
    this.lineLength = lineLength;
 
33
    this.indent = indent;
 
34
    this.uriMap.put(mainSourceUri, mainOutputFile.getName());
 
35
    int slashOff = mainSourceUri.lastIndexOf('/');
 
36
    int dotOff = mainSourceUri.lastIndexOf('.');
 
37
    this.mainInputExtension = dotOff > 0 && dotOff > slashOff ? mainSourceUri.substring(dotOff) : "";
 
38
  }
 
39
 
 
40
  public void setEncoding(String encoding) {
 
41
    defaultEncoding = encoding;
 
42
    alwaysUseDefaultEncoding = true;
 
43
  }
 
44
 
 
45
  public OutputDirectory.Stream open(String sourceUri, String encoding) throws IOException {
 
46
    if (encoding == null || alwaysUseDefaultEncoding)
 
47
      encoding = defaultEncoding;
 
48
    String javaEncoding = EncodingMap.getJavaName(encoding);
 
49
    File file = new File(mainOutputFile.getParentFile(), mapFilename(sourceUri));
 
50
    return new OutputDirectory.Stream(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)),
 
51
                                                             javaEncoding),
 
52
                                      encoding,
 
53
                                      CharRepertoire.getInstance(javaEncoding));
 
54
  }
 
55
 
 
56
  public String reference(String fromSourceUri, String toSourceUri) {
 
57
    return mapFilename(toSourceUri);
 
58
  }
 
59
 
 
60
  private String mapFilename(String sourceUri) {
 
61
    String filename = uriMap.get(sourceUri);
 
62
    if (filename == null) {
 
63
      filename = chooseFilename(sourceUri);
 
64
      uriMap.put(sourceUri, filename);
 
65
    }
 
66
    return filename;
 
67
  }
 
68
 
 
69
  private String chooseFilename(String sourceUri) {
 
70
    String filename = sourceUri.substring(sourceUri.lastIndexOf('/') + 1);
 
71
    String base;
 
72
    if (filename.endsWith(mainInputExtension))
 
73
      base = filename.substring(0, filename.length() - mainInputExtension.length());
 
74
    else
 
75
      base = filename;
 
76
    filename = base + outputExtension;
 
77
    for (int i = 1; uriMap.containsValue(filename); i++)
 
78
      filename = base + Integer.toString(i) + outputExtension;
 
79
    return filename;
 
80
  }
 
81
 
 
82
  public String getLineSeparator() {
 
83
    return lineSeparator;
 
84
  }
 
85
 
 
86
  public int getLineLength() {
 
87
    return lineLength;
 
88
  }
 
89
 
 
90
  public int getIndent() {
 
91
    return indent;
 
92
  }
 
93
 
 
94
  public void setIndent(int indent) {
 
95
    this.indent = indent;
 
96
  }
 
97
}