package org.jboss.ejb.plugins.cmp.jdbc.metadata;
import java.util.Arrays;
import java.util.List;
import java.util.Collections;
import java.util.Iterator;
import org.jboss.deployment.DeploymentException;
import org.jboss.metadata.MetaData;
import org.w3c.dom.Element;
public class JDBCReadAheadMetaData
{
public static final JDBCReadAheadMetaData DEFAULT = new JDBCReadAheadMetaData();
private static final byte NONE = 0;
private static final byte ON_LOAD = 1;
private static final byte ON_FIND = 2;
private static final List STRATEGIES = Arrays.asList(new String[]{"none", "on-load", "on-find"});
private final byte strategy;
private final int pageSize;
private final String eagerLoadGroup;
private final List leftJoinList;
private JDBCReadAheadMetaData()
{
strategy = ON_LOAD;
pageSize = 255;
eagerLoadGroup = "*";
leftJoinList = Collections.EMPTY_LIST;
}
public JDBCReadAheadMetaData(String strategy, int pageSize, String eagerLoadGroup)
{
this(strategy, pageSize, eagerLoadGroup, Collections.EMPTY_LIST);
}
public JDBCReadAheadMetaData(String strategy, int pageSize, String eagerLoadGroup, List leftJoins)
{
this.strategy = (byte)STRATEGIES.indexOf(strategy);
if(this.strategy < 0)
{
throw new IllegalArgumentException("Unknown read ahead strategy '" + strategy + "'.");
}
this.pageSize = pageSize;
this.eagerLoadGroup = eagerLoadGroup;
leftJoinList = leftJoins;
}
public JDBCReadAheadMetaData(Element element, JDBCReadAheadMetaData defaultValue)
throws DeploymentException
{
String strategyStr = MetaData.getUniqueChildContent(element, "strategy");
strategy = (byte)STRATEGIES.indexOf(strategyStr);
if(strategy < 0)
{
throw new DeploymentException("Unknown read ahead strategy '" + strategyStr + "'.");
}
String pageSizeStr = MetaData.getOptionalChildContent(element, "page-size");
if(pageSizeStr != null)
{
try
{
pageSize = Integer.parseInt(pageSizeStr);
}
catch(NumberFormatException ex)
{
throw new DeploymentException("Invalid number format in read-ahead page-size '" + pageSizeStr + "': " + ex);
}
if(pageSize < 0)
{
throw new DeploymentException("Negative value for read ahead page-size '" + pageSizeStr + "'.");
}
}
else
{
pageSize = defaultValue.getPageSize();
}
Element eagerLoadGroupElement = MetaData.getOptionalChild(element, "eager-load-group");
if(eagerLoadGroupElement != null)
{
eagerLoadGroup = MetaData.getElementContent(eagerLoadGroupElement);
}
else
{
eagerLoadGroup = defaultValue.getEagerLoadGroup();
}
Iterator iter = MetaData.getChildrenByTagName(element, "left-join");
leftJoinList = JDBCLeftJoinMetaData.readLeftJoinList(iter);
}
public boolean isNone()
{
return (strategy == NONE);
}
public boolean isOnLoad()
{
return (strategy == ON_LOAD);
}
public boolean isOnFind()
{
return (strategy == ON_FIND);
}
public int getPageSize()
{
return pageSize;
}
public String getEagerLoadGroup()
{
return eagerLoadGroup;
}
public Iterator getLeftJoins()
{
return leftJoinList.iterator();
}
public String toString()
{
return "[JDBCReadAheadMetaData :" +
" strategy=" + STRATEGIES.get(strategy) +
", pageSize=" + pageSize +
", eagerLoadGroup=" + eagerLoadGroup +
", left-join" + leftJoinList + "]";
}
}