diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2b4f8cd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..aaedb37 --- /dev/null +++ b/pom.xml @@ -0,0 +1,115 @@ + + + + 4.0.0 + + ru.egspt.moodle + anyreport + 0.1 + + anyreport + + http://www.example.com + + + UTF-8 + 1.8 + 1.8 + + + + + org.apache.poi + poi + 5.2.2 + + + org.apache.poi + poi-ooxml + 5.2.2 + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + + + org.apache.poi + poi-scratchpad + 5.2.2 + + + org.apache.poi + ooxml-schemas + 1.1 + + + org.apache.logging.log4j + log4j-to-slf4j + 2.8.2 + + + org.apache.cassandra + cassandra-all + 4.0.3 + + + junit + junit + 4.11 + test + + + mysql + mysql-connector-java + 8.0.28 + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/report.xlsx b/report.xlsx new file mode 100644 index 0000000..e49b82c Binary files /dev/null and b/report.xlsx differ diff --git a/src/main/java/ru/egspt/moodle/Access.java b/src/main/java/ru/egspt/moodle/Access.java new file mode 100644 index 0000000..df912ce --- /dev/null +++ b/src/main/java/ru/egspt/moodle/Access.java @@ -0,0 +1,19 @@ +package ru.egspt.moodle; + +public class Access { + private static String userName = "esoe"; + private static String password = "psalm6912"; + private static String url = "jdbc:MySQL://45.128.206.87:3306/moodle"; + + //если значение userName отсутствует, запросить его у пользователя + public static String getUserName(){ + return userName; + } + public static String getPassword(){ + return password; + } + public static String getURL(){ + return url; + } + +} diff --git a/src/main/java/ru/egspt/moodle/App.java b/src/main/java/ru/egspt/moodle/App.java new file mode 100644 index 0000000..0594680 --- /dev/null +++ b/src/main/java/ru/egspt/moodle/App.java @@ -0,0 +1,14 @@ +package ru.egspt.moodle; + +/** + * графический интерфейс для + * moodle.anyreport + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Работает подготовщик отчетов по результатам тестирования пользователей ..." ); + } +} diff --git a/src/main/java/ru/egspt/moodle/Base.java b/src/main/java/ru/egspt/moodle/Base.java new file mode 100644 index 0000000..95d737c --- /dev/null +++ b/src/main/java/ru/egspt/moodle/Base.java @@ -0,0 +1,503 @@ +package ru.egspt.moodle; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Класс предоставляет методы работы с базой данных + * передает данные классам-пользователям + * Включает: + * - подключение к серверу баз данных + * - подключение к базе данных + * - подключение к таблице базы данных + * - запрос данных из таблицы + * - + */ + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.time.LocalTime; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.util.ArrayList; + +import javax.swing.JOptionPane; + +public class Base { + private ArrayList users; + private ArrayList results; + private ArrayList quizes; + + /** + * @return the quizes + */ + public ArrayList getQuizes() { + return quizes; + } + /** + * @param quizes the quizes to set + */ + public void setQuizes(Connection conn, Base base) { + ArrayList quizList = new ArrayList<>(); + try{ + Statement stmt = conn.createStatement(); + //берем данные о результатах тестирования на сервере + ResultSet rs = stmt.executeQuery("SELECT id, name, timelimit FROM mdl_quiz"); + while(rs.next()){ + int id = rs.getInt("id"); + String name = rs.getString("name"); + //перебираем результаты тестирований, пишем в класс. + int i = 0;// + while (i < base.getResults().size()){ + if (base.getResults().get(i).getQuizid() == id){ + Quiz q = new Quiz(); + q.setId(id); + q.setName(name); + int j = 0; + boolean b = false; + while (j < quizList.size()){ + if (q.getId() == quizList.get(j).getId()){ + b = true; + } + j++; + } + if (b != true){ + quizList.add(q); + } + } + i++; + } + } + } + catch (Exception ex){ + System.err.println ("Подключение к серверу баз данных не установлено ... "); + ex.printStackTrace(); + System.out.println (ex); + } + this.quizes = quizList; + } + /** + * @return the users + */ + public ArrayList getUsers() { + return users; + } + /** + * @param users the users to set + */ + public void setUsers(ArrayList users) { + this.users = users; + } + /** + * @return the results + */ + public ArrayList getResults() { + return results; + } + /** + * @param results the results to set + * @throws IOException + */ + + public void createExcellReport(Connection conn, Base base) throws IOException{ + System.out.println("Формирование report.xlsx ..."); + // создание самого excel файла в памяти + XSSFWorkbook book = new XSSFWorkbook(); + // создание листа + XSSFSheet sheet = book.createSheet("Report"); + + + //формируем заголовки + System.out.println("Формируем заголовки таблицы ..."); + ArrayList header = new ArrayList(); + header.add("login"); + header.add("mail"); + //пишем названия тестов в заголовки xlsx + System.out.println("Пишем названия тестов в заголовки xlsx ..."); + System.out.println("Количество пройденных тестов участниками выборки составило: " + base.getQuizes().size()); + int i = 0; + while (i < base.getQuizes().size()){ + header.add(base.getQuizes().get(i).getName()); + //System.out.println("Пишем заголовок: " + base.getQuizes().get(i).getName()); + header.add(""); + i++; + } + int row = 0;//строка + int col = 0;//столбец + Row r = sheet.createRow(row); + while (col < header.size()){ + r.createCell(col).setCellValue(header.get(col).toString()); + //System.out.println(header.get(col)); + col++; + } + System.out.println("Заголовки в report.xlsx сформированы."); + + //построчно формируем отчет + System.out.println("Построчно формируем отчет .... "); + row++; + //строк в отчете будет столько же, сколько пользователей попало в выборку (плюс строка- заголовков) + int userCurr = 0; + while (userCurr < base.getUsers().size()){ + col = 0; + r = sheet.createRow(row); + //заполняем данные пользователя (имя и почту) + Cell cname = r.createCell(col); + cname.setCellValue(base.getUsers().get(userCurr).getName()); + col++; + Cell cmail = r.createCell(col); + cmail.setCellValue(base.getUsers().get(userCurr).getMail()); + col++; + //Заполняем результаты тестирвоания пользователя + //Перебираем результаты, получаем результаты текущего пользователя + int resultCurr = 0; + while (resultCurr < base.getResults().size()){ + if (base.getResults().get(resultCurr).getUserid() == base.getUsers().get(userCurr).getId()){ + //если текущий результат относится к текущему пользователю + //взять индекс теста из результата и сопоставить с полями заголовков (определить номер ячейки для формирования записи) + String quizname = ""; + int quizCurr = 0; + while (quizCurr < base.getQuizes().size()){ + if (base.getResults().get(resultCurr).getQuizid() == base.getQuizes().get(quizCurr).getId()){ + quizname = base.getQuizes().get(quizCurr).getName(); + } + quizCurr++; + } + //поиск индекса ячейки, куда писать результаты + int ihead = 0; + int headerCurr = 0;//номер ячейки в которую писать результаты тестирования (+2) + while (ihead < header.size()){ + if (quizname.equals(header.get(ihead))){ + headerCurr = ihead; + } + ihead++; + } + //формируем ячейку grade + Cell cGrade = r.createCell(headerCurr); + cGrade.setCellValue(base.getResults().get(resultCurr).getGrade()); + //формируем ячейку time + Cell cTime = r.createCell(headerCurr + 1); + //Time t = new Time(base.getResults().get(resultCurr).getTime()); + //cTime.setCellValue(t.toString()); + Long time = base.getResults().get(resultCurr).getTime(); + String t = LocalTime.MIN.plusSeconds(time).toString(); + cTime.setCellValue(t); + } + resultCurr++; + } + row++; + userCurr++; + } + //пишем книгу в файл + String location = System.getProperty("user.dir") + "\\report.xlsx"; + Path path = Paths.get(location); + if (Files.exists(path)) { + try (FileOutputStream out = new FileOutputStream(location)) { + book.write(out); + book.close(); + out.close(); + System.out.println("Excel файл успешно перезаписан!"); + System.out.println(location); + } + catch (IOException e){ + e.printStackTrace(); + } + } + else { + try (FileOutputStream out = new FileOutputStream(new File(location))) { + book.write(out); + book.close(); + out.close(); + System.out.println("Excel файл успешно создан!"); + System.out.println(location); + } + catch (IOException e){ + e.printStackTrace(); + } + } + } + public void setResults(Connection conn, ArrayList uFiltered) { + ArrayList rList = new ArrayList<>(); + try{ + Statement stmt = conn.createStatement(); + //берем данные о результатах тестирования на сервере + System.out.println("Берем с сервера данные о результатах тестирования ...."); + ResultSet rs = stmt.executeQuery("SELECT id, quiz, userid, grade, timemodified FROM mdl_quiz_grades"); + while(rs.next()){ + int id = rs.getInt("id"); + int quizid = rs.getInt("quiz"); + /** + * если пользователь с таким ящиком уже существует в выборке, + * удаляем пользователя из выборки и пишем старый id пользователя в result + * либо переписать результаты + * надо в результате указать старый id пользователя. Остальные данные результата при этом сохранить. + * надо удалить пользователя в случае изменения данных результата + */ + int userid = rs.getInt("userid");//проверить почтовый ящик + double grade = rs.getDouble("grade"); + //преобразование данных о времени сдачи теста + long time = 0; + //перебираем результаты тестирования, пишем в класс. + int i = 0;// + while (i < uFiltered.size()){ + if (uFiltered.get(i).getId() == userid){ + Result res = new Result(); + res.setId(id); + res.setQuizid(quizid); + res.setUserid(userid); + res.setGrade(grade); + res.setTime(time); + rList.add(res); + } + i++; + } + } + } + catch (Exception ex){ + System.err.println ("Подключение к серверу баз данных не установлено ... "); + ex.printStackTrace(); + System.out.println (ex); + } + + try { + //берем данные о попытках с сервера, пишем корректное время сдачи теста + System.out.println("Берем данные о попытках с сервера, запоминаем результаты последней попытки ...."); + Statement stmt = conn.createStatement(); + ResultSet at = stmt.executeQuery("SELECT id, quiz, userid, attempt, timestart, timefinish, timemodified, sumgrades FROM mdl_quiz_attempts"); + while (at.next()){ + int quizidAt = at.getInt("quiz"); + int useridAt = at.getInt("userid"); + Long timestartAt = at.getLong("timestart"); + Long timefinishAt = at.getLong("timefinish"); + double sumgradesAt = at.getDouble("sumgrades"); + int rCurr = 0; + while (rCurr < rList.size()){ + if (rList.get(rCurr).getUserid() == useridAt){ + if (rList.get(rCurr).getQuizid() == quizidAt){ + rList.get(rCurr).setTime(timefinishAt - timestartAt); + rList.get(rCurr).setGrade(sumgradesAt); + } + } + rCurr++; + } + } + } + catch (Exception ex){ + System.err.println ("Подключение к серверу баз данных не установлено ... "); + ex.printStackTrace(); + System.out.println (ex); + } + this.results = rList; + } + + /** + * + * @param conn + * @param teg + */ + public void setUsersByTeg(Connection conn){ + ArrayList uList = new ArrayList(); + String teg = ""; + int b = 0; + while (b != 2){ + try{ + teg = JOptionPane.showInputDialog("Укажите тег для поиска пользователей:"); + Statement stmt = conn.createStatement(); + //берем данные о базах данных на сервере + ResultSet rs = stmt.executeQuery("SELECT id, username, email FROM mdl_user"); + while(rs.next()){ + //фильтруем выборку user + int id = rs.getInt("id"); + String username = rs.getString("username"); + String email = rs.getString("email"); + //проверяем соответствие тега и записи в таблице + if (username.contains(teg)){ + User u = new User(); + u.setId(id); + u.setMail(email); + u.setName(username); + uList.add(u); + } + } + } + catch (Exception ex){ + System.err.println ("Подключение к серверу баз данных не установлено ... "); + ex.printStackTrace(); + System.out.println (ex); + } + b = JOptionPane.showConfirmDialog(null, "Добавить еще тег?", "try", JOptionPane.OK_CANCEL_OPTION); + System.out.println("Сделан выбор: " + b); + } + this.users = uList; + } + + /** + * Фильтруем пользователей, находим дубли почтовых ящиков + * когда ящик совпал, перебираем результаты и заменяем ID пользователя в результате + * + * удаляем пользователей, для которых отсутствуют результаты. + * + * @param base + */ + public void filterByMail (ArrayList users, ArrayList results){ + ArrayList fusers = new ArrayList<>();//отфильтрованные пользователи + //ArrayList fresults = new ArrayList<>();//исправленные результаты + //перебираем юзеров + //Stream> streamUsers = Stream.of(users); + //streamUsers.filter(predicate) + int currentUser = 0; + while (currentUser < users.size()){ + User user = users.get(currentUser); + ArrayList userList= new ArrayList<>();//список аккаунтов пользователя с одинаковыми mail + //формируем список аккаунтов пользователя + int c = 0; + //сравниваем почтовый ящик текущего пользователя с пользователями по списку, запоминаем все повторения. + while (c < users.size()){ + if (user.getMail().equals(users.get(c).getMail())){ + userList.add(users.get(c));//список аккаунтов текущего пользователя + } + c++; + } + //если у пользователя больше одного аккаунта, + if (userList.size() != 1){ + //System.out.println("Пользователь: " + userList.get(0).getMail() + "количество аккаунтов: " + userList.size()); + /** + * переписываем результаты тестирования текущего пользователя + * заменяем в старых результатах id пользователя + * перебираем список дублирующихся аккаунтов + * */ + //перебираем список дублирующихся аккаунтов + int uacc = 0; + while (uacc < userList.size()){ + //если аккаунт не первый + if (uacc != 0){ + //перебираем результаты + int rCurr = 0; + while (rCurr < results.size()){ + if (userList.get(uacc).getId() == results.get(rCurr).getUserid()){ + results.get(rCurr).setUserid(userList.get(0).getId());//сменили id пользователя в строке результата + } + rCurr++; + } + } + uacc++; + } + } + //формирование списка пользователей, без дублирований + if (userList.size() != 1){//tесли есть дублирования + if (user.getId() == userList.get(0).getId()){//и пользователь первый в списке дублей + fusers.add(user); + } + } + else{ + fusers.add(user);//нет дублирований + } + currentUser++;//переходим к следующему пользователю + } + + //Вычисляем пользователей, которые не проходили тестирование (нет результатов) + /** + * + */ + //перебираем список не дублирующихся пользователей + ArrayList balbesers = new ArrayList<>(); + int uClear = 0; + while (uClear < fusers.size()){ + //список пользователей, не сдававших тесты + //перебираем результаты + int rClear = 0; + int num = 0; + while (rClear < results.size()){ + if (fusers.get(uClear).getId() == results.get(rClear).getUserid()){ + num++;//считаем количество тестов пройденных пользователем + } + rClear++; + } + if (num == 0){ + balbesers.add(fusers.get(uClear)); + } + uClear++; + } + + /** + * формирование отчетов + * + */ + System.out.println("Учетных записей: " + users.size()); + System.out.println("Пользователей (без дублирований): " + fusers.size()); + System.out.println("Пользователей (balbesers): " + balbesers.size()); + } + + /** + * Главный метод, для проверки кода + * @param args + */ + public static void main (String[] args){ + System.out.println("Подключение к серверу баз данных ..."); + Connection conn = null; + try{ + //данные аккаунта + String userName = Access.getUserName(); + String password = Access.getPassword(); + String url = Access.getURL(); + conn = DriverManager.getConnection (url, userName, password); + System.out.println ("Подключение к серверу баз данных установлено ... "); + + //Формирование перечня пользователей, по которым нужно подготовить отчет + //использование метода setUsersByTeg + Base b = new Base(); + b.setUsersByTeg(conn); + System.out.println("Перечень пользователей для формирования отчета установлен ... "); + + //Формирование результатов тестирования, для указанных пользователей + b.setResults(conn, b.getUsers()); + System.out.println("Результаты тестирования пользователей получены из базы данных ... "); + + //расшифровка данных о пройденных пользователями тестах + b.setQuizes(conn, b); + + //выгрузка отчета в xlsx (по результатам обучения группы, содержащий дублирования и прогульщиков) + b.createExcellReport(conn, b); + + // выводим отчет в консоль + //Выводим перечень тестов в консоль + System.out.println("Всего тестов: " + b.getQuizes().size()); + System.out.println("Всего записано на тестирование человек: " + b.getUsers().size()); + System.out.println("Всего результатов (человеко-тестов): " + b.getResults().size()); + + /** + * Фильтрация результатов по уникальному почтовому ящику + * отчет общий по статистике обучения + */ + b.filterByMail(b.getUsers(), b.getResults()); + + + } + catch (Exception ex){ + System.err.println ("Подключение к серверу баз данных не установлено ... "); + ex.printStackTrace(); + System.out.println (ex); + } + finally{ + if (conn != null){ + try{ + System.out.println("Попытка отключения от базы данных ... "); + conn.close (); + System.out.println ("Подключение к базе данных завершено. "); + } + catch (Exception ex){ + System.out.println ("Подключение к серверу баз данных уже отсутствует."); + System.out.println (ex); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/egspt/moodle/Quiz.java b/src/main/java/ru/egspt/moodle/Quiz.java new file mode 100644 index 0000000..07b2212 --- /dev/null +++ b/src/main/java/ru/egspt/moodle/Quiz.java @@ -0,0 +1,37 @@ +package ru.egspt.moodle; + +/** + * Данные об опросе для подстановки в отчет наименований, вместо id опроса + * - наименование + * - id + * + */ +public class Quiz { + private int id; + private String name; + + /** + * @param id the id to set + */ + public void setId(int id) { + this.id = id; + } + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + /** + * @return the id + */ + public int getId() { + return id; + } + /** + * @return the name + */ + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/egspt/moodle/Result.java b/src/main/java/ru/egspt/moodle/Result.java new file mode 100644 index 0000000..7192f72 --- /dev/null +++ b/src/main/java/ru/egspt/moodle/Result.java @@ -0,0 +1,75 @@ +package ru.egspt.moodle; + +/** + * Результат тестирования + * - набранные баллы + * - длительность сдачи теста + */ +public class Result { + private int id; + private int quizid; + private int userid; + private double grade; + private Long time; + + /** + * @return the id + */ + public int getId() { + return id; + } + /** + * @param id the id to set + */ + public void setId(int id) { + this.id = id; + } + /** + * @return the quiz + */ + public int getQuizid() { + return quizid; + } + /** + * @param quiz the quiz to set + */ + public void setQuizid(int quizid) { + this.quizid = quizid; + } + /** + * @return the userid + */ + public int getUserid() { + return userid; + } + /** + * @param userid the userid to set + */ + public void setUserid(int userid) { + this.userid = userid; + } + /** + * @return the grade + */ + public double getGrade() { + return grade; + } + /** + * @param grade the grade to set + */ + public void setGrade(double grade) { + this.grade = grade; + } + /** + * @return the time + */ + public Long getTime() { + return time; + } + /** + * @param time2 the time to set + */ + public void setTime(Long time2) { + this.time = time2; + } +} diff --git a/src/main/java/ru/egspt/moodle/User.java b/src/main/java/ru/egspt/moodle/User.java new file mode 100644 index 0000000..99e74b4 --- /dev/null +++ b/src/main/java/ru/egspt/moodle/User.java @@ -0,0 +1,52 @@ +package ru.egspt.moodle; + +/** + * Данные пользователей + * - уникальный номер + * - имя + * - почта + * - + * + */ +public class User { + private int id; + private String name; + private String mail; + + /** + * @return the id + */ + public int getId() { + return id; + } + /** + * @return the mail + */ + public String getMail() { + return mail; + } + /** + * @return the name + */ + public String getName() { + return name; + } + /** + * @param id the id to set + */ + public void setId(int id) { + this.id = id; + } + /** + * @param mail the mail to set + */ + public void setMail(String mail) { + this.mail = mail; + } + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } +} diff --git a/src/test/java/ru/egspt/moodle/AppTest.java b/src/test/java/ru/egspt/moodle/AppTest.java new file mode 100644 index 0000000..361a520 --- /dev/null +++ b/src/test/java/ru/egspt/moodle/AppTest.java @@ -0,0 +1,20 @@ +package ru.egspt.moodle; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/target/classes/ru/egspt/moodle/Access.class b/target/classes/ru/egspt/moodle/Access.class new file mode 100644 index 0000000..ba2ed46 Binary files /dev/null and b/target/classes/ru/egspt/moodle/Access.class differ diff --git a/target/classes/ru/egspt/moodle/App.class b/target/classes/ru/egspt/moodle/App.class new file mode 100644 index 0000000..311264f Binary files /dev/null and b/target/classes/ru/egspt/moodle/App.class differ diff --git a/target/classes/ru/egspt/moodle/Base.class b/target/classes/ru/egspt/moodle/Base.class new file mode 100644 index 0000000..00c130d Binary files /dev/null and b/target/classes/ru/egspt/moodle/Base.class differ diff --git a/target/classes/ru/egspt/moodle/Quiz.class b/target/classes/ru/egspt/moodle/Quiz.class new file mode 100644 index 0000000..f512102 Binary files /dev/null and b/target/classes/ru/egspt/moodle/Quiz.class differ diff --git a/target/classes/ru/egspt/moodle/Result.class b/target/classes/ru/egspt/moodle/Result.class new file mode 100644 index 0000000..79b18ed Binary files /dev/null and b/target/classes/ru/egspt/moodle/Result.class differ diff --git a/target/classes/ru/egspt/moodle/User.class b/target/classes/ru/egspt/moodle/User.class new file mode 100644 index 0000000..511c670 Binary files /dev/null and b/target/classes/ru/egspt/moodle/User.class differ diff --git a/target/dependencies.txt b/target/dependencies.txt new file mode 100644 index 0000000..d33eb83 --- /dev/null +++ b/target/dependencies.txt @@ -0,0 +1,107 @@ +digraph "ru.egspt.moodle:anyreport:jar:0.1" { + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:poi:jar:5.2.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:poi-ooxml:jar:5.2.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:poi-ooxml-schemas:jar:4.1.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:poi-scratchpad:jar:5.2.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:ooxml-schemas:jar:1.1:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:openxml4j:jar:1.0-beta:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.logging.log4j:log4j-to-slf4j:jar:2.8.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "junit:junit:jar:4.11:test" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "mysql:mysql-connector-java:jar:8.0.28:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "commons-codec:commons-codec:jar:1.15:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "org.apache.commons:commons-collections4:jar:4.4:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "org.apache.commons:commons-math3:jar:3.6.1:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "commons-io:commons-io:jar:2.11.0:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "com.zaxxer:SparseBitSet:jar:1.2:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "org.apache.logging.log4j:log4j-api:jar:2.17.2:compile" ; + "org.apache.poi:poi-ooxml:jar:5.2.2:compile" -> "org.apache.poi:poi-ooxml-lite:jar:5.2.2:compile" ; + "org.apache.poi:poi-ooxml:jar:5.2.2:compile" -> "org.apache.xmlbeans:xmlbeans:jar:5.0.3:compile" ; + "org.apache.poi:poi-ooxml:jar:5.2.2:compile" -> "org.apache.commons:commons-compress:jar:1.21:compile" ; + "org.apache.poi:poi-ooxml:jar:5.2.2:compile" -> "com.github.virtuald:curvesapi:jar:1.07:compile" ; + "org.apache.poi:openxml4j:jar:1.0-beta:compile" -> "dom4j:dom4j:jar:1.6.1:compile" ; + "org.apache.poi:openxml4j:jar:1.0-beta:compile" -> "log4j:log4j:jar:1.2.8:compile" ; + "dom4j:dom4j:jar:1.6.1:compile" -> "xml-apis:xml-apis:jar:1.0.b2:compile" ; + "org.apache.logging.log4j:log4j-to-slf4j:jar:2.8.2:compile" -> "org.slf4j:slf4j-api:jar:1.7.24:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.google.guava:guava:jar:r08:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "commons-cli:commons-cli:jar:1.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "commons-collections:commons-collections:jar:3.2.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "commons-lang:commons-lang:jar:2.4:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:jar:1.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.antlr:antlr:jar:3.2:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.apache.cassandra.deps:avro:jar:1.4.0-cassandra-1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.codehaus.jackson:jackson-core-asl:jar:1.4.0:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.codehaus.jackson:jackson-mapper-asl:jar:1.4.0:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "jline:jline:jar:0.9.94:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.googlecode.json-simple:json-simple:jar:1.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.github.stephenc.high-scale-lib:high-scale-lib:jar:1.1.2:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.yaml:snakeyaml:jar:1.6:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.apache.thrift:libthrift:jar:0.6.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.apache.cassandra:cassandra-thrift:jar:0.8.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.github.stephenc:jamm:jar:0.2.2:compile" ; + "org.antlr:antlr:jar:3.2:compile" -> "org.antlr:antlr-runtime:jar:3.2:compile" ; + "org.antlr:antlr-runtime:jar:3.2:compile" -> "org.antlr:stringtemplate:jar:3.2:compile" ; + "org.antlr:stringtemplate:jar:3.2:compile" -> "antlr:antlr:jar:2.7.7:compile" ; + "org.apache.cassandra.deps:avro:jar:1.4.0-cassandra-1:compile" -> "org.mortbay.jetty:jetty:jar:6.1.22:compile" ; + "org.mortbay.jetty:jetty:jar:6.1.22:compile" -> "org.mortbay.jetty:jetty-util:jar:6.1.22:compile" ; + "org.mortbay.jetty:jetty:jar:6.1.22:compile" -> "org.mortbay.jetty:servlet-api:jar:2.5-20081211:compile" ; + "org.apache.thrift:libthrift:jar:0.6.1:compile" -> "javax.servlet:servlet-api:jar:2.5:compile" ; + "org.apache.thrift:libthrift:jar:0.6.1:compile" -> "org.apache.httpcomponents:httpclient:jar:4.0.1:compile" ; + "org.apache.httpcomponents:httpclient:jar:4.0.1:compile" -> "org.apache.httpcomponents:httpcore:jar:4.0.1:compile" ; + "org.apache.httpcomponents:httpclient:jar:4.0.1:compile" -> "commons-logging:commons-logging:jar:1.1.1:compile" ; + "junit:junit:jar:4.11:test" -> "org.hamcrest:hamcrest-core:jar:1.3:test" ; + "mysql:mysql-connector-java:jar:8.0.28:compile" -> "com.google.protobuf:protobuf-java:jar:3.11.4:compile" ; + } digraph "ru.egspt.moodle:anyreport:jar:0.1" { + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:poi:jar:5.2.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:poi-ooxml:jar:5.2.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:poi-ooxml-schemas:jar:4.1.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:poi-scratchpad:jar:5.2.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:ooxml-schemas:jar:1.1:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.poi:openxml4j:jar:1.0-beta:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.logging.log4j:log4j-to-slf4j:jar:2.8.2:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "junit:junit:jar:4.11:test" ; + "ru.egspt.moodle:anyreport:jar:0.1" -> "mysql:mysql-connector-java:jar:8.0.28:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "commons-codec:commons-codec:jar:1.15:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "org.apache.commons:commons-collections4:jar:4.4:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "org.apache.commons:commons-math3:jar:3.6.1:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "commons-io:commons-io:jar:2.11.0:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "com.zaxxer:SparseBitSet:jar:1.2:compile" ; + "org.apache.poi:poi:jar:5.2.2:compile" -> "org.apache.logging.log4j:log4j-api:jar:2.17.2:compile" ; + "org.apache.poi:poi-ooxml:jar:5.2.2:compile" -> "org.apache.poi:poi-ooxml-lite:jar:5.2.2:compile" ; + "org.apache.poi:poi-ooxml:jar:5.2.2:compile" -> "org.apache.xmlbeans:xmlbeans:jar:5.0.3:compile" ; + "org.apache.poi:poi-ooxml:jar:5.2.2:compile" -> "org.apache.commons:commons-compress:jar:1.21:compile" ; + "org.apache.poi:poi-ooxml:jar:5.2.2:compile" -> "com.github.virtuald:curvesapi:jar:1.07:compile" ; + "org.apache.poi:openxml4j:jar:1.0-beta:compile" -> "dom4j:dom4j:jar:1.6.1:compile" ; + "org.apache.poi:openxml4j:jar:1.0-beta:compile" -> "log4j:log4j:jar:1.2.8:compile" ; + "dom4j:dom4j:jar:1.6.1:compile" -> "xml-apis:xml-apis:jar:1.0.b2:compile" ; + "org.apache.logging.log4j:log4j-to-slf4j:jar:2.8.2:compile" -> "org.slf4j:slf4j-api:jar:1.7.24:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.google.guava:guava:jar:r08:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "commons-cli:commons-cli:jar:1.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "commons-collections:commons-collections:jar:3.2.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "commons-lang:commons-lang:jar:2.4:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:jar:1.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.antlr:antlr:jar:3.2:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.apache.cassandra.deps:avro:jar:1.4.0-cassandra-1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.codehaus.jackson:jackson-core-asl:jar:1.4.0:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.codehaus.jackson:jackson-mapper-asl:jar:1.4.0:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "jline:jline:jar:0.9.94:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.googlecode.json-simple:json-simple:jar:1.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.github.stephenc.high-scale-lib:high-scale-lib:jar:1.1.2:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.yaml:snakeyaml:jar:1.6:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.apache.thrift:libthrift:jar:0.6.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "org.apache.cassandra:cassandra-thrift:jar:0.8.1:compile" ; + "org.apache.cassandra:cassandra-all:jar:0.8.1:compile" -> "com.github.stephenc:jamm:jar:0.2.2:compile" ; + "org.antlr:antlr:jar:3.2:compile" -> "org.antlr:antlr-runtime:jar:3.2:compile" ; + "org.antlr:antlr-runtime:jar:3.2:compile" -> "org.antlr:stringtemplate:jar:3.2:compile" ; + "org.antlr:stringtemplate:jar:3.2:compile" -> "antlr:antlr:jar:2.7.7:compile" ; + "org.apache.cassandra.deps:avro:jar:1.4.0-cassandra-1:compile" -> "org.mortbay.jetty:jetty:jar:6.1.22:compile" ; + "org.mortbay.jetty:jetty:jar:6.1.22:compile" -> "org.mortbay.jetty:jetty-util:jar:6.1.22:compile" ; + "org.mortbay.jetty:jetty:jar:6.1.22:compile" -> "org.mortbay.jetty:servlet-api:jar:2.5-20081211:compile" ; + "org.apache.thrift:libthrift:jar:0.6.1:compile" -> "javax.servlet:servlet-api:jar:2.5:compile" ; + "org.apache.thrift:libthrift:jar:0.6.1:compile" -> "org.apache.httpcomponents:httpclient:jar:4.0.1:compile" ; + "org.apache.httpcomponents:httpclient:jar:4.0.1:compile" -> "org.apache.httpcomponents:httpcore:jar:4.0.1:compile" ; + "org.apache.httpcomponents:httpclient:jar:4.0.1:compile" -> "commons-logging:commons-logging:jar:1.1.1:compile" ; + "junit:junit:jar:4.11:test" -> "org.hamcrest:hamcrest-core:jar:1.3:test" ; + "mysql:mysql-connector-java:jar:8.0.28:compile" -> "com.google.protobuf:protobuf-java:jar:3.11.4:compile" ; + } \ No newline at end of file diff --git a/target/test-classes/ru/egspt/moodle/AppTest.class b/target/test-classes/ru/egspt/moodle/AppTest.class new file mode 100644 index 0000000..f6ebb15 Binary files /dev/null and b/target/test-classes/ru/egspt/moodle/AppTest.class differ