package org.pentaho.reporting.engine.classic.core.modules.misc.connections.writer; import org.pentaho.database.model.IDatabaseConnection; import org.pentaho.reporting.engine.classic.core.modules.misc.connections.ConnectionModule; import org.pentaho.reporting.libraries.base.util.StringUtils; import org.pentaho.reporting.libraries.xmlns.common.AttributeList; import org.pentaho.reporting.libraries.xmlns.writer.DefaultTagDescription; import org.pentaho.reporting.libraries.xmlns.writer.XmlWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.Map; import java.util.Set; public class FileDataSourceMgmtWriter implements DataSourceMgmtWriter { private static final String PROP_INDEX_TBS = "INDEX_TBS"; //$NON-NLS-1$ private static final String PROP_DATA_TBS = "DATA_TBS"; //$NON-NLS-1$ private static final String PROP_SERVERNAME = "SERVERNAME"; //$NON-NLS-1$ private static final String PROP_PASSWORD = "PASSWORD"; //$NON-NLS-1$ private static final String PROP_USERNAME = "USERNAME"; //$NON-NLS-1$ private static final String PROP_PORT = "PORT"; //$NON-NLS-1$ private static final String PROP_DATABASE_NAME = "DATABASE_NAME"; //$NON-NLS-1$ private static final String PROP_HOST_NAME = "HOST_NAME"; //$NON-NLS-1$ private static final String PROP_CONTYPE = "CONTYPE"; //$NON-NLS-1$ private static final String PROP_TYPE = "TYPE"; //$NON-NLS-1$ private static final String NODE_ROOT = "databaseMeta"; //$NON-NLS-1$ private static final String NODE_ATTRIBUTES = "attributes"; //$NON-NLS-1$ private static final String NODE_ATTRIBUTE = "attribute"; //$NON-NLS-1$ public FileDataSourceMgmtWriter() { } public void write( final IDatabaseConnection[] connections, final OutputStream out ) throws IOException { DefaultTagDescription tagDescription = new DefaultTagDescription(); tagDescription.setDefaultNamespace( ConnectionModule.NAMESPACE ); tagDescription.setNamespaceHasCData( ConnectionModule.NAMESPACE, false ); tagDescription.setElementHasCData( ConnectionModule.NAMESPACE, "attribute", true ); final XmlWriter writer = new XmlWriter( new OutputStreamWriter( out, "UTF-8" ), tagDescription ); writer.writeXmlDeclaration( "UTF-8" ); final AttributeList rootList = new AttributeList(); rootList.addNamespaceDeclaration( null, ConnectionModule.NAMESPACE ); writer.writeTag( ConnectionModule.NAMESPACE, "connections", rootList, XmlWriter.OPEN ); for ( int i = 0; i < connections.length; i++ ) { final IDatabaseConnection connection = connections[i]; write( connection, writer ); } writer.writeCloseTag(); writer.flush(); } private void write( final IDatabaseConnection databaseConnection, final XmlWriter writer ) throws IOException { final AttributeList rootAttrs = new AttributeList(); if ( databaseConnection.getDatabaseType() != null ) { rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_TYPE, databaseConnection.getDatabaseType() .getShortName() ); } final String port = StringUtils.isEmpty( databaseConnection.getDatabasePort() ) ? "0" : databaseConnection.getDatabasePort(); // Then the basic db information rootAttrs.setAttribute( ConnectionModule.NAMESPACE, "name", databaseConnection.getName() ); rootAttrs.setAttribute( ConnectionModule.NAMESPACE, "id", databaseConnection.getId() ); rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_CONTYPE, setNull( databaseConnection.getAccessType() .getName() ) ); rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_HOST_NAME, setNull( databaseConnection.getHostname() ) ); rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_DATABASE_NAME, setNull( databaseConnection .getDatabaseName() ) ); rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_PORT, String.valueOf( new Long( port ) ) ); // implicit // validate, as // the // interface // allows text // here. rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_USERNAME, setNull( databaseConnection.getUsername() ) ); rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_PASSWORD, setNull( databaseConnection.getPassword() ) ); rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_SERVERNAME, setNull( databaseConnection .getInformixServername() ) ); rootAttrs .setAttribute( ConnectionModule.NAMESPACE, PROP_DATA_TBS, setNull( databaseConnection.getDataTablespace() ) ); rootAttrs.setAttribute( ConnectionModule.NAMESPACE, PROP_INDEX_TBS, setNull( databaseConnection .getIndexTablespace() ) ); writer.writeTag( ConnectionModule.NAMESPACE, NODE_ROOT, rootAttrs, XmlWriter.OPEN ); // Now store all the attributes set on the database connection... // final Map<String, String> attributes = databaseConnection.getAttributes(); final Set<Map.Entry<String, String>> entries = attributes.entrySet(); if ( entries.isEmpty() == false ) { writer.writeTag( null, NODE_ATTRIBUTES, XmlWriter.OPEN ); for ( final Map.Entry<String, String> e : entries ) { writer.writeTag( ConnectionModule.NAMESPACE, NODE_ATTRIBUTE, "name", e.getKey(), XmlWriter.OPEN ); writer.writeTextNormalized( e.getValue(), false ); writer.writeCloseTag(); } writer.writeCloseTag(); } writer.writeCloseTag(); } private String setNull( final String value ) { if ( StringUtils.isEmpty( value ) ) { return null; } return value; } }