/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.platform.dataaccess.datasource.wizard;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.pentaho.database.model.DatabaseAccessType;
import org.pentaho.database.model.DatabaseConnection;
import org.pentaho.database.model.DatabaseType;
import org.pentaho.database.model.IDatabaseConnection;
import org.pentaho.database.util.DatabaseTypeHelper;
import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.Element;
import com.google.gwt.xml.client.Node;
import com.google.gwt.xml.client.NodeList;
import com.google.gwt.xml.client.Text;
import com.google.gwt.xml.client.XMLParser;
public class DatabaseConnectionConverter {
private static final String USERNAME = "username";
private static final String ATTRIBUTES = "attributes";
private static final String DATABASE_TYPE = "databaseType";
private static final String ACCESS_TYPE = "accessType";
private static final String PASSWORD = "password";
private static final String NAME = "name";
private static final String SERVER_NAME = "serverName";
private static final String DATA_TABLESPACE = "dataTablespace";
private static final String INDEX_TABLESPACE = "indexTablespace";
private static final String HOSTNAME = "hostname";
private static final String DATABASE_PORT = "databasePort";
private static final String DATABASE_NAME = "databaseName";
private static final String DATABASE_CONNECTION = "databaseConnection";
private DatabaseTypeHelper databaseTypeHelper;
public DatabaseConnectionConverter( DatabaseTypeHelper databaseTypeHelper ) {
this.databaseTypeHelper = databaseTypeHelper;
}
public String convertToXml( IDatabaseConnection dbConn ) {
Document document = XMLParser.createDocument();
try {
Element databaseConnection = document.createElement( DATABASE_CONNECTION );
document.appendChild( databaseConnection );
Element databaseName = document.createElement( DATABASE_NAME );
Text databaseNameText = document.createTextNode( dbConn.getDatabaseName() );
databaseName.appendChild( databaseNameText );
databaseConnection.appendChild( databaseName );
Element databasePort = document.createElement( DATABASE_PORT );
Text databasePortText = document.createTextNode( dbConn.getDatabasePort() );
databasePort.appendChild( databasePortText );
databaseConnection.appendChild( databasePort );
Element hostname = document.createElement( HOSTNAME );
Text hostnameText = document.createTextNode( dbConn.getHostname() );
hostname.appendChild( hostnameText );
databaseConnection.appendChild( hostname );
Element indexTablespace = document.createElement( INDEX_TABLESPACE );
Text indexTablespaceText = document.createTextNode( dbConn.getIndexTablespace() );
indexTablespace.appendChild( indexTablespaceText );
databaseConnection.appendChild( indexTablespace );
Element dataTablespace = document.createElement( DATA_TABLESPACE );
Text dataTablespaceText = document.createTextNode( dbConn.getIndexTablespace() );
dataTablespace.appendChild( dataTablespaceText );
databaseConnection.appendChild( dataTablespace );
Element informixServername = document.createElement( SERVER_NAME );
Text informixServernameText = document.createTextNode( dbConn.getInformixServername() );
informixServername.appendChild( informixServernameText );
databaseConnection.appendChild( informixServername );
Element name = document.createElement( NAME );
Text nameText = document.createTextNode( dbConn.getName() );
name.appendChild( nameText );
databaseConnection.appendChild( name );
Element username = document.createElement( USERNAME );
Text usernameTxt = document.createTextNode( dbConn.getUsername() );
username.appendChild( usernameTxt );
databaseConnection.appendChild( username );
Element password = document.createElement( PASSWORD );
Text passwordText = document.createTextNode( dbConn.getPassword() );
password.appendChild( passwordText );
databaseConnection.appendChild( password );
Element accessType = document.createElement( ACCESS_TYPE );
Text accessTypeText = document.createTextNode( dbConn.getAccessType().getName() );
accessType.appendChild( accessTypeText );
databaseConnection.appendChild( accessType );
Element databaseType = document.createElement( DATABASE_TYPE );
Text databaseTypeText = document.createTextNode( dbConn.getDatabaseType().getShortName() );
databaseType.appendChild( databaseTypeText );
databaseConnection.appendChild( databaseType );
Element attrributes = document.createElement( ATTRIBUTES );
databaseConnection.appendChild( attrributes );
Map<String, String> attributeMap = dbConn.getAttributes();
for ( String key : attributeMap.keySet() ) {
Element attribute = document.createElement( key );
Text attributeText = document.createTextNode( attributeMap.get( key ) );
attribute.appendChild( attributeText );
attrributes.appendChild( attribute );
}
return document.toString();
} catch ( Exception e ) {
return null;
}
}
public IDatabaseConnection convertToObject( String xml ) {
Document document = XMLParser.parse( xml );
Element element = document.getDocumentElement();
IDatabaseConnection databaseConnection = new DatabaseConnection();
databaseConnection.setDatabaseName( getNodeValueByTagName( element, DATABASE_NAME ) );
databaseConnection.setHostname( getNodeValueByTagName( element, HOSTNAME ) );
databaseConnection.setIndexTablespace( getNodeValueByTagName( element, INDEX_TABLESPACE ) );
databaseConnection.setDataTablespace( getNodeValueByTagName( element, DATA_TABLESPACE ) );
databaseConnection.setName( getNodeValueByTagName( element, NAME ) );
databaseConnection.setUsername( getNodeValueByTagName( element, USERNAME ) );
databaseConnection.setPassword( getNodeValueByTagName( element, PASSWORD ) );
databaseConnection.setDatabasePort( getNodeValueByTagName( element, DATABASE_PORT ) );
databaseConnection
.setAccessType( DatabaseAccessType.getAccessTypeByName( getNodeValueByTagName( element, ACCESS_TYPE ) ) );
databaseConnection.setDatabaseType(
(DatabaseType) databaseTypeHelper.getDatabaseTypeByShortName( getNodeValueByTagName( element, DATABASE_TYPE ) ) );
databaseConnection.setPassword( getNodeValueByTagName( element, PASSWORD ) );
databaseConnection.setInformixServername( getNodeValueByTagName( element, SERVER_NAME ) );
for ( Node node : getNodesByTagName( element, ATTRIBUTES ) ) {
databaseConnection.getAttributes().put( node.getNodeName(), node.getNodeValue() );
}
return databaseConnection;
}
/*
* Return the first name that matched the tagName. Starting from the
* current element location
*/
private Node getNodeByTagName( Element element, String tagName ) {
NodeList list = element.getChildNodes();
for ( int i = 0; i < list.getLength(); i++ ) {
Node node = list.item( i );
if ( node != null && node.getNodeName().equals( tagName ) ) {
return node;
}
}
return null;
}
/*
* Return all node matching the tagName, starting from the current element
* location
*/
private List<Node> getNodesByTagName( Element element, String tagName ) {
List<Node> nodes = new ArrayList<Node>();
NodeList list = element.getChildNodes();
for ( int i = 0; i < list.getLength(); i++ ) {
Node node = list.item( i );
if ( node != null && node.getNodeName().equals( tagName ) ) {
nodes.add( node );
}
}
return nodes;
}
/*
* Get Node Value of the element matching the tag name
*/
private String getNodeValueByTagName( Element element, String tagName ) {
Node node = getNodeByTagName( element, tagName );
if ( node != null && node.getFirstChild() != null ) {
return node.getFirstChild().getNodeValue();
} else {
return null;
}
}
}