Mercurial > hg > LGServices
diff src/main/java/de/mpiwg/gazetteer/utils/DataProvider.java @ 0:3e62083dbcbf
First commit. This project comes from LGServer. We removed the framework icefaces. Now, LGServices uses just JSP and jquery.
author | "jurzua <jurzua@mpiwg-berlin.mpg.de>" |
---|---|
date | Thu, 23 Apr 2015 15:46:01 +0200 |
parents | |
children | ce2e3f2814c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/mpiwg/gazetteer/utils/DataProvider.java Thu Apr 23 15:46:01 2015 +0200 @@ -0,0 +1,246 @@ +package de.mpiwg.gazetteer.utils; + +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 de.mpiwg.gazetteer.bo.LGBranch; +import de.mpiwg.gazetteer.bo.LGFile; +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(DBService.class); + private static DataProvider instance; + + public static DataProvider getInstance(){ + if(instance == null) + instance = new DataProvider(); + return instance; + } + + public DataProvider(){ + logger.info("##### Starting DataProvider #####"); + } + + 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<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().getCurrentSession(); + session.getTransaction().begin(); + + + 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); + + session.getTransaction().commit(); + //################################## + + + //Saving into Cache + getBranchMap().put(branch.getKey(), branch); + getFileMap().put(file.getKey(), file); + getFileMap().put(previousFile.getKey(), previousFile); + + 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().getCurrentSession(); + session.getTransaction().begin(); + + 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); + + session.getTransaction().commit(); + //################################## + + + //Saving into Cache + getBranchMap().put(branch.getKey(), branch); + getFileMap().put(file.getKey(), file); + + return branch.getId(); + + } +}