package org.safehaus.penrose.source; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.dom4j.Element; import org.dom4j.tree.DefaultElement; import org.dom4j.tree.DefaultText; import org.dom4j.tree.DefaultAttribute; import org.safehaus.penrose.mapping.Expression; import org.safehaus.penrose.util.BinaryUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileWriter; /** * @author Endi Sukma Dewata */ public class SourceWriter { public Logger log = LoggerFactory.getLogger(getClass()); public void write(File file, SourceConfigManager sourceConfigManager) throws Exception { log.debug("Writing "+file+"."); Element element = createElement(sourceConfigManager); FileWriter fw = new FileWriter(file); OutputFormat format = OutputFormat.createPrettyPrint(); format.setTrimText(false); XMLWriter writer = new XMLWriter(fw, format); writer.startDocument(); writer.startDTD( "sources", "-//Penrose/DTD Sources "+getClass().getPackage().getSpecificationVersion()+"//EN", "http://penrose.safehaus.org/dtd/sources.dtd" ); writer.write(element); writer.close(); } public Element createElement(SourceConfigManager sources) throws Exception { Element element = new DefaultElement("sources"); for (SourceConfig sourceConfig : sources.getSourceConfigs()) { element.add(createElement(sourceConfig)); } return element; } public Element createElement(SourceConfig sourceConfig) throws Exception { log.debug("Source "+sourceConfig.getName()+":"); Element element = new DefaultElement("source"); element.addAttribute("name", sourceConfig.getName()); if (!sourceConfig.isEnabled()) element.addAttribute("enabled", "false"); String sourceClass = sourceConfig.getSourceClass(); if (sourceClass != null) { Element sourceClassElement = new DefaultElement("source-class"); sourceClassElement.add(new DefaultText(sourceClass)); element.add(sourceClassElement); } String description = sourceConfig.getDescription(); if (description != null) { Element descriptionElement = new DefaultElement("description"); descriptionElement.add(new DefaultText(description)); element.add(descriptionElement); } String partitionName = sourceConfig.getPartitionName(); if (partitionName != null) { Element sourceName = new DefaultElement("partition-name"); sourceName.add(new DefaultText(partitionName)); element.add(sourceName); } String connectionName = sourceConfig.getConnectionName(); if (connectionName != null) { Element connectionElement = new DefaultElement("connection-name"); connectionElement.add(new DefaultText(connectionName)); element.add(connectionElement); } for (FieldConfig fieldConfig : sourceConfig.getFieldConfigs()) { Element fieldElement = createElement(fieldConfig); element.add(fieldElement); } for (IndexConfig indexConfig : sourceConfig.getIndexConfigs()) { Element indexElement = createElement(indexConfig); element.add(indexElement); } for (String name : sourceConfig.getParameterNames()) { String value = sourceConfig.getParameter(name); Element parameter = new DefaultElement("parameter"); Element paramName = new DefaultElement("param-name"); paramName.add(new DefaultText(name)); parameter.add(paramName); Element paramValue = new DefaultElement("param-value"); paramValue.add(new DefaultText(value)); parameter.add(paramValue); element.add(parameter); } return element; } public Element createElement(IndexConfig indexConfig) throws Exception { log.debug(" - Index "+indexConfig.getName()+":"); Element indexElement = new DefaultElement("index"); if (indexConfig.getName() != null) indexElement.addAttribute("name", indexConfig.getName()); for (String fieldName : indexConfig.getFieldNames()) { Element fieldNameElement = new DefaultElement("field-name"); fieldNameElement.add(new DefaultText(fieldName)); indexElement.add(fieldNameElement); } return indexElement; } public Element createElement(FieldConfig fieldConfig) throws Exception { log.debug(" - Field "+fieldConfig.getName()+":"); Element element = new DefaultElement("field"); element.addAttribute("name", fieldConfig.getName()); if (!fieldConfig.getName().equals(fieldConfig.getOriginalName())) { log.debug(" - originalName: "+fieldConfig.getOriginalName()); element.addAttribute("originalName", fieldConfig.getOriginalName()); } if (fieldConfig.isPrimaryKey()) { log.debug(" - primaryKey: "+fieldConfig.isPrimaryKey()); element.addAttribute("primaryKey", "true"); } if (!fieldConfig.isSearchable()) { log.debug(" - searchable: "+fieldConfig.isSearchable()); element.addAttribute("searchable", "false"); } if (fieldConfig.isUnique()) { log.debug(" - unique: "+fieldConfig.isUnique()); element.addAttribute("unique", "true"); } if (fieldConfig.isIndex()) { log.debug(" - index: "+fieldConfig.isIndex()); element.addAttribute("index", "true"); } if (fieldConfig.isCaseSensitive()) { log.debug(" - caseSensitive: "+fieldConfig.isCaseSensitive()); element.addAttribute("caseSensitive", "true"); } if (fieldConfig.isAutoIncrement()) { log.debug(" - autoIncrement: "+fieldConfig.isAutoIncrement()); element.addAttribute("autoIncrement", "true"); } if (!FieldConfig.DEFAULT_TYPE.equals(fieldConfig.getType())) { log.debug(" - type: "+fieldConfig.getType()); element.addAttribute("type", fieldConfig.getType()); } if (fieldConfig.getOriginalType() != null) { log.debug(" - originalType: "+fieldConfig.getOriginalType()); element.addAttribute("originalType", fieldConfig.getOriginalType()); } if (fieldConfig.getCastType() != null) { log.debug(" - castType: "+fieldConfig.getCastType()); element.addAttribute("castType", fieldConfig.getCastType()); } if (fieldConfig.getLength() != fieldConfig.getDefaultLength()) { log.debug(" - length: "+fieldConfig.getLength()); element.addAttribute("length", ""+ fieldConfig.getLength()); } if (fieldConfig.getPrecision() != FieldConfig.DEFAULT_PRECISION) { log.debug(" - precision: "+fieldConfig.getPrecision()); element.addAttribute("precision", ""+ fieldConfig.getPrecision()); } if (fieldConfig.getConstant() != null) { Object value = fieldConfig.getConstant(); if (value instanceof byte[]) { String s = BinaryUtil.encode(BinaryUtil.BASE64, (byte[])value); log.debug(" - binary: "+s); Element e = element.addElement("binary"); e.addText(s); } else { log.debug(" - constant: "+value); Element e = element.addElement("constant"); e.addText((String)value); } } else if (fieldConfig.getVariable() != null) { log.debug(" - variable: "+fieldConfig.getVariable()); Element scriptElement = new DefaultElement("variable"); scriptElement.setText(fieldConfig.getVariable()); element.add(scriptElement); } Expression expression = fieldConfig.getExpression(); if (expression != null) { log.debug(" - expression foreach: "+expression.getForeach()); log.debug(" - expression var: "+expression.getVar()); log.debug(" - expression script: "+expression.getScript()); element.add(createElement(fieldConfig.getExpression())); } return element; } public Element createElement(Expression expression) { Element element = new DefaultElement("expression"); if (expression.getForeach() != null) element.add(new DefaultAttribute("foreach", expression.getForeach())); if (expression.getVar() != null) element.add(new DefaultAttribute("var", expression.getVar())); element.setText(expression.getScript()); return element; } }