package org.apache.ojb.broker.metadata;
/* Copyright 2002-2005 The Apache Software Foundation
*
* Licensed under the Apache 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.apache.org/licenses/LICENSE-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.
*/
import java.io.Serializable;
import javax.sql.DataSource;
import org.apache.ojb.broker.util.logging.Logger;
import org.apache.ojb.broker.util.logging.LoggerFactory;
import org.apache.ojb.broker.PBKey;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang.SystemUtils;
/**
* JdbcConnectionDescriptor describes all relevant parameters of
* JDBC Connections used by the PersistenceBroker.
*
* @author <a href="mailto:thma@apache.org">Thomas Mahler<a>
* @version $Id: JdbcConnectionDescriptor.java,v 1.31.2.4 2005/07/24 23:32:43 arminw Exp $
*/
public class JdbcConnectionDescriptor extends DescriptorBase implements Serializable, XmlCapable
{
private static final long serialVersionUID = -600900924512028960L;
private Logger logger = LoggerFactory.getLogger(JdbcConnectionDescriptor.class);
public static final int AUTO_COMMIT_IGNORE_STATE = 0;
public static final int AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE = 1;
public static final int AUTO_COMMIT_SET_FALSE = 2;
private String m_jcdAlias;
private String m_Dbms;
private String m_Driver;
private String m_Protocol;
private String m_SubProtocol;
private String m_DbAlias;
private String m_DatasourceName;
private String m_UserName;
private String m_Password;
private double m_JdbcLevel = 2.0;
private boolean m_eagerRelease = false;
private boolean m_batchMode = false;
private boolean defaultConnection = false;
private int useAutoCommit = AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE;
private boolean ignoreAutoCommitExceptions = false;
private PBKey pbKey;
private ConnectionPoolDescriptor cpd;
private SequenceDescriptor sequenceDescriptor;
private ObjectCacheDescriptor objectCacheDescriptor;
private transient DataSource dataSource;
/**
* Constructor declaration
*/
public JdbcConnectionDescriptor()
{
cpd = new ConnectionPoolDescriptor();
objectCacheDescriptor = new ObjectCacheDescriptor();
}
/**
* Returns the appropriate {@link ObjectCacheDescriptor}
* or <code>null</code> if not specified.
*/
public ObjectCacheDescriptor getObjectCacheDescriptor()
{
return objectCacheDescriptor;
}
/**
* Sets the {@link ObjectCacheDescriptor} for representing connection/database.
*/
public void setObjectCacheDescriptor(ObjectCacheDescriptor objectCacheDescriptor)
{
this.objectCacheDescriptor = objectCacheDescriptor;
}
/**
* Returns the data source that this connection descriptor represents if any.
*
* @return The data source or <code>null</code>
*/
public DataSource getDataSource()
{
return dataSource;
}
/**
* Sets the data source that this connection descriptor represents.
*
* @param dataSource The data source
*/
public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
}
/**
* Get the alias name for this descriptor.
*/
public String getJcdAlias()
{
return m_jcdAlias;
}
/**
* Set an alias name for this descriptor.
*/
public void setJcdAlias(String jcdAlias)
{
this.clearPBKey();
this.m_jcdAlias = jcdAlias;
}
/**
*
*/
public boolean isDefaultConnection()
{
return defaultConnection;
}
public boolean isDataSource()
{
return (getDataSource() != null) || (getDatasourceName() != null);
}
/**
*
*/
public void setDefaultConnection(boolean defaultConnection)
{
this.defaultConnection = defaultConnection;
}
/**
* Return the associated <code>SequenceDescriptor</code>
* or <code>null</code> if not set.
*/
public SequenceDescriptor getSequenceDescriptor()
{
return sequenceDescriptor;
}
/**
* Set the <code>SequenceDescriptor</code> for this
* connection descriptor.
*/
public void setSequenceDescriptor(SequenceDescriptor sequenceDescriptor)
{
this.sequenceDescriptor = sequenceDescriptor;
}
/**
* Returns the connection pool descriptor.
*/
public ConnectionPoolDescriptor getConnectionPoolDescriptor()
{
return cpd;
}
/**
* Sets the connection pool descriptor.
*/
public void setConnectionPoolDescriptor(ConnectionPoolDescriptor cpd)
{
this.cpd = cpd;
}
/**
* Return a key to identify the connection descriptor.
*/
public PBKey getPBKey()
{
if (pbKey == null)
{
this.pbKey = new PBKey(this.getJcdAlias(), this.getUserName(), this.getPassWord());
}
return pbKey;
}
private void clearPBKey()
{
this.pbKey = null;
}
public int getUseAutoCommit()
{
return useAutoCommit;
}
public void setUseAutoCommit(int useAutoCommit)
{
this.useAutoCommit = useAutoCommit;
}
public boolean isIgnoreAutoCommitExceptions()
{
return ignoreAutoCommitExceptions;
}
public void setIgnoreAutoCommitExceptions(boolean ignoreAutoCommitExceptions)
{
this.ignoreAutoCommitExceptions = ignoreAutoCommitExceptions;
}
/**
* Returns the database platform name.
*/
public String getDbms()
{
return m_Dbms;
}
/**
* Sets the database platform name.
*/
public void setDbms(String str)
{
m_Dbms = str;
}
/**
* Returns the driver name.
*/
public String getDriver()
{
return m_Driver;
}
/**
* Set the database driver.
*/
public void setDriver(String str)
{
m_Driver = str;
}
/**
* Returns the database protocol.
*/
public String getProtocol()
{
return m_Protocol;
}
/**
* Sets the database protocol.
*/
public void setProtocol(String str)
{
m_Protocol = str;
}
/**
* Returns the database sub-protocol.
*/
public String getSubProtocol()
{
return m_SubProtocol;
}
/**
* Sets the database sub-protocol.
*/
public void setSubProtocol(String str)
{
m_SubProtocol = str;
}
/**
* Returns the database alias name
* used by OJB.
*/
public String getDbAlias()
{
return m_DbAlias;
}
/**
* Sets the database alias name. These
* names you could find in the repository.dtd.
*/
public void setDbAlias(String str)
{
m_DbAlias = str;
}
/**
* Returns the database user name.
*/
public String getUserName()
{
return m_UserName;
}
/**
* Sets the database user name.
*/
public void setUserName(String str)
{
this.clearPBKey();
m_UserName = str;
}
/**
* Returns the database password.
*/
public String getPassWord()
{
return m_Password;
}
/**
* Sets the database password.
*/
public void setPassWord(String str)
{
this.clearPBKey();
m_Password = str;
}
/**
* Gets the datasourceName.
* @return Returns a String
*/
public String getDatasourceName()
{
return m_DatasourceName;
}
/**
* Sets the datasourceName.
* @param datasourceName The datasourceName to set
*/
public void setDatasourceName(String datasourceName)
{
m_DatasourceName = datasourceName;
}
/**
* Gets the jdbcLevel.
* @return Returns a String
*/
public double getJdbcLevel()
{
return m_JdbcLevel;
}
/**
* Sets the jdbcLevel. parse the string setting and check that it is indeed an integer.
* @param jdbcLevel The jdbcLevel to set
*/
public void setJdbcLevel(String jdbcLevel)
{
if (jdbcLevel != null)
{
try
{
double intLevel = Double.parseDouble(jdbcLevel);
setJdbcLevel(intLevel);
}
catch(NumberFormatException nfe)
{
setJdbcLevel(2.0);
logger.info("Specified JDBC level was not numeric (Value=" + jdbcLevel + "), used default jdbc level of 2.0 ");
}
}
else
{
setJdbcLevel(2.0);
logger.info("Specified JDBC level was null, used default jdbc level of 2.0 ");
}
}
public void setJdbcLevel(double jdbcLevel)
{
m_JdbcLevel = jdbcLevel;
}
public boolean getEagerRelease()
{
return m_eagerRelease;
}
public void setEagerRelease(boolean flag)
{
m_eagerRelease = flag;
}
public boolean getBatchMode()
{
return m_batchMode;
}
public void setBatchMode(boolean flag)
{
m_batchMode = flag;
}
/**
* Returns a String representation of this class.
*/
public String toString()
{
ToStringBuilder buf = new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE);
buf.
append("jcd-alias", m_jcdAlias).
append("default-connection", defaultConnection).
append("dbms", m_Dbms).
append("jdbc-level", m_JdbcLevel).
append("driver", m_Driver).
append("protocol", m_Protocol).
append("sub-protocol", m_SubProtocol).
append("db-alias", m_DbAlias).
append("user", m_UserName).
append("password", "*****").
append("eager-release", m_eagerRelease).
append("ConnectionPoolDescriptor", cpd).
append("batchMode", m_batchMode).
append("useAutoCommit", getUseAutoCommitAsString(useAutoCommit)).
append("ignoreAutoCommitExceptions", ignoreAutoCommitExceptions).
append("sequenceDescriptor", sequenceDescriptor);
return buf.toString();
}
/*
* @see XmlCapable#toXML()
*/
public String toXML()
{
RepositoryTags tags = RepositoryTags.getInstance();
String eol = SystemUtils.LINE_SEPARATOR;
StringBuffer strReturn = new StringBuffer( 1024 );
strReturn.append( eol );
strReturn.append( " <!-- Descriptor for Connection " );
strReturn.append( getProtocol() );
strReturn.append( ":" );
strReturn.append( getSubProtocol() );
strReturn.append( ":" );
strReturn.append( getDbAlias() );
strReturn.append( " -->" );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getOpeningTagNonClosingById( JDBC_CONNECTION_DESCRIPTOR ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( JCD_ALIAS, this.getJcdAlias() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( DEFAULT_CONNECTION, "" + this.isDefaultConnection() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( DBMS_NAME, this.getDbms() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( JDBC_LEVEL, "" + this.getJdbcLevel() ) );
strReturn.append( eol );
//username is optional
String user = getUserName();
if( user != null )
{
strReturn.append( " " );
strReturn.append( tags.getAttribute( USER_NAME, user ) );
strReturn.append( eol );
}
// password is optional
String passwd = getPassWord();
if( passwd != null )
{
strReturn.append( " " );
strReturn.append( tags.getAttribute( USER_PASSWD, passwd ) );
strReturn.append( eol );
}
// JDBC Datasource or DriverManager information are alternatives:
String dsn = getDatasourceName();
if( dsn != null )
{
strReturn.append( " " );
strReturn.append( tags.getAttribute( DATASOURCE_NAME, this.getDatasourceName() ) );
strReturn.append( eol );
}
else
{
strReturn.append( " " );
strReturn.append( tags.getAttribute( DRIVER_NAME, this.getDriver() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( URL_PROTOCOL, this.getProtocol() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( URL_SUBPROTOCOL, this.getSubProtocol() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( encode( tags.getAttribute( URL_DBALIAS, this.getDbAlias() ) ) );
strReturn.append( eol );
}
strReturn.append( " " );
strReturn.append( tags.getAttribute( EAGER_RELEASE, "" + this.getEagerRelease() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( BATCH_MODE, "" + this.getBatchMode() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( USE_AUTOCOMMIT, "" + this.getUseAutoCommit() ) );
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getAttribute( IGNORE_AUTOCOMMIT_EXCEPTION, "" + this.isIgnoreAutoCommitExceptions() ) );
strReturn.append( eol );
strReturn.append( " >" );
strReturn.append( eol );
strReturn.append( eol );
strReturn.append( this.getConnectionPoolDescriptor().toXML() );
strReturn.append( eol );
if( this.getSequenceDescriptor() != null )
{
strReturn.append( this.getSequenceDescriptor().toXML() );
}
strReturn.append( eol );
strReturn.append( " " );
strReturn.append( tags.getClosingTagById( JDBC_CONNECTION_DESCRIPTOR ) );
strReturn.append( eol );
return strReturn.toString();
}
private static String encode(String toBeEncoded)
{
StringBuffer retval = new StringBuffer();
char c;
for (int i=0; i < toBeEncoded.length(); i++)
{
c = toBeEncoded.charAt(i);
if (c == '<')
{
retval.append("<");
}
else if (c == '>')
{
retval.append(">");
}
//else if (c == '"')
//{
// retval.append(""");
//}
else if (c == '&')
{
retval.append("&");
}
else if (c == ' ')
{
retval.append(" ");
}
else
{
retval.append(c);
}
}
return retval.toString();
}
private static String getUseAutoCommitAsString(int state)
{
switch (state)
{
case AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE:
return "AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE";
case AUTO_COMMIT_SET_FALSE:
return "AUTO_COMMIT_SET_FALSE";
case AUTO_COMMIT_IGNORE_STATE:
return "AUTO_COMMIT_IGNORE_STATE";
default: return "UNKOWN_STATE";
}
}
}