blob: 63cbeaa70192bc6e81e9986833c33b295c0d7e8c [file] [log] [blame]
// Copyright 2009 Google Inc. All Rights Reserved.
package org.unicode.cldr.icu;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.List;
import org.unicode.cldr.icu.ICUResourceWriter.Resource;
import org.unicode.cldr.icu.ICUResourceWriter.ResourceTable;
import org.unicode.cldr.icu.ResourceSplitter.ResultInfo;
class ICUWriter {
private static final String LINESEP = System.getProperty("line.separator");
private static final String BOM = "\uFEFF";
private static final String CHARSET = "UTF-8";
private final String dstDirName;
private final ICULog log;
private final ResourceSplitter splitter;
ICUWriter(String dstDirName, ICULog log, ResourceSplitter splitter) {
this.dstDirName = dstDirName;
this.log = log;
this.splitter = splitter;
}
// private static final ResourceSplitter debugSplitter;
// static {
// List<SplitInfo> splitInfos = new ArrayList<SplitInfo>();
// splitInfos.add(new SplitInfo("/Languages", "lang"));
// splitInfos.add(new SplitInfo("/LanguagesShort", "lang"));
// splitInfos.add(new SplitInfo("/Scripts", "lang"));
// splitInfos.add(new SplitInfo("/Types", "lang"));
// splitInfos.add(new SplitInfo("/Variants", "lang"));
// splitInfos.add(new SplitInfo("/codePatterns", "lang"));
// splitInfos.add(new SplitInfo("/Countries", "terr", "/Territories"));
// splitInfos.add(new SplitInfo("/Currencies", "curr"));
// splitInfos.add(new SplitInfo("/CurrencyPlurals", "curr"));
// splitInfos.add(new SplitInfo("/CurrencyUnitPatterns", "curr"));
// splitInfos.add(new SplitInfo("/zoneStrings", "zone"));
//
// debugSplitter = new ResourceSplitter("/tmp/ldml", splitInfos);
// }
public void writeResource(Resource res, String sourceInfo) {
if (splitter == null) {
String outputFileName = dstDirName + "/" + res.name + ".txt";
writeResource(res, sourceInfo, outputFileName);
} else {
File rootDir = new File(dstDirName);
List<ResultInfo> result = splitter.split(rootDir, (ResourceTable) res);
for (ResultInfo info : result) {
res = info.root;
String outputFileName = info.directory.getAbsolutePath() + "/" + res.name + ".txt";
writeResource(res, sourceInfo, outputFileName);
}
}
}
private void writeResource(Resource set, String sourceInfo, String outputFileName) {
try {
log.log("Writing " + outputFileName);
FileOutputStream file = new FileOutputStream(outputFileName);
BufferedOutputStream writer = new BufferedOutputStream(file);
writeHeader(writer, sourceInfo);
for (Resource res = set; res != null; res = res.next) {
res.sort();
}
for (Resource res = set; res != null; res = res.next) {
res.write(writer, 0, false);
}
writer.flush();
writer.close();
} catch (Resource.MalformedResourceError mre) {
String where = set.findResourcePath(mre.offendingResource);
log.error("Could not write resource " + where + ". " + mre.toString(), mre);
if (!new File(outputFileName).delete()) {
log.error("Failed to delete file");
}
System.exit(1);
} catch (Exception ie) {
log.error("Could not write resource." + ie.toString(), ie);
if (!new File(outputFileName).delete()) {
log.error("Failed to delete file");
}
System.exit(1);
}
}
private void writeLine(OutputStream writer, String line) {
try {
byte[] bytes = line.getBytes(CHARSET);
writer.write(bytes, 0, bytes.length);
} catch (Exception e) {
log.error(e.getMessage(), e);
System.exit(1);
}
}
private void writeHeader(OutputStream writer, String fileName) {
writeBOM(writer);
Calendar c = Calendar.getInstance();
StringBuilder buffer = new StringBuilder();
buffer.append("// ***************************************************************************")
.append(LINESEP)
.append("// *")
.append(LINESEP)
.append("// * Copyright (C) ")
.append(c.get(Calendar.YEAR))
.append(" International Business Machines")
.append(LINESEP)
.append("// * Corporation and others. All Rights Reserved.")
.append(LINESEP)
.append("// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java")
.append(LINESEP);
// buffer.append("// * Date & Time: ")
// .append(c.get(Calendar.YEAR))
// .append("/")
// .append(c.get(Calendar.MONTH) + 1)
// .append("/")
// .append(c.get(Calendar.DAY_OF_MONTH))
// .append(" ")
// .append(c.get(Calendar.HOUR_OF_DAY))
// .append(COLON)
// .append(c.get(Calendar.MINUTE))
// .append(LINESEP);
// String ver = LDMLUtilities.getCVSVersion(fileName);
// if (ver == null) {
// ver = "";
// } else {
// ver = " v" + ver;
// }
String tempdir = fileName.replace('\\', '/');
int index = tempdir.indexOf("/common");
if (index > -1) {
tempdir = "<path>" + tempdir.substring(index, tempdir.length());
} else {
index = tempdir.indexOf("/xml");
if (index > -1) {
tempdir = "<path>" + tempdir.substring(index, tempdir.length());
} else {
tempdir = "<path>/" + tempdir;
}
}
buffer.append("// * Source File:" + tempdir)
.append(LINESEP)
.append("// *")
.append(LINESEP)
.append("// ***************************************************************************")
.append(LINESEP);
writeLine(writer, buffer.toString());
}
private void writeBOM(OutputStream buffer) {
try {
byte[] bytes = BOM.getBytes(CHARSET);
buffer.write(bytes, 0, bytes.length);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}