public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { ChartModel chartModel = new ChartModel(); chartModel.setChartEngineId(reader.getAttribute("chartEngine")); String attribute = reader.getAttribute("theme"); if (attribute != null) { try { chartModel.setTheme(Enum.valueOf(ChartTheme.class, attribute.toUpperCase())); } catch (Exception e) { // Do nothing } } String cssStyle = reader.getAttribute("style"); if (cssStyle != null) { chartModel.getStyle().setStyleString(cssStyle); } while (reader.hasMoreChildren()) { reader.moveDown(); if (reader.getNodeName().equals("title")) { String title = reader.getValue(); if (title != null) { chartModel.getTitle().setText(title); } cssStyle = reader.getAttribute("style"); if (cssStyle != null) { chartModel.getTitle().getStyle().setStyleString(cssStyle); } attribute = reader.getAttribute("location"); if (attribute != null) { try { chartModel .getTitle() .setLocation(Enum.valueOf(TitleLocation.class, attribute.toUpperCase())); } catch (Exception e) { // Do nothing } } } else if (reader.getNodeName().equals("subtitle")) { String subtitle = reader.getValue(); if ((subtitle != null) && (subtitle.trim().length() > 0)) { StyledText styledText = new StyledText(subtitle); cssStyle = reader.getAttribute("style"); if (cssStyle != null) { styledText.getStyle().setStyleString(cssStyle); } chartModel.getSubtitles().add(styledText); } } else if (reader.getNodeName().equals("legend")) { chartModel.getLegend().setVisible(true); cssStyle = reader.getAttribute("style"); if (cssStyle != null) { chartModel.getLegend().getStyle().setStyleString(cssStyle); } } else if (reader.getNodeName().equals("barPlot") || reader.getNodeName().equals("linePlot") || reader.getNodeName().equals("areaPlot") || reader.getNodeName().equals("piePlot") || reader.getNodeName().equals("dialPlot") || reader.getNodeName().equals("scatterPlot")) { chartModel.setPlot(createPlot(reader)); } reader.moveUp(); } return chartModel; }