view src/main/java/de/mpiwg/gazetteer/utils/DataProvider.java @ 105:16a0796e3871 default tip

remove "console.log" from general.js
author Calvin Yeh <cyeh@mpipw-berlin.mpg.com>
date Fri, 29 Sep 2017 16:18:02 +0200
parents f4242db6206b
children
line wrap: on
line source

package de.mpiwg.gazetteer.utils;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;

import cl.maps.duplex.DuplexKey;
import de.mpiwg.gazetteer.bo.LGBranch;
import de.mpiwg.gazetteer.bo.LGFile;
import de.mpiwg.gazetteer.bo.LGFullTextSearchFile;
import de.mpiwg.gazetteer.bo.LGTaglist;
import de.mpiwg.gazetteer.bo.LGTopic;
import de.mpiwg.gazetteer.bo.LGTopicSectionRelation;
import de.mpiwg.gazetteer.bo.LGTopicTagRelation;
import de.mpiwg.gazetteer.db.DBContents;
import de.mpiwg.gazetteer.db.DBSection;
import de.mpiwg.gazetteer.utils.exceptions.NoAuthorizedException;
import de.mpiwg.gazetteer.utils.exceptions.VersioningException;

public class DataProvider extends AbstractDataProvider{

	private static Logger logger = Logger.getLogger(DataProvider.class);
	private static DataProvider instance;

	public static DataProvider getInstance(){
		if(instance == null)
			instance = new DataProvider();
		return instance;
	}

	public static void resetInstance() {
		instance = null;
	}

	public DataProvider(){
		logger.info("##### Starting DataProvider #####");
	}



	/* --- branch --- */

	public LGFile getFile(Long fileId){
		return getFileMap().getValuesByOwnKey(fileId);
	}

	public List<LGFile> getAllFiles(Long branchId){
		List<LGFile> list = getFileMap().getValuesByAKey(branchId);
		Collections.sort(list);
		Collections.reverse(list);
		return list;
	}

	public List<LGTopicSectionRelation> getAllExistingTopicSectionRelation() {
		List<LGTopicSectionRelation> list = new ArrayList<LGTopicSectionRelation>();
		for (LGTopicSectionRelation relation : getTopicSectionRelationMap().values()) {
			list.add(relation);
		}
		return list;
	}

	public List<LGBranch> getAllExistingBranches(){
		List<LGBranch> list = new ArrayList<LGBranch>();
		for(LGBranch branch : getBranchMap().values()){
			list.add(branch);
		}
		return list;
	}

	public List<LGBranch> getBranches(Long userId){
		List<LGBranch> list = new ArrayList<LGBranch>();
		for(LGBranch branch : getBranchMap().values()){
			if(branch.hasContributor(userId)){
				list.add(branch);
			}
		}
		return list;
	}


	public LGBranch getBranch(Long branchId){
		return getBranchMap().getValuesByOwnKey(branchId);
	}

	public void deleteFile(LGFile file) throws Exception{

		LGBranch branch = getBranch(file.getBranchId());

		if(branch == null){
			throw new Exception("There is any Branch for " + file);
		}

		List<LGFile> files = getAllFiles(file.getBranchId());

		if(files.size() == 1){
			throw new Exception("This file could not be deleted, because it is part of a branch that has only one file. A Branch without files is a inconsistency.");
		}

		// if the file is the last version of a branch, we must replace the current file with the penultimate file.
		if(branch.getCurrentLastFileId().equals(file.getId())){
			LGFile penultimateFile = getPenultimateFile(files);

			penultimateFile.setLastVersion(true);
			branch.setCurrentLastFileId(penultimateFile.getId());

			this.updateBranch(branch);
			this.updateFile(penultimateFile);

		}

		//deleting file from DB and cache
		int modifiedFiles = DBService.deleteFileFromDB(file.getId());
		getFileMap().remove(file.getKey());

		logger.info(modifiedFiles + " items deleted by removing file " + file);
	}

	private LGFile getPenultimateFile(List<LGFile> files){
		LGFile penultimateFile = null;
		LGFile lastFile = null;

		for(LGFile file : files){
			if(lastFile == null){
				lastFile = file;
			}else if(penultimateFile == null){
				lastFile = (lastFile.getVersion() > file.getVersion()) ? lastFile : file;
				penultimateFile = (lastFile.getVersion() < file.getVersion()) ? lastFile : file;
			}else{
				if(file.getVersion() > lastFile.getVersion()){
					penultimateFile = lastFile;
					lastFile = file;
				}else if(file.getVersion() > penultimateFile.getVersion()){
					penultimateFile = file;
				}
			}
		}

		return penultimateFile;
	}

	public void deleteBranch(LGBranch branch){

		int modifiedFiles = DBService.deleteBranchFromDB(branch.getId());
		List<LGFile> fileToDelete = getFileMap().getValuesByAKey(branch.getId());

		for(LGFile file : new ArrayList<LGFile>(fileToDelete)){
			getFileMap().remove(file.getKey());
		}
		getBranchMap().remove(branch.getKey());

		logger.info(modifiedFiles + " items deleted by removing branch " + branch.toString());
	}

	public void updateFile(LGFile file) throws Exception{
		if(!file.isPersistent()){
			throw new Exception("Trying to update a file that it is not persistent!");
		}

		Date date = new Date();
		DBService.saveDBEntry(file, date);
		this.getFileMap().put(file.getKey(), file);
	}

	public void updateBranch(LGBranch branch) throws Exception{
		if(!branch.isPersistent()){
			throw new Exception("Trying to update a branch that it is not persistent!");
		}

		Date date = new Date();
		DBService.saveDBEntry(branch, date);
		this.getBranchMap().put(branch.getKey(), branch);
	}

	public LGFile saveFile(Long branchId, String text, Long userId, Long userPreviousFileId) throws Exception{

		Date date = new Date();

		LGBranch branch = getBranchMap().getValuesByOwnKey(branchId);

		if(!branch.hasContributor(userId)){
			throw new NoAuthorizedException(userId, branchId);
		}

		if(!branch.getCurrentLastFileId().equals(userPreviousFileId)){
			LGFile userPreviousFile = getFileMap().getValuesByOwnKey(userPreviousFileId);
			LGFile currentLastFile = getFileMap().getValuesByOwnKey(branch.getCurrentLastFileId());

			throw new VersioningException(userPreviousFile, currentLastFile);
		}

		LGFile previousFile = getFileMap().getValuesByOwnKey(branch.getCurrentLastFileId());

		LGFile file = new LGFile();
		file.setBranchId(branchId);
		file.setVersion(previousFile.getVersion() + 1);
		file.setUserId(userId);
		file.setContent(text);

		//Saving into DB
		//##################################
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;

		try{

			  tx = session.beginTransaction();

				file.setBranchId(branch.getId());
				DBService.saveDBEntry0(session, file, date);

				previousFile.setLastVersion(false);
				DBService.saveDBEntry0(session, previousFile, date);

				branch.setCurrentLastFileId(file.getId());
				DBService.saveDBEntry0(session, branch, date);

				//Saving physical file in the operating system
				String fileName = FileManager.saveFile(branch, file, date, userId);
				file.setFileName(fileName);

		    DBService.saveDBEntry0(session, file, date);

		    tx.commit();

				//##################################

				//Saving into Cache
				getBranchMap().put(branch.getKey(), branch);
				getFileMap().put(file.getKey(), file);
				getFileMap().put(previousFile.getKey(), previousFile);

		}catch (Exception e) {

			 if (tx!=null) tx.rollback();

			 e.printStackTrace();

			 throw e;

		}finally {
			 session.close();
		}

		return file;
	}

	public Long saveNewFile(String text, String label, Long sectionId, Long userId) throws Exception{

		Date date = new Date();

		LGBranch branch = new LGBranch();
		branch.setSectionId(sectionId);
		branch.setUserId(userId);
		branch.setLabel(label);
		branch.addContributor(userId);
		branch.loadTransientData();

		LGFile file = new LGFile();
		file.setUserId(userId);
		file.setContent(text);

		//Saving into DB
		//##################################
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;
    try{
         tx = session.beginTransaction();

					DBService.saveDBEntry0(session, branch, date);
					file.setBranchId(branch.getId());

					DBService.saveDBEntry0(session, file, date);
					branch.setCurrentLastFileId(file.getId());

					//Saving physical file in the operating system
					String fileName = FileManager.saveFile(branch, file, date, userId);
					file.setFileName(fileName);
					DBService.saveDBEntry0(session, file, date);

					tx.commit();

					//Saving into Cache
					getBranchMap().put(branch.getKey(), branch);
					getFileMap().put(file.getKey(), file);

    }catch (Exception e) {
       if (tx!=null) tx.rollback();

			 e.printStackTrace();

       throw e;
    }finally {
       session.close();
    }
		//##################################

		return branch.getId();

	}

	/* --- end branch --- */



	/* --- full text search --- */

	public List<LGFullTextSearchFile> getSearchFileList4User(Long userId) {

		List<LGFullTextSearchFile> list = new ArrayList<LGFullTextSearchFile>();

		for(LGFullTextSearchFile searchFile : getFullTextSearchFileMap().values()){
			if(searchFile.getUserId() == userId){
				list.add(searchFile);
			}
		}

		return list;
	}




	public void deleteLGFullTextSearchFile(LGFullTextSearchFile file) throws IOException{
		//deleting file from DB: the record in table FullTextSearchFile
		int modifiedFiles = DBService.deleteFullTextSearchFileFromDB(file.getId());

		// delete the files from file system (html in ftsearch-data/... and csv in LGMap/datasets/)
		FileManager.deleteFullTextSearchFileCsv(file);
		FileManager.deleteFullTextSearchFileHtml(file);

		// delete file from cache
		this.getFullTextSearchFileMap().remove(file.getKey());
		logger.debug("deleteLGFullTextSearchFile");
	}

	public LGFullTextSearchFile saveLGFullTextSearchFile(List<DBContents> list, Long userId, LGFullTextSearchFile searchFile) throws Exception {
		// save as csv and html file in filesystem, and records in db `FullTextSearchFile
		// List<DBContents> list is the filteredList of searching result with isRemoved field

		Date date = new Date();

		//Saving into DB
		//##################################
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;
    try{
         tx = session.beginTransaction();

		     DBService.saveDBEntry0(session, searchFile, date);

				 //Saving physical file in the operating system
				 FileManager.saveFullTextSearchFileAsCsv(searchFile, userId, list);	// save csv file to LGMap's datasets folder
				 FileManager.saveFullTextSearchFileAsHtml(searchFile, userId, list);	// save html file to LGMap's datasets folder

				 tx.commit();
		}catch (Exception e) {
         if (tx!=null) tx.rollback();

				 e.printStackTrace();

         throw e;
    }finally {
       session.close();
    }
		//##################################

		return searchFile;
	}

	public LGFullTextSearchFile getFullTextSearchFile(Long fileId) {

		LGFullTextSearchFile file = getFullTextSearchFileMap().getValuesByOwnKey(fileId);

		return file;
	}

	/* --- end full text search --- */

	/* --- topic --- */

	public List<LGTopic> getTopics(Long userId){
		List<LGTopic> list = new ArrayList<LGTopic>();
		for(LGTopic topic : getTopicMap().values()){
			/*
			if(topic.hasContributor(userId)){
				list.add(topic);
			}
			*/

			// add topic into list anyway, without checking the contributor role.
			list.add(topic);
		}

		return list;
	}

	public LGTopic getTopic(Long topicId){
		return getTopicMap().getValuesByOwnKey(topicId);
	}


	public void deleteTopic(LGTopic topic){

		int modifiedRelation = DBService.deleteTopicFromDB(topic.getId());
		getTopicMap().remove(topic.getKey());

		logger.info("removing " + modifiedRelation + " records in TopicSectionRelation and TopicTagRelation table for the topic " + topic.toString());

		this.setTopicSectionRelationMap(null);	// clear topicSectionRelationMap cache

	}

	public void createTopic(String nameEn, String nameCh,String namePinyin, String description, Long userId) {

		Date date = new Date();

		LGTopic topic = new LGTopic();
		topic.setNameEn(nameEn);
		topic.setNameCh(nameCh);
		topic.setNamePinyin(namePinyin);
		topic.setDescription(description);
		topic.setUserId(userId);
		topic.setContributors("[" + userId.toString() + "]");

		// auto-generating a tag for the topic: could be from nameEn replace space with '_'
		String tag = new String();
		tag = nameEn.replace(' ', '_');
		topic.setTag(tag);

		//Saving into DB
		//##################################
		// For Topic table
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;
		try{
				tx = session.beginTransaction();

				DBService.saveDBEntry0(session, topic, date);

				// For Taglist table
				// create record, which is the topic tag, in taglist table,
				// with the taglis.name=nameCh, the taglist.tag=tag, the taglist.color=the defualt topic tag color, which is rgb(255,0,174)

				LGTaglist taglist = new LGTaglist();
				taglist.setName(nameCh);

				// tag to lowercase only!! bcuz it will be used as topic tag in Extraction-interface, and it'll be a tag in HTML which is case-insensitive
				taglist.setTag(tag.toLowerCase());

				taglist.setColor("rgb(255, 0, 174)");

				DBService.saveDBEntry0(session, taglist, date);

		    logger.debug("new topic tag id=" + taglist.getId());

				// For TopicTagRelation table
				// link the relation between the new topic and its corresponding tag
				LGTopicTagRelation relation = new LGTopicTagRelation();
				relation.setTagId(taglist.getId());
				relation.setTopicId(topic.getId());

				DBService.saveDBEntry0(session, relation, date);

				tx.commit();

    }catch (Exception e) {
       if (tx!=null) tx.rollback();

			 e.printStackTrace();

       throw e;
    }finally {
       session.close();
    };
		//##################################

	}

	public void updateTopic(LGTopic topic) throws Exception {
		if(!topic.isPersistent()){
			throw new Exception("Trying to update a topic that it is not persistent!");
		}

		Date date = new Date();
		DBService.saveDBEntry(topic, date);
		this.getTopicMap().put(topic.getKey(), topic);

	}



	public List<DBSection> getAllSectionsInTopic(Long topicId) throws SQLException{

		List<LGTopicSectionRelation> topicSectionRelationList = getTopicSectionRelationMap().getValuesByAKey(topicId);

		// get sections from topicSecionRelation list
		List<DBSection> list = new ArrayList<DBSection>();
		for (LGTopicSectionRelation aRelation : topicSectionRelationList) {
			//logger.debug(aRelation.getInfo() );

			DBSection section = DBService.getSectionWithContent(aRelation.getSectionId());
			list.add(section);

		}


		Collections.sort(list);
		Collections.reverse(list);
		return list;
	}




	public void deleteTopicSectionRelation(Long topicId, String bookId) throws Exception{
		// delete record with topicId, bookId in topicSectionRelation
		// this means the sectionId = 0, there is no corresponding section in the book for this topic

		// TODO

	}

	public void deleteTopicSectionRelation(Long topicId, Long sectionId) throws Exception{
		if (sectionId == 0) {
			throw new Exception("sectionId cannot be 0");
		}

		DuplexKey<Long, Long> key = new DuplexKey<Long, Long>(topicId, sectionId);
		LGTopicSectionRelation topicSectionRelation = this.getTopicSectionRelationMap().get(key);

		LGTopic topic = getTopic(topicId);

		if(topic == null){
			throw new Exception("There is no topic of " + topicSectionRelation);
		}

		//deleting topicSectionRelation from DB and cache
		int modifiedRelation = DBService.deleteTopicSectionRelationFromDB(topicSectionRelation.getId());
		getTopicSectionRelationMap().remove(topicSectionRelation.getKey());

		logger.info(modifiedRelation + " items deleted by removing topicSectionRelation " + topicSectionRelation.toString());


	}

	public String updateTopicSectionRelation(Long sectionId, Long topicId) throws Exception {
		DuplexKey<Long, Long> key = new DuplexKey<Long, Long>(topicId, sectionId);
		LGTopicSectionRelation topicSectionRelation = this.getTopicSectionRelationMap().get(key);

		if (topicSectionRelation != null) {
			// the relation already existed
			// would this possibly need any modification to the existing record in the topicSectionRelation table?

			return "updated";

		} else {
			createTopicSectionRelation(sectionId, topicId);

			return "added";
		}



	}


	public void createTopicSectionRelation(Long sectionId, Long topicId) throws Exception {

		Date date = new Date();

		LGTopicSectionRelation topicSectionRelation = new LGTopicSectionRelation();
		topicSectionRelation.setTopicId(topicId);
		topicSectionRelation.setSectionId(sectionId);

		DBService.getInstance();
		DBSection section = DBService.getSectionWithContent(sectionId);
		topicSectionRelation.setBookId(section.getBookId());

		//Saving into DB
		//##################################
		// For Topic table
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;
    try{
       tx = session.beginTransaction();
       DBService.saveDBEntry0(session, topicSectionRelation, date);
       tx.commit();
    }catch (Exception e) {
       if (tx!=null) tx.rollback();
       e.printStackTrace();
			 throw e;
    }finally {
       session.close();
    }

		// update cache
		this.loadTopicSectionRelations();

	}

	public Integer getNumberOfSectionInTopic(Long topicId) {
		List<LGTopicSectionRelation> topicSectionRelationList = getTopicSectionRelationMap().getValuesByAKey(topicId);

		return topicSectionRelationList.size();
	}



	/* --- end topic --- */

}