/**
*
*/
package webctdbexport.jdbc;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Session;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import webctdbexport.db.LearningContext;
import webctdbexport.jdbc.model.Person;
import webctdbexport.test.TestRepository;
import webctdbexport.tools.DumpUtils;
import webctdbexport.utils.DbUtils;
//import webctdbexport.utils.MoodleRepository;
/** Dump all users and their own file areas in whole database ?!
*
* @author cmg
*
*/
public class DumpUsers {
private static final String DONE_FILE = "done.ts";
static Logger logger = Logger.getLogger(DumpUsers.class.getName());
/**
* @param args
*/
public static void main(String[] args) {
if (args.length<4) {
System.err.println("Usage: <jdbc.properties> <outputdir> <filedir> <extrapermissionsfile> [usernames...]");
System.err.println("Extra permissions file format: <username> lc<learningcontextid> ...");
System.exit(-1);
}
File outputdir = new File(args[1]);
if (!outputdir.exists() || !outputdir.canWrite() || !outputdir.isDirectory()) {
logger.log(Level.SEVERE, "Output directory does not exist or is not writable: "+outputdir);
System.exit(-1);
}
File filedir = new File(args[2]);
if (!filedir.exists() || !filedir.canWrite() || !filedir.isDirectory()) {
logger.log(Level.SEVERE, "File directory does not exist or is not writable: "+filedir);
System.exit(-1);
}
File extrapermissionsfile = new File(args[3]);
if (!extrapermissionsfile.exists() || !extrapermissionsfile.canRead() || !extrapermissionsfile.isFile()) {
logger.log(Level.SEVERE, "Cannot read extra permissions file: "+extrapermissionsfile);
System.exit(-1);
}
Map<String,Set<String>> extrapermissions = readExtrapermissions(extrapermissionsfile);
Connection conn = JdbcUtils.getConnection(args[0]);
try {
logger.log(Level.INFO, "output folders to "+outputdir);
List<BigDecimal> personIds = getPersonIds(args, 4, conn);
for (BigDecimal personId : personIds) {
dumpUser(conn, personId, outputdir, filedir, extrapermissions, null);
}
logger.log(Level.INFO, "Done all users");
} catch (Exception e) {
logger.log(Level.SEVERE, "Error", e);
}
finally {
try { conn.close(); } catch (Throwable ignore) {}
}
}
static void dumpUser(Connection conn, BigDecimal personId,
File outputdir, File filedir,
Map<String, Set<String>> extrapermissions, File oldoutputdir) throws SQLException, JSONException, IOException {
Person p = MoodleRepository.getPerson(conn, personId);
if (p==null) {
logger.log(Level.WARNING,"Could not find Person "+personId);
return;
}
String username = p.getWebctId();
if (username==null || username.length()<3) {
logger.log(Level.WARNING,"Ignoring user "+username+" (short username)");
return;
}
logger.log(Level.INFO, "Dump Person "+username);
// learning contexts...
Set<String> extralcs = extrapermissions!=null ? extrapermissions.get(username) : null;
JSONObject listing = MoodleRepository.getListingForUser(conn, username, true, true, extralcs);
List<JSONObject> items = new LinkedList<JSONObject>();
if (listing.getJSONArray("list").length()==0)
{
logger.log(Level.INFO,"Skip user "+username+" (no folder, etc.)");
return;
}
String user2 = username.substring(0,2);
String user3 = username.substring(0,3);
File userdir = new File(new File(new File(new File(outputdir, "user"), user2), user3), username);
userdir.mkdirs();
DumpUtils.writeResponse(listing, userdir, false);
//DumpUtils.addPersonItems(items, listing, "/");
// not mark as done?!
DumpUtils.addItems(items, listing, null/*"/"*/);
DumpAll.processItems(conn, items, outputdir, filedir, oldoutputdir);
}
static List<BigDecimal> getPersonIds(String[] args, int skipArgs, Connection conn) throws SQLException {
List<BigDecimal> personIds = null;
if (args.length<=skipArgs) {
logger.log(Level.INFO, "Dump all users...");
personIds = MoodleRepository.getPersonIds(conn);
logger.log(Level.INFO, "Found "+personIds.size()+" active nondemo users");
} else {
personIds = new LinkedList<BigDecimal>();
for (int ai=skipArgs; ai<args.length; ai++) {
Person p = MoodleRepository.getPersonByWebctId(conn, args[ai]);
if (p==null)
logger.log(Level.WARNING,"Could not find user "+args[ai]);
else
personIds.add(p.getId());
}
}
return personIds;
}
private static Map<String, Set<String>> readExtrapermissions(
File extrapermissionsfile) {
logger.log(Level.INFO, "Read extra permissions from "+extrapermissionsfile);
Map<String,Set<String>> extrapermissions = new HashMap<String,Set<String>>();
try {
// warning: default encoding
BufferedReader br = new BufferedReader(new FileReader(extrapermissionsfile));
int count = 0;
while (true) {
String line = br.readLine();
count++;
if (line==null)
break;
if (line.startsWith("#") || line.startsWith("//"))
continue;
String values[] = line.trim().split("[ \\t,]");
if (values.length<2)
throw new IOException("Extra persmission line "+count+" too short: "+line);
String username = values[0];
for (int i=1; i<values.length; i++) {
String lc = values[i];
if (!lc.startsWith("lc"))
throw new IOException("Extra permission line "+count+", LC "+lc+" is not valid (does not start with 'lc'): "+line);
Set<String> lcs = extrapermissions.get(username);
if (lcs==null) {
lcs = new TreeSet<String>();
extrapermissions.put(username, lcs);
}
lcs.add(lc);
}
}
br.close();
}
catch (Exception e) {
logger.log(Level.SEVERE, "Error reading extra permissions file "+extrapermissionsfile, e);
System.exit(-1);
}
return extrapermissions;
}
}