diff --git a/.eclipse-pmd b/.eclipse-pmd
deleted file mode 100644
index c7240957..00000000
--- a/.eclipse-pmd
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.pmd b/.pmd
deleted file mode 100644
index 133c62cf..00000000
--- a/.pmd
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- true
- pmd_rules.xml
- false
- true
- true
-
diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component
index a1c4ec2c..fe147916 100644
--- a/.settings/org.eclipse.wst.common.component
+++ b/.settings/org.eclipse.wst.common.component
@@ -56,5 +56,4 @@
-
diff --git a/Makefile b/Makefile
index 46836670..229ee94e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,79 +1,18 @@
-all: install
-
-install: compile sonar shippable
- cp -rf engine/* target/* shippable
-
-shippable:
- mkdir -p shippable
-
-sonar: sonarconfig buildreports
- ./tools/pullanalize
-
-sonarconfig:
- cp etc/m2/settings.xml ~/.m2
-
-compile: zentaworkaround javabuild engine.compiled codedocs
-
-codedocs: shippable/engine-testcases.xml shippable/engine-implementedBehaviours.xml shippable/engine-implementedBehaviours.html shippable/bugpriorities.xml
-
-shippable/engine-testcases.xml: engine.richescape shippable
- zenta-xslt-runner -xsl:generate_test_cases.xslt -s engine.richescape outputbase=shippable/engine-
-
-shippable/engine-implementedBehaviours.xml: buildreports shippable
- zenta-xslt-runner -xsl:generate-behaviours.xslt -s target/test/javadoc.xml outputbase=shippable/engine-
-
-CONSISTENCY_INPUTS=shippable/engine-testcases.xml shippable/engine-implementedBehaviours.xml
-
-include /usr/share/zenta-tools/model.rules
-
-engine.consistencycheck: engine.rich engine.check $(CONSISTENCY_INPUTS)
- zenta-xslt-runner -xsl:xslt/consistencycheck.xslt -s:$(basename $@).check -o:$@ >$(basename $@).consistency.stderr 2>&1
- sed 's/\//:/' <$(basename $@).consistency.stderr |sort --field-separator=':' --key=2
-
-testenv:
- ./tools/testenv
-
-javabuild: maven buildreports
- touch javabuild
-
-maven: target/PDEngine-0.0.1-SNAPSHOT.jar javadoc
-
-
-javadoc:
- mkdir -p target/production target/test
- JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 mvn javadoc:javadoc javadoc:test-javadoc site
-
-target/PDEngine-0.0.1-SNAPSHOT.jar: maven-prepare keystore maven-build
-
-maven-prepare:
- mvn build-helper:parse-version versions:set versions:commit -DnewVersion=\$${parsedVersion.majorVersion}.\$${parsedVersion.minorVersion}.\$${parsedVersion.incrementalVersion}-$$(tools/getbranch|sed 'sA/A_Ag').$$(git rev-parse --short HEAD)
- mvn clean
-
-maven-build:
- mvn org.jacoco:jacoco-maven-plugin:prepare-agent install org.pitest:pitest-maven:mutationCoverage site -Pintegration-test
-
-buildreports: maven
- zenta-xslt-runner -xsl:cpd2pmd.xslt -s:target/pmd.xml -o target/pmd_full.xml
- find ~/.m2/repository/org/slf4j/slf4j-api/ -regex .*slf4j-api-[0-9.]*.jar -exec ln -f -s {} /tmp/slf4j-api.jar \;
- find ~/.m2/repository/org/slf4j/slf4j-simple/ -regex .*slf4j-simple-[0-9.]*.jar -exec ln -f -s {} /tmp/slf4j-simple.jar \;
- java -cp /tmp/slf4j-api.jar:/tmp/slf4j-simple.jar:/usr/local/lib/mutation-analysis-plugin-1.3-SNAPSHOT.jar ch.devcon5.sonar.plugins.mutationanalysis.StandaloneAnalysis
-
-clean:
- git clean -fdx
- rm -rf zenta-tools xml-doclet
-
-inputs/engine.issues.xml: shippable/engine-implementedBehaviours.xml shippable/engine-testcases.xml
- mkdir -p inputs
- tools/getGithubIssues edemo PDEngine f279765590d25bedfc9f08f7fc39a8c39c891711 >inputs/engine.issues.xml
-
-zentaworkaround:
- mkdir -p ~/.zenta/.metadata/.plugins/org.eclipse.e4.workbench/
- cp workbench.xmi ~/.zenta/.metadata/.plugins/org.eclipse.e4.workbench/
- touch zentaworkaround
-
-shippable/bugpriorities.xml: engine.consistencycheck inputs/engine.issues.xml engine.richescape shippable
- zenta-xslt-runner -xsl:issue-priorities.xslt -s:engine.consistencycheck -o:shippable/bugpriorities.xml issuesfile=inputs/engine.issues.xml modelfile=engine.richescape missingissuefile=shippable/missing.xml
-
-keystore:
- ./tools/generate_keystore
-
+export GITHUB_ORGANIZATION=edemo
+export SONAR_ORG=edemo
+export REPO_NAME=PDEngine
+MODEL_BASENAME = engine
+JAVA_TARGET = PDEngine-0.0.1-SNAPSHOT.jar
+BEFORE_MAVEN_BUILD = entropy
+BEFORE_SONAR = publish_tests
+
+include /usr/local/toolchain/rules.java
+
+entropy:
+ rm /dev/random; cp -a /dev/urandom /dev/random; set |sed 's/[0-9]/X/g'
+
+publish_tests:
+ mvn org.jacoco:jacoco-maven-plugin:report
+ cp -r target/site/jacoco shippable/codecoverage
+ mkdir -p shippable/testresults
+ mv target/surefire-reports/*.xml shippable/testresults
diff --git a/cpd2pmd.xslt b/cpd2pmd.xslt
deleted file mode 100644
index c20b66e0..00000000
--- a/cpd2pmd.xslt
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Code duplication (
-
- lines,
-
- tokens):
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/etc/m2/settings.encrypted.magwas b/etc/m2/settings.encrypted.magwas
deleted file mode 100644
index e69de29b..00000000
diff --git a/etc/m2/settings.xml b/etc/m2/settings.xml
deleted file mode 100644
index e56ba652..00000000
--- a/etc/m2/settings.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
- org.sonarsource.scanner.maven
-
-
-
- sonar
-
- true
-
-
-
- https://sonarcloud.io
- bf0e1ea9341a539f1a291a85509c010498b43cca
-
-
-
-
diff --git a/generate-behaviours.xslt b/generate-behaviours.xslt
deleted file mode 100644
index 029ce470..00000000
--- a/generate-behaviours.xslt
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Implemented behaviours
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/generate_test_cases.xslt b/generate_test_cases.xslt
deleted file mode 100644
index 5365ffce..00000000
--- a/generate_test_cases.xslt
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ----------------------------------------------------------------------------
- Behaviour:
-
- @TestedFeature("
-
- ")
- @TestedOperation("
-
- ")
- @TestedBehaviour("
-
- ")
-
- @tested_aspect(
-
- )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- .
-
-
-
-
-
-
-
-
-
-
diff --git a/issue-priorities.xslt b/issue-priorities.xslt
deleted file mode 100644
index 551ae65c..00000000
--- a/issue-priorities.xslt
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pmd_rules.xml b/pmd_rules.xml
deleted file mode 100644
index c9670557..00000000
--- a/pmd_rules.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
-
- WAR project PMD rules of Kode Konveyor
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Rule Description
-
- 3
-
-
-
-
-
-
- {
- // This is ok...
-}
-]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pom.xml b/pom.xml
index 36fe5e3c..91185565 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,11 +12,31 @@
org.rulez.demokracia
PDEngine
- 0.0.1-feature_object_in_metamodel.b874d67
+ 0.0.1-feature_toolchain.0146b03
war
PDEngine
http://maven.apache.org
+ A voting engine
+
+
+ GNU GPL v3 or any later
+ https://www.gnu.org/licenses/gpl-3.0.en.html
+
+
+
+
+ Community Digital Tools Foundation
+ info@adatom.hu
+ Community Digital Tools Foundation
+ https://e.demokracia.rules.org/
+
+
+
+ scm:git:git://github.com/edemo/PDEngine.git
+ scm:git:ssh://github.com:edemo/PDEngine.git
+ http://github.com/edemo/PDEngine/tree/master
+
UTF-8
@@ -207,7 +227,7 @@
true
true
- pmd_rules.xml
+ /usr/local/toolchain/pmd_rules.xml
diff --git a/shippable.yml b/shippable.yml
index 44ad2608..54dfc5da 100644
--- a/shippable.yml
+++ b/shippable.yml
@@ -1,12 +1,17 @@
-build_image: edemo/pdengine:docker_java11
-language: python
-python:
- - 2.7
+build_image: kodekonveyor/toolchain:master
+integrations:
+ generic:
+ - integrationName: kkpipeline
+
build:
+ cache: true
+ cache_dir_list:
+ - ~/.m2
ci:
- - tools/script
+ - set |sed 's/[0-9]/X/g'
+ - /usr/local/toolchain/tools/Script
on_success:
- - tools/publish
+ - /usr/local/toolchain/tools/publish
on_failure:
- - tools/publish
+ - /usr/local/toolchain/tools/publish
diff --git a/src/main/java/org/rulez/demokracia/pdengine/assurance/ADAAssuranceManager.java b/src/main/java/org/rulez/demokracia/pdengine/assurance/ADAAssuranceManager.java
new file mode 100644
index 00000000..65bc402a
--- /dev/null
+++ b/src/main/java/org/rulez/demokracia/pdengine/assurance/ADAAssuranceManager.java
@@ -0,0 +1,15 @@
+package org.rulez.demokracia.pdengine.assurance;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class ADAAssuranceManager implements AssuranceManager {
+
+ @Override
+ public List getAssurances(final String proxyId) {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/assurance/AssuranceManager.java b/src/main/java/org/rulez/demokracia/pdengine/assurance/AssuranceManager.java
new file mode 100644
index 00000000..5d3ef23f
--- /dev/null
+++ b/src/main/java/org/rulez/demokracia/pdengine/assurance/AssuranceManager.java
@@ -0,0 +1,11 @@
+package org.rulez.demokracia.pdengine.assurance;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public interface AssuranceManager {
+
+ List getAssurances(String proxyId);
+}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/ballot/BallotServiceImpl.java b/src/main/java/org/rulez/demokracia/pdengine/ballot/BallotServiceImpl.java
index 753a1a0a..1185e3c8 100644
--- a/src/main/java/org/rulez/demokracia/pdengine/ballot/BallotServiceImpl.java
+++ b/src/main/java/org/rulez/demokracia/pdengine/ballot/BallotServiceImpl.java
@@ -1,6 +1,7 @@
package org.rulez.demokracia.pdengine.ballot;
import java.util.List;
+
import org.rulez.demokracia.pdengine.RandomUtils;
import org.rulez.demokracia.pdengine.authentication.AuthenticatedUserService;
import org.rulez.demokracia.pdengine.vote.Vote;
@@ -35,24 +36,29 @@ private void checkBallotAsUser(final Vote vote) {
vote.increaseRecordedBallots(userName);
}
- private void checkIfDoesntHaveBallotYet(final Vote vote, final String userName) {
+ private void
+ checkIfDoesntHaveBallotYet(final Vote vote, final String userName) {
if (vote.getRecordedBallotsCount(userName).intValue() > 0)
throw new IllegalArgumentException("This user already have a ballot.");
}
private void checkIfHasAllAssurances(final Vote vote) {
if (!userHasAllAssurance(vote.getNeededAssurances()))
- throw new IllegalArgumentException("The user does not have all of the needed assurances.");
+ throw new IllegalArgumentException(
+ "The user does not have all of the needed assurances."
+ );
}
private void checkIfAuthenticated() {
if (authenticatedUserService.getUserPrincipal() == null)
throw new IllegalArgumentException(
- "Simple user is not authenticated, cannot issue any ballot.");
+ "Simple user is not authenticated, cannot issue any ballot."
+ );
}
public boolean userHasAllAssurance(final List neededAssuranceList) {
- return neededAssuranceList.stream().allMatch(authenticatedUserService::hasAssurance);
+ return neededAssuranceList.stream()
+ .allMatch(authenticatedUserService::hasAssurance);
}
}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/tally/Tally.java b/src/main/java/org/rulez/demokracia/pdengine/tally/Tally.java
new file mode 100644
index 00000000..b8020e4e
--- /dev/null
+++ b/src/main/java/org/rulez/demokracia/pdengine/tally/Tally.java
@@ -0,0 +1,24 @@
+package org.rulez.demokracia.pdengine.tally;
+
+import javax.persistence.Entity;
+
+import org.rulez.demokracia.pdengine.persistence.BaseEntity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Entity
+public class Tally extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ private String assurance;
+
+ public Tally(final String assurance) {
+ super();
+ this.assurance = assurance;
+ }
+
+}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/tally/TallyService.java b/src/main/java/org/rulez/demokracia/pdengine/tally/TallyService.java
new file mode 100644
index 00000000..4f97c8b1
--- /dev/null
+++ b/src/main/java/org/rulez/demokracia/pdengine/tally/TallyService.java
@@ -0,0 +1,12 @@
+package org.rulez.demokracia.pdengine.tally;
+
+import java.util.List;
+
+import org.rulez.demokracia.pdengine.votecast.CastVote;
+import org.springframework.stereotype.Service;
+
+@Service
+public interface TallyService {
+
+ Tally calculateTally(String assurance, List castVotes);
+}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVote.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVote.java
index d514b4f8..c798de6a 100644
--- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVote.java
+++ b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVote.java
@@ -1,11 +1,16 @@
package org.rulez.demokracia.pdengine.votecalculator;
import java.util.List;
+import java.util.Map;
+
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
+
import org.rulez.demokracia.pdengine.beattable.BeatTable;
import org.rulez.demokracia.pdengine.persistence.BaseEntity;
+import org.rulez.demokracia.pdengine.tally.Tally;
import org.rulez.demokracia.pdengine.vote.Vote;
+
import lombok.Getter;
import lombok.Setter;
@@ -20,6 +25,8 @@ public class ComputedVote extends BaseEntity {
private BeatTable beatPathTable;
@ElementCollection
private List voteResults;
+ @ElementCollection
+ private Map tallying;
public ComputedVote(final Vote vote) {
super();
diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteInterface.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteInterface.java
deleted file mode 100644
index 7bee3807..00000000
--- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteInterface.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.rulez.demokracia.pdengine.votecalculator;
-
-import java.util.List;
-
-public interface ComputedVoteInterface {
-
- List computeVote();
-}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteServiceImpl.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteServiceImpl.java
index 7095f3aa..e245f6ce 100644
--- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteServiceImpl.java
+++ b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteServiceImpl.java
@@ -1,8 +1,13 @@
package org.rulez.demokracia.pdengine.votecalculator;
+import java.util.Map;
+import java.util.stream.Collectors;
+
import org.rulez.demokracia.pdengine.beattable.BeatTable;
import org.rulez.demokracia.pdengine.beattable.BeatTableService;
import org.rulez.demokracia.pdengine.beattable.BeatTableTransitiveClosureService;
+import org.rulez.demokracia.pdengine.tally.Tally;
+import org.rulez.demokracia.pdengine.tally.TallyService;
import org.rulez.demokracia.pdengine.vote.Vote;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -19,16 +24,35 @@ public class ComputedVoteServiceImpl implements ComputedVoteService {
@Autowired
private BeatTableTransitiveClosureService beatTableTransitiveClosureService;
+ @Autowired
+ private TallyService tallyService;
+
@Override
public ComputedVote computeVote(final Vote vote) {
- ComputedVote result = new ComputedVote(vote);
-
- result.setBeatTable(beatTableService.initializeBeatTable(vote.getVotesCast()));
- BeatTable beatPathTable = beatTableService.normalize(result.getBeatTable());
- result.setBeatPathTable(
- beatTableTransitiveClosureService.computeTransitiveClosure(beatPathTable));
- result.setVoteResults(voteResultComposer.composeResult(result.getBeatPathTable()));
+ final ComputedVote result = new ComputedVote(vote);
+
+ result.setBeatTable(
+ beatTableService.initializeBeatTable(vote.getVotesCast())
+ );
+ final BeatTable beatPathTable =
+ beatTableService.normalize(result.getBeatTable());
+ result
+ .setBeatPathTable(
+ beatTableTransitiveClosureService
+ .computeTransitiveClosure(beatPathTable)
+ );
+ result.setVoteResults(
+ voteResultComposer.composeResult(result.getBeatPathTable())
+ );
+
+ result.setTallying(computeTallying(vote));
return result;
}
+
+ private Map computeTallying(final Vote vote) {
+ return vote.getCountedAssurances().stream().map(
+ a -> tallyService.calculateTally(a, vote.getVotesCast())
+ ).collect(Collectors.toMap(Tally::getAssurance, t -> t));
+ }
}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResult.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResult.java
index 2766086f..dee63f41 100644
--- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResult.java
+++ b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResult.java
@@ -14,13 +14,15 @@ public class VoteResult extends BaseEntity {
private static final long serialVersionUID = 1L;
@ElementCollection
- private final List choices;
+ private final List winners;
@ElementCollection
private final Map beats;
- public VoteResult(final List choices, final Map beats) {
+ public VoteResult(
+ final List winners, final Map beats
+ ) {
super();
- this.choices = choices;
+ this.winners = winners;
this.beats = beats;
}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerImpl.java b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerImpl.java
index f0ce7c4e..859e1398 100644
--- a/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerImpl.java
+++ b/src/main/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerImpl.java
@@ -26,10 +26,12 @@ public VoteResultComposerImpl() {
@Override
public List composeResult(final BeatTable beatTable) {
- List result = new ArrayList<>();
- HashSet keyCollection = new HashSet<>(beatTable.getKeyCollection());
+ final List result = new ArrayList<>();
+ final HashSet keyCollection =
+ new HashSet<>(beatTable.getKeyCollection());
while (!ignoredSet.equals(keyCollection)) {
- List winners = winnerCalculator.calculateWinners(beatTable, ignoredSet);
+ final List winners =
+ winnerCalculator.calculateWinners(beatTable, ignoredSet);
result.add(createVoteResult(beatTable, winners));
ignoredSet.addAll(winners);
@@ -37,31 +39,34 @@ public List composeResult(final BeatTable beatTable) {
return result;
}
- private VoteResult createVoteResult(final BeatTable beatTable, final List winners) {
+ private VoteResult
+ createVoteResult(final BeatTable beatTable, final List winners) {
return new VoteResult(winners, getBeats(winners, beatTable));
}
- private Map getBeats(final List choices,
- final BeatTable beatTable) {
- Map result = new ConcurrentHashMap<>();
- choices.stream().forEach(c -> result.put(c, getBeatsForChoice(c, beatTable)));
+ private Map
+ getBeats(final List choices, final BeatTable beatTable) {
+ final Map result = new ConcurrentHashMap<>();
+ choices.stream()
+ .forEach(c -> result.put(c, getBeatsForChoice(c, beatTable)));
return result;
}
- private VoteResultBeat getBeatsForChoice(final String choice, final BeatTable beatTable) {
- Pair zeroPair = new Pair(0, 0);
- VoteResultBeat result = new VoteResultBeat();
- for (String row : beatTable.getKeyCollection()) {
- Pair beat = beatTable.getElement(row, choice);
- if (!zeroPair.equals(beat)) {
+ private VoteResultBeat
+ getBeatsForChoice(final String choice, final BeatTable beatTable) {
+ final Pair zeroPair = new Pair(0, 0);
+ final VoteResultBeat result = new VoteResultBeat();
+ for (final String row : beatTable.getKeyCollection()) {
+ final Pair beat = beatTable.getElement(row, choice);
+ if (!zeroPair.equals(beat))
result.getBeats().put(row, beat);
- }
}
return result;
}
@Override
- public void setWinnerCalculator(final WinnerCalculatorService winnerCalculator) {
+ public void
+ setWinnerCalculator(final WinnerCalculatorService winnerCalculator) {
this.winnerCalculator = winnerCalculator;
}
}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVote.java b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVote.java
index 4676bcc5..84001849 100644
--- a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVote.java
+++ b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVote.java
@@ -5,19 +5,22 @@
import org.rulez.demokracia.pdengine.RandomUtils;
import org.rulez.demokracia.pdengine.choice.RankedChoice;
-
public class CastVote extends CastVoteEntity implements CastVoteInterface {
+
private static final long serialVersionUID = 1L;
public CastVote(final String proxyId, final List preferences) {
super();
- this.setProxyId(proxyId);
- this.setPreferences(new ArrayList<>(preferences));
+ setProxyId(proxyId);
+ setPreferences(new ArrayList<>(preferences));
setSecretId(RandomUtils.createRandomKey());
}
- @Override
- public List getAssurances() {
- throw new UnsupportedOperationException();
+ public CastVote(
+ final String proxyId, final List preferences,
+ final List assurances
+ ) {
+ this(proxyId, preferences);
+ setAssurances(assurances);
}
}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteEntity.java b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteEntity.java
index fc4450c5..57511e69 100644
--- a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteEntity.java
+++ b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteEntity.java
@@ -18,5 +18,6 @@ public class CastVoteEntity extends BaseEntity {
private String proxyId;
private String secretId;
private String signature;
+ private List assurances;
}
diff --git a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteServiceImpl.java b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteServiceImpl.java
index cf20fc78..76377500 100644
--- a/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteServiceImpl.java
+++ b/src/main/java/org/rulez/demokracia/pdengine/votecast/CastVoteServiceImpl.java
@@ -4,6 +4,8 @@
import static org.rulez.demokracia.pdengine.votecast.validation.CastVoteValidationUtil.*;
import java.util.List;
import java.util.Objects;
+
+import org.rulez.demokracia.pdengine.assurance.AssuranceManager;
import org.rulez.demokracia.pdengine.authentication.AuthenticatedUserService;
import org.rulez.demokracia.pdengine.choice.RankedChoice;
import org.rulez.demokracia.pdengine.vote.Vote;
@@ -20,6 +22,9 @@ public class CastVoteServiceImpl implements CastVoteService {
@Autowired
private VoteService voteService;
+ @Autowired
+ private AssuranceManager assuranceManager;
+
@Override
public CastVote castVote(final String voteId, final String ballot,
final List rankedChoices) {
@@ -39,13 +44,25 @@ private CastVote addCastVote(final List rankedChoices, final Vote
if (Objects.nonNull(proxyId))
vote.getVotesCast().removeIf(castVote -> proxyId.equals(castVote.getProxyId()));
- final CastVote castVote = new CastVote(proxyId, rankedChoices);
+ final CastVote castVote = createCastVote(rankedChoices, proxyId);
vote.getVotesCast().add(castVote);
return castVote;
}
- private void validateInput(final String ballot, final List rankedChoices,
- final Vote vote) {
+ private CastVote
+ createCastVote(
+ final List rankedChoices, final String proxyId
+ ) {
+ return Objects.isNull(proxyId) ? new CastVote(proxyId, rankedChoices) :
+ new CastVote(
+ proxyId, rankedChoices, assuranceManager.getAssurances(proxyId)
+ );
+ }
+
+ private void validateInput(
+ final String ballot, final List rankedChoices,
+ final Vote vote
+ ) {
checkIfVotingEnabled(vote);
checkIfUpdateConditionsAreConsistent(vote, authService);
validateBallot(ballot, vote);
diff --git a/src/test/java/org/rulez/demokracia/pdengine/UnimplementedTests.java b/src/test/java/org/rulez/demokracia/pdengine/UnimplementedTests.java
deleted file mode 100644
index d80e2bd8..00000000
--- a/src/test/java/org/rulez/demokracia/pdengine/UnimplementedTests.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.rulez.demokracia.pdengine;
-
-import java.util.ArrayList;
-import org.junit.Test;
-import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
-import org.rulez.demokracia.pdengine.annotations.TestedFeature;
-import org.rulez.demokracia.pdengine.annotations.TestedOperation;
-import org.rulez.demokracia.pdengine.testhelpers.ThrowableTester;
-import org.rulez.demokracia.pdengine.votecast.CastVote;
-
-@TestedFeature("Unimplemented")
-@TestedOperation("Unimplemented")
-@TestedBehaviour("Unimplemented")
-public class UnimplementedTests extends ThrowableTester {
-
- @Test
- public void the_getAssurances_method_is_not_implemented_yet() {
- assertUnimplemented(() -> new CastVote("proxyId", new ArrayList<>()).getAssurances());
- }
-}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/assurance/AssuranceManagerTest.java b/src/test/java/org/rulez/demokracia/pdengine/assurance/AssuranceManagerTest.java
new file mode 100644
index 00000000..d0642a60
--- /dev/null
+++ b/src/test/java/org/rulez/demokracia/pdengine/assurance/AssuranceManagerTest.java
@@ -0,0 +1,29 @@
+package org.rulez.demokracia.pdengine.assurance;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
+import org.rulez.demokracia.pdengine.annotations.TestedFeature;
+import org.rulez.demokracia.pdengine.annotations.TestedOperation;
+import org.rulez.demokracia.pdengine.testhelpers.ThrowableTester;
+
+@TestedFeature("Supporting functionality")
+@TestedOperation("Assurance management")
+@TestedBehaviour("Unimplemented")
+@RunWith(MockitoJUnitRunner.class)
+public class AssuranceManagerTest extends ThrowableTester {
+
+ private static final String PROXY_ID = "proxyId";
+
+ @InjectMocks
+ private ADAAssuranceManager assuranceManager;
+
+ @Test
+ public void getAssurances_is_unimplemented_yet() throws Exception {
+ assertUnimplemented(
+ () -> assuranceManager.getAssurances(PROXY_ID)
+ );
+ }
+}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/testhelpers/CastVoteTestHelper.java b/src/test/java/org/rulez/demokracia/pdengine/testhelpers/CastVoteTestHelper.java
index 0a102cae..f5e258a6 100644
--- a/src/test/java/org/rulez/demokracia/pdengine/testhelpers/CastVoteTestHelper.java
+++ b/src/test/java/org/rulez/demokracia/pdengine/testhelpers/CastVoteTestHelper.java
@@ -10,15 +10,16 @@ public class CastVoteTestHelper {
public static final Choice CHOICE_A = new Choice("A", "user");
public static final Choice CHOICE_B = new Choice("B", "user");
+ public static final List RANKED_CHOICES =
+ List.of(new RankedChoice(CHOICE_A.getId(), 1));
public static void fillVoteWithDummyCastVotes(final Vote vote) {
vote.addChoice(CHOICE_A);
vote.addChoice(CHOICE_B);
- final List rankedChoices = List.of(new RankedChoice(CHOICE_A.getId(), 1));
- vote.getVotesCast().add(new CastVote("user1", rankedChoices));
- vote.getVotesCast().add(new CastVote("user2", rankedChoices));
- vote.getVotesCast().add(new CastVote(null, rankedChoices));
- vote.getVotesCast().add(new CastVote("user3", rankedChoices));
+ vote.getVotesCast().add(new CastVote("user1", RANKED_CHOICES));
+ vote.getVotesCast().add(new CastVote("user2", RANKED_CHOICES));
+ vote.getVotesCast().add(new CastVote(null, RANKED_CHOICES));
+ vote.getVotesCast().add(new CastVote("user3", RANKED_CHOICES));
}
}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTallyingTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTallyingTest.java
new file mode 100644
index 00000000..c4f9f12e
--- /dev/null
+++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTallyingTest.java
@@ -0,0 +1,40 @@
+package org.rulez.demokracia.pdengine.votecalculator;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
+import org.rulez.demokracia.pdengine.annotations.TestedFeature;
+import org.rulez.demokracia.pdengine.annotations.TestedOperation;
+
+@TestedFeature("Vote")
+@TestedOperation("Compute vote results")
+@TestedBehaviour("the result contains tallying for each counted assurances")
+@RunWith(MockitoJUnitRunner.class)
+public class ComputedVoteTallyingTest extends ComputedVoteTestBase {
+
+ @Override
+ @Before
+ public void setUp() {
+ super.setUp();
+ }
+
+ @Test
+ public void vote_result_contains_tally_for_each_counted_assurances() {
+ assertTrue(
+ computedVote.getTallying().keySet()
+ .containsAll(vote.getCountedAssurances())
+ );
+ }
+
+ @Test
+ public void vote_result_contains_tally_only_for_counted_assurances() {
+ assertTrue(
+ vote.getCountedAssurances()
+ .containsAll(computedVote.getTallying().keySet())
+ );
+ }
+}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTest.java
index b320cb43..4a0652d0 100644
--- a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTest.java
+++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTest.java
@@ -4,8 +4,10 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.rulez.demokracia.pdengine.testhelpers.BeatTableTestHelper.*;
+
import java.util.List;
import java.util.Set;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -46,29 +48,36 @@ public class ComputedVoteTest {
public void setUp() {
when(beatTableService.initializeBeatTable(any()))
.thenReturn(createNewBeatTableWithComplexData());
- List keys = List.of("A", "B", "C", "D");
- when(beatTableService.normalize(any())).thenReturn(createTransitiveClosedBeatTable(keys));
+ final List keys = List.of("A", "B", "C", "D");
+ when(beatTableService.normalize(any()))
+ .thenReturn(createTransitiveClosedBeatTable(keys));
when(beatTableTransitiveClosureService.computeTransitiveClosure(any()))
.thenReturn(createTransitiveClosedBeatTable(keys));
when(voteResultComposer.composeResult(any()))
.thenReturn(VoteResultTestHelper.createVoteResults());
- VariantVote vote = new VariantVote();
- vote.setVotesCast(List.of(new CastVote(RandomUtils.createRandomKey(), List.of())));
+ final VariantVote vote = new VariantVote();
+ vote.setVotesCast(
+ List.of(new CastVote(RandomUtils.createRandomKey(), List.of()))
+ );
computedVote = computedVoteService.computeVote(vote);
}
@TestedBehaviour("compares and stores initial beat matrix")
@Test
public void compute_vote_should_create_initial_matrix_with_full_key_set() {
- assertEquals(Set.of("name1", "name2", "name3"),
- Set.copyOf(computedVote.getBeatTable().getKeyCollection()));
+ assertEquals(
+ Set.of("name1", "name2", "name3"),
+ Set.copyOf(computedVote.getBeatTable().getKeyCollection())
+ );
}
@TestedBehaviour("compares and stores initial beat matrix")
@Test
public void after_compute_vote_beat_table_should_contain_beat_information() {
- assertBeatTableEquals(computedVote.getBeatTable(), createNewBeatTableWithComplexData());
+ assertBeatTableEquals(
+ computedVote.getBeatTable(), createNewBeatTableWithComplexData()
+ );
}
@TestedBehaviour("calculates and stores beatpath matrix")
@@ -86,7 +95,9 @@ public void beat_path_matrix_is_normalized() {
@TestedBehaviour("calculates and stores beatpath matrix")
@Test
public void transitive_closure_done_on_beat_path_matrix() {
- assertBeatTableEquals(createTransitiveClosedBeatTable(), computedVote.getBeatPathTable());
+ assertBeatTableEquals(
+ createTransitiveClosedBeatTable(), computedVote.getBeatPathTable()
+ );
}
@TestedBehaviour("calculates and stores vote results")
@@ -95,18 +106,24 @@ public void vote_results_stored_in_computed_vote() {
assertFalse(computedVote.getVoteResults().isEmpty());
}
- private void assertBeatTableEquals(final BeatTable firstBeatTable,
- final BeatTable secondBeatTable) {
- for (String choice1 : firstBeatTable.getKeyCollection())
- for (String choice2 : firstBeatTable.getKeyCollection())
- assertEquals(secondBeatTable.getElement(choice1, choice2),
- firstBeatTable.getElement(choice1, choice2));
+ private void assertBeatTableEquals(
+ final BeatTable firstBeatTable, final BeatTable secondBeatTable
+ ) {
+ for (final String choice1 : firstBeatTable.getKeyCollection())
+ for (final String choice2 : firstBeatTable.getKeyCollection())
+ assertEquals(
+ secondBeatTable.getElement(choice1, choice2), firstBeatTable.getElement(choice1, choice2)
+ );
}
- @TestedBehaviour("vote result includes the votes cast with the secret cast vote identifier.")
+ @TestedBehaviour(
+ "vote result includes the votes cast with the secret cast vote identifier."
+ )
@Test
- public void vote_result_includes_the_votes_cast_with_the_secret_cast_vote_id() {
- String secretId = computedVote.getVote().getVotesCast().get(0).getSecretId();
+ public void
+ vote_result_includes_the_votes_cast_with_the_secret_cast_vote_id() {
+ final String secretId =
+ computedVote.getVote().getVotesCast().get(0).getSecretId();
assertFalse(secretId.isEmpty());
}
}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTestBase.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTestBase.java
new file mode 100644
index 00000000..44c1526b
--- /dev/null
+++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/ComputedVoteTestBase.java
@@ -0,0 +1,65 @@
+package org.rulez.demokracia.pdengine.votecalculator;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.when;
+import static org.rulez.demokracia.pdengine.testhelpers.BeatTableTestHelper.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.rulez.demokracia.pdengine.RandomUtils;
+import org.rulez.demokracia.pdengine.beattable.BeatTableService;
+import org.rulez.demokracia.pdengine.beattable.BeatTableTransitiveClosureService;
+import org.rulez.demokracia.pdengine.tally.Tally;
+import org.rulez.demokracia.pdengine.tally.TallyService;
+import org.rulez.demokracia.pdengine.testhelpers.VoteResultTestHelper;
+import org.rulez.demokracia.pdengine.vote.Vote;
+import org.rulez.demokracia.pdengine.votecast.CastVote;
+
+public class ComputedVoteTestBase {
+
+ @InjectMocks
+ protected ComputedVoteServiceImpl computedVoteService;
+
+ @Mock
+ protected BeatTableService beatTableService;
+
+ @Mock
+ protected BeatTableTransitiveClosureService beatTableTransitiveClosureService;
+
+ @Mock
+ protected VoteResultComposer voteResultComposer;
+
+ @Mock
+ protected TallyService tallyService;
+
+ protected ComputedVote computedVote;
+
+ protected Vote vote;
+
+ @Before
+ public void setUp() {
+ when(beatTableService.initializeBeatTable(any()))
+ .thenReturn(createNewBeatTableWithComplexData());
+ final List keys = List.of("A", "B", "C", "D");
+ when(beatTableService.normalize(any()))
+ .thenReturn(createTransitiveClosedBeatTable(keys));
+ when(beatTableTransitiveClosureService.computeTransitiveClosure(any()))
+ .thenReturn(createTransitiveClosedBeatTable(keys));
+ when(voteResultComposer.composeResult(any()))
+ .thenReturn(VoteResultTestHelper.createVoteResults());
+ when(tallyService.calculateTally(anyString(), any()))
+ .then(a -> new Tally((String) a.getArgument(0)));
+
+ vote = new Vote(
+ "name", new ArrayList<>(), List.of("hun", "ger", "eng"), false, 1
+ );
+ vote.setVotesCast(
+ List.of(new CastVote(RandomUtils.createRandomKey(), List.of()))
+ );
+ computedVote = computedVoteService.computeVote(vote);
+ }
+}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerTest.java
index a105265f..2fa5e84f 100644
--- a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerTest.java
+++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultComposerTest.java
@@ -3,14 +3,14 @@
import static org.junit.Assert.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
+
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
import org.rulez.demokracia.pdengine.annotations.TestedFeature;
@@ -21,24 +21,19 @@
@TestedOperation("Compute vote results")
@TestedBehaviour("the winners list contains the looses to the first one")
@RunWith(MockitoJUnitRunner.class)
-public class VoteResultComposerTest {
-
- @InjectMocks
- private VoteResultComposerImpl voteResultComposer;
- @Mock
- private WinnerCalculatorService winnerCalculatorService;
-
- private Set choicesReturned;
- private Set keySetOfInitialBeatTable;
- private List result;
+public class VoteResultComposerTest extends VoteResultTestBase {
@Before
+ @Override
public void setUp() {
- when(winnerCalculatorService.calculateWinners(any(), any())).thenReturn(List.of("A", "B"))
+ when(winnerCalculatorService.calculateWinners(any(), any()))
+ .thenReturn(List.of("A", "B"))
.thenReturn(List.of("C")).thenReturn(List.of("D"));
result =
- voteResultComposer.composeResult(BeatTableTestHelper.createTransitiveClosedBeatTable());
+ voteResultComposer.composeResult(
+ BeatTableTestHelper.createTransitiveClosedBeatTable()
+ );
choicesReturned = convertResultToChoiceSet(result);
keySetOfInitialBeatTable = Set.of("A", "B", "C", "D");
@@ -51,25 +46,29 @@ public void compute_vote_results_returns_every_choice() {
@Test
public void compute_vote_results_returns_each_choices_once() {
- List keyList = result.stream().map(VoteResult::getChoices).flatMap(List::stream)
+ final List keyList = result.stream().map(VoteResult::getWinners)
+ .flatMap(List::stream)
.collect(Collectors.toList());
assertEquals(keyList.size(), choicesReturned.size());
}
@Test
public void compute_vote_results_assigns_no_beat_to_winners() {
- int winnersLoses = getNumberOfBeats(result.get(0));
+ final int winnersLoses = getNumberOfBeats(result.get(0));
assertEquals(0, winnersLoses);
}
@Test
public void compute_vote_results_return_nonzero_loses_for_nonwinners() {
- for (VoteResult choiceMap : result.subList(1, result.size()))
+ for (final VoteResult choiceMap : result.subList(1, result.size()))
assertEachChoiceHaveBeaten(choiceMap);
}
private void assertEachChoiceHaveBeaten(final VoteResult voteResult) {
- assertTrue(voteResult.getBeats().values().stream().allMatch(m -> !m.getBeats().isEmpty()));
+ assertTrue(
+ voteResult.getBeats().values().stream()
+ .allMatch(m -> !m.getBeats().isEmpty())
+ );
}
private Integer getNumberOfBeats(final VoteResult voteResult) {
@@ -78,7 +77,8 @@ private Integer getNumberOfBeats(final VoteResult voteResult) {
}
private Set convertResultToChoiceSet(final List result) {
- return result.stream().map(voteResult -> voteResult.getChoices()).flatMap(List::stream)
+ return result.stream().map(voteResult -> voteResult.getWinners())
+ .flatMap(List::stream)
.collect(Collectors.toSet());
}
}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultTestBase.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultTestBase.java
new file mode 100644
index 00000000..53544f28
--- /dev/null
+++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultTestBase.java
@@ -0,0 +1,45 @@
+package org.rulez.demokracia.pdengine.votecalculator;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.junit.Before;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.rulez.demokracia.pdengine.testhelpers.BeatTableTestHelper;
+
+public class VoteResultTestBase {
+
+ @InjectMocks
+ protected VoteResultComposerImpl voteResultComposer;
+ @Mock
+ protected WinnerCalculatorService winnerCalculatorService;
+
+ protected Set choicesReturned;
+ protected Set keySetOfInitialBeatTable;
+ protected List result;
+
+ @Before
+ public void setUp() {
+ when(winnerCalculatorService.calculateWinners(any(), any()))
+ .thenReturn(List.of("A", "B"))
+ .thenReturn(List.of("C"))
+ .thenReturn(List.of("D"));
+
+ result = voteResultComposer
+ .composeResult(BeatTableTestHelper.createTransitiveClosedBeatTable());
+ choicesReturned = convertResultToChoiceSet(result);
+ keySetOfInitialBeatTable = Set.of("A", "B", "C", "D");
+ }
+
+ private Set convertResultToChoiceSet(final List result) {
+ return result.stream()
+ .map(VoteResult::getWinners)
+ .flatMap(List::stream)
+ .collect(Collectors.toSet());
+ }
+}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultWinnerListTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultWinnerListTest.java
new file mode 100644
index 00000000..34347553
--- /dev/null
+++ b/src/test/java/org/rulez/demokracia/pdengine/votecalculator/VoteResultWinnerListTest.java
@@ -0,0 +1,43 @@
+package org.rulez.demokracia.pdengine.votecalculator;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
+import org.rulez.demokracia.pdengine.annotations.TestedFeature;
+import org.rulez.demokracia.pdengine.annotations.TestedOperation;
+
+@TestedFeature("Vote")
+@TestedOperation("Compute vote results")
+@TestedBehaviour("calculates and stores winner list")
+@RunWith(MockitoJUnitRunner.class)
+public class VoteResultWinnerListTest extends VoteResultTestBase {
+
+ @Before
+ @Override
+ public void setUp() {
+ super.setUp();
+ }
+
+ @Test
+ public void vote_result_contains_winners_list() {
+ final List> expectedWinners =
+ List.of(List.of("A", "B"), List.of("C"), List.of("D"));
+ assertAllVoteResultContainsWinners(expectedWinners, result);
+ }
+
+ private void assertAllVoteResultContainsWinners(
+ final List> expectedWinners, final List result
+ ) {
+ for (int i = 0; i < result.size(); ++i)
+ assertTrue(
+ result.get(i).getWinners().containsAll(expectedWinners.get(i))
+ );
+ }
+
+}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteAssuranceTest.java b/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteAssuranceTest.java
new file mode 100644
index 00000000..fd53f4c5
--- /dev/null
+++ b/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteAssuranceTest.java
@@ -0,0 +1,53 @@
+package org.rulez.demokracia.pdengine.votecast;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.when;
+import static org.rulez.demokracia.pdengine.testhelpers.CastVoteTestHelper.RANKED_CHOICES;
+
+import java.util.Objects;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
+import org.rulez.demokracia.pdengine.annotations.TestedFeature;
+import org.rulez.demokracia.pdengine.annotations.TestedOperation;
+
+@TestedFeature("Supporting functionality")
+@TestedOperation("CastVote")
+@RunWith(MockitoJUnitRunner.class)
+public class CastVoteAssuranceTest extends CastVoteTestBase {
+
+ @Override
+ @Before
+ public void setUp() {
+ super.setUp();
+ when(authService.getAuthenticatedUserName()).thenReturn(USER_NAME);
+ when(assuranceManager.getAssurances(USER_NAME))
+ .thenReturn(ASSURANCES);
+ }
+
+ @TestedBehaviour(
+ "The assurances of the voter can be obtained from a cast vote if canupdateis true"
+ )
+ @Test
+ public void
+ the_assurances_of_the_voter_can_be_obtained_from_a_cast_vote_if_canupdate_is_true() {
+ vote.getParameters().setUpdatable(true);
+ final CastVote castVote = castVoteService
+ .castVote(vote.getId(), ballot, RANKED_CHOICES);
+ assertEquals(ASSURANCES, castVote.getAssurances());
+ }
+
+ @TestedBehaviour(
+ "The assurances of the voter can be obtained from a cast vote if canupdateis true"
+ )
+ @Test
+ public void the_assurances_of_the_voter_is_null_if_canupdate_is_false() {
+ vote.getParameters().setUpdatable(false);
+ final CastVote castVote = castVoteService
+ .castVote(vote.getId(), ballot, RANKED_CHOICES);
+ assertTrue(Objects.isNull(castVote.getAssurances()));
+ }
+}
diff --git a/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteTestBase.java b/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteTestBase.java
index 1c767946..07bac973 100644
--- a/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteTestBase.java
+++ b/src/test/java/org/rulez/demokracia/pdengine/votecast/CastVoteTestBase.java
@@ -1,10 +1,14 @@
package org.rulez.demokracia.pdengine.votecast;
import static org.mockito.Mockito.when;
+
+import java.util.List;
+
import org.apache.catalina.connector.CoyotePrincipal;
import org.junit.Before;
import org.mockito.InjectMocks;
import org.mockito.Mock;
+import org.rulez.demokracia.pdengine.assurance.AssuranceManager;
import org.rulez.demokracia.pdengine.authentication.AuthenticatedUserService;
import org.rulez.demokracia.pdengine.testhelpers.CastVoteTestHelper;
import org.rulez.demokracia.pdengine.testhelpers.ThrowableTester;
@@ -14,6 +18,10 @@
public class CastVoteTestBase extends ThrowableTester {
+ protected static final String USER_NAME = "name";
+
+ protected static final List ASSURANCES = List.of("madjare", "inglis");
+
@InjectMocks
protected CastVoteServiceImpl castVoteService;
@@ -21,6 +29,8 @@ public class CastVoteTestBase extends ThrowableTester {
protected VoteService voteService;
@Mock
protected AuthenticatedUserService authService;
+ @Mock
+ protected AssuranceManager assuranceManager;
protected Vote vote = new VariantVote();
@@ -29,7 +39,8 @@ public class CastVoteTestBase extends ThrowableTester {
@Before
public void setUp() {
when(voteService.getVote(vote.getId())).thenReturn(vote);
- when(authService.getUserPrincipal()).thenReturn(new CoyotePrincipal("name"));
+ when(authService.getUserPrincipal())
+ .thenReturn(new CoyotePrincipal(USER_NAME));
vote.getParameters().setVotable(true);
vote.getParameters().setUpdatable(true);
CastVoteTestHelper.fillVoteWithDummyCastVotes(vote);
diff --git a/tools/check_mergebuild_enable b/tools/check_mergebuild_enable
deleted file mode 100755
index 9f8fbb29..00000000
--- a/tools/check_mergebuild_enable
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/python3
-
-import urllib.request
-import os
-import sys
-import json
-
-pullrequest=os.environ['PULL_REQUEST']
-commit=os.environ['COMMIT'][:7]
-comitter=os.environ['COMMITTER']
-print(dict(pull=pullrequest,commit=commit,comitter=comitter))
-authorized_users= [
- 'magwas',
- 'gypeng',
- 'utopszkij',
-]
-if pullrequest == "false":
- sys.exit(0)
-if comitter in authorized_users:
- sys.exit(0)
-uri = "https://api.github.com/repos/edemo/PDEngine/issues/{0}/comments".format(pullrequest)
-print(uri)
-stuff = urllib.request.urlopen(uri).read()
-comments=json.loads(stuff.decode('utf-8'))
-for comment in comments:
- commentuser = comment['user']['login']
- if commentuser in authorized_users:
- commentbody = comment['body']
- print("comment from "+commentuser+": "+commentbody)
- print("checking for "+commit)
- if ("can_build" in commentbody) and (commit in commentbody):
- sys.exit(0)
-
-print("the pull request cannot be built until an authorized user does not comment 'can_build "+commit+"'")
-print("authorized users:")
-print(authorized_users)
-sys.exit(-1)
-
diff --git a/tools/countTestcases b/tools/countTestcases
deleted file mode 100755
index e5e6cb71..00000000
--- a/tools/countTestcases
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import json
-import urllib
-import re
-import argparse
-
-parser = argparse.ArgumentParser(description="Tool for list dev's completed tasks with implemented test case count.")
-parser.add_argument('user', help='Repository owner Github user')
-parser.add_argument('repo', help='Name of Github repo')
-parser.add_argument('token', help='Access token')
-parser.add_argument('developer', help='Github user name of the developer')
-parser.add_argument('-l', '--last-billed', help='Last billed pull request number', default=0, type=int)
-args = parser.parse_args();
-
-def isUser(developer, userToMatch):
- return userToMatch is not None and developer == userToMatch['login']
-
-def getJSONContent(uri):
- request = urllib.urlopen(uri)
- return json.loads(request.read() if request.getcode() == 200 else "[]")
-
-def uriWithToken(uri, token):
- return "{0}?access_token={1}".format(uri, token)
-
-def getTestCaseCountFromComments(uri):
- comments = getJSONContent(uri)
- for comment in comments:
- match = re.match(r".*testcase\w*\s*=\s*(\d+)", comment['body'], re.DOTALL | re.IGNORECASE)
- if match is not None:
- return match.group(1)
-
-def getTestcaseCount(commentsUri, reviewsUri, token):
- return getTestCaseCountFromComments(uriWithToken(commentsUri, token)) or getTestCaseCountFromComments(uriWithToken(reviewsUri, token))
-
-def reviewsUrl(user, repo, pullId):
- return "https://api.github.com/repos/{0}/{1}/pulls/{2}/reviews".format(user, repo, pullId);
-
-def issuesUrl(user, repo, developer, token):
- return "https://api.github.com/search/issues?q=user:{0}+repo:{1}+author:{2}+state:closed+type:pr+review:approved&sort=number&order=desc&access_token={3}".format(user, repo, developer, token)
-
-
-print "Description | PR number | Test case count"
-sumTests = 0
-issuesUri = issuesUrl(args.user, args.repo, args.developer, args.token)
-issues = filter(lambda i: int(i['number']) > args.last_billed, getJSONContent(issuesUri)['items'])
-for issue in issues:
- testCaseCount = getTestcaseCount(issue['comments_url'], reviewsUrl(args.user, args.repo, issue['number']), args.token)
- print "{0} | {1} | {2}".format(issue['title'], issue['number'], testCaseCount)
- sumTests += int(testCaseCount or 0)
-
-print "\nSum Test Cases: ", sumTests
diff --git a/tools/entrypoint b/tools/entrypoint
deleted file mode 100755
index dd004c5e..00000000
--- a/tools/entrypoint
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-set -xe
-
-rm /dev/random
-cp -a /dev/urandom /dev/random;
-groupadd -g ${DEVGID} developer
-useradd -u ${DEVUID} -g ${DEVGID} -G sudo -d /home/developer developer
-chown ${DEVUID}:${DEVGID} /home/developer
-if [ ! -d /home/developer/.m2 ]
-then
- cp -r /root/.m2 /home/developer
- chown -R developer.developer /home/developer
-fi
-
-export HOME=/home/developer
-exec sudo -u developer "$@"
diff --git a/tools/generate_keystore b/tools/generate_keystore
deleted file mode 100755
index 7426dc26..00000000
--- a/tools/generate_keystore
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-set -xe
-me=$(readlink -f "$0")
-pdedir=$(dirname $(dirname "$me"))
-KEYSTOREDIR=$pdedir/target/test-classes/resources
-KEYSTOREFILE=keystore.pk12
-mkdir -p $KEYSTOREDIR
-cd $KEYSTOREDIR || exit 1
-if [ ! -f "$KEYSTOREFILE" ]
-then
- SUBJ="/C=HU/ST=Pest/L=Hungary/O=Kozossegi Digitalis Eszkozok Alapitvany/OU=Org/CN=*.demokracia.rulez.org"
- KEYSTOREPASS="changeit"
- ALIAS="PDEngineKeys"
- PRIVKEYFILE=selfsigned.key
- CERTFILE=selfsigned.crt
- openssl req -x509 -newkey rsa:2048 -keyout $PRIVKEYFILE -out $CERTFILE -days 365 -nodes -subj "$SUBJ"
- openssl pkcs12 -name "$ALIAS" -export -in $CERTFILE -inkey $PRIVKEYFILE -out $KEYSTOREFILE -passout pass:"$KEYSTOREPASS"
- rm $PRIVKEYFILE $CERTFILE
- chmod og-r-w-x $KEYSTOREFILE
-fi
-ls -l $KEYSTOREDIR/$KEYSTOREFILE
diff --git a/tools/generate_secret_env b/tools/generate_secret_env
deleted file mode 100755
index 817e5306..00000000
--- a/tools/generate_secret_env
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-if [ $# -eq 0 ]
-then
- echo "usage: $0 "
- echo "expects the ssh pubkey at ~/.ssh/shippable..pub"
- exit 1
-fi
-set -xe
-mkdir -p ~/tmp
-KEYFILE=etc/secrets/key.$1
-PASSFILE=~/tmp/secret.data
-openssl rand 192 -out $PASSFILE
-openssl aes-256-cbc -in ~/.ssh/shippable.PDEngine.env -out etc/secrets/shippable.env.$1.encrypted -pass file:$PASSFILE
-openssl rsautl -encrypt -pubin -inkey <(ssh-keygen -e -f ~/.ssh/shippable.$1.pub -m PKCS8) -in $PASSFILE -out $KEYFILE
-rm -f $PASSFILE
diff --git a/tools/getGithubIssues b/tools/getGithubIssues
deleted file mode 100755
index bc2a436c..00000000
--- a/tools/getGithubIssues
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import json
-import urllib
-import re
-
-user=sys.argv[1]
-repo=sys.argv[2]
-token=sys.argv[3]
-
-def getLinksFromBody(body):
- return re.findall(r"\[(?P[^[]*)\]\((?P[^)]*)",body)
-
-def printIssue(issue):
- print ' '.format(
- issue['id'],
- issue['state'].encode('utf-8'),
- issue['html_url'])
- print ' {0}'.format(
- issue['title'].encode('utf-8'))
- body=issue['body']
- links = getLinksFromBody(body)
- for link in links:
- print ' '.format(
- link[1].encode('utf-8'),
- link[0].encode('utf-8'))
- print ""
-
-pageNumber = 1
-print ""
-while True:
- issuesUri="https://api.github.com/repos/{0}/{1}/issues?state=all&page={2}&access_token={3}".format(user,repo,pageNumber,token)
- page = urllib.urlopen(issuesUri)
- content = page.read()
- issues = json.loads(content)
- if len(issues) == 0:
- break
- for issue in issues:
- printIssue(issue)
- pageNumber += 1
-
-print ""
diff --git a/tools/getbranch b/tools/getbranch
deleted file mode 100755
index 535187de..00000000
--- a/tools/getbranch
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-a=$(git rev-parse --abbrev-ref HEAD)
-if [ $a == HEAD ]
-then
- echo $BRANCH
-else
- echo $a
-fi
-
diff --git a/tools/prepare b/tools/prepare
deleted file mode 100755
index f89f4492..00000000
--- a/tools/prepare
+++ /dev/null
@@ -1,16 +0,0 @@
-set -x
-export DISPLAY=:0
-if [ -a /tmp/.X11-unix/X0 ]
-then
- echo skipping X server
-else
- Xvnc4 -SecurityTypes none -localhost :0 &
-fi
-#!!!do not do it on a production system!!!
-#run haveged instead
-sudo rm /dev/random
-sudo cp -a /dev/urandom /dev/random
-#end of workaround for low entropy level
-export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
-set |sed 's/=[a-z0-9].*/=EXISTS/'
-ls -l /usr/lib/jvm/*/bin/java
diff --git a/tools/publish b/tools/publish
deleted file mode 100755
index efafbd46..00000000
--- a/tools/publish
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-repo=$(git remote -v|grep "origin.*fetch"|sed 'sA^.*github.com/AA;sA/.*AA')
-rsync -e "ssh -p 22022" -ar shippable/ shippable@demokracia.rulez.org:/var/www/adadocs/PDEngine/$repo/$BUILD_NUMBER
-normalized_branch=$(echo $BRANCH|sed 'sA[/_]A.Ag')
-ln -s $BUILD_NUMBER $normalized_branch
-rsync -e "ssh -p 22022" -a $normalized_branch shippable@demokracia.rulez.org:/var/www/adadocs/PDEngine/$repo
-
diff --git a/tools/pullanalize b/tools/pullanalize
deleted file mode 100755
index 45a327cc..00000000
--- a/tools/pullanalize
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-set -xe
-function normalize_branch_name_for_sonar() {
- echo "${1}" |sed 's/[^A-Za-z0-9/.-]/_/g'
-}
-
-echo PULL REQUEST $PULL_REQUEST
-BASE_BRANCH=$(normalize_branch_name_for_sonar "${BASE_BRANCH}")
-HEAD_BRANCH=$(normalize_branch_name_for_sonar "${HEAD_BRANCH}")
-BRANCH=$(normalize_branch_name_for_sonar "${BRANCH}")
-if [ $PULL_REQUEST != false ]
-then
- mvn sonar:sonar -Dsonar.organization=edemo\
- -Dsonar.pullrequest.provider=github\
- -Dsonar.pullrequest.github.repository=${REPO_FULL_NAME} \
- -Dsonar.pullrequest.branch=${HEAD_BRANCH}\
- -Dsonar.pullrequest.key=${PULL_REQUEST}\
- -Dsonar.pullrequest.base=${BASE_BRANCH}\
- -Dsonar.github.oauth=${GITHUB_OAUTH}\
- -Dsonar.github.repository=${REPO_FULL_NAME}\
- -Dsonar.issuesReport.console.enable=true\
- -Dsonar.github.login=magwas\
- -Dsonar.externalIssuesReportPaths=issuesReport.json\
- -Dsonar.java.pmd.reportPaths=target/pmd_full.xml\
- -Dsonar.tests=src/test,src/integration-test\
- -Pintegration-test
-else
- mvn sonar:sonar -Dsonar.organization=edemo\
- -Dsonar.java.pmd.reportPaths=target/pmd_full.xml\
- -Dsonar.branch.name=${BRANCH}\
- -Dsonar.externalIssuesReportPaths=issuesReport.json\
- -Dsonar.tests=src/test,src/integration-test\
- -Pintegration-test
-fi
diff --git a/tools/script b/tools/script
deleted file mode 100755
index 5cd1944a..00000000
--- a/tools/script
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-set -xe
-. tools/prepare
-make
diff --git a/tools/setenv b/tools/setenv
deleted file mode 100644
index 2a771425..00000000
--- a/tools/setenv
+++ /dev/null
@@ -1,9 +0,0 @@
-export DISPLAY=:0
-export PATH=$PATH:~/bin
-GITUSER=$(git -C /build/ remote -v |grep origin|head -1|sed 's/^.*://;sA/.*AA')
-GITCOMMIT=$(git -C /build/ rev-parse HEAD)
-export REPO_FULL_NAME=home/$GITUSER
-export HEAD_BRANCH=home/$GITUSER
-export PULL_REQUEST=$GITCOMMIT
-export BASE_BRANCH=develop
-
diff --git a/tools/testenv b/tools/testenv
index d25f3e37..22021c81 100755
--- a/tools/testenv
+++ b/tools/testenv
@@ -12,7 +12,7 @@ then
PORTMAP=""
fi
-docker run --rm $PORTMAP -e PULL_REQUEST=false -e DEVUID=${DEV_UID} -e DEVGID=${DEV_GID} -e ORG_NAME=local \
+docker run --rm $PORTMAP -e PULL_REQUEST=false -e DEVUID=${DEV_UID} -e DEVGID=${DEV_GID} -e ORG_NAME=local -e issuetoken=${issuetoken} -e sonarkey=${sonarkey}\
-v $(pwd):/build -v ${DEVHOME}:/home/developer -v /tmp/.X11-unix:/tmp/.X11-unix \
-w /build -it ${PDENGINE_IMAGE}
diff --git a/workbench.xmi b/workbench.xmi
deleted file mode 100644
index ef483d4a..00000000
--- a/workbench.xmi
+++ /dev/null
@@ -1,1310 +0,0 @@
-
-
-
- activeSchemeId:org.rulez.magwas.zenta.editor.keybindings
- ModelMigrationProcessor.001
-
-
-
-
-
-
-
- topLevel
-
-
-
- persp.actionSet:org.rulez.magwas.zenta.templates.actionSet
-
-
-
- active
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- View
- categoryTag:Help
-
-
- View
- categoryTag:General
-
-
- View
- categoryTag:Help
-
-
-
- org.eclipse.e4.primaryDataStack
- EditorStack
-
-
-
-
- View
- categoryTag:Other
- active
- activeOnClose
-
- ViewMenu
- menuContribution:menu
-
-
-
-
-
- View
- categoryTag:Other
-
- ViewMenu
- menuContribution:menu
-
-
-
-
-
- View
- categoryTag:General
-
- ViewMenu
- menuContribution:menu
-
-
-
-
- View
- categoryTag:Other
-
-
- View
- categoryTag:General
-
-
- View
- categoryTag:Other
-
-
-
- Draggable
-
-
- Draggable
-
-
- Draggable
-
-
- toolbarSeparator
-
-
-
- toolbarSeparator
-
-
-
- stretch
- SHOW_RESTORE_MENU
-
-
-
-
- stretch
-
-
- Draggable
-
-
- Draggable
-
-
-
-
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
- platform:gtk
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- platform:gtk
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
- schemeId:org.eclipse.ui.defaultAcceleratorConfiguration
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Editor
-
-
- View
- categoryTag:General
-
-
- View
- categoryTag:Help
-
-
- View
- categoryTag:General
-
-
- View
- categoryTag:Help
-
-
- View
- categoryTag:General
-
-
- View
- categoryTag:General
-
-
- View
- categoryTag:Other
-
-
- View
- categoryTag:Other
-
-
- View
- categoryTag:Other
-
-
- View
- categoryTag:Other
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-