/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2009 Alex Buloichik
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OmegaT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.omegat.convert.v20to21;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.XMLDecoder;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import gen.core.filters.Files;
import gen.core.filters.Filter;
import gen.core.filters.Filters;
/**
* Convert some configs from v2.0 to v2.1
*
* @author Alex Buloichik (alex73mail@gmail.com)
*/
public class Convert20to21 {
/**
* Convert filters config ('filters.conf') into new format.
*
* @param fromFile
* old config file
* @param toFile
* new config file
* @throws Exception
*/
public static void convertFiltersConfig(final File fromFile, final File toFile) throws Exception {
if (!fromFile.exists()) {
return;
}
String c = read(fromFile);
org.omegat.convert.v20to21.data.Filters filters;
XMLDecoder xmldec = new XMLDecoder(new ByteArrayInputStream(c.getBytes("UTF-8")));
try {
filters = (org.omegat.convert.v20to21.data.Filters) xmldec.readObject();
} finally {
xmldec.close();
}
Filters res = new Filters();
for (org.omegat.convert.v20to21.data.OneFilter f : filters.getFilter()) {
Filter fo = new Filter();
res.getFilters().add(fo);
fo.setClassName(f.getClassName());
fo.setEnabled(f.isOn());
for (org.omegat.convert.v20to21.data.Instance i : f.getInstance()) {
Files io = new Files();
fo.getFiles().add(io);
io.setSourceFilenameMask(i.getSourceFilenameMask());
io.setTargetFilenamePattern(i.getTargetFilenamePattern());
io.setSourceEncoding(i.getSourceEncoding());
io.setTargetEncoding(i.getTargetEncoding());
}
Serializable opts = f.getOptions();
if (opts != null) {
BeanInfo bi = Introspector.getBeanInfo(opts.getClass());
for (PropertyDescriptor prop : bi.getPropertyDescriptors()) {
if ("class".equals(prop.getName())) {
continue;
}
Object value = prop.getReadMethod().invoke(opts);
Filter.Option op = new Filter.Option();
op.setName(prop.getName());
op.setValue(value.toString());
fo.getOption().add(op);
}
}
}
convertTextFilter(res);
convertHTMLFilter2(res);
JAXBContext CTX = JAXBContext.newInstance(Filters.class);
Marshaller m = CTX.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(res, toFile);
}
/**
* Read old config file and replace package names.
*
* @param f
* old config file
* @return old config file with replaces package names
* @throws IOException
*/
private static String read(File f) throws IOException {
StringBuilder r = new StringBuilder();
char[] c = new char[8192];
int len;
try (InputStreamReader rd = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8)) {
while ((len = rd.read(c)) >= 0) {
r.append(c, 0, len);
}
}
String res = r.toString();
res = res.replace("org.omegat.filters2.master.Filters", "org.omegat.convert.v20to21.data.Filters");
res = res
.replace("org.omegat.filters2.master.OneFilter", "org.omegat.convert.v20to21.data.OneFilter");
res = res.replace("org.omegat.filters2.Instance", "org.omegat.convert.v20to21.data.Instance");
res = res.replace("org.omegat.filters2.html2.HTMLOptions",
"org.omegat.convert.v20to21.data.HTMLOptions");
res = res.replace("org.omegat.filters2.text.TextOptions",
"org.omegat.convert.v20to21.data.TextOptions");
res = res.replace("org.omegat.filters3.xml.opendoc.OpenDocOptions",
"org.omegat.convert.v20to21.data.OpenDocOptions");
res = res.replace("org.omegat.filters3.xml.openxml.OpenXMLOptions",
"org.omegat.convert.v20to21.data.OpenXMLOptions");
res = res.replace("org.omegat.filters3.xml.xhtml.XHTMLOptions",
"org.omegat.convert.v20to21.data.XHTMLOptions");
return res;
}
/**
* Convert TextFilter options from int to string.
*
* @param res
*/
private static void convertTextFilter(Filters res) {
for (Filter f : res.getFilters()) {
if (!f.getClassName().equals("org.omegat.filters2.text.TextFilter")) {
continue;
}
for (Filter.Option opt : f.getOption()) {
if (opt.getName().equals("segmentOn")) {
try {
switch (Integer.parseInt(opt.getValue())) {
case 1:
opt.setValue("BREAKS");
break;
case 2:
opt.setValue("EMPTYLINES");
break;
case 3:
opt.setValue("NEVER");
break;
}
} catch (Exception ex) {
}
}
}
}
}
/**
* Convert HTMLFilter2 options from int to string.
*
* @param res
*/
private static void convertHTMLFilter2(Filters res) {
for (Filter f : res.getFilters()) {
if (!f.getClassName().equals("org.omegat.filters2.html2.HTMLFilter2")) {
continue;
}
for (Filter.Option opt : f.getOption()) {
if (opt.getName().equals("rewriteEncoding")) {
try {
switch (Integer.parseInt(opt.getValue())) {
case 1:
opt.setValue("ALWAYS");
break;
case 2:
opt.setValue("IFHEADER");
break;
case 3:
opt.setValue("IFMETA");
break;
case 4:
opt.setValue("NEVER");
break;
}
} catch (Exception ex) {
}
}
}
}
}
}