/**
* File ./src/main/java/de/lemo/dms/test/TestDataCreatorChemgapedia.java
* Lemo-Data-Management-Server for learning analytics.
* Copyright (C) 2013
* Leonard Kappe, Andreas Pursian, Sebastian Schwarzrock, Boris Wenzlaff
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
**/
/**
* File ./main/java/de/lemo/dms/test/TestDataCreatorChemgapedia.java
* Date 2013-01-24
* Project Lemo Learning Analytics
*/
package de.lemo.dms.test;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import de.lemo.dms.core.config.ServerConfiguration;
import de.lemo.dms.db.IDBHandler;
import de.lemo.dms.db.mapping.CourseMining;
import de.lemo.dms.db.mapping.CourseResourceMining;
import de.lemo.dms.db.mapping.LevelAssociationMining;
import de.lemo.dms.db.mapping.LevelCourseMining;
import de.lemo.dms.db.mapping.LevelMining;
import de.lemo.dms.db.mapping.ResourceLogMining;
import de.lemo.dms.db.mapping.ResourceMining;
/**
* Class to test the chemgapedia data creator
* @author Sebastian Schwarzrock
*
*/
public class TestDataCreatorChemgapedia {
private List<ResourceLogMining> resourceLogList = new ArrayList<ResourceLogMining>();
private List<ResourceMining> resourceList = new ArrayList<ResourceMining>();
private List<LevelAssociationMining> departmentDegreeList = new ArrayList<LevelAssociationMining>();
private List<LevelCourseMining> degreeCourseList = new ArrayList<LevelCourseMining>();
private List<CourseResourceMining> courseResourceList = new ArrayList<CourseResourceMining>();
private final Map<Long, CourseMining> couResMap = new HashMap<Long, CourseMining>();
private final Map<Long, LevelMining> degCouMap = new HashMap<Long, LevelMining>();
private final Map<Long, LevelMining> depDegMap = new HashMap<Long, LevelMining>();
private Logger logger = Logger.getLogger(this.getClass());
/**
* Extracts Mining-data from the Mining-database
*/
@SuppressWarnings("unchecked")
public void getDataFromDB()
{
final IDBHandler dbHandler = ServerConfiguration.getInstance().getMiningDbHandler();
// accessing DB by creating a session and a transaction using HibernateUtil
final Session session = dbHandler.getMiningSession();
session.clear();
final Query resLogQuery = session.createQuery("from ResourceLogMining x order by x.id asc");
this.resourceLogList = (ArrayList<ResourceLogMining>) resLogQuery.list();
final Query resQuery = session.createQuery("from ResourceMining x order by x.id asc");
this.resourceList = (ArrayList<ResourceMining>) resQuery.list();
final Query degCouQuery = session.createQuery("from LevelCourseMining x order by x.id asc");
this.degreeCourseList = (ArrayList<LevelCourseMining>) degCouQuery.list();
final Query depDegQuery = session.createQuery("from DepartmentDegreeMining x order by x.id asc");
this.departmentDegreeList = (ArrayList<LevelAssociationMining>) depDegQuery.list();
final Query couResQuery = session.createQuery("from CourseResourceMining x order by x.id asc");
this.courseResourceList = (ArrayList<CourseResourceMining>) couResQuery.list();
for (final CourseResourceMining cr : this.courseResourceList) {
this.couResMap.put(cr.getResource().getId(), cr.getCourse());
}
for (final LevelCourseMining dc : this.degreeCourseList) {
this.degCouMap.put(dc.getCourse().getId(), dc.getLevel());
}
for (final LevelAssociationMining dd : this.departmentDegreeList) {
this.depDegMap.put(dd.getLower().getId(), dd.getUpper());
}
}
private void createFile(final String path, final String url, final String title, final String specialism,
final String name, final String area, final String audienceLevel, final String timeValue,
final List<String> subResourceTitles, final List<String> subResourceUrls)
{
try {
final FileWriter out = new FileWriter(path);
final PrintWriter pout = new PrintWriter(out);
pout.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
pout.println("<!DOCTYPE vlunode PUBLIC \"-//Vernetztes Studium - Chemie//DTD vlu 1.0//EN\" \"http://www.vs-c.de/schema/vlunode.dtd\">");
pout.println("<vlunode state=\"1\" version=\"0.1\" xlink:href=\""
+ url
+ "\" xml:lang=\"de\" xmlns=\"http://www.vs-c.de/schema/2002\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">");
pout.println("<title>" + title + "</title>");
pout.println("<subject area=\"" + area + "\" name=\"" + name + "\" specialism=\"" + specialism + "\"/>");
pout.println("<audience level=\"" + audienceLevel + "\"/>");
pout.println("<time value=\"" + timeValue + "\"/>");
pout.println("<content>");
for (int i = 0; i < subResourceTitles.size(); i++) {
pout.println("<page xlink:title=\"" + subResourceTitles.get(i) + "\" xlink:href=\""
+ subResourceUrls.get(i) + "\"/>");
}
pout.println("</content>");
pout.println("</vlunode>");
pout.close();
} catch (final Exception e)
{
logger.error(e.getMessage());
}
}
/**
* Writes the data, extracted from the Mining-database into a pseudo-server-log-file and pseudo-vlu-packages
*
* @param logFile
* path for the pseudo-log-file
* @param metaPackage
* path for pseudo-vlu-packages-folder
*/
public void writeDataSource(final String logFile, final String metaPackage)
{
try
{
final FileWriter out = new FileWriter(logFile);
final PrintWriter pout = new PrintWriter(out);
final HashMap<Long, String> ips = new HashMap<Long, String>();
final HashMap<Long, String> refs = new HashMap<Long, String>();
// Write "server-logs"
for (final ResourceLogMining r : this.resourceLogList)
{
final Random randy = new Random();
final String time = r.getTimestamp() + "";
final String url = r.getResource().getUrl().substring(r.getResource().getUrl().indexOf("/vsengine/"));
String ref = "-";
if (refs.get(r.getUser().getId()) != null) {
ref = refs.get(r.getUser().getId());
}
String ip;
String cookie = "-";
if (ips.get(r.getUser().getId()) == null)
{
ip = randy.nextInt(256) + "." + randy.nextInt(256) + "." + randy.nextInt(256) + "."
+ randy.nextInt(256);
if ((randy.nextInt(8) != 0) && (ips.get(r.getUser().getId()) == null)) {
cookie = ip + "/" + r.getTimestamp();
}
ips.put(r.getUser().getId(), ip);
} else {
ip = ips.get(r.getUser().getId());
}
final String line = time + "\t" + "200\t" + ip + "\t" + cookie + "\t" + url + "\t" + ref;
pout.println(line);
if (r.getDuration() != -1) {
refs.put(r.getUser().getId(), r.getResource().getUrl());
} else {
refs.put(r.getUser().getId(), "-");
}
}
pout.close();
// Write meta-data-packages
ArrayList<String> subResourceTitles = new ArrayList<String>();
ArrayList<String> subResourceUrls = new ArrayList<String>();
String title = "";
String url = "";
String specialism = "";
String name = "";
String area = "";
String audienceLevel = "";
String timeValue = "";
String path = "";
boolean newResource = false;
for (final ResourceMining resource : this.resourceList)
{
if (resource.getType().equals("VLU") ||
(resource.getType().equals("Page") &&
(this.couResMap.get(resource.getId()) != null)))
{
if (resource.getType().equals("VLU"))
{
if (newResource) {
this.createFile(path, url, title, specialism, name, area, audienceLevel, timeValue,
subResourceTitles, subResourceUrls);
}
newResource = true;
subResourceTitles = new ArrayList<String>();
subResourceUrls = new ArrayList<String>();
final CourseMining course = this.couResMap.get(resource.getId());
final LevelMining degree = this.degCouMap.get(course.getId());
final LevelMining department = this.depDegMap.get(degree.getId());
final String dir = metaPackage + "\\" + department.getTitle() + "\\" + degree.getTitle() + "\\"
+ course.getTitle() + "\\";
final File f = new File(dir);
f.mkdirs();
path = metaPackage + "\\" + department.getTitle() + "\\" + degree.getTitle() + "\\"
+ course.getTitle() + "\\" + resource.getTitle() + ".vlu";
title = resource.getTitle();
url = resource.getUrl().substring(resource.getUrl().indexOf("/vsc/"),
resource.getUrl().lastIndexOf("."));
specialism = course.getTitle();
name = department.getTitle();
area = degree.getTitle();
audienceLevel = resource.getDifficulty();
timeValue = resource.getProcessingTime() + "";
}
else if (resource.getType().equals("Page"))
{
subResourceTitles.add(resource.getTitle());
subResourceUrls.add(resource.getUrl().substring(resource.getUrl().lastIndexOf("/vsc/"),
resource.getUrl().lastIndexOf(".")));
}
}
}
this.createFile(path, url, title, specialism, name, area, audienceLevel, timeValue, subResourceUrls,
subResourceUrls);
} catch (final Exception e)
{
logger.error(e.getMessage());
}
}
}