Search in sources :

Example 11 with AnyMemoDBOpenHelper

use of org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper in project AnyMemo by helloworld1.

the class DatabaseUtilsTest method testMergeDatabase.

@SmallTest
@Test
@SuppressWarnings("unused")
public void testMergeDatabase() throws Exception {
    // Create testing DB to merge
    String path2 = "/sdcard/testdb2.db";
    new File(path2).delete();
    AnyMemoDBOpenHelper helper2 = AnyMemoDBOpenHelperManager.getHelper(getContext(), path2);
    // DAOs to use
    CardDao destCardDao = helper.getCardDao();
    CategoryDao destCategoryDao = helper.getCategoryDao();
    LearningDataDao destLearningDataDao = helper.getLearningDataDao();
    CardDao srcCardDao = helper2.getCardDao();
    CategoryDao srcCategoryDao = helper2.getCategoryDao();
    LearningDataDao srcLearningDataDao = helper2.getLearningDataDao();
    // Create some categories in both db to test category merge
    Category destCat1 = destCategoryDao.createOrReturn("cat1");
    Category destCat2 = destCategoryDao.createOrReturn("cat2");
    Category srcCat2 = srcCategoryDao.createOrReturn("cat2");
    Category srcCat3 = srcCategoryDao.createOrReturn("cat3");
    // Modify the learning data and category for some cards in src
    Card destCard20 = destCardDao.queryForId(20);
    destCategoryDao.refresh(destCard20.getCategory());
    destLearningDataDao.refresh(destCard20.getLearningData());
    destCard20.setCategory(destCat1);
    LearningData destLd20 = destCard20.getLearningData();
    // Use a specific acq_reps for testing
    destLd20.setAcqReps(15);
    destLearningDataDao.update(destLd20);
    destCardDao.update(destCard20);
    // Another card for testing duplicated category in src and dest
    Card destCard21 = destCardDao.queryForId(21);
    destCategoryDao.refresh(destCard21.getCategory());
    destLearningDataDao.refresh(destCard21.getLearningData());
    destCard21.setCategory(destCat2);
    LearningData destLd21 = destCard21.getLearningData();
    destLd21.setAcqReps(16);
    destLearningDataDao.update(destLd21);
    destCardDao.update(destCard21);
    // Now set up the cards in the src db
    // Card 1 with a duplicated category as dest db
    Card srcCard1 = new Card();
    srcCard1.setQuestion("card1");
    LearningData srcLd1 = new LearningData();
    srcLd1.setAcqReps(8);
    srcCard1.setLearningData(srcLd1);
    srcCard1.setCategory(srcCat2);
    srcCardDao.createCard(srcCard1);
    // Card 2 with a new category
    Card srcCard2 = new Card();
    srcCard2.setQuestion("card2");
    LearningData srcLd2 = new LearningData();
    srcLd2.setAcqReps(10);
    srcCard2.setLearningData(srcLd2);
    srcCard2.setCategory(srcCat3);
    srcCardDao.createCard(srcCard2);
    // Card 3 with default lenaring data and category
    Card srcCard3 = new Card();
    srcCard3.setQuestion("card3");
    srcCard3.setCategory(new Category());
    srcCard3.setLearningData(new LearningData());
    srcCardDao.createCard(srcCard3);
    // Now merge them!
    databaseUtil.mergeDatabases(TestHelper.SAMPLE_DB_PATH, path2);
    // Original 28 plus 3 merged cards
    assertEquals(31, destCardDao.queryForAll().size());
    assertEquals(31, destLearningDataDao.queryForAll().size());
    // 5 categories: "", "french-body-parts.db", "cat1", "cat2", "cat3"
    assertEquals(5, destCategoryDao.queryForAll().size());
    // Query out the cards we are interested in
    Card mergedCard20 = destCardDao.queryForId(20);
    destLearningDataDao.refresh(mergedCard20.getLearningData());
    destCategoryDao.refresh(mergedCard20.getCategory());
    Card mergedCard21 = destCardDao.queryForId(21);
    destLearningDataDao.refresh(mergedCard21.getLearningData());
    destCategoryDao.refresh(mergedCard21.getCategory());
    Card mergedCard29 = destCardDao.queryForId(29);
    destLearningDataDao.refresh(mergedCard29.getLearningData());
    destCategoryDao.refresh(mergedCard29.getCategory());
    Card mergedCard30 = destCardDao.queryForId(30);
    destLearningDataDao.refresh(mergedCard30.getLearningData());
    destCategoryDao.refresh(mergedCard30.getCategory());
    Card mergedCard31 = destCardDao.queryForId(31);
    destLearningDataDao.refresh(mergedCard31.getLearningData());
    destCategoryDao.refresh(mergedCard31.getCategory());
    // Now verify
    // The original cards in dest should be intact
    assertEquals(destCard20.getOrdinal(), mergedCard20.getOrdinal());
    assertEquals(destCard20.getQuestion(), mergedCard20.getQuestion());
    assertEquals("cat1", mergedCard20.getCategory().getName());
    assertEquals(15, (int) mergedCard20.getLearningData().getAcqReps());
    assertEquals(destCard21.getOrdinal(), mergedCard21.getOrdinal());
    assertEquals(destCard21.getQuestion(), mergedCard21.getQuestion());
    assertEquals("cat2", mergedCard21.getCategory().getName());
    assertEquals(16, (int) mergedCard21.getLearningData().getAcqReps());
    // The newly merged cards
    assertEquals(29, (int) mergedCard29.getOrdinal());
    assertEquals("card1", mergedCard29.getQuestion());
    assertEquals("cat2", mergedCard29.getCategory().getName());
    assertEquals(8, (int) mergedCard29.getLearningData().getAcqReps());
    assertEquals(30, (int) mergedCard30.getOrdinal());
    assertEquals("card2", mergedCard30.getQuestion());
    assertEquals("cat3", mergedCard30.getCategory().getName());
    assertEquals(10, (int) mergedCard30.getLearningData().getAcqReps());
    assertEquals(31, (int) mergedCard31.getOrdinal());
    assertEquals("card3", mergedCard31.getQuestion());
    assertEquals("", mergedCard31.getCategory().getName());
    assertEquals(0, (int) mergedCard31.getLearningData().getAcqReps());
    // Clearn up
    AnyMemoDBOpenHelperManager.releaseHelper(helper2);
    new File(path2).delete();
}
Also used : AnyMemoDBOpenHelper(org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper) Category(org.liberty.android.fantastischmemo.entity.Category) CategoryDao(org.liberty.android.fantastischmemo.dao.CategoryDao) File(java.io.File) LearningDataDao(org.liberty.android.fantastischmemo.dao.LearningDataDao) LearningData(org.liberty.android.fantastischmemo.entity.LearningData) CardDao(org.liberty.android.fantastischmemo.dao.CardDao) Card(org.liberty.android.fantastischmemo.entity.Card) SmallTest(androidx.test.filters.SmallTest) Test(org.junit.Test) AbstractExistingDBTest(org.liberty.android.fantastischmemo.test.AbstractExistingDBTest) SmallTest(androidx.test.filters.SmallTest)

Example 12 with AnyMemoDBOpenHelper

use of org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper in project AnyMemo by helloworld1.

the class Mnemosyne2CardsExporter method createXMLFile.

private void createXMLFile(String dbPath, File xmlFile) throws IOException {
    AnyMemoDBOpenHelper helper = null;
    PrintWriter outXml = null;
    try {
        helper = AnyMemoDBOpenHelperManager.getHelper(dbPath);
        CardDao cardDao = helper.getCardDao();
        CategoryDao categoryDao = helper.getCategoryDao();
        LearningDataDao learningDataDao = helper.getLearningDataDao();
        int cardCount = (int) cardDao.countOf();
        outXml = new PrintWriter(new BufferedWriter(new FileWriter(xmlFile)));
        outXml.printf("<openSM2sync number_of_entries=\"%d\">\n", cardCount);
        // First card tags (categories)
        Map<String, String> categoryOidMap = new HashMap<String, String>();
        Map<Integer, String> cardIdOidMap = new HashMap<Integer, String>(cardCount * 4 / 3);
        Iterator<Category> categoryIterator = categoryDao.iterator();
        while (categoryIterator.hasNext()) {
            Category category = categoryIterator.next();
            String tagName = "__UNTAGGED__";
            String oId = generateOid();
            if (!Strings.isNullOrEmpty(category.getName())) {
                tagName = category.getName();
            }
            categoryOidMap.put(tagName, oId);
            outXml.printf("<log type=\"10\" o_id=\"%s\"><name>%s</name></log>\n", oId, AMStringUtils.encodeXML(tagName));
        }
        // Then cards
        Iterator<Card> cardIterator = cardDao.iterator();
        while (cardIterator.hasNext()) {
            Card card = cardIterator.next();
            String front = card.getQuestion();
            String back = card.getAnswer();
            String oId = generateOid();
            cardIdOidMap.put(card.getId(), oId);
            outXml.printf("<log type=\"16\" o_id=\"%s\"><b>%s</b><f>%s</f></log>\n", oId, AMStringUtils.encodeXML(back), AMStringUtils.encodeXML(front));
        }
        // Then learningData
        // <log card_t="1" fact_v="1.1" e="2.5" gr="-1" tags="5SfWDFGwqrlnGLDQxHHyG0" rt_rp_l="0" lps="0" l_rp="-1" n_rp="-1" ac_rp_l="0" rt_rp="0" ac_rp="0" type="6" o_id="7IXjCysHuCDtXo8hlFrK55" fact="7xmRCBH0WP0DZaxeFn5NLw"></log>
        Iterator<Card> cardIterator2 = cardDao.iterator();
        while (cardIterator2.hasNext()) {
            Card card = cardIterator2.next();
            categoryDao.refresh(card.getCategory());
            learningDataDao.refresh(card.getLearningData());
            String fact = cardIdOidMap.get(card.getId());
            String category = card.getCategory().getName();
            if (Strings.isNullOrEmpty(category)) {
                category = "__UNTAGGED__";
            }
            String tags = categoryOidMap.get(category);
            String oId = generateOid();
            // Needs to converter to unix time
            LearningData learningData = card.getLearningData();
            long l_rp = learningData.getLastLearnDate().getTime() / 1000;
            long n_rp = learningData.getNextLearnDate().getTime() / 1000;
            outXml.printf("<log card_t=\"1\" fact_v=\"1.1\" e=\"%f\" gr=\"%d\" tags=\"%s\" rt_rp_l=\"%d\" lps=\"%d\" l_rp=\"%d\" n_rp=\"%d\" ac_rp_l=\"%d\" rt_rp=\"%d\" ac_rp=\"%d\" type=\"6\" o_id=\"%s\" fact=\"%s\"></log>\n", learningData.getEasiness(), learningData.getGrade(), tags, learningData.getRetRepsSinceLapse(), learningData.getLapses(), l_rp, n_rp, learningData.getAcqRepsSinceLapse(), learningData.getRetReps(), learningData.getAcqReps(), oId, fact);
        }
        outXml.print("</openSM2sync>\n");
    } finally {
        if (helper != null) {
            AnyMemoDBOpenHelperManager.releaseHelper(helper);
        }
        if (outXml != null) {
            outXml.close();
        }
    }
}
Also used : Category(org.liberty.android.fantastischmemo.entity.Category) CategoryDao(org.liberty.android.fantastischmemo.dao.CategoryDao) HashMap(java.util.HashMap) FileWriter(java.io.FileWriter) LearningDataDao(org.liberty.android.fantastischmemo.dao.LearningDataDao) BufferedWriter(java.io.BufferedWriter) Card(org.liberty.android.fantastischmemo.entity.Card) AnyMemoDBOpenHelper(org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper) LearningData(org.liberty.android.fantastischmemo.entity.LearningData) CardDao(org.liberty.android.fantastischmemo.dao.CardDao) PrintWriter(java.io.PrintWriter)

Example 13 with AnyMemoDBOpenHelper

use of org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper in project AnyMemo by helloworld1.

the class MnemosyneXMLExporter method convert.

public void convert(String src, String dest) throws Exception {
    AnyMemoDBOpenHelper helper = AnyMemoDBOpenHelperManager.getHelper(src);
    String dbName = FilenameUtils.getName(dest);
    PrintWriter outxml = null;
    try {
        final CardDao cardDao = helper.getCardDao();
        final LearningDataDao learningDataDao = helper.getLearningDataDao();
        final CategoryDao categoryDao = helper.getCategoryDao();
        // Populate all category field in a transaction.
        List<Card> cardList = cardDao.callBatchTasks(new Callable<List<Card>>() {

            public List<Card> call() throws Exception {
                List<Card> cards = cardDao.queryForAll();
                for (Card c : cards) {
                    categoryDao.refresh(c.getCategory());
                    learningDataDao.refresh(c.getLearningData());
                }
                return cards;
            }
        });
        if (cardList == null || cardList.size() == 0) {
            throw new IOException("Read empty or corrupted file");
        }
        outxml = new PrintWriter(new BufferedWriter(new FileWriter(dest)));
        if (outxml.checkError()) {
            throw new IOException("Can't open: " + dest);
        }
        int count = 0;
        long timeOfStart = 0L;
        String id, u, gr, e, ac_rp, rt_rp, lps, ac_rp_l, rt_rp_l, l_rp, n_rp, question, answer, category;
        // Now write the xml to the file
        for (Card card : cardList) {
            // At the first item, we write all metadata
            if (count == 0) {
                // timeOfStart = item.getDatelearnUnix();
                // 2000-01-01 12:00
                timeOfStart = 946728000L;
                outxml.print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
                outxml.print("<mnemosyne core_version=\"1\" time_of_start=\"" + timeOfStart + "\" >\n");
                outxml.print("<category active=\"1\">\n");
                outxml.print("<name>" + dbName + "</name>\n");
                outxml.print("</category>\n");
            }
            // Convert the learning data
            LearningData ld = card.getLearningData();
            id = "" + card.getOrdinal();
            gr = "" + ld.getGrade();
            e = "" + ld.getEasiness();
            ac_rp = "" + ld.getAcqReps();
            rt_rp = "" + ld.getRetReps();
            lps = "" + ld.getLapses();
            ac_rp_l = "" + ld.getAcqRepsSinceLapse();
            rt_rp_l = "" + ld.getRetRepsSinceLapse();
            ;
            if (ac_rp.equals("0")) {
                u = "1";
            } else {
                u = "0";
            }
            // Add 1 here to avoid rounding problem
            l_rp = Long.toString((ld.getLastLearnDate().getTime() / 1000 - timeOfStart) / 86400);
            n_rp = Long.toString((ld.getNextLearnDate().getTime() / 1000 - timeOfStart) / 86400 + 1);
            // Replace the illegal symbols from the question and answer
            question = card.getQuestion();
            answer = card.getAnswer();
            category = card.getCategory().getName();
            if (question == null) {
                question = "";
            }
            if (answer == null) {
                answer = "";
            }
            if (category == null) {
                category = "";
            }
            question = question.replaceAll("&", "&amp;");
            question = question.replaceAll("<", "&lt;");
            question = question.replaceAll(">", "&gt;");
            question = question.replaceAll("'", "&apos;");
            question = question.replaceAll("\"", "&quot;");
            answer = answer.replaceAll("&", "&amp;");
            answer = answer.replaceAll("<", "&lt;");
            answer = answer.replaceAll(">", "&gt;");
            answer = answer.replaceAll("'", "&apos;");
            answer = answer.replaceAll("\"", "&quot;");
            category = category.replaceAll("&", "&amp;");
            category = category.replaceAll("<", "&lt;");
            category = category.replaceAll(">", "&gt;");
            category = category.replaceAll("'", "&apos;");
            category = category.replaceAll("\"", "&quot;");
            outxml.print("<item id=\"" + id + "\" u=\"" + u + "\" gr=\"" + gr + "\" e=\"" + e + "\" ac_rp=\"" + ac_rp + "\" rt_rp=\"" + rt_rp + "\" lps=\"" + lps + "\" ac_rp_l=\"" + ac_rp_l + "\" rt_rp_l=\"" + rt_rp_l + "\" l_rp=\"" + l_rp + "\" n_rp=\"" + n_rp + "\">\n");
            if (category.equals("")) {
                outxml.print("<cat>" + dbName + "</cat>\n");
            } else {
                outxml.print("<cat>" + category + "</cat>\n");
            }
            outxml.print("<Q>" + question + "</Q>\n");
            outxml.print("<A>" + answer + "</A>\n");
            outxml.print("</item>\n");
            if (outxml.checkError()) {
                throw new IOException("Error writing xml on id: " + id);
            }
            count += 1;
        }
        outxml.print("</mnemosyne>");
        outxml.close();
    } finally {
        AnyMemoDBOpenHelperManager.releaseHelper(helper);
        if (outxml != null) {
            outxml.close();
        }
    }
}
Also used : CategoryDao(org.liberty.android.fantastischmemo.dao.CategoryDao) FileWriter(java.io.FileWriter) IOException(java.io.IOException) LearningDataDao(org.liberty.android.fantastischmemo.dao.LearningDataDao) IOException(java.io.IOException) Card(org.liberty.android.fantastischmemo.entity.Card) BufferedWriter(java.io.BufferedWriter) AnyMemoDBOpenHelper(org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper) List(java.util.List) LearningData(org.liberty.android.fantastischmemo.entity.LearningData) CardDao(org.liberty.android.fantastischmemo.dao.CardDao) PrintWriter(java.io.PrintWriter)

Example 14 with AnyMemoDBOpenHelper

use of org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper in project AnyMemo by helloworld1.

the class QATxtExporter method convert.

public void convert(String src, String dest) throws Exception {
    new File(dest).delete();
    AnyMemoDBOpenHelper helper = AnyMemoDBOpenHelperManager.getHelper(src);
    try {
        final CardDao cardDao = helper.getCardDao();
        PrintWriter outtxt = new PrintWriter(new BufferedWriter(new FileWriter(dest)));
        if (outtxt.checkError()) {
            throw new IOException("Can't open: " + dest + " for writting");
        }
        List<Card> cardList = cardDao.queryForAll();
        if (cardList == null || cardList.size() == 0) {
            throw new IOException("Can't retrieve items for database: " + src);
        }
        for (Card card : cardList) {
            outtxt.print("Q: " + card.getQuestion() + "\n");
            outtxt.print("A: " + card.getAnswer() + "\n\n");
        }
        outtxt.close();
    } finally {
        AnyMemoDBOpenHelperManager.releaseHelper(helper);
    }
}
Also used : AnyMemoDBOpenHelper(org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper) FileWriter(java.io.FileWriter) IOException(java.io.IOException) File(java.io.File) CardDao(org.liberty.android.fantastischmemo.dao.CardDao) PrintWriter(java.io.PrintWriter) BufferedWriter(java.io.BufferedWriter) Card(org.liberty.android.fantastischmemo.entity.Card)

Example 15 with AnyMemoDBOpenHelper

use of org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper in project AnyMemo by helloworld1.

the class Mnemosyne2CardsImporter method convert.

@Override
public void convert(String src, String dest) throws Exception {
    // Make the tmp directory tmp/[src file name]/
    String srcFilename = FilenameUtils.getName(src);
    File tmpDirectory = new File(AMEnv.DEFAULT_TMP_PATH + srcFilename);
    FileUtils.deleteDirectory(tmpDirectory);
    FileUtils.forceMkdir(tmpDirectory);
    AnyMemoDBOpenHelper helper = null;
    try {
        // First unzip the file since cards is just a zip archive
        // Example content of cards
        // $ ls
        // METADATA  cards.xml  musicnotes
        AMZipUtils.unZipFile(new File(src), tmpDirectory);
        // Make sure the XML file exists.
        File xmlFile = new File(tmpDirectory + "/cards.xml");
        if (!xmlFile.exists()) {
            throw new Exception("Could not find the cards.xml after extracting " + src);
        }
        List<Card> cardList = xmlToCards(xmlFile);
        if (!new File(dest).exists()) {
            amFileUtil.createDbFileWithDefaultSettings(new File(dest));
        }
        helper = AnyMemoDBOpenHelperManager.getHelper(dest);
        CardDao cardDao = helper.getCardDao();
        cardDao.createCards(cardList);
        // The last step is to see if there are images to import.
        Collection<File> imageFiles = FileUtils.listFiles(tmpDirectory, new SuffixFileFilter(new String[] { "jpg", "png", "bmp" }, IOCase.INSENSITIVE), DirectoryFileFilter.DIRECTORY);
        if (!imageFiles.isEmpty()) {
            String destDbName = FilenameUtils.getName(dest);
            File imageDir = new File(AMEnv.DEFAULT_IMAGE_PATH + destDbName);
            FileUtils.forceMkdir(imageDir);
            for (File imageFile : imageFiles) {
                FileUtils.copyFileToDirectory(imageFile, imageDir);
            }
        }
    } finally {
        if (helper != null) {
            AnyMemoDBOpenHelperManager.releaseHelper(helper);
        }
        FileUtils.deleteDirectory(tmpDirectory);
    }
}
Also used : AnyMemoDBOpenHelper(org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper) SuffixFileFilter(org.apache.commons.io.filefilter.SuffixFileFilter) File(java.io.File) IOException(java.io.IOException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) CardDao(org.liberty.android.fantastischmemo.dao.CardDao) Card(org.liberty.android.fantastischmemo.entity.Card)

Aggregations

AnyMemoDBOpenHelper (org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper)32 CardDao (org.liberty.android.fantastischmemo.dao.CardDao)28 Card (org.liberty.android.fantastischmemo.entity.Card)28 File (java.io.File)13 Category (org.liberty.android.fantastischmemo.entity.Category)11 CategoryDao (org.liberty.android.fantastischmemo.dao.CategoryDao)10 LearningDataDao (org.liberty.android.fantastischmemo.dao.LearningDataDao)9 LearningData (org.liberty.android.fantastischmemo.entity.LearningData)9 IOException (java.io.IOException)6 URL (java.net.URL)5 FileWriter (java.io.FileWriter)4 ArrayList (java.util.ArrayList)4 SmallTest (androidx.test.filters.SmallTest)3 BufferedWriter (java.io.BufferedWriter)3 PrintWriter (java.io.PrintWriter)3 SAXParser (javax.xml.parsers.SAXParser)3 SAXParserFactory (javax.xml.parsers.SAXParserFactory)3 Test (org.junit.Test)3 InputSource (org.xml.sax.InputSource)3 XMLReader (org.xml.sax.XMLReader)3