package org.buckit.datasource.database;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
import org.buckit.Config;
import org.buckit.access.AccessLevel;
import org.buckit.access.Group;
import org.buckit.datasource.DataSourceManager;
import org.buckit.datasource.type.AccessDataSource;
public class DatabaseAccessDataSource implements AccessDataSource {
private Map<Integer, Group> groupsint;
private Map<String, Group> groups;
private Map<Integer, AccessLevel> accesslevelsint;
private Map<String, AccessLevel> accesslevels;
private static String SELECT_GROUPS = "SELECT id,name,commands,worlds FROM " + Config.DATABASE_ACCESSGROUPS_TABLE;
private static String SELECT_ACCESSLEVELS = "SELECT id,name,usernameformat,accessgroups,admingroup,canbuild FROM " + Config.DATABASE_ACCESS_TABLE;
private static final Group defaultGroup = new Group(-1,"default","","world");
private static final AccessLevel defaultLevel = new AccessLevel(-1,new Group[]{defaultGroup},"default",null,false,false);
private DataSourceManager datasource;
public DatabaseAccessDataSource(DataSourceManager dataSource) {
datasource = dataSource;
}
public DataSourceManager getDataSource(){
return datasource;
}
@Override
public AccessLevel getAccessLevel(int id) {
if(accesslevelsint.containsKey(id))
return accesslevelsint.get(id);
else
return defaultLevel;
}
@Override
public AccessLevel getAccessLevel(String name) {
if(accesslevels.containsKey(name))
return accesslevels.get(name);
else
return defaultLevel;
}
@Override
public Group getGroup(int id) {
if(groupsint.containsKey(id))
return groupsint.get(id);
else
return defaultGroup;
}
@Override
public Group getGroup(String name) {
if(groups.containsKey(name))
return groups.get(name);
else
return defaultGroup;
}
@Override
public boolean load() {
groups = new HashMap<String, Group>();
groupsint = new HashMap<Integer, Group>();
accesslevels = new HashMap<String, AccessLevel>();
accesslevelsint = new HashMap<Integer, AccessLevel>();
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(SELECT_GROUPS);
rs = st.executeQuery();
Group group;
while (rs.next()) {
group = new Group(rs.getInt("id"), rs.getString("name"), rs.getString("commands"), rs.getString("worlds"));
groups.put(group.getName(), group);
groupsint.put(group.getId(), group);
}
rs.close();
st.close();
st = conn.prepareStatement(SELECT_ACCESSLEVELS);
rs = st.executeQuery();
AccessLevel access;
while (rs.next()) {
access = new AccessLevel(rs.getInt("id"), getGroups(rs.getString("accessgroups")), rs.getString("name"), rs.getString("usernameformat"), rs.getBoolean("canbuild"), rs.getBoolean("admingroup"));
accesslevels.put(access.getName(), access);
accesslevelsint.put(access.getId(), access);
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
if (rs != null)
rs.close();
} catch (Exception e) {
}
}
// TODO: print result.
return true;
}
private Group[] getGroups(String list) {
if(list == null || list.equals(""))
return null;
String[] split = list.split(Config.DATABASE_DELIMITER);
Group[] group = new Group[split.length];
for (int i = 0; i < split.length; i++) {
try {
group[i] = getGroup(Integer.parseInt(split[i]));
} catch (NumberFormatException e) {
group[i] = getGroup(split[i]);
}
if (group[i] == null) {
// TODO: print error.
}
}
return group;
}
}