From a83cda9ecd115f1033451df5482fa3030c169791 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sat, 9 Mar 2019 21:45:34 +0100 Subject: [PATCH] custom XStream converters for more compact files --- .../org/diylc/presenter/ColorConverter.java | 56 +++++++++++ .../org/diylc/presenter/FontConverter.java | 59 +++++++++++ .../org/diylc/presenter/MeasureConverter.java | 95 ++++++++++++++++++ .../diylc/presenter/ProjectFileManager.java | 15 ++- diylc/diylc-library/lib/diylc-core.jar | Bin 273849 -> 276939 bytes diylc/diylc-swing/lib/diylc-core.jar | Bin 273849 -> 276939 bytes diylc/diylc-swing/update.xml | 2 +- 7 files changed, 222 insertions(+), 5 deletions(-) create mode 100644 diylc/diylc-core/src/org/diylc/presenter/ColorConverter.java create mode 100644 diylc/diylc-core/src/org/diylc/presenter/FontConverter.java create mode 100644 diylc/diylc-core/src/org/diylc/presenter/MeasureConverter.java diff --git a/diylc/diylc-core/src/org/diylc/presenter/ColorConverter.java b/diylc/diylc-core/src/org/diylc/presenter/ColorConverter.java new file mode 100644 index 00000000..ee581e28 --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/presenter/ColorConverter.java @@ -0,0 +1,56 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC 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. + + DIYLC 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 DIYLC. If not, see . + +*/ +package org.diylc.presenter; + +import java.awt.Color; + +import com.thoughtworks.xstream.converters.MarshallingContext; +import com.thoughtworks.xstream.converters.UnmarshallingContext; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; + +/** + * Serializes {@link Color} objects as hex values instead of r/g/b. Backwards compatible when unmarshalling. + * + * @author Branislav Stojkovic + */ +public class ColorConverter extends com.thoughtworks.xstream.converters.extended.ColorConverter { + + @Override + public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) { + Color c = (Color) object; + writer.addAttribute("hex", String.format("%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue())); + } + + @Override + public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { + if (reader.getAttribute("hex") != null) + return Color.decode("#" + reader.getAttribute("hex")); + return super.unmarshal(reader, context); + } + + @SuppressWarnings("rawtypes") + @Override + public boolean canConvert(Class clazz) { + return Color.class.isAssignableFrom(clazz); + } +} diff --git a/diylc/diylc-core/src/org/diylc/presenter/FontConverter.java b/diylc/diylc-core/src/org/diylc/presenter/FontConverter.java new file mode 100644 index 00000000..4a8dc9ba --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/presenter/FontConverter.java @@ -0,0 +1,59 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC 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. + + DIYLC 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 DIYLC. If not, see . + +*/ +package org.diylc.presenter; + +import java.awt.Font; + +import com.thoughtworks.xstream.converters.MarshallingContext; +import com.thoughtworks.xstream.converters.UnmarshallingContext; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; + +/** + * Serializes {@link Font} objects in a more compact fashion. Backwards compatible when unmarshalling. + * + * @author Branislav Stojkovic + */ +public class FontConverter extends com.thoughtworks.xstream.converters.extended.FontConverter { + + @Override + public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) { + Font f = (Font) object; + writer.addAttribute("name", f.getFontName()); + writer.addAttribute("size", Integer.toString(f.getSize())); + writer.addAttribute("style", Integer.toString(f.getStyle())); + } + + @Override + public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { + if (reader.getAttribute("name") != null) { + return new Font(reader.getAttribute("name"), Integer.parseInt(reader.getAttribute("style")), Integer.parseInt(reader.getAttribute("size"))); + } + return super.unmarshal(reader, context); + } + + @SuppressWarnings("rawtypes") + @Override + public boolean canConvert(Class clazz) { + return Font.class.isAssignableFrom(clazz); + } +} diff --git a/diylc/diylc-core/src/org/diylc/presenter/MeasureConverter.java b/diylc/diylc-core/src/org/diylc/presenter/MeasureConverter.java new file mode 100644 index 00000000..fe946237 --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/presenter/MeasureConverter.java @@ -0,0 +1,95 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC 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. + + DIYLC 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 DIYLC. If not, see . + +*/ +package org.diylc.presenter; + +import org.diylc.core.measures.AbstractMeasure; + +import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl; + +import com.thoughtworks.xstream.converters.Converter; +import com.thoughtworks.xstream.converters.MarshallingContext; +import com.thoughtworks.xstream.converters.UnmarshallingContext; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; + +/** + * Serializes objects of types derived from {@link AbstractMeasure} objects in a compact format. Backwards compatible when unmarshalling. + * + * @author Branislav Stojkovic + */ +public class MeasureConverter implements Converter { + + @SuppressWarnings("rawtypes") + @Override + public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) { + AbstractMeasure m = (AbstractMeasure) object; + if (m.getValue() != null) + writer.addAttribute("value", Double.toString(m.getValue())); + if (m.getUnit() != null) + writer.addAttribute("unit", m.getUnit().name()); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + @Override + public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { + Double value = null; + String unitStr = null; + if (reader.getAttribute("value") != null) { + value = Double.parseDouble(reader.getAttribute("value")); + unitStr = reader.getAttribute("unit"); + } else { + if (reader.hasMoreChildren()) { + reader.moveDown(); + if (reader.getNodeName().equals("value")) + value = Double.parseDouble(reader.getValue()); + else if (reader.getNodeName().equals("unit")) + unitStr = reader.getValue(); + reader.moveUp(); + } + if (reader.hasMoreChildren()) { + reader.moveDown(); + if (reader.getNodeName().equals("value")) + value = Double.parseDouble(reader.getValue()); + else if (reader.getNodeName().equals("unit")) + unitStr = reader.getValue(); + reader.moveUp(); + } + } + try { + Class requiredType = context.getRequiredType(); + ParameterizedTypeImpl generic = (ParameterizedTypeImpl)requiredType.getGenericSuperclass(); + Class unitType = (Class)generic.getActualTypeArguments()[0]; + Object unit = unitStr == null ? null : Enum.valueOf(unitType, unitStr); + return requiredType.getConstructor(Double.class, unitType).newInstance(value, unit); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + @SuppressWarnings("rawtypes") + @Override + public boolean canConvert(Class clazz) { + return AbstractMeasure.class.isAssignableFrom(clazz); + } +} diff --git a/diylc/diylc-core/src/org/diylc/presenter/ProjectFileManager.java b/diylc/diylc-core/src/org/diylc/presenter/ProjectFileManager.java index c8acb3ba..8277ece4 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/ProjectFileManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/ProjectFileManager.java @@ -92,8 +92,15 @@ public class ProjectFileManager { }; } }; - xStream.autodetectAnnotations(true); - xStream.registerConverter(new PointConverter()); + xStream.autodetectAnnotations(true); + xStream.alias("point", java.awt.Point.class); + xStream.alias("font", java.awt.Font.class); + xStream.alias("project", Project.class); + xStream.aliasPackage("diylc", "org.diylc.components"); + xStream.registerConverter(new PointConverter()); + xStream.registerConverter(new ColorConverter()); + xStream.registerConverter(new FontConverter()); + xStream.registerConverter(new MeasureConverter()); xStream.addImmutableType(Color.class); xStream.addImmutableType(java.awt.Point.class); xStream.addImmutableType(org.diylc.core.measures.Voltage.class); @@ -160,7 +167,7 @@ public class ProjectFileManager { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new InputSource(new InputStreamReader(new FileInputStream(file)))); doc.getDocumentElement().normalize(); - if (doc.getDocumentElement().getNodeName().equalsIgnoreCase(Project.class.getName())) { + if (doc.getDocumentElement().getNodeName().equals(Project.class.getName()) || doc.getDocumentElement().getNodeName().equals("project")) { project = parseV3File(fileName, warnings); } else { if (!doc.getDocumentElement().getNodeName().equalsIgnoreCase("layout")) { @@ -209,7 +216,7 @@ public class ProjectFileManager { Reader reader = new InputStreamReader(fis, "UTF-8"); project = (Project) xStream.fromXML(reader); } catch (Exception e) { - LOG.warn("Could not open with the new xStream, trying the old one"); + LOG.warn("Could not open with the new xStream, trying the old one", e); fis.close(); fis = new FileInputStream(fileName); project = (Project) xStreamOld.fromXML(fis); diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index b3442b9c88d05f9fd9897af6246cf59424d1afc6..7fa620bd37fd6b7c21d3ee5361bfa25228dfda0d 100644 GIT binary patch delta 12093 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 R6ctMLJOM%QG=Az5{68*5?;rpG delta 9143 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 NLr3S^N82^J{{s%ytJeSk diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index b3442b9c88d05f9fd9897af6246cf59424d1afc6..7fa620bd37fd6b7c21d3ee5361bfa25228dfda0d 100644 GIT binary patch delta 12093 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 R6ctMLJOM%QG=Az5{68*5?;rpG delta 9143 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 NLr3S^N82^J{{s%ytJeSk diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index a08a32d2..a9ffc4b8 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2596,7 +2596,7 @@ IMPROVEMENT - Cleaner XML format for .DIY files with less cross-references + Cleaner and more compact XML format for .DIY files resulting in files about half the size of originals. Backward compatible with older files, but might introduce issues when opening files from the new version using an old version! BUG_FIX