# HG changeset patch # User Zoe Hong # Date 1450356248 -3600 # Node ID ba9515f22897297e96907c81af4217243236c348 # Parent 35ed4e650a539c11676cd833b13e559382b8cc15 new: topic management and adding sections from searching result into topic diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/gazetteer/bo/LGTopic.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/mpiwg/gazetteer/bo/LGTopic.java Thu Dec 17 13:44:08 2015 +0100 @@ -0,0 +1,227 @@ +package de.mpiwg.gazetteer.bo; + +import java.io.Serializable; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.json.JSONArray; + +import cl.maps.duplex.DuplexKey; +import de.mpiwg.gazetteer.dataverse.DataverseUtils; +import de.mpiwg.gazetteer.db.DBBook; +import de.mpiwg.gazetteer.db.DBSection; +import de.mpiwg.gazetteer.utils.DBService; +import de.mpiwg.gazetteer.utils.DataProvider; + + +@Entity +@Table(name="Topic") +@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) +public class LGTopic extends DBEntry implements Cloneable, Serializable { + private static final long serialVersionUID = 7805209462045170778L; + + @Column(name="userId") + private Long userId; + + @Column(name="contributors") + private String contributors = "[]"; + + @Column(name="nameEn") + private String nameEn; + + @Column(name="nameCh") + private String nameCh; + + @Column(name="namePinyin") + private String namePinyin; + + @Column(name="description") + private String description; + + + @Transient + private List contributorsList; + + + @Transient + private boolean transientDataLoaded = false; + + + + public boolean isEmpty() { + if (nameEn.equals("") || nameCh.equals("") || namePinyin.equals("") ) { + return true; + } else { + return false; + } + } + + + + + public boolean isTransientDataLoaded() { + return transientDataLoaded; + } + + + + public Object clone() throws CloneNotSupportedException { + LGTopic clone = (LGTopic)super.clone(); + clone.setContributorsList(new ArrayList(clone.getContributorsList())); + + return clone; + } + + + + public boolean hasContributor(Long userId){ + for(Long id : getContributorsList()){ + if(id.equals(userId)){ + return true; + } + } + return false; + } + + public List getContributorsList(){ + if(contributorsList == null){ + reloadContributorsList(); + } + return contributorsList; + } + + public List getContributorsNameList(){ + List list = new ArrayList(); + for(Long userId : getContributorsList()){ + list.add(DataverseUtils.getUsername(userId)); + } + return list; + } + + public String getUsername(){ + if(this.userId != null){ + return DataverseUtils.getUsername(this.userId); + } + return null; + } + + private void reloadContributorsList(){ + this.contributorsList = new ArrayList(); + try { + JSONArray array = new JSONArray(this.contributors); + for(int i=0; i contributorsList) { + this.contributorsList = contributorsList; + } + + + public void setTransientDataLoaded(boolean transientDataLoaded) { + this.transientDataLoaded = transientDataLoaded; + } + + public DuplexKey getKey(){ + return new DuplexKey(this.userId, this.id); + } + + + @Override + public String toString(){ + return "LGTopic[nameEn=" + nameEn + ", nameCh=" + nameCh + ", namePinyin=" + namePinyin + "]"; + } + + +} diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/gazetteer/bo/LGTopicSectionRelation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/mpiwg/gazetteer/bo/LGTopicSectionRelation.java Thu Dec 17 13:44:08 2015 +0100 @@ -0,0 +1,105 @@ +package de.mpiwg.gazetteer.bo; + +import java.io.Serializable; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.json.JSONArray; + +import cl.maps.duplex.DuplexKey; +import de.mpiwg.gazetteer.dataverse.DataverseUtils; +import de.mpiwg.gazetteer.db.DBBook; +import de.mpiwg.gazetteer.db.DBSection; +import de.mpiwg.gazetteer.utils.DBService; +import de.mpiwg.gazetteer.utils.DataProvider; + + +@Entity +@Table(name="TopicSectionRelation") +@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) +public class LGTopicSectionRelation extends DBEntry implements Cloneable, Serializable { + private static final long serialVersionUID = 7805209462045170778L; + + @Column(name="topicId") + private Long topicId; + + @Column(name="sectionId") + private Long sectionId; + + + @Column(name="bookId") + private String bookId; + + @Transient + private boolean transientDataLoaded = false; + + + + + public boolean isEmpty() { + if (topicId != null && sectionId != null) { + return true; + } else { + return false; + } + } + + + public Long getTopicId() { + return topicId; + } + + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public Long getSectionId() { + return sectionId; + } + + + public void setSectionId(Long sectionId) { + this.sectionId = sectionId; + } + + + public String getBookId() { + return bookId; + } + + + public void setBookId(String bookId) { + this.bookId = bookId; + } + + + public boolean isTransientDataLoaded() { + return transientDataLoaded; + } + + + public void setTransientDataLoaded(boolean transientDataLoaded) { + this.transientDataLoaded = transientDataLoaded; + } + + + public DuplexKey getKey(){ + return new DuplexKey(this.topicId, this.sectionId); + } + + @Override + public String toString(){ + return "LGTopicSectionRelation[topicId=" + topicId.toString() + ", sectionId=" + sectionId.toString() + "]"; + } + + +} diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/gazetteer/utils/AbstractDataProvider.java --- a/src/main/java/de/mpiwg/gazetteer/utils/AbstractDataProvider.java Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/java/de/mpiwg/gazetteer/utils/AbstractDataProvider.java Thu Dec 17 13:44:08 2015 +0100 @@ -6,6 +6,8 @@ import de.mpiwg.gazetteer.bo.LGBranch; import de.mpiwg.gazetteer.bo.LGFile; import de.mpiwg.gazetteer.bo.LGFullTextSearchFile; +import de.mpiwg.gazetteer.bo.LGTopic; +import de.mpiwg.gazetteer.bo.LGTopicSectionRelation; public class AbstractDataProvider { @@ -73,4 +75,48 @@ } + + private DuplexMap topicMap = null; + + public void setTopicMap(DuplexMap topicMap) { + this.topicMap = topicMap; + } + + protected DuplexMap getTopicMap(){ + if(topicMap == null){ + loadTopics(); + } + return topicMap; + } + + public void loadTopics(){ + List list = DBService.getAllLGTopicFromDB(); + this.topicMap = new DuplexMap(); + for(LGTopic item : list){ + this.topicMap.put(item.getKey(), item); + } + } + + + private DuplexMap topicSectionRelationMap = null; + + public void setTopicSectionRelationMap(DuplexMap topicSectionRelationMap) { + this.topicSectionRelationMap = topicSectionRelationMap; + } + + protected DuplexMap getTopicSectionRelationMap(){ + if(topicSectionRelationMap == null){ + loadTopicSectionRelations(); + } + return topicSectionRelationMap; + } + + public void loadTopicSectionRelations(){ + List list = DBService.getAllLGTopicSectionRelationFromDB(); + this.topicSectionRelationMap = new DuplexMap(); + for(LGTopicSectionRelation item : list){ + this.topicSectionRelationMap.put(item.getKey(), item); + } + } + } diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/gazetteer/utils/DBService.java --- a/src/main/java/de/mpiwg/gazetteer/utils/DBService.java Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/java/de/mpiwg/gazetteer/utils/DBService.java Thu Dec 17 13:44:08 2015 +0100 @@ -20,6 +20,8 @@ import de.mpiwg.gazetteer.bo.LGBranch; import de.mpiwg.gazetteer.bo.LGFile; import de.mpiwg.gazetteer.bo.LGFullTextSearchFile; +import de.mpiwg.gazetteer.bo.LGTopic; +import de.mpiwg.gazetteer.bo.LGTopicSectionRelation; import de.mpiwg.gazetteer.db.DBBook; import de.mpiwg.gazetteer.db.DBContents; import de.mpiwg.gazetteer.db.DBCoordinatesBook; @@ -88,7 +90,7 @@ try { this.loadBookMap(); } catch (SQLException e) { - // TODO Auto-generated catch block + e.printStackTrace(); } @@ -789,7 +791,9 @@ return list; } - protected static List getAllLGBranchFromDB(){ + + + protected static List getAllLGBranchFromDB(){ List list = null; Session session = HibernateUtil.getSessionFactory().getCurrentSession(); @@ -932,4 +936,80 @@ } */ + + + + + /* --- topic --- */ + protected static List getAllLGTopicFromDB(){ + List list = null; + + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.getTransaction().begin(); + Query query = session.createQuery("from LGTopic"); + list = query.list(); + session.getTransaction().commit(); + + return list; + } + + protected static int deleteTopicFromDB(Long topicId){ + logger.info("Deleting topic by topicId=" + topicId); + + int modifiedTopic; + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.getTransaction().begin(); + + Query query = session.createQuery("delete LGTopic where id = :id"); + query.setLong("id", topicId); + modifiedTopic = query.executeUpdate(); + + + // delete records in TopicSectionRelation table + Query query0 = session.createQuery("delete LGTopicSectionRelation where topicId = :topicId"); + query0.setLong("topicId", topicId); + modifiedTopic += query0.executeUpdate(); + + session.getTransaction().commit(); + + return modifiedTopic; + } + + + protected static List getAllLGTopicSectionRelationFromDB(){ + List list = null; + + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.getTransaction().begin(); + Query query = session.createQuery("from LGTopicSectionRelation"); + list = query.list(); + session.getTransaction().commit(); + + return list; + } + + protected static int deleteTopicSectionRelationFromDB(Long relationId){ + + int modifiedRelation; + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.getTransaction().begin(); + + + Query query0 = session.createQuery("delete LGTopicSectionRelation where id = :relationId"); + query0.setLong("relationId", relationId); + modifiedRelation = query0.executeUpdate(); + + session.getTransaction().commit(); + + return modifiedRelation; + + } + + + + + /* --- end topic --- */ + + + } diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/gazetteer/utils/DataProvider.java --- a/src/main/java/de/mpiwg/gazetteer/utils/DataProvider.java Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/java/de/mpiwg/gazetteer/utils/DataProvider.java Thu Dec 17 13:44:08 2015 +0100 @@ -1,5 +1,6 @@ package de.mpiwg.gazetteer.utils; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -12,7 +13,10 @@ import de.mpiwg.gazetteer.bo.LGBranch; import de.mpiwg.gazetteer.bo.LGFile; import de.mpiwg.gazetteer.bo.LGFullTextSearchFile; +import de.mpiwg.gazetteer.bo.LGTopic; +import de.mpiwg.gazetteer.bo.LGTopicSectionRelation; 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; @@ -34,6 +38,11 @@ public DataProvider(){ logger.info("##### Starting DataProvider #####"); } + + + + /* --- branch --- */ + public LGFile getFile(Long fileId){ return getFileMap().getValuesByOwnKey(fileId); } @@ -259,6 +268,11 @@ } + /* --- end branch --- */ + + + + /* --- full text search --- */ public List getSearchFileList4User(Long userId) { @@ -303,7 +317,179 @@ return file; } + /* --- end full text search --- */ + + /* --- topic --- */ + public List getTopics(Long userId){ + List list = new ArrayList(); + for(LGTopic topic : getTopicMap().values()){ + if(topic.hasContributor(userId)){ + 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 of 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() + "]"); + + //Saving into DB + //################################## + // For Topic table + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.getTransaction().begin(); + + DBService.saveDBEntry0(session, topic, date); + + session.getTransaction().commit(); + //################################## + + } + + 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 getAllSectionsInTopic(Long topicId) throws SQLException{ + + List topicSectionRelationList = getTopicSectionRelationMap().getValuesByAKey(topicId); + + // get sections from topicSecionRelation list + List list = new ArrayList(); + 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 key = new DuplexKey(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 key = new DuplexKey(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().getCurrentSession(); + session.getTransaction().begin(); + + DBService.saveDBEntry0(session, topicSectionRelation, date); + + session.getTransaction().commit(); + //################################## + + // update cache + this.loadTopicSectionRelations(); + + } + + /* --- end topic --- */ + } diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/web/jsp/ApplicationBean.java --- a/src/main/java/de/mpiwg/web/jsp/ApplicationBean.java Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/java/de/mpiwg/web/jsp/ApplicationBean.java Thu Dec 17 13:44:08 2015 +0100 @@ -68,6 +68,10 @@ return value; } + public String getPlusImage() { + return getRootServer() + "/resources/images/plus.png"; + } + public String getShowImage(){ return getRootServer() + "/resources/images/show_16.png"; } diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/web/jsp/JSPProxy.java --- a/src/main/java/de/mpiwg/web/jsp/JSPProxy.java Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/java/de/mpiwg/web/jsp/JSPProxy.java Thu Dec 17 13:44:08 2015 +0100 @@ -27,6 +27,7 @@ logger.info("processRequest [bean= " + bean + ", action=" + action +"]"); try{ + if(StringUtils.equals(bean, BranchPage.bean)){ getSessionBean().getBranchPage().loadParameters(request, response); @@ -49,7 +50,7 @@ return BranchPage.page; - }else if(StringUtils.equals(bean, CreateFilePage.bean)){ + } else if(StringUtils.equals(bean, CreateFilePage.bean)){ getSessionBean().getCreateFilePage().loadParameters(request, response); @@ -141,7 +142,8 @@ getSessionBean().logout(); } - return "pages/home.jsp"; + return TopicListPage.page; + //return "pages/home.jsp"; }else if(StringUtils.equals(bean, SearchPage.bean)){ getSessionBean().getSearchPage().loadParameters(request, response); @@ -150,6 +152,8 @@ getSessionBean().getSearchPage().search(); } else if(StringUtils.equals(action, "filter")){ getSessionBean().getSearchPage().filter(); + + //PAGINATOR } else if(StringUtils.equals(action, "firstPage")){ getSessionBean().getSearchPage().firstPage(); @@ -285,6 +289,107 @@ return FullTextSearchPage.page; + + } else if(StringUtils.equals(bean, TopicListPage.bean)){ + getSessionBean().getTopicListPage().loadParameters(request, response); + + if(StringUtils.equals(action, "forceLoadTopics")){ + getSessionBean().getTopicListPage().forceLoadTopics(); + + } else if(StringUtils.equals(action, "deleteTopic")){ + getSessionBean().getTopicListPage().deleteTopic(); + } else if(StringUtils.equals(action, "createTopic")){ + Long userId = getSessionBean().getUser().getId(); + getSessionBean().getTopicListPage().createTopic(userId); + } + + + return TopicListPage.page; + + + } else if(StringUtils.equals(bean, TopicPage.bean)){ + getSessionBean().getTopicPage().loadParameters(request, response); + + if(StringUtils.equals(action, "forceLoadTopicSectionRelation")){ + getSessionBean().getTopicPage().forceLoadTopicSectionRelation(); + + } else /* if(StringUtils.equals(action, "deleteTopic")){ + getSessionBean().getTopicPage().deleteTopic(); + } else if(StringUtils.equals(action, "createTopic")){ + Long userId = getSessionBean().getUser().getId(); + getSessionBean().getTopicPage().createTopic(userId); + + } else */ + + if(StringUtils.equals(action, "addContributor")){ + getSessionBean().getTopicPage().addContributor(); + } else if(StringUtils.equals(action, "removeContributor")){ + getSessionBean().getTopicPage().removeContributor(); + } else if( StringUtils.equals(action ,"updateDescription")) { + getSessionBean().getTopicPage().updateDescription(); + + } else if( StringUtils.equals(action ,"deleteSection")) { + getSessionBean().getTopicPage().deleteSection(getLongParameter("sectionId")); + + } else if(StringUtils.equals(action, "filter")){ + getSessionBean().getTopicPage().filter(); + + + } else if(StringUtils.equals(action, "addSectionToTopic")) { + Long selectedSectionId = getLongParameter("selectedSectionId"); + Long selectedTopicId = getLongParameter("selectedTopicId"); + + getSessionBean().getTopicPage().addSectionToTopic(selectedSectionId, selectedTopicId); + return SearchPage.page; + + + + //SORTING + } else if(StringUtils.equals(action, "sortByBookIdUp")){ + getSessionBean().getTopicPage().sortByBookIdUp(); + } else if(StringUtils.equals(action, "sortByBookIdDown")){ + getSessionBean().getTopicPage().sortByBookIdDown(); + } else if(StringUtils.equals(action, "sortByBookNameUp")){ + getSessionBean().getTopicPage().sortByBookNameUp(); + } else if(StringUtils.equals(action, "sortByBookNameDown")){ + getSessionBean().getTopicPage().sortByBookNameDown(); + } else if(StringUtils.equals(action, "sortByDynastyUp")){ + getSessionBean().getTopicPage().sortByDynastyUp(); + } else if(StringUtils.equals(action, "sortByDynastyDown")){ + getSessionBean().getTopicPage().sortByDynastyDown(); + } else if(StringUtils.equals(action, "sortByPeriodUp")){ + getSessionBean().getTopicPage().sortByPeriodUp(); + } else if(StringUtils.equals(action, "sortByPeriodDown")){ + getSessionBean().getTopicPage().sortByPeriodDown(); + } else if(StringUtils.equals(action, "sortBySectionNameUp")){ + getSessionBean().getTopicPage().sortBySectionNameUp(); + } else if(StringUtils.equals(action, "sortBySectionNameDown")){ + getSessionBean().getTopicPage().sortBySectionNameDown(); + + } else if(StringUtils.equals(action, "sortByLevel1Up")){ + getSessionBean().getTopicPage().sortByLevel1Up(); + } else if(StringUtils.equals(action, "sortByLevel1Down")){ + getSessionBean().getTopicPage().sortByLevel1Down(); + } else if(StringUtils.equals(action, "sortByLevel2Up")){ + getSessionBean().getTopicPage().sortByLevel2Up(); + } else if(StringUtils.equals(action, "sortByLevel2Down")){ + getSessionBean().getTopicPage().sortByLevel2Down(); + + + } else if(StringUtils.equals(action, "sortByAdminTypeUp")){ + getSessionBean().getTopicPage().sortByAdminTypeUp(); + } else if(StringUtils.equals(action, "sortByAdminTypeDown")){ + getSessionBean().getTopicPage().sortByAdminTypeDown(); + + } else if(StringUtils.equals(action, "sortByStartPageUp")){ + getSessionBean().getTopicPage().sortByStartPageUp(); + } else if(StringUtils.equals(action, "sortByStartPageDown")){ + getSessionBean().getTopicPage().sortByStartPageDown(); + } + + return TopicPage.page; + + } else if(StringUtils.equals(bean, BooksPage.bean)){ getSessionBean().getBooksPage().loadParameters(request, response); @@ -385,13 +490,14 @@ e.printStackTrace(); addMsg("There is an internal error: " + e.getLocalizedMessage()); - return HomePage.page; + return TopicListPage.page; + //return HomePage.page; } //Default Page: - //return BooksPage.page; - return HomePage.page; + return TopicListPage.page; + //return HomePage.page; //return "pages/search.jsp"; } diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/web/jsp/SearchPage.java --- a/src/main/java/de/mpiwg/web/jsp/SearchPage.java Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/java/de/mpiwg/web/jsp/SearchPage.java Thu Dec 17 13:44:08 2015 +0100 @@ -65,6 +65,7 @@ } public void loadParameters(HttpServletRequest request, HttpServletResponse response){ + this.request = request; this.response = response; @@ -182,6 +183,10 @@ } } + + + + private List splitTerms(){ List rs = new ArrayList(); String[] array = this.searchTerm.split(","); @@ -356,8 +361,22 @@ public void setFilteringMessage(String filteringMessage) { this.filteringMessage = filteringMessage; } - - /////// Sorting + + public String getAdminTypeFilter() { + return adminTypeFilter; + } + + public void setAdminTypeFilter(String adminTypeFilter) { + this.adminTypeFilter = adminTypeFilter; + } + + public String getLevel1Filter() { + return level1Filter; + } + + public void setLevel1Filter(String level1Filter) { + this.level1Filter = level1Filter; + } public String getDynastyFilter() { return dynastyFilter; @@ -367,6 +386,9 @@ this.dynastyFilter = dynastyFilter; } + + /////// Sorting + public void sortByBookNameUp(){ Collections.sort(this.completeSectionList, new SortSectionByBookName()); filter(); @@ -500,21 +522,5 @@ filter(); } - public String getAdminTypeFilter() { - return adminTypeFilter; - } - - public void setAdminTypeFilter(String adminTypeFilter) { - this.adminTypeFilter = adminTypeFilter; - } - - public String getLevel1Filter() { - return level1Filter; - } - - public void setLevel1Filter(String level1Filter) { - this.level1Filter = level1Filter; - } - } diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/web/jsp/SessionBean.java --- a/src/main/java/de/mpiwg/web/jsp/SessionBean.java Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/java/de/mpiwg/web/jsp/SessionBean.java Thu Dec 17 13:44:08 2015 +0100 @@ -33,6 +33,9 @@ private BooksPage booksPage = new BooksPage(); private FullTextSearchPage fullTextSearchPage = new FullTextSearchPage(); + + private TopicListPage topicListPage = new TopicListPage(); + private TopicPage topicPage = new TopicPage(); public SessionBean(){ logger.info("\n\n### SessionBean #####\n\n"); @@ -192,4 +195,24 @@ } + public TopicListPage getTopicListPage() { + return topicListPage; + } + + + public void setTopicListPage(TopicListPage topicListPage) { + this.topicListPage = topicListPage; + } + + + public TopicPage getTopicPage() { + return topicPage; + } + + + public void setTopicPage(TopicPage topicPage) { + this.topicPage = topicPage; + } + + } diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/web/jsp/TopicListPage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/mpiwg/web/jsp/TopicListPage.java Thu Dec 17 13:44:08 2015 +0100 @@ -0,0 +1,273 @@ +package de.mpiwg.web.jsp; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import de.mpiwg.gazetteer.bo.LGTopic; +import de.mpiwg.gazetteer.utils.DataProvider; +public class TopicListPage extends AbstractJSPPage{ + + private static Logger logger = Logger.getLogger(TopicListPage.class); + + public static String bean = "topicListBean"; + public static String page = "pages/topicList.jsp"; + + + private List completeTopicList; // complete topic list + private List filteredTopicList; + private List displayTopicList; + + private Long topicId; + + private int topicNumber; + + private String filteringMessage; + + private DataPaginator paginator = new DataPaginator(); + + + public void loadParameters(HttpServletRequest request, HttpServletResponse response){ + this.request = request; + this.response = response; + + this.topicId = getLongParameter("topicId"); + + } + + + public void reloadTopics(){ + logger.debug("reloadTopics"); + if (this.completeTopicList == null) { + this.forceLoadTopics(); + this.filteringMessage = null; + } + return; + } + + + public void forceLoadTopics(){ + logger.debug("forceLoadTopics"); + DataProvider.getInstance().setTopicMap(null); + DataProvider.getInstance().setTopicSectionRelationMap(null); + + this.completeTopicList = new ArrayList(); + + if(getSessionBean().getUser() != null){ + for(LGTopic topic : DataProvider.getInstance().getTopics(getSessionBean().getUser().getId())){ + + if (topic.isEmpty()) { + logger.debug("topic doesn't exist anymore."); + } else { + this.completeTopicList.add(topic); + } + } + } + this.setTopicNumber(this.completeTopicList.size()); + + sortByLastModifiedDown(); // default sorting by from lasted modified to oldest + + + } + + + + public void createTopic(Long userId){ + logger.debug("createTopic"); + String nameEn = getParameter("nameEn"); + String nameCh = getParameter("nameCh"); + String namePinyin = getParameter("namePinyin"); + String description = getParameter("description"); + + logger.debug("nameEn: " + nameEn); + logger.debug("nameCh: " + nameCh); + logger.debug("namePinyin: " + namePinyin); + logger.debug("description: " + description); + + if (StringUtils.isEmpty(nameEn)) { + addMsg("Create Fails. Name(eng) cannot be empty."); + } else { + + DataProvider.getInstance().createTopic(nameEn, nameCh, namePinyin, description, userId); + + addMsg("New topic has been created."); + this.forceLoadTopics(); + } + } + + + public void deleteTopic(){ + logger.debug("deleteTopic " + topicId); + + if(topicId != null){ + LGTopic topic = DataProvider.getInstance().getTopic(topicId); + if(topic != null){ + DataProvider.getInstance().deleteTopic(topic); + this.forceLoadTopics(); + } + } + } + + + + public void filter(){ + + this.filteredTopicList = new ArrayList(); + for (LGTopic topic : this.completeTopicList) { + if(!this.filteredTopicList.contains(topic)){ + /* + if( (StringUtils.isEmpty(bookNameFilter) || StringUtils.startsWith(branch.getBook().getName(), bookNameFilter)) && + (StringUtils.isEmpty(level1Filter) || StringUtils.startsWith(branch.getBook().getLevel1(), level1Filter)) && + (StringUtils.isEmpty(level2Filter) || StringUtils.startsWith(branch.getBook().getLevel2(), level2Filter)) && + (StringUtils.isEmpty(dynastyFilter) || StringUtils.startsWith(branch.getBook().getDynasty(), dynastyFilter)) && + (StringUtils.isEmpty(adminTypeFilter) || StringUtils.startsWith(branch.getBook().getAdmin_type(), adminTypeFilter)) && + (StringUtils.isEmpty(bookIdFilter) || StringUtils.startsWith(branch.getBook().getId(), bookIdFilter)) && + (StringUtils.isEmpty(periodFilter) || StringUtils.startsWith(branch.getBook().getPeriod(), periodFilter)) && + (StringUtils.isEmpty(sectionNameFilter) || StringUtils.startsWith(branch.getSection().getName(), sectionNameFilter)) && + (StringUtils.isEmpty(labelFilter) || StringUtils.startsWith(branch.getLabel(), labelFilter)) + ){ + + this.filteredTopicList.add(branch); + + } + */ + + this.filteredTopicList.add(topic); + + } + } + + if(completeTopicList.size() > 0){ + this.filteringMessage = this.filteredTopicList.size() + " topics listed after filtering"; + this.paginator.setCurrentPage(0); + this.paginator.resetNumberOfPages(filteredTopicList.size()); + + + }else{ + this.filteredTopicList = null; + } + + this.updateCurrentTopics(); + } + + private void updateCurrentTopics() { + this.paginator.initCount(); + int startRecord = this.paginator.getCurrentPage() + * this.paginator.getItemsPerPage(); + if(this.paginator.getNumberOfPages() == 0){ + this.displayTopicList = new ArrayList(); + }else if((this.paginator.getCurrentPage() + 1) == this.paginator.getNumberOfPages()){ + int mod = this.filteredTopicList.size() % paginator.getItemsPerPage(); + if(mod == 0){ + this.displayTopicList = filteredTopicList.subList(startRecord, startRecord + this.paginator.getItemsPerPage()); + }else{ + this.displayTopicList = filteredTopicList.subList(startRecord, startRecord + mod); + } + + }else{ + this.displayTopicList = filteredTopicList.subList(startRecord, startRecord + this.paginator.getItemsPerPage()); + } + /* + for(LGTopic topic : this.displayTopicList){ + topic.setTopic(this.topicMap.get(topic.getId())); + } + */ + } + + + + + // sort + + public void sortByLastModifiedDown() { + //Collections.sort(this.completeTopicList, new SortByLastModified()); + //Collections.reverse(this.completeTopicList); + filter(); + } + + + + public List getCompleteTopicList() { + return completeTopicList; + } + + + public void setCompleteTopicList(List completeTopicList) { + this.completeTopicList = completeTopicList; + } + + + public List getFilteredTopicList() { + return filteredTopicList; + } + + + public void setFilteredTopicList(List filteredTopicList) { + this.filteredTopicList = filteredTopicList; + } + + + public List getDisplayTopicList() { + return displayTopicList; + } + + + public void setDisplayTopicList(List displayTopicList) { + this.displayTopicList = displayTopicList; + } + + + public Long getTopicId() { + return topicId; + } + + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + + public String getFilteringMessage() { + return filteringMessage; + } + + + public void setFilteringMessage(String filteringMessage) { + this.filteringMessage = filteringMessage; + } + + + + public DataPaginator getPaginator() { + return paginator; + } + + + public void setPaginator(DataPaginator paginator) { + this.paginator = paginator; + } + + + public int getTopicNumber() { + return topicNumber; + } + + + public void setTopicNumber(int topicNumber) { + this.topicNumber = topicNumber; + } + + + + + + + + +} diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/web/jsp/TopicPage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/mpiwg/web/jsp/TopicPage.java Thu Dec 17 13:44:08 2015 +0100 @@ -0,0 +1,672 @@ +package de.mpiwg.web.jsp; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import cl.maps.duplex.DuplexKey; +import de.mpiwg.gazetteer.bo.LGBranch; +import de.mpiwg.gazetteer.bo.LGTopic; +import de.mpiwg.gazetteer.bo.LGTopicSectionRelation; +import de.mpiwg.gazetteer.dataverse.DataverseUtils; +import de.mpiwg.gazetteer.dataverse.bo.VDCUser; +import de.mpiwg.gazetteer.db.DBSection; +import de.mpiwg.gazetteer.utils.DBService; +import de.mpiwg.gazetteer.utils.DataProvider; +import de.mpiwg.web.search.SortSectionByAdminType; +import de.mpiwg.web.search.SortSectionByBookId; +import de.mpiwg.web.search.SortSectionByBookName; +import de.mpiwg.web.search.SortSectionByDynasty; +import de.mpiwg.web.search.SortSectionById; +import de.mpiwg.web.search.SortSectionByLevel1; +import de.mpiwg.web.search.SortSectionByLevel2; +import de.mpiwg.web.search.SortSectionByPeriod; +import de.mpiwg.web.search.SortSectionByStartPage; + + +public class TopicPage extends AbstractJSPPage{ + + private static Logger logger = Logger.getLogger(TopicPage.class); + + public static String bean = "topicBean"; + public static String page = "pages/topicPage.jsp"; + + private LGTopic topic; + private Long topicId; + + private Long userId; + + private List suggestionUserList; + private List contributors; + + private List completeSectionList; + private List filteredSectionList; + private List displaySectionList; + + + private String dynastyFilter = new String(); + private String adminTypeFilter = new String(); + private String level1Filter = new String(); + private String level2Filter = new String(); + + private String bookNameFilter = new String(); + private String bookIdFilter = new String(); + private String periodFilter = new String(); + private String sectionNameFilter = new String(); + + private DataPaginator paginator = new DataPaginator(); + private String filteringMessage; + + private Map> branchesMap; + + public void loadParameters(HttpServletRequest request, HttpServletResponse response){ + + this.request = request; + this.response = response; + this.userId = getLongParameter("userId"); + this.topicId = getLongParameter("topicId"); + + this.dynastyFilter = getParameter("dynastyFilter"); + this.adminTypeFilter = getParameter("adminTypeFilter"); + this.level1Filter = getParameter("level1Filter"); + this.level2Filter = getParameter("level2Filter"); + this.periodFilter = getParameter("periodFilter"); + this.sectionNameFilter = getParameter("sectionNameFilter"); + this.bookIdFilter = getParameter("bookIdFilter"); + this.bookNameFilter = getParameter("bookNameFilter"); + + } + + + + public void forceLoadTopicSectionRelation() { + + logger.debug("forceLoadTopicSectionRelation"); + DataProvider.getInstance().setTopicSectionRelationMap(null); + + this.loadTopic(this.topic); + } + + + + public void loadTopic(String topicId0){ + try { + + this.topicId = Long.parseLong(topicId0); + + LGTopic topic = DataProvider.getInstance().getTopic(topicId); + if(topic != null){ + this.loadTopic(topic); + }else{ + addMsg("topic [id=" + topicId + "] no found."); + } + + + } catch (Exception e) { + internalError(e); + } + + } + + public void addContributor(){ + if(userId != null){ + + VDCUser user = DataverseUtils.getUser(userId); + System.out.println("Adding user: " + user.getUserName()); + + this.topic.addContributor(userId); + this.saveTopic0(); + } + } + + + + public void removeContributor(){ + if(userId != null){ + + VDCUser user = DataverseUtils.getUser(userId); + System.out.println("Removing user: " + user.getUserName()); + + this.topic.removeContributor(userId); + this.saveTopic0(); + } + } + + private void saveTopic0(){ + try { + DataProvider.getInstance().updateTopic(topic); + this.loadTopic(topic); + addMsg("The topic has been updated!"); + } catch (Exception e) { + internalError(e); + } + } + + + public void loadTopic(LGTopic topic){ + logger.info("Loading topic: " + topic.toString()); + + if(topic != null && topic.isPersistent()){ + this.loadBranches(); + try { + this.topic = (LGTopic)topic.clone(); + this.contributors = new ArrayList(); + for(Long userId : this.topic.getContributorsList()){ + VDCUser user = DataverseUtils.getUser(userId); + if(user != null){ + this.contributors.add(user); + } + + } + + this.loadSuggestionUserList(); + + // all sections in the topic + this.completeSectionList = DataProvider.getInstance().getAllSectionsInTopic(topic.getId()); + + } catch (Exception e) { + internalError(e); + } + + logger.info("completeSectionList.size=" + completeSectionList.size()); + } + this.filter(); + } + + + + public void updateDescription() { + String description = getParameter("description"); + //logger.info("updateLabel: " + branchLabel + ", for branch id=" + this.getBranchId()) + this.getTopic().setDescription(description); + + this.saveTopic0(); + + } + + + + + public void deleteSection(Long sectionId) throws Exception { + // delete the record with sectionId, topicId in topicSectionRelation database table + + logger.debug("delete sectionId=" + sectionId + " in topicId=" + topicId); + + DataProvider.getInstance().deleteTopicSectionRelation(topicId, sectionId); + + + // update completeSectionList + this.completeSectionList = DataProvider.getInstance().getAllSectionsInTopic(topic.getId()); + + + } + + + + private void loadSuggestionUserList() throws Exception{ + this.suggestionUserList = new ArrayList(); + for(VDCUser user : DataverseUtils.getAllUsers()){ + if(!topic.hasContributor(user.getId())){ + this.suggestionUserList.add(user); + } + } + } + + public void reset(){ + this.topic = null; + this.completeSectionList = null; + } + + public void filter(){ + this.filteredSectionList = new ArrayList(); + for(DBSection section : this.completeSectionList){ + if(!this.filteredSectionList.contains(section)){ + + if( (StringUtils.isEmpty(dynastyFilter) || StringUtils.startsWith(section.getBook().getDynasty(), dynastyFilter)) && + (StringUtils.isEmpty(level1Filter) || StringUtils.startsWith(section.getBook().getLevel1(), level1Filter)) && + (StringUtils.isEmpty(level2Filter) || StringUtils.startsWith(section.getBook().getLevel2(), level2Filter)) && + (StringUtils.isEmpty(bookIdFilter) || StringUtils.startsWith(section.getBookId(), bookIdFilter)) && + (StringUtils.isEmpty(bookNameFilter) || StringUtils.startsWith(section.getBook().getName(), bookNameFilter)) && + (StringUtils.isEmpty(periodFilter) || StringUtils.startsWith(section.getBook().getPeriod(), periodFilter)) && + (StringUtils.isEmpty(sectionNameFilter) || StringUtils.startsWith(section.getName(), sectionNameFilter)) && + (StringUtils.isEmpty(adminTypeFilter) || StringUtils.startsWith(section.getBook().getAdmin_type(), adminTypeFilter)) + ){ + this.filteredSectionList.add(section); + } + + } + } + + if(completeSectionList.size() > 0){ + + this.filteringMessage = this.filteredSectionList.size() + " section(s) listed after the filtering"; + + this.paginator.setCurrentPage(0); + this.paginator.resetNumberOfPages(filteredSectionList.size()); + + this.updateCurrentSections(); + + }else{ + this.filteredSectionList = null; + this.filteringMessage = ""; + + this.paginator.setCurrentPage(0); + this.paginator.resetNumberOfPages(0); + } + + + } + + + private void updateCurrentSections() { + /* developing... */ + this.displaySectionList = this.filteredSectionList; + + /* + + this.paginator.initCount(); + int startRecord = this.paginator.getCurrentPage() + * this.paginator.getItemsPerPage(); + if(this.paginator.getNumberOfPages() == 0){ + this.displaySectionList = new ArrayList(); + }else if((this.paginator.getCurrentPage() + 1) == this.paginator.getNumberOfPages()){ + int mod = this.filteredSectionList.size() % paginator.getItemsPerPage(); + if(mod == 0){ + this.displaySectionList = filteredSectionList.subList(startRecord, startRecord + this.paginator.getItemsPerPage()); + }else{ + this.displaySectionList = filteredSectionList.subList(startRecord, startRecord + mod); + } + + }else{ + this.displaySectionList = filteredSectionList.subList(startRecord, startRecord + this.paginator.getItemsPerPage()); + } + */ + + for(DBSection section : this.displaySectionList){ + section.setBranches(this.branchesMap.get(section.getId())); + } + + + } + + + + public void addSectionToTopic(Long _sectionId, Long _topicId) throws Exception { + logger.debug("selectedSectionId:" + _sectionId + ", selectedTopicId: " + _topicId); + + + // create a new record in TopicSectionRelation table + String status = DataProvider.getInstance().updateTopicSectionRelation(_sectionId, _topicId); + + if (StringUtils.equals(status, "added") ) { + // TODO responding with names to user + addMsg("Added section [id=" + _sectionId + "] to the topic [id=" + _topicId + "]"); + } else if (StringUtils.equals(status, "updated") ) { + addMsg("The section already in the topic"); + } + + this.reset(); + } + + + + + private void loadBranches(){ + this.branchesMap = new HashMap>(); + // List list = DataProvider.getInstance().getBranches(getSessionBean().getUser().getId()); + List list = DataProvider.getInstance().getAllExistingBranches(); + + for(LGBranch branch : list){ + branch.loadTransientData(); + if(this.branchesMap.get(branch.getSectionId()) == null){ + this.branchesMap.put(branch.getSectionId(), new ArrayList()); + } + this.branchesMap.get(branch.getSectionId()).add(branch); + } + } + + public List getContributors() { + return contributors; + } + + public void setContributors(List contributors) { + this.contributors = contributors; + } + + public List getSuggestionUserList() { + return suggestionUserList; + } + public void setSuggestionUserList(List suggestionUserList) { + this.suggestionUserList = suggestionUserList; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + + public LGTopic getTopic() { + return topic; + } + + + + public void setTopic(LGTopic topic) { + this.topic = topic; + } + + + + public Long getTopicId() { + return topicId; + } + + + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + + + public String getDynastyFilter() { + return dynastyFilter; + } + + + + public void setDynastyFilter(String dynastyFilter) { + this.dynastyFilter = dynastyFilter; + } + + + + public String getAdminTypeFilter() { + return adminTypeFilter; + } + + + + public void setAdminTypeFilter(String adminTypeFilter) { + this.adminTypeFilter = adminTypeFilter; + } + + + + public String getLevel1Filter() { + return level1Filter; + } + + + + public void setLevel1Filter(String level1Filter) { + this.level1Filter = level1Filter; + } + + + + public String getLevel2Filter() { + return level2Filter; + } + + + + public void setLevel2Filter(String level2Filter) { + this.level2Filter = level2Filter; + } + + + + public List getFilteredSectionList() { + return filteredSectionList; + } + + + + public void setFilteredSectionList(List filteredSectionList) { + this.filteredSectionList = filteredSectionList; + } + + + + public List getDisplaySectionList() { + return displaySectionList; + } + + + + public void setDisplaySectionList(List displaySectionList) { + this.displaySectionList = displaySectionList; + } + + + + public DataPaginator getPaginator() { + return paginator; + } + + + + public void setPaginator(DataPaginator paginator) { + this.paginator = paginator; + } + + + + public String getFilteringMessage() { + return filteringMessage; + } + + + + public void setFilteringMessage(String filteringMessage) { + this.filteringMessage = filteringMessage; + } + + + + public Map> getBranchesMap() { + return branchesMap; + } + + + + public void setBranchesMap(Map> branchesMap) { + this.branchesMap = branchesMap; + } + + public String getBookNameFilter() { + return bookNameFilter; + } + + + public void setBookNameFilter(String bookNameFilter) { + this.bookNameFilter = bookNameFilter; + } + + + + public String getBookIdFilter() { + return bookIdFilter; + } + + + + public void setBookIdFilter(String bookIdFilter) { + this.bookIdFilter = bookIdFilter; + } + + + + public String getPeriodFilter() { + return periodFilter; + } + + + + public void setPeriodFilter(String periodFilter) { + this.periodFilter = periodFilter; + } + + + + public String getSectionNameFilter() { + return sectionNameFilter; + } + + + + public void setSectionNameFilter(String sectionNameFilter) { + this.sectionNameFilter = sectionNameFilter; + } + + + + public List getCompleteSectionList() { + return completeSectionList; + } + + + + public void setCompleteSectionList(List completeSectionList) { + this.completeSectionList = completeSectionList; + } + + + + /////// Sorting + + + public void sortByBookNameUp(){ + Collections.sort(this.completeSectionList, new SortSectionByBookName()); + filter(); + } + + public void sortByBookNameDown(){ + Collections.sort(this.completeSectionList, new SortSectionByBookName()); + Collections.reverse(this.completeSectionList); + filter(); + } + + public void sortBySectionNameUp(){ + Collections.sort(this.completeSectionList); + filter(); + } + + public void sortBySectionNameDown(){ + Collections.sort(this.completeSectionList); + Collections.reverse(this.completeSectionList); + filter(); + } + + + public void sortByPeriodUp(){ + Collections.sort(this.completeSectionList, new SortSectionByPeriod()); + filter(); + } + + public void sortByPeriodDown(){ + Collections.sort(this.completeSectionList, new SortSectionByPeriod()); + Collections.reverse(this.completeSectionList); + filter(); + } + + + + public void sortBySectionIdUp(){ + Collections.sort(this.completeSectionList, new SortSectionById()); + this.filter(); + } + + public void sortBySectionIdDown(){ + Collections.sort(this.completeSectionList, new SortSectionById()); + Collections.reverse(completeSectionList); + this.filter(); + } + + + + public void sortByDynastyUp(){ + Collections.sort(this.completeSectionList, new SortSectionByDynasty()); + filter(); + } + + public void sortByDynastyDown(){ + Collections.sort(this.completeSectionList, new SortSectionByDynasty()); + Collections.reverse(completeSectionList); + filter(); + } + + public void sortByBookIdUp(){ + Collections.sort(this.completeSectionList, new SortSectionByBookId()); + filter(); + } + + public void sortByBookIdDown(){ + Collections.sort(this.completeSectionList, new SortSectionByBookId()); + Collections.reverse(completeSectionList); + filter(); + } + + public void sortByLevel1Up(){ + Collections.sort(this.completeSectionList, new SortSectionByLevel1()); + filter(); + } + + public void sortByLevel1Down(){ + Collections.sort(this.completeSectionList, new SortSectionByLevel1()); + Collections.reverse(completeSectionList); + filter(); + } + + public void sortByLevel2Up(){ + Collections.sort(this.completeSectionList, new SortSectionByLevel2()); + filter(); + } + + public void sortByLevel2Down(){ + Collections.sort(this.completeSectionList, new SortSectionByLevel2()); + Collections.reverse(completeSectionList); + filter(); + } + + public void sortByAdminTypeUp(){ + Collections.sort(this.completeSectionList, new SortSectionByAdminType()); + filter(); + } + + public void sortByAdminTypeDown(){ + Collections.sort(this.completeSectionList, new SortSectionByAdminType()); + Collections.reverse(completeSectionList); + filter(); + } + + public void sortByStartPageUp(){ + Collections.sort(this.completeSectionList, new SortSectionByStartPage()); + filter(); + } + + public void sortByStartPageDown(){ + Collections.sort(this.completeSectionList, new SortSectionByStartPage()); + Collections.reverse(completeSectionList); + filter(); + } + + + + + + +} diff -r 35ed4e650a53 -r ba9515f22897 src/main/java/de/mpiwg/web/search/SortSectionByLevel2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/mpiwg/web/search/SortSectionByLevel2.java Thu Dec 17 13:44:08 2015 +0100 @@ -0,0 +1,15 @@ +package de.mpiwg.web.search; + +import java.util.Comparator; + +import de.mpiwg.gazetteer.db.DBSection; + +public class SortSectionByLevel2 implements Comparator{ + + public int compare(DBSection o1, DBSection o2) { + if(o1.getBook() == null || o2.getBook() == null){ + return o1.getName().compareTo(o2.getName()); + } + return o1.getBook().getLevel1().compareTo(o2.getBook().getLevel1()); + } +} diff -r 35ed4e650a53 -r ba9515f22897 src/main/resources/hibernate.cfg.xml --- a/src/main/resources/hibernate.cfg.xml Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/resources/hibernate.cfg.xml Thu Dec 17 13:44:08 2015 +0100 @@ -37,7 +37,10 @@ - + + + + diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/componentes/template.jsp --- a/src/main/webapp/componentes/template.jsp Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/webapp/componentes/template.jsp Thu Dec 17 13:44:08 2015 +0100 @@ -71,6 +71,7 @@ diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/pages/fullTextSearch.jsp --- a/src/main/webapp/pages/fullTextSearch.jsp Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/webapp/pages/fullTextSearch.jsp Thu Dec 17 13:44:08 2015 +0100 @@ -1,6 +1,4 @@ -<%@page import="de.mpiwg.gazetteer.bo.LGBranch"%> <%@page import="org.apache.commons.lang.StringUtils"%> -<%@page import="de.mpiwg.gazetteer.db.DBSection"%> <%@page import="de.mpiwg.gazetteer.db.DBContents"%> <%@page import="de.mpiwg.gazetteer.bo.LGFullTextSearchFile"%> @@ -108,7 +106,7 @@
<% if(sessionBean.getUser() == null) { %> - + <% } else { if (sessionBean.getFullTextSearchPage().getFileList() == null){ diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/pages/home.jsp --- a/src/main/webapp/pages/home.jsp Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/webapp/pages/home.jsp Thu Dec 17 13:44:08 2015 +0100 @@ -19,7 +19,7 @@
<% if(sessionBean.getUser() == null) { %> - + <% } else { if (sessionBean.getHomePage().getCompleteBranchList() == null){ diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/pages/search.jsp --- a/src/main/webapp/pages/search.jsp Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/webapp/pages/search.jsp Thu Dec 17 13:44:08 2015 +0100 @@ -12,10 +12,37 @@ + + + + + + + +
+ + <% if(sessionBean.getUser() == null) { %> + + <% } else { + + if (sessionBean.getTopicListPage().getCompleteTopicList() == null){ + sessionBean.getTopicListPage().loadParameters(request, response); + sessionBean.getTopicListPage().reloadTopics(); + } + + %> + + <% if(sessionBean.getTopicListPage().getCompleteTopicList().isEmpty()) { %> + + <% } else { %> + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ Name (Eng) + + +
+ name (中文) + + +
+ name (Pinyin) + + +
+ description + + +
+ +
+
+
+ +
+ + +
Topic + + +

You have <%= sessionBean.getTopicListPage().getTopicNumber() %> topics.

+

<%= (StringUtils.isNotEmpty(sessionBean.getTopicListPage().getFilteringMessage())) ? sessionBean.getTopicListPage().getFilteringMessage() : ""%>

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + <% for (LGTopic topic : sessionBean.getTopicListPage().getDisplayTopicList() ) { + %> + + + + + + + + + + + + + + + + + <% } %> + +
+ + + + + +
+ + + +
+ +
+ +
+
+
+ + + + + + +
+ + + +
+ +
+ +
+
+
+ + + + + + +
+ + + +
+ +
+ +
+
+
+ + + + + + +
+ + + +
+ +
+ +
+
+
+ + + + + + +
+ + + +
+ +
+ +
+
+
+ + + + + + +
+ + + +
+ +
+ +
+
+
<%=topic.getId() %><%=topic.getNameEn() %><%=topic.getNameCh() %><%=topic.getNamePinyin() %><%=topic.getDescription() %> + + <% for(String contributor : topic.getContributorsNameList()) { %> + + <% } %> +
+
<%=topic.getFomattedLastChange() %> + + Manage Topic + + + +
+ +
+ + + + + + +
+ <% } %> + <% } %> +
+ + \ No newline at end of file diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/pages/topicPage.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/webapp/pages/topicPage.jsp Thu Dec 17 13:44:08 2015 +0100 @@ -0,0 +1,541 @@ +<%@page import="de.mpiwg.gazetteer.dataverse.bo.VDCUser"%> +<%@page import="de.mpiwg.gazetteer.bo.LGFile"%> +<%@page import="de.mpiwg.gazetteer.bo.LGBranch"%> +<%@page import="org.apache.commons.lang.StringUtils"%> +<%@page import="de.mpiwg.gazetteer.db.DBSection"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> + + + + + + + + + + + + + + + + +
+ + <% if(sessionBean.getUser() == null) { %> + + <% } else { %> + + <% if(sessionBean.getTopicPage().getCompleteSectionList() == null || sessionBean.getParameter("topicId") != null) { + sessionBean.getTopicPage().loadParameters(request, response); + sessionBean.getTopicPage().loadTopic(request.getParameter("topicId")); + } %> + + <% if(sessionBean.getTopicPage().getCompleteSectionList().isEmpty()) { %> + + + <% } else { %> + +
+
+ + + <% for(VDCUser user : sessionBean.getTopicPage().getSuggestionUserList()) { %> + + + + <% } %> +
<%=user.getUserName()%>
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + +
+
+ + + <% for(VDCUser contr : sessionBean.getTopicPage().getContributors()) { %> + + + + + <% } %> +
+ +
+
+
+ +
+
+
+ + + + + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + <% for(DBSection section : sessionBean.getTopicPage().getDisplaySectionList() ) { %> + + + + + + + + + + + + + + + + + + + <% } %> +
+ + + + + + + + + +
+ + + +
+ +
+ +
+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ +
+ +
+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ +
+ +
+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + +
+ +
+ +
+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ +
+ +
+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ +
+ +
+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ +
+ +
+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ +
+ +
+
+ + + +
+
+ + + + + +
+ + + +
+ +
+ +
+
+
+ + <%=section.getBookId()%> + + + + Show Section in Extraction Interface + + + <% if(section.getBranches() != null && !section.getBranches().isEmpty()) { %> + + <% for(LGBranch branch : section.getBranches()) { %> + + + + + <% } %> +
+ + + +
<%=branch.getFomattedLastChange() %>
<%=branch.getLabel() %>
+
+ <% if (branch.hasContributor(sessionBean.getUser().getId())) { %> + + Manage Branch + + <% } else { %> + + <% } %> +
+ <% } %> +
+ +
+
+
+
+ + + <% } %> + + <% } %> + +
+ + \ No newline at end of file diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/resources/.DS_Store Binary file src/main/webapp/resources/.DS_Store has changed diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/resources/css/style.css --- a/src/main/webapp/resources/css/style.css Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/webapp/resources/css/style.css Thu Dec 17 13:44:08 2015 +0100 @@ -268,6 +268,10 @@ padding:0 0; } +.filterInput{ + width:60px; +} + #loading{ position:fixed; z-index:2000; diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/resources/images/plus.png Binary file src/main/webapp/resources/images/plus.png has changed diff -r 35ed4e650a53 -r ba9515f22897 src/main/webapp/resources/js/proxyMethods.js --- a/src/main/webapp/resources/js/proxyMethods.js Mon Dec 07 17:06:57 2015 +0100 +++ b/src/main/webapp/resources/js/proxyMethods.js Thu Dec 17 13:44:08 2015 +0100 @@ -35,6 +35,18 @@ setAction(action, formName); } +function deleteTopic(action, formName, topicId){ + + var theForm = document.forms[formName]; + var input = document.createElement('input'); + input.type = 'hidden'; + input.name = 'topicId'; + input.value = topicId; + theForm.appendChild(input); + + setAction(action, formName); +} + function addContributor(action, formName, userId){ var theForm = document.forms[formName]; var input = document.createElement('input');