/** * $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-impl/src/java/org/sakaiproject/sitestats/impl/parser/DigesterUtil.java $ * $Id: DigesterUtil.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $ * * Copyright (c) 2006-2009 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sakaiproject.sitestats.impl.parser; import java.beans.IntrospectionException; import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.apache.commons.betwixt.AttributeDescriptor; import org.apache.commons.betwixt.expression.Context; import org.apache.commons.betwixt.io.BeanReader; import org.apache.commons.betwixt.io.BeanWriter; import org.apache.commons.betwixt.strategy.DefaultObjectStringConverter; import org.apache.commons.betwixt.strategy.ValueSuppressionStrategy; import org.apache.commons.digester.Digester; import org.sakaiproject.sitestats.api.PrefsData; import org.sakaiproject.sitestats.api.event.ToolInfo; import org.sakaiproject.sitestats.api.report.ReportDef; import org.sakaiproject.sitestats.api.report.ReportParams; public class DigesterUtil { public static Digester configureToolEventsDefDigester(String prefix, Digester digester) { // root digester.addObjectCreate(prefix + "toolEventsDef", ArrayList.class ); // tool tag ToolFactoryImpl toolFactory = new ToolFactoryImpl(); digester.addFactoryCreate(prefix + "toolEventsDef/tool", toolFactory); digester.addBeanPropertySetter(prefix + "toolEventsDef/tool/toolId", "toolId" ); digester.addBeanPropertySetter(prefix + "toolEventsDef/tool/additionalToolIds", "additionalToolIdsStr" ); digester.addBeanPropertySetter(prefix + "toolEventsDef/tool/selected", "selected" ); digester.addSetNext(prefix + "toolEventsDef/tool", "add" ); // event tag EventFactoryImpl eventFactoryImpl = new EventFactoryImpl(); digester.addFactoryCreate(prefix + "toolEventsDef/tool/event", eventFactoryImpl); digester.addBeanPropertySetter(prefix + "toolEventsDef/tool/event/eventId", "eventId" ); digester.addBeanPropertySetter(prefix + "toolEventsDef/tool/event/selected", "selected" ); digester.addBeanPropertySetter(prefix + "toolEventsDef/tool/event/anonymous", "anonymous" ); digester.addSetNext(prefix + "toolEventsDef/tool/event", "addEvent" ); return digester; } public static Digester configurePrefsDigester(Digester digester) { // prefs root digester.addObjectCreate("prefs", PrefsData.class ); digester.addSetProperties("prefs" ); digester.addBeanPropertySetter("prefs/listToolEventsOnlyAvailableInSite", "setListToolEventsOnlyAvailableInSite" ); digester.addBeanPropertySetter("prefs/chartIn3D", "setChartIn3D" ); digester.addBeanPropertySetter("prefs/chartTransparency", "setChartTransparency" ); digester.addBeanPropertySetter("prefs/itemLabelsVisible", "setItemLabelsVisible" ); digester.addBeanPropertySetter("prefs/useAllTools", "setUseAllTools" ); // toolEventsDef digester = configureToolEventsDefDigester("prefs/", digester); digester.addSetNext("prefs/toolEventsDef", "setToolEventsDef" ); return digester; } public static List<ToolInfo> parseToolEventsDefinition(InputStream input) throws Exception{ Digester digester = new Digester(); digester.setValidating(false); digester = configureToolEventsDefDigester("", digester); // eventParserTip tag EventParserTipFactoryImpl eventParserTipFactoryImpl = new EventParserTipFactoryImpl(); digester.addFactoryCreate("toolEventsDef/tool/eventParserTip", eventParserTipFactoryImpl); digester.addSetNestedProperties("toolEventsDef/tool/eventParserTip"); digester.addSetNext("toolEventsDef/tool/eventParserTip", "setEventParserTip" ); return (List<ToolInfo>) digester.parse( input ); } public static ReportParams convertXmlToReportParams(String inputString) throws Exception { BeanReader beanReader = getBeanReader(); StringReader reader = null; ReportParams reportParams = null; try{ reader = new StringReader(inputString); reportParams = (ReportParams) beanReader.parse(reader); }finally{ if(reader != null) { reader.close(); } } return reportParams; } public static String convertReportParamsToXml(ReportParams reportParams) throws Exception { String xml = null; StringWriter outputWriter = null; try{ outputWriter = new StringWriter(); outputWriter.write("<?xml version='1.0' ?>"); BeanWriter beanWriter = getBeanWriter(outputWriter); beanWriter.write("ReportParams", reportParams); xml = outputWriter.toString(); }finally{ outputWriter.close(); } return xml; } public static List<ReportDef> convertXmlToReportDefs(String inputString) throws Exception { BeanReader beanReader = getBeanReader(); StringReader reader = null; List<ReportDef> reportDefs = null; try{ reader = new StringReader(inputString); reportDefs = (List<ReportDef>) beanReader.parse(reader); }finally{ if(reader != null) { reader.close(); } } return reportDefs; } public static String convertReportDefsToXml(List<ReportDef> reportDef) throws Exception { String xml = null; StringWriter outputWriter = null; try{ outputWriter = new StringWriter(); outputWriter.write("<?xml version='1.0' ?>"); BeanWriter beanWriter = getBeanWriter(outputWriter); beanWriter.write("List", reportDef); xml = outputWriter.toString(); }finally{ outputWriter.close(); } return xml; } private static BeanWriter getBeanWriter(final StringWriter outputWriter) { BeanWriter beanWriter = new BeanWriter(outputWriter); beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false); beanWriter.getBindingConfiguration().setMapIDs(false); beanWriter.getBindingConfiguration().setValueSuppressionStrategy(new NullEmptyValueSuppressionStrategy()); beanWriter.getBindingConfiguration().setObjectStringConverter(new SitestatsObjectStringConverter()); beanWriter.setEndOfLine(""); return beanWriter; } private static BeanReader getBeanReader() throws IntrospectionException { BeanReader beanReader = new BeanReader(); beanReader.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false); beanReader.getBindingConfiguration().setMapIDs(false); beanReader.getBindingConfiguration().setValueSuppressionStrategy(new NullEmptyValueSuppressionStrategy()); beanReader.getBindingConfiguration().setObjectStringConverter(new SitestatsObjectStringConverter()); beanReader.registerBeanClass("List", ArrayList.class); beanReader.registerBeanClass("ReportDef", ReportDef.class); beanReader.registerBeanClass("ReportParams", ReportParams.class); return beanReader; } private static class NullEmptyValueSuppressionStrategy extends ValueSuppressionStrategy { @Override public boolean suppressAttribute(AttributeDescriptor attributeDescriptor, String value) { if(value == null || "".equals(value.trim())) { return true; } return false; } } private static class SitestatsObjectStringConverter extends DefaultObjectStringConverter { @Override public Object stringToObject(String value, Class type, String flavour, Context context) { if(value != null && !("").equals(value.trim())) { return super.stringToObject(value, type, flavour, context); }else{ return null; } /*if(isUtilDate(type) ){ try{ return formatter.parse(value); }catch(ParseException ex){ handleException(ex); return value; } }else{ // use ConvertUtils implementation return super.stringToObject(value, type, flavour, context); }*/ } /*private boolean isUtilDate(Class type) { return ( java.util.Date.class.isAssignableFrom(type) && !java.sql.Date.class.isAssignableFrom(type) && !java.sql.Time.class.isAssignableFrom(type) && !java.sql.Timestamp.class.isAssignableFrom(type) ); }*/ } }