/**********************************************************************************
* $URL:https://source.sakaiproject.org/svn/osp/trunk/warehouse/api-impl/src/java/org/theospi/portfolio/util/db/GenericTableHandler.java $
* $Id:GenericTableHandler.java 9134 2006-05-08 20:28:42Z chmaurer@iupui.edu $
***********************************************************************************
*
* Copyright (c) 2005, 2006, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.
*
**********************************************************************************/
package org.sakaiproject.warehouse.util.db;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.sakaiproject.warehouse.util.db.Cascade;
import org.sakaiproject.warehouse.util.db.DbLoader;
/**
* Generic table handler will work for most databases. If not,
* then you can create database specific handlers having this as the
* starting point.
*
* This code was inspired from the Dbloader.java from uPortal by JASIG
*
* @author <a href="felipeen@udel.edu">Luis F.C. Mendes</a> - University of Delaware
* @version $Revision 1.0 $
*/
public class GenericTableHandler implements ContentHandler{
private static final int UNSET = -1;
private static final int DROP = 0;
private static final int CREATE = 1;
private static final int ALTER = 2;
private static final int INDEX = 3;
private static int mode = UNSET;
private static StringBuilder stmtBuffer;
private int treeLevel;
private String tmpType = "";
private String tmpParm = "";
private DbLoader loader;
protected final Log logger = LogFactory.getLog(getClass());
public GenericTableHandler(DbLoader loader){
this.loader = loader;
logger.debug("Generic table handler for " + this.loader.getDbName() + " ...");
}
public void startDocument ()
{
}
public void endDocument ()
{
//System.out.println();
}
public void startElement (String namespaceURI, String localName,
String qName, Attributes atts)
{
if (qName.equals("statement"))
{
stmtBuffer = new StringBuilder(1024);
String statementType = atts.getValue("type");
if (mode == UNSET || mode != DROP
&& statementType != null && statementType.equals("drop"))
{
mode = DROP;
logger.debug("Dropping tables...");
if (!this.loader.isDropTables())
logger.debug("disabled.");
}
else if (mode == UNSET || mode != CREATE
&& statementType != null && statementType.equals("create"))
{
mode = CREATE;
logger.debug("Creating tables...");
if (!this.loader.isCreateTables())
logger.debug("disabled.");
}
else if (mode == UNSET || mode != ALTER
&& statementType != null && statementType.equals("alter"))
{
mode = ALTER;
logger.debug("Altering tables...");
if (!this.loader.isAlterTables())
logger.debug("disabled.");
}
else if (mode == UNSET || mode != INDEX
&& statementType != null && statementType.equals("index"))
{
mode = INDEX;
logger.debug("Indexing tables...");
if (!this.loader.isIndexTables())
logger.debug("disabled.");
}
}
if (qName.equals("column-type")){
++treeLevel;
tmpType = "";
}
if (qName.equals("type-param")){
++treeLevel;
tmpParm = "";
}
}
public void endElement (String namespaceURI, String localName, String qName)
{
if (qName.equals("statement"))
{
treeLevel = 0;
String statement = stmtBuffer.toString();
switch (mode)
{
case DROP:
if (this.loader.isDropTables())
this.loader.dropTable(Cascade.cascadeConstraint(statement));
//System.out.println(statement);
break;
case CREATE:
if (this.loader.isCreateTables())
this.loader.createTable(statement);
//System.out.println(statement);
break;
case ALTER:
if (this.loader.isAlterTables())
this.loader.alterTable(statement);
//System.out.println(statement);
break;
case INDEX:
if (this.loader.isIndexTables())
this.loader.indexTable(statement);
//System.out.println(statement);
break;
default:
break;
}
}
if(qName.equals("column-type"))
--treeLevel;
if(qName.equals("type-param"))
--treeLevel;
if(treeLevel == 0)
parseParamToDatabase();
}
public void characters (char ch[], int start, int length)
{
if(treeLevel == 0)
stmtBuffer.append(ch, start, length);
else
if(treeLevel == 1)
tmpType += new String(ch, start, length);
else
if(treeLevel == 2)
tmpParm += new String(ch, start, length);
//chmaurer 1/24/06
//Changed the tmpType and tmpParm to do a += due to some strange
// buffering issues. We were seeing data types being truncated
// if they fell at the end of the ch[] and were cut off.
}
protected void parseParamToDatabase(){
if(tmpParm != null && tmpParm.length() > 0){
stmtBuffer.append(tmpType.trim());
stmtBuffer.append("(" + tmpParm.trim() + ")");
}
else
if(tmpType != null && tmpType.length() > 0)
stmtBuffer.append(tmpType.trim());
tmpParm = "";
tmpType = "";
}
public void setDocumentLocator (Locator locator)
{
}
public void processingInstruction (String target, String data)
{
}
public void ignorableWhitespace (char[] ch, int start, int length)
{
}
public void startPrefixMapping (String prefix, String uri)
throws SAXException {};
public void endPrefixMapping (String prefix) throws SAXException {};
public void skippedEntity(String name) throws SAXException {};
}