/** * AbstractExporter.java * Created On 2007, Jul 5, 2007 12:10:51 PM * @author E. Rajasekar */ package app.astrosoft.export; import java.io.BufferedWriter; import java.io.FileWriter; import java.text.Format; import java.util.EnumMap; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.namespace.QName; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.events.Attribute; import app.astrosoft.beans.AshtaVargaChartData; import app.astrosoft.beans.Degree; import app.astrosoft.beans.HousePosition; import app.astrosoft.beans.PlanetChartData; import app.astrosoft.beans.PlanetaryInfo; import app.astrosoft.consts.AstrosoftTableColumn; import app.astrosoft.consts.Language; import app.astrosoft.consts.Planet; import app.astrosoft.consts.Rasi; import app.astrosoft.consts.XmlConsts; import app.astrosoft.core.Ashtavarga; import app.astrosoft.core.Compactibility; import app.astrosoft.core.Horoscope; import app.astrosoft.core.PanchangList; import app.astrosoft.core.ShadBala; import app.astrosoft.core.Vimshottari; import app.astrosoft.pref.AstrosoftPref; import app.astrosoft.ui.AstroSoft; import app.astrosoft.ui.table.ColumnMetaData; import app.astrosoft.ui.table.Table; import app.astrosoft.ui.table.TableData; import app.astrosoft.ui.table.TableRowData; import app.astrosoft.util.AstroUtil; /** * This is abstract Exporter class to implement common behaviour between all Exporter classes. * All non-common operations throws UnsupportedOperationException and concrete subclasses * should provide implementation if it really supports that operation. * * @author Raja * */ public abstract class AbstractExporter implements Exporter{ private static final Logger log = Logger.getLogger(AbstractExporter.class.getName()); protected static final XMLOutputFactory factory = XMLOutputFactory.newInstance(); protected static final XMLEventFactory xmlef = XMLEventFactory.newInstance(); protected static final Format formatter = new java.text.DecimalFormat("000.00"); protected XMLEventWriter xmlWriter; public AbstractExporter(String file) { try { xmlWriter = factory.createXMLEventWriter(new BufferedWriter(new FileWriter(file))); }catch(Exception e){ log.log(Level.SEVERE, "Exception in creating xml event writer ", e); } } public void export2Xml(Exportable exportable){ //Switch to English to write all data in English AstrosoftPref pref = AstroSoft.getPreferences(); Language currLang = pref.getLanguage(); pref.setLanguage(Language.ENGLISH); exportable.doExport(this); // Switch back to current language setting pref.setLanguage(currLang); } /** * Use this method if table data needs to be represented as key-value pair * @param data * @param title */ public <E extends TableRowData> void exportTableData(TableData<E> data, QName tableTitle, QName rowTitle) { try { xmlWriter.add(xmlef.createStartElement(tableTitle, null,null)); for(int i = 0; i < data.getRowCount(); i++){ TableRowData row = data.getRow(i); xmlWriter.add(xmlef.createStartElement(rowTitle, null,null)); xmlWriter.add(xmlef.createAttribute(XmlConsts.Name, row.getColumnData(AstrosoftTableColumn.Key).toString())); xmlWriter.add(xmlef.createCharacters(row.getColumnData(AstrosoftTableColumn.Value).toString())); xmlWriter.add(xmlef.createEndElement(rowTitle,null)); } xmlWriter.add(xmlef.createEndElement(tableTitle, null)); }catch(Exception e){ log.log(Level.SEVERE, "Exception in writing horosocope xml document", e); } } public <E extends TableRowData> void exportTableData(Table table , QName tableTitle, QName rowTitle) { exportTableData(table.getTableData(), table.getColumnMetaData(), tableTitle, rowTitle); } public <E extends TableRowData> void exportTableData(TableData<E> data, ColumnMetaData colMetaData , QName tableTitle, QName rowTitle) { exportTableData(data,colMetaData,tableTitle, null, rowTitle); } /** * Use this method for regular table * @param data * @param title */ public <E extends TableRowData> void exportTableData(TableData<E> data, ColumnMetaData colMetaData , QName tableTitle, Attribute titleAttribute, QName rowTitle) { try { xmlWriter.add(xmlef.createStartElement(tableTitle, null,null)); if (titleAttribute != null){ xmlWriter.add(titleAttribute); } for(int i = 0; i < data.getRowCount(); i++){ TableRowData row = data.getRow(i); xmlWriter.add(xmlef.createStartElement(rowTitle, null,null)); for (AstrosoftTableColumn col : colMetaData.getVisibleColumns()) { QName colTag = new QName(XmlConsts.XML_NS, col.name()); xmlWriter.add(xmlef.createStartElement(colTag, null, null)); Object value = row.getColumnData(col); if (value != null ) { xmlWriter.add(xmlef.createCharacters(formatTableValue(colMetaData.getColumnClass(col), value))); } xmlWriter.add(xmlef.createEndElement(colTag,null)); } xmlWriter.add(xmlef.createEndElement(rowTitle,null)); } xmlWriter.add(xmlef.createEndElement(tableTitle, null)); }catch(Exception e){ log.log(Level.SEVERE, "Exception in writing horosocope xml document", e); } } private static String formatTableValue(Class columnClass , Object value){ String strVal; if (columnClass == Degree.class){ strVal = AstroUtil.dms(Double.valueOf(value.toString())); } else if (value instanceof Double){ strVal = formatter.format(value); } else{ strVal = value.toString(); } return strVal; } public void export(PlanetChartData planetChart) { try { xmlWriter.add(xmlef.createStartElement(XmlConsts.CHART_TAG, null,null)); xmlWriter.add(xmlef.createAttribute(XmlConsts.Name, planetChart.getChartName())); for(Rasi rasi:Rasi.values()){ xmlWriter.add(xmlef.createStartElement(XmlConsts.HOUSE_TAG, null,null)); xmlWriter.add(xmlef.createAttribute(XmlConsts.Number, String.valueOf(rasi.ordinal()+1))); EnumMap<Rasi, List<Planet>> planetsInRasi = planetChart.getPlanetsInRasi(); if (planetsInRasi.keySet().contains(rasi)){ for(Planet planet : planetsInRasi.get(rasi)){ xmlWriter.add(xmlef.createStartElement(XmlConsts.PLANET_TAG, null,null)); xmlWriter.add(xmlef.createCharacters(planet.sym())); xmlWriter.add(xmlef.createEndElement(XmlConsts.PLANET_TAG, null)); } } xmlWriter.add(xmlef.createEndElement(XmlConsts.HOUSE_TAG, null)); } xmlWriter.add(xmlef.createEndElement(XmlConsts.CHART_TAG, null)); }catch(Exception e){ log.log(Level.SEVERE, "Exception in writing chart xml ", e); } } public void export(Ashtavarga ashtavarga) { throw new UnsupportedOperationException("Operation export(ashtavarga) is not supported"); } public void export(AshtaVargaChartData ashtavargaChart) { throw new UnsupportedOperationException("Operation export(ashtavargaChart) is not supported"); } public void export(ShadBala shadBala) { throw new UnsupportedOperationException("Operation export(shadBala) is not supported"); } public void export(PlanetaryInfo planetaryInfo) { throw new UnsupportedOperationException("Operation export(planetaryInfo) is not supported"); } public void export(HousePosition housePosition) { throw new UnsupportedOperationException("Operation export(housePosition) is not supported"); } public void export(Vimshottari vimshottari) { throw new UnsupportedOperationException("Operation export(vimshottari) is not supported"); } public void export(Horoscope horoscope) { throw new UnsupportedOperationException("Operation export(horoscope) is not supported"); } public void export(Compactibility compactibility) { throw new UnsupportedOperationException("Operation export(compactibility) is not supported"); } public void export(PanchangList panchangList) { throw new UnsupportedOperationException("Operation export(panchangList) is not supported"); } }