blob: f33bd86175d0c3b176f197fbe84b02b70b26c6e7 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2004, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
*/
package com.ibm.icu.dev.tool.cldr;
import com.ibm.icu.dev.tool.UOption;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import java.io.*;
/**
* @author ram
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class LDMLNodesAdder {
/**
* These must be kept in sync with getOptions().
*/
private static final int HELP1 = 0;
private static final int HELP2 = 1;
private static final int MAINFILE= 2;
private static final int EXTRACTFILE = 3;
private static final int DESTFILE = 4;
private static final int ADDONLY = 5;
private static final UOption[] options = new UOption[] {
UOption.HELP_H(),
UOption.HELP_QUESTION_MARK(),
UOption.create("main", 'm', UOption.REQUIRES_ARG),
UOption.create("extract", 'e', UOption.REQUIRES_ARG),
UOption.DESTDIR(),
UOption.create("add-only", 'a', UOption.NO_ARG),
};
private String mainfile = null;
private String destfile = null;
private String extractfile = null;
private boolean addonly = false;
public static void main(String[] args) {
LDMLNodesAdder cnv = new LDMLNodesAdder();
cnv.processArgs(args);
}
private void usage() {
System.out.println("\nUsage: LDMLNodesAdder [OPTIONS] [XPATH1] [XPATH2]\n\n"+
"This program is used to extract nodes from extract LDML file and merge \n"+
"the extracted nodes with the main LDML file\n"+
"Please refer to the following options. Options are not case sensitive.\n"+
"Options:\n"+
"-m or --main The LDML file to which the extracted nodes are merged\n" +
"-o or --extract The LDML file from which the nodes need to be extracted\n" +
"-d or --destination destination directory, followed by the path, default is current directory.\n"+
"-a or --add-only Don't replace existing nodes in the main document.\n"+
"-h or -? or --help this usage text.\n"+
"example: com.ibm.icu.dev.tool.cldr.LDMLNodesAdder -m locale/common/main/en.xml -o locale/ibmjdk/main/en.xml //ldml/dates/calendars/calendar[@type='chinese'] //ldml/posix");
System.exit(-1);
}
private void processArgs(String[] args) {
int remainingArgc = 0;
try{
remainingArgc = UOption.parseArgs(args, options);
}catch (Exception e){
System.err.println("ERROR: "+ e.toString());
e.printStackTrace();
usage();
}
if(args.length==0 || options[HELP1].doesOccur || options[HELP2].doesOccur) {
usage();
}
if(options[MAINFILE].doesOccur) {
mainfile = options[MAINFILE].value;
}
if(options[DESTFILE].doesOccur) {
destfile = options[DESTFILE].value;
}
if(options[EXTRACTFILE].doesOccur) {
extractfile = options[EXTRACTFILE].value;
}
if(options[ADDONLY].doesOccur) {
addonly = true;
}
if(destfile==null){
throw new RuntimeException("Destination not specified");
}
if(remainingArgc<1){
usage();
System.exit(-1);
}
try{
Document maindoc = LDMLUtilities.parse(mainfile, false);
Document extractdoc = LDMLUtilities.parse(extractfile, false);
System.out.println("INFO: Merging nodes and marking them draft");
mergeNodes(maindoc, extractdoc, args, remainingArgc);
System.out.println("INFO: Removing specials");
removeSpecials(maindoc);
System.out.println("INFO: Fixing eras");
fixEras(maindoc);
maindoc.normalize();
OutputStreamWriter writer = new
OutputStreamWriter(new FileOutputStream(destfile),"UTF-8");
PrintWriter pw = new PrintWriter(writer);
LDMLUtilities.printDOMTree(maindoc,pw);
writer.flush();
}catch( Exception e){
e.printStackTrace();
//System.exit(-1);
}
}
// private static final String xmlheader = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
//private static final String doctype = "<!DOCTYPE ldml SYSTEM \"http://oss.software.ibm.com/cvs/icu/~checkout~/locale/ldml.dtd\">\n";
private void mergeNodes(Document maindoc, Document extractdoc, String[] args, int argc ){
for(int i=0; i< argc; i++){
Node extract = LDMLUtilities.getNode(extractdoc, args[i]);
Node nodeInSource = LDMLUtilities.getNode(maindoc, args[i]);
Node parentNode = null;
StringBuffer xpath = new StringBuffer(args[i]);
if(nodeInSource==null){
int j=0;
while(parentNode==null){
XPathTokenizer.deleteToken(xpath);
parentNode = LDMLUtilities.getNode(maindoc, xpath.toString());
if(j>0){
extract = extract.getParentNode();
}
j++;
}
extract = maindoc.importNode(extract, true);
parentNode.appendChild(extract);
Attr draft = maindoc.createAttribute("draft");
draft.setValue("true");
((Element) extract).setAttributeNode(draft);
}else if(!addonly){
parentNode = nodeInSource.getParentNode();
extract = maindoc.importNode(extract, true);
parentNode.replaceChild(extract, nodeInSource);
Attr draft = maindoc.createAttribute("draft");
draft.setValue("true");
((Element) extract).setAttributeNode(draft);
}
}
}
private void removeSpecials(Document doc){
Node[] nodes = LDMLUtilities.getElementsByTagName(doc, LDMLConstants.SPECIAL);
if(nodes!=null){
for(int i=0;i<nodes.length;i++){
Node parent = nodes[i].getParentNode();
parent.removeChild(nodes[i]);
}
}
}
private void fixEras(Document doc){
Node[] nodes = LDMLUtilities.getElementsByTagName(doc, LDMLConstants.ERA);
if(nodes!=null){
for(int i=0; i<nodes.length; i++){
NamedNodeMap attr = nodes[i].getAttributes();
Node type = attr.getNamedItem(LDMLConstants.TYPE);
if(type!=null){
String val = type.getNodeValue();
int j = Integer.parseInt(val);
if(j>0){
j--;
}
type.setNodeValue(Integer.toString(j));
}
}
}
}
}