package org.pentaho.reporting.engine.classic.core.modules.misc.connections.parser;
import org.pentaho.database.model.DatabaseAccessType;
import org.pentaho.database.model.DatabaseConnection;
import org.pentaho.database.model.IDatabaseConnection;
import org.pentaho.database.service.IDatabaseDialectService;
import org.pentaho.database.util.DatabaseTypeHelper;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.modules.misc.connections.ConnectionModule;
import org.pentaho.reporting.libraries.base.boot.ObjectFactory;
import org.pentaho.reporting.libraries.xmlns.parser.AbstractXmlReadHandler;
import org.pentaho.reporting.libraries.xmlns.parser.PropertiesReadHandler;
import org.pentaho.reporting.libraries.xmlns.parser.XmlReadHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import java.util.Map;
import java.util.Properties;
public class DatabaseMetaReadHandler extends AbstractXmlReadHandler {
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_ATTRIBUTES = "attributes"; //$NON-NLS-1$
private static final String NODE_ATTRIBUTE = "attribute"; //$NON-NLS-1$
private final DatabaseTypeHelper databaseTypeHelper;
private DatabaseConnection databaseConnection;
private PropertiesReadHandler propertiesReadHandler;
public DatabaseMetaReadHandler() {
final ObjectFactory objectFactory = ClassicEngineBoot.getInstance().getObjectFactory();
final IDatabaseDialectService dialectService = objectFactory.get( IDatabaseDialectService.class );
this.databaseTypeHelper = new DatabaseTypeHelper( dialectService.getDatabaseTypes() );
}
public IDatabaseConnection getObject() throws SAXException {
return databaseConnection;
}
protected void startParsing( final Attributes attrs ) throws SAXException {
databaseConnection = new DatabaseConnection();
final String databaseType = attrs.getValue( ConnectionModule.NAMESPACE, PROP_TYPE );
if ( databaseType != null ) {
databaseConnection.setDatabaseType( databaseTypeHelper.getDatabaseTypeByShortName( databaseType ) );
} else {
databaseConnection.setDatabaseType( null );
}
databaseConnection.setName( attrs.getValue( ConnectionModule.NAMESPACE, "name" ) );
databaseConnection.setId( attrs.getValue( ConnectionModule.NAMESPACE, "id" ) );
final String accessType = attrs.getValue( ConnectionModule.NAMESPACE, PROP_CONTYPE );
databaseConnection.setAccessType( accessType != null ? DatabaseAccessType.getAccessTypeByName( accessType ) : null );
databaseConnection.setHostname( attrs.getValue( ConnectionModule.NAMESPACE, PROP_HOST_NAME ) );
databaseConnection.setDatabaseName( attrs.getValue( ConnectionModule.NAMESPACE, PROP_DATABASE_NAME ) );
databaseConnection.setDatabasePort( attrs.getValue( ConnectionModule.NAMESPACE, PROP_PORT ) );
databaseConnection.setUsername( attrs.getValue( ConnectionModule.NAMESPACE, PROP_USERNAME ) );
databaseConnection.setPassword( attrs.getValue( ConnectionModule.NAMESPACE, PROP_PASSWORD ) );
databaseConnection.setInformixServername( attrs.getValue( ConnectionModule.NAMESPACE, PROP_SERVERNAME ) );
databaseConnection.setDataTablespace( attrs.getValue( ConnectionModule.NAMESPACE, PROP_DATA_TBS ) );
databaseConnection.setIndexTablespace( attrs.getValue( ConnectionModule.NAMESPACE, PROP_INDEX_TBS ) );
}
protected XmlReadHandler getHandlerForChild( final String uri, final String tagName, final Attributes atts )
throws SAXException {
if ( isSameNamespace( uri ) ) {
if ( NODE_ATTRIBUTES.equals( tagName ) ) {
propertiesReadHandler = new PropertiesReadHandler( NODE_ATTRIBUTE );
return propertiesReadHandler;
}
}
return null;
}
protected void doneParsing() throws SAXException {
if ( propertiesReadHandler == null ) {
return;
}
final Properties result = propertiesReadHandler.getResult();
for ( final Map.Entry<Object, Object> entry : result.entrySet() ) {
final String code = (String) entry.getKey();
final String attribute = (String) entry.getValue();
databaseConnection.getAttributes().put( code, ( attribute == null || attribute.length() == 0 ) ? "" : attribute ); //$NON-NLS-1$
}
}
}