package ee.esutoniagodesu.service; import ee.esutoniagodesu.bean.ProjectDAO; import ee.esutoniagodesu.domain.library.table.Reading; import ee.esutoniagodesu.domain.library.table.ReadingPage; import ee.esutoniagodesu.repository.domain.library.ReadingPageRepository; import ee.esutoniagodesu.repository.domain.library.ReadingRepository; import ee.esutoniagodesu.repository.project.LibraryDB; import ee.esutoniagodesu.security.SecurityUtils; import ee.esutoniagodesu.security.permission.Permission; import ee.esutoniagodesu.util.PaginationUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.inject.Inject; import java.io.IOException; import java.util.List; /** * Lugemisharjutused. Artiklite moodulis saab hallata täispikki Jaapanikeelseid algtekste. * Tekst tükeldatakse 3-5 lauselisteks lõikudeks. Igale lõigule saab lisada heli. * Algajale on Jaapanikeelsete tekstide lugemine ilma abivahenditeta erakordselt tülikas. * Võib öelda, et ilma vähemalt 1500-t kanjit tundmata ei ole võimalik lugeda. * Seejuures ei ole lugemisoskus lineaarses seoses kanjide oskusega. * Tekstide moodulisse on koondatud erinevad abivahendid, et lugemist lihtsustada. * <p/> * TODO * kasutaja roll ei tohiks näha artiklite admin andmeid */ @Service @Transactional public class ReadingService { private static final Logger log = LoggerFactory.getLogger(ReadingService.class); @Inject private ProjectDAO dao; @Inject private ReadingRepository readingRepository; @Inject private ReadingPageRepository readingPageRepository; @Inject private LibraryDB libraryDB; @Inject private KuromojiService kuromojiService; @Inject private SHAFileService shaFileService; //------------------------------ artiklite vaade ------------------------------ public Reading update(Reading reading) { log.debug("update: reading=" + reading); //CPE.check(reading, Permission.reading_update); return save(reading); } public Reading create(Reading reading) { log.debug("create: reading=" + reading); //CPE.check(reading, Permission.reading_create); return save(reading); } private Reading save(Reading reading) { return readingRepository.save(reading); } public ReadingPage create(ReadingPage page) throws IOException { log.debug("create: page=" + page); //CPE.check(page, Permission.reading_create); return save(page); } public ReadingPage update(ReadingPage page) throws IOException { log.debug("update: page=" + page); //CPE.check(readingRepository.findOne(page.getReadingId()), Permission.reading_update); return save(page); } private ReadingPage save(ReadingPage p) throws IOException { if (p.getAudioFile() != null) { log.debug("save to shafs {}", p.getAudioFile().getOriginalFilename()); String sha = shaFileService.put(p.getAudioFile()); if (p.getAudioSha() != null && !p.getAudioSha().equals(sha)) { shaFileService.delete(p.getAudioSha()); } p.setAudioSha(sha); } return readingPageRepository.save(p); } private String uuid() { return SecurityUtils.getUserUuid(); } public String deleteAudio(int readingPageId) throws IOException { log.debug("deleteAudio: readingPageId=", readingPageId); ReadingPage page = readingPageRepository.findOne(readingPageId); if (page == null) return null; //CPE.check(readingRepository.findOne(page.getId()), Permission.reading_update); String sha = page.getAudioSha(); if (sha == null) return null; page.setAudioSha(null); readingPageRepository.save(page); shaFileService.delete(sha); return sha; } /** * Kasutajale näidatakse tema enda loodud ja avalikke artikleid. Pagineeritud. */ public Page<Reading> getReadings(Integer page, Integer limit) { return readingRepository.findAvailable(uuid(), PaginationUtil.generatePageRequest(page, limit)); } public Page<Reading> findByTag(String tag, Integer page, Integer limit) { return readingRepository.findByTag(tag, uuid(), PaginationUtil.generatePageRequest(page, limit)); } public Reading getReading(int id) { log.debug("get: id=" + id); Reading result = readingRepository.findOne(id); //CPE.check(result, Permission.reading_read); return result; } /** * Lubatud on kustutada ainult enda loodud artikleid. * Administraatoril on lubatud kõiki kustutada. */ public void deleteReading(int id) { log.debug("delete: id=", id); Reading result = readingRepository.findOne(id); //CPE.check(result, Permission.reading_delete); dao.removeById(Reading.class, id); } public List<String> autocompleteTag(String tagstart) { return libraryDB.getAutocompleteTags(tagstart, 20); } public List<ReadingPage> getReadingPages(int readingId) { Reading reading = readingRepository.findOne(readingId); //CPE.check(reading, Permission.reading_read); return readingPageRepository.findByReadingId(readingId); } private Reading findByPageId(int readingPageId) { ReadingPage page = readingPageRepository.findOne(readingPageId); return readingRepository.findOne(page.getReadingId()); } public void deleteReadingPage(int id) { log.debug("deleteReadingPage: id=", id); //CPE.check(findByPageId(id), Permission.reading_update); dao.removeById(ReadingPage.class, id); } //------------------------------ sõnavara vaade ------------------------------ //------------------------------ statistika vaade ------------------------------ /** * Annab ülevaate teksti keerukusest kanjide kontekstis. Lisaks tavapärane statistika teksti pikkuse kohta. * Graafikud leitakse nupu vajutusel. * GRAAFIK1: nelja erineva indeksi põhjal graafikud. x=kanji indeks, y=kogus. * Näitab erineva taseme kanjide hulka tekstis. Mida paremal ja ülevalpool paikneb mediaan, seda keerukam on tekst. * NB! Keerukate kanjidega tekst ei pruugi olla sisuliselt raske. * Samuti ei tõuse teksti keerukus oluliselt kui ühte kanjit kasutatakse palju. * Võib öelda, et keerukus tõuseb kui kanjit on kasutatud 1,2 või 3 korda, * kuid suurema arvu põhjutab tõenäoliselt korduvate sõnade kasutamine. */ //------------------------------ allalaadimiste vaade ------------------------------ /** * Allalaetavad failid luuakse nupuvajutusel. * ZIP - tekstilõikude csv fail, helifailid (audio/lõigu jrk.mp3) * XLS/ODS/PDF - ainult tekstilõigud. */ /* public Map.Entry<String, byte[]> getZip(int id, User user) throws Exception { Reading reading = getReading(id, user); Map.Entry<String, byte[]> report = jasperService.getReport(ECfReportType.ARTICLE, JSGeneratorType.CSV, reading.getReadingParagraphs()); ByteArrayOutputStream ostream = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(ostream); JCIOUtils.addToZipFile(report, zos); for (ArticleParagraph p : reading.getArticleParagraphs()) { p.getAudio().getAudioFile(); Audio audio = p.getAudio(); if (audio.getAudioFile() != null) { JCIOUtils.addToZipFile("article_audio/" + audio.getFileName(), audio.getAudioFile(), zos); } } zos.close(); ostream.close(); return new AbstractMap.SimpleEntry<>(reading.getTitle() + ".zip", ostream.toByteArray()); } //*/ }