This is an automated email from the git hooks/post-receive script. New commit to branch feature/1112 in repository pollen. See http://git.chorem.org/pollen.git commit c65d74b4a42fc08d2bc266a511c9ff39ddfea310 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Sep 20 12:22:18 2014 +0200 refs #1112 : introduce the Export service --- pollen-services/pom.xml | 6 + .../pollen/services/impl/PollenExportService.java | 384 +++++++++++++++++++++ 2 files changed, 390 insertions(+) diff --git a/pollen-services/pom.xml b/pollen-services/pom.xml index cd4f7cb..9914231 100644 --- a/pollen-services/pom.xml +++ b/pollen-services/pom.xml @@ -29,6 +29,12 @@ </dependency> <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>pollen-io-api</artifactId> + <version>2.0-SNAPSHOT</version> + </dependency> + + <dependency> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> </dependency> diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollenExportService.java b/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollenExportService.java new file mode 100644 index 0000000..4237a70 --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollenExportService.java @@ -0,0 +1,384 @@ +package org.chorem.pollen.services.impl; + +import org.chorem.pollen.PollenTechnicalException; +import org.chorem.pollen.bean.PollDateChoice; +import org.chorem.pollen.bean.PollImageChoice; +import org.chorem.pollen.business.persistence.PersonList; +import org.chorem.pollen.business.persistence.PersonToList; +import org.chorem.pollen.business.persistence.PollAccount; +import org.chorem.pollen.business.persistence.PollDAO; +import org.chorem.pollen.business.persistence.UserAccount; +import org.chorem.pollen.business.persistence.UserAccountDAO; +import org.chorem.pollen.business.persistence.VotingList; +import org.chorem.pollen.io.PollenDataStorage; +import org.chorem.pollen.io.dto.Choice; +import org.chorem.pollen.io.dto.ChoiceType; +import org.chorem.pollen.io.dto.Comment; +import org.chorem.pollen.io.dto.CommentVisibility; +import org.chorem.pollen.io.dto.FavoriteList; +import org.chorem.pollen.io.dto.FavoriteListMember; +import org.chorem.pollen.io.dto.Poll; +import org.chorem.pollen.io.dto.PollType; +import org.chorem.pollen.io.dto.PollenData; +import org.chorem.pollen.io.dto.PollenPrincipal; +import org.chorem.pollen.io.dto.PollenResource; +import org.chorem.pollen.io.dto.PollenResourceFile; +import org.chorem.pollen.io.dto.PollenToken; +import org.chorem.pollen.io.dto.PollenUser; +import org.chorem.pollen.io.dto.ResultVisibility; +import org.chorem.pollen.io.dto.Vote; +import org.chorem.pollen.io.dto.VoteToChoice; +import org.chorem.pollen.io.dto.VoterList; +import org.chorem.pollen.io.dto.VoterListMember; +import org.chorem.pollen.services.PollenServiceContext; +import org.chorem.pollen.services.PollenServiceSupport; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.TreeMap; + +/** + * Created on 9/19/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 1.5.6 + */ +public class PollenExportService extends PollenServiceSupport { + + protected PollService pollService; + + @Override + public void setServiceContext(PollenServiceContext serviceContext) { + super.setServiceContext(serviceContext); + pollService = newService(PollService.class); + } + + public void exportData(File zipFile) { + + PollenData data = new PollenData(); + data.setVersion(getConfiguration().getVersion().getVersion()); + data.setDescription("From Pollen at " + getConfiguration().getApplicationUrl()); + data.setDate(serviceContext.getCurrentTime()); + + // extract users + extractUsers(data); + + // extract polls + resources + extractPolls(data); + + PollenDataStorage storage = new PollenDataStorage(); + + try { + storage.store(data, zipFile); + } catch (IOException e) { + throw new PollenTechnicalException("Could not store export to " + zipFile, e); + } + + } + + protected void extractUsers(PollenData data) { + + UserAccountDAO dao = getDAO(org.chorem.pollen.business.persistence.UserAccount.class); + + for (UserAccount user : dao) { + + PollenUser exportUser = extractPollUser(user); + data.addUser(exportUser); + + } + + } + + protected void extractPolls(PollenData data) { + + Map<String, PollenUser> userMap = new TreeMap<String, PollenUser>(); + + for (PollenUser user : data.getUsers()) { + userMap.put(user.getId(), user); + } + + PollDAO dao = getDAO(org.chorem.pollen.business.persistence.Poll.class); + + for (org.chorem.pollen.business.persistence.Poll poll : dao) { + + Poll exportPoll = extractPoll(poll, userMap, data); + data.addPoll(exportPoll); + + } + + } + + protected Poll extractPoll(org.chorem.pollen.business.persistence.Poll incomingPoll, Map<String, PollenUser> userMap, PollenData data) { + + Poll poll = new Poll(); + poll.setId(incomingPoll.getTopiaId()); + poll.setTitle(incomingPoll.getTitle()); + poll.setDescription(incomingPoll.getDescription()); + poll.setAnonymousVoteAllowed(incomingPoll.isAnonymousVoteAllowed()); + poll.setBeginChoiceDate(incomingPoll.getBeginChoiceDate()); + poll.setEndChoiceDate(incomingPoll.getEndChoiceDate()); + poll.setBeginDate(incomingPoll.getBeginDate()); + poll.setEndDate(incomingPoll.getEndDate()); + poll.setChoiceAddAllowed(incomingPoll.isChoiceAddAllowed()); + poll.setClosed(incomingPoll.isClosed()); + poll.setCommentVisibility(CommentVisibility.valueOf(incomingPoll.getPollCommentVisibility().name())); + poll.setContinuousResults(incomingPoll.isContinuousResults()); + poll.setMaxChoiceNumber(incomingPoll.getMaxChoiceNb()); + poll.setPollType(PollType.valueOf(incomingPoll.getPollType().name())); + poll.setResultVisibility(incomingPoll.isPollFree() ? ResultVisibility.EVERYBODY : ResultVisibility.VOTER); + poll.setVoteCountingType(incomingPoll.getVoteCountingType() + 1); + PollenPrincipal creator = extractPrincipal(incomingPoll.getCreator(), userMap); + poll.setCreator(creator); + + Map<String, Choice> choices = new TreeMap<String, Choice>(); + + if (!incomingPoll.isChoiceEmpty()) { + + String pollId = poll.getCreator().getPermission().getToken(); + + int choiceOrder = 0; + + for (org.chorem.pollen.business.persistence.Choice incomingChoice : incomingPoll.getChoice()) { + + Choice choice = extractChoice(pollId, creator, incomingChoice, choiceOrder++, data); + poll.addChoice(choice); + choices.put(incomingChoice.getTopiaId(), choice); + + } + + } + + if (!incomingPoll.isCommentEmpty()) { + + for (org.chorem.pollen.business.persistence.Comment incomingComment : incomingPoll.getComment()) { + + Comment comment = extractComment(incomingComment, userMap); + poll.addComment(comment); + + } + + } + + if (!incomingPoll.isVotingListEmpty()) { + + for (org.chorem.pollen.business.persistence.VotingList incomingVotinglist : incomingPoll.getVotingList()) { + + VoterList voterList = extractVoterList(incomingVotinglist, userMap); + poll.addVoterList(voterList); + + } + + } + + if (!incomingPoll.isVoteEmpty()) { + + for (org.chorem.pollen.business.persistence.Vote incomingVote : incomingPoll.getVote()) { + + Vote vote = extractVote(incomingVote, choices, userMap); + poll.addVote(vote); + + } + + } + + return poll; + + } + + protected VoterList extractVoterList(VotingList incomingVotinglist, Map<String, PollenUser> userMap) { + + VoterList voterList = new VoterList(); + voterList.setName(incomingVotinglist.getName()); + voterList.setWeight(incomingVotinglist.getWeight()); + + if (!incomingVotinglist.isPollAccountPersonToListEmpty()) { + + for (PersonToList incomingVoterListMember : incomingVotinglist.getPollAccountPersonToList()) { + + VoterListMember voterListMember = extractVoterListMember(incomingVoterListMember, userMap); + voterList.addMember(voterListMember); + + } + } + + return voterList; + + } + + protected VoterListMember extractVoterListMember(PersonToList incomingVoterListMember, Map<String, PollenUser> userMap) { + + VoterListMember voterListMember = new VoterListMember(); + voterListMember.setWeight(incomingVoterListMember.getWeight()); + PollenPrincipal member = extractPrincipal(incomingVoterListMember.getPollAccount(), userMap); + voterListMember.setMember(member); + return voterListMember; + + } + + protected Vote extractVote(org.chorem.pollen.business.persistence.Vote incomingVote, + Map<String, Choice> choices, + Map<String, PollenUser> userMap) { + + Vote vote = new Vote(); + vote.setAnonymous(incomingVote.isAnonymous()); + PollenPrincipal voter = extractPrincipal(incomingVote.getPollAccount(), userMap); + vote.setVoter(voter); + + if (!incomingVote.isChoiceVoteToChoiceEmpty()) { + + for (org.chorem.pollen.business.persistence.VoteToChoice incomingVoteToChoice : incomingVote.getChoiceVoteToChoice()) { + + VoteToChoice voteToChoice = extractVoteToChoice(incomingVoteToChoice, choices); + vote.addVoteToChoice(voteToChoice); + + } + } + + return vote; + } + + protected VoteToChoice extractVoteToChoice(org.chorem.pollen.business.persistence.VoteToChoice incomingVoteToChoice, Map<String, Choice> choices) { + + VoteToChoice voteToChoice = new VoteToChoice(); + voteToChoice.setVoteValue(Double.valueOf(incomingVoteToChoice.getVoteValue())); + Choice choice = choices.get(incomingVoteToChoice.getChoice().getTopiaId()); + voteToChoice.setChoice(choice); + return voteToChoice; + + } + + protected Comment extractComment(org.chorem.pollen.business.persistence.Comment incomingComment, Map<String, PollenUser> userMap) { + + Comment comment = new Comment(); + comment.setText(incomingComment.getText()); + comment.setPostDate(incomingComment.getPostDate()); + PollenPrincipal author = extractPrincipal(incomingComment.getPollAccount(), userMap); + comment.setAuthor(author); + + return comment; + + } + + protected Choice extractChoice(String pollId, PollenPrincipal creator, org.chorem.pollen.business.persistence.Choice incomingChoice, int choiceOrder, PollenData data) { + + Choice choice = new Choice(); + choice.setChoiceOrder(choiceOrder); + + choice.setDescription(incomingChoice.getDescription()); + choice.setCreator(creator); + choice.setChoiceValue(incomingChoice.getName()); + + ChoiceType choiceType; + + if (incomingChoice instanceof PollDateChoice) { + + // resource choice + choiceType = ChoiceType.DATE; + + } else if (incomingChoice instanceof PollImageChoice) { + + // resource choice + choiceType = ChoiceType.RESOURCE; + + // extract resource + PollenResource resourceFile = extractChoiceResource(pollId, choice); + data.addResource(resourceFile); + + } else { + + // text choice + choiceType = ChoiceType.TEXT; + + } + choice.setChoiceType(choiceType); + + + return choice; + + } + + protected PollenResource extractChoiceResource(String pollId, Choice choice) { + + String choiceId = choice.getCreator().getPermission().getToken(); + + File file = pollService.getPollChoiceImageFile(pollId, choiceId); + + PollenResourceFile resourceFile = new PollenResourceFile(); + resourceFile.setFile(file); + resourceFile.setId(pollId + "--" + choiceId); + resourceFile.setName(file.getName()); + resourceFile.setContentType("image"); + resourceFile.setSize(file.length()); + + return resourceFile; + + } + + protected PollenPrincipal extractPrincipal(PollAccount pollAccount, Map<String, PollenUser> userMap) { + + PollenPrincipal pollenPrincipal = new PollenPrincipal(); + pollenPrincipal.setEmail(pollAccount.getEmail()); + + PollenToken permission = new PollenToken(); + permission.setToken(pollAccount.getAccountId()); + pollenPrincipal.setPermission(permission); + + if (pollAccount.getUserAccount() != null) { + PollenUser pollenUser = userMap.get(pollAccount.getUserAccount().getTopiaId()); + pollenPrincipal.setPollenUser(pollenUser); + } + + return pollenPrincipal; + + } + + protected PollenUser extractPollUser(UserAccount userAccount) { + + PollenUser user = new PollenUser(); + user.setId(userAccount.getTopiaId()); + user.setName(userAccount.getDisplayName()); + user.setEmail(userAccount.getEmail()); + user.setAdministrator(userAccount.isAdministrator()); + + if (!userAccount.isFavoriteListEmpty()) { + + for (PersonList personList : userAccount.getFavoriteList()) { + + FavoriteList favoriteList = extractFavoriteList(personList); + user.addFavoriteList(favoriteList); + + } + } + + return user; + + } + + protected FavoriteList extractFavoriteList(PersonList personList) { + + FavoriteList favoriteList = new FavoriteList(); + favoriteList.setName(personList.getName()); + + if (!personList.isPollAccountEmpty()) { + for (PollAccount pollAccount : personList.getPollAccount()) { + FavoriteListMember member = extractFavoriteListMember(pollAccount); + favoriteList.addMember(member); + } + } + + return favoriteList; + + } + + protected FavoriteListMember extractFavoriteListMember(PollAccount personListMember) { + + FavoriteListMember member = new FavoriteListMember(); + member.setName(personListMember.getUserAccount().getDisplayName()); + member.setEmail(personListMember.getEmail()); + return member; + + } + + +} -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.