diff --git a/.build.sh b/.build.sh index 92d1e44d..e82f6bcf 100755 --- a/.build.sh +++ b/.build.sh @@ -18,7 +18,7 @@ info_txt() { } check_prerequisites() { - for i in $PREREQ; do + for i in $PREREQ; do if [[ -e ../.rebuild_${i}_dependent ]]; then if [[ -e ${JAR} && ${JAR} -nt ../.rebuild_${i}_dependent ]]; then touch .rebuild @@ -29,12 +29,12 @@ check_prerequisites() { true } check_jar() { - if ! [[ -e ${JAR} ]]; then + if ! [[ -e ${JAR} ]]; then echo -n "no jar! "; touch .rebuild fi } -check_modified() { - find src/ -type f -newer ${JAR} | +check_modified() { + find src/ -type f -newer ${JAR} | grep -v '\.svn' && { echo -n ${JAR} $PWD "modification found! " touch .rebuild @@ -56,7 +56,7 @@ do_rebuild() { } rebuild() { if test -e .rebuild; then - echo "yes" + echo "yes" do_rebuild else echo "no" @@ -64,11 +64,11 @@ rebuild() { } printtesterrors() { - [ -e target/surefire-reports/ ] && - { - echo "Tests in error in $TARGET:"; - cat target/surefire-reports/*.txt|grep '<<<'|grep '^[^()]*[(][^(]*[)]' -Eo || - echo "(none)" + [ -e target/surefire-reports/ ] && + { + echo "Tests in error in $TARGET:"; + cat target/surefire-reports/*.txt|grep '<<<'|grep '^[^()]*[(][^(]*[)]' -Eo || + echo "(none)" echo } } diff --git a/Makefile b/Makefile index 5eb1be39..b09d22a6 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # Makefile for Jake # -# provides a dependency system to avoid duplicate builds, tests +# provides a dependency system to avoid duplicate builds, tests # and packaging. VERSION="1.0-SNAPSHOT" @@ -22,13 +22,13 @@ help: start: install cd gui; ${MVN} -o exec:java -# multistart: allow jake to run multiple instances (no dependency +# multistart: allow jake to run multiple instances (no dependency # system) multistart: install cd gui; ${MVN} -o exec:java -Dcom.jakeapp.gui.ignoresingleinstance # @depstart: start gui with dependency system -depstart: gui +depstart: gui cd gui; ${MVN} exec:java # instantquit: start gui and quit it immediatly (for debugging spring) @@ -40,7 +40,7 @@ quickstart: gui cd gui; ${MVN} exec:java -Dexec.args=${PROJECTFOLDER} # console : start console-gui (commander) -console: commander +console: commander cd commander; ${MVN} exec:java -Dexec.mainClass=com.jakeapp.gui.console.JakeCommander xmpp-console: commander @@ -49,7 +49,7 @@ xmpp-console: commander # building & installing # # @install : simply install everything (no dependency system) -install: +install: mvn -Dmaven.test.skip=true install # @jar : deploy to a single jar file @@ -57,7 +57,7 @@ jar: #${MVN} clean ${MVN} install -Dmaven.test.skip=true mkdir -p releases - cd releases && rm -rf temp && mkdir -p temp + cd releases && rm -rf temp && mkdir -p temp cd releases/temp && unzip ../../gui/target/gui-swing-${VERSION}.one-jar.jar && cp -v ../../{core,ics,ics-xmpp}/target/*.jar main/ && rm -f ../jake-current.jar && jar cvfm ../jake-current.jar meta-inf/manifest.mf . cd releases; rm -rf temp @echo release ready under releases/jake-current.jar @@ -98,13 +98,13 @@ package-win: jar rm -f releases/jake.xml releases/jakeapp.ico @echo Winows Package: releases/Jake.exe @echo TODO create installer with NULLSOFT or use other db path - + package-linux: jar @echo Creating Linux Package... rm -f releases/Jake.bin cat launcher/jake.sh releases/jake-current.jar > releases/jake.bin chmod +x releases/jake.bin - #tar cjvf releases/jake.tar.bz2 releases/jake.bin + #tar cjvf releases/jake.tar.bz2 releases/jake.bin @echo Linux Package: releases/Jake.bin @@ -121,7 +121,7 @@ commander: core rm -f .rebuild* */.rebuild # core : build core component -core: availablelater fss ics ics-xmpp core-dao-hibernate-threading +core: availablelater fss ics ics-xmpp core-dao-hibernate-threading @bash .build.sh ${VERSION} $@ "$^" rm -f .rebuild_ics_dependent .rebuild_ics-xmpp_dependent @@ -164,7 +164,7 @@ ics-xmpp: ics clean: ${MVN} clean -# mrproper : clean build environment and uninstall from local +# mrproper : clean build environment and uninstall from local # repository mrproper: clean rm -rf ~/.m2/repository/com/{jakeapp,doublesignal}/ @@ -178,7 +178,7 @@ lazyclean: mkdir fss/target/ mv .backup.fss-${VERSION}.jar fss/target/fss-${VERSION}.jar -# others # +# others # generateDaos: # use SpringThreadBroker.getInstance() for global dao's @@ -192,10 +192,10 @@ generateDaos: bash generateDao.sh core/src/main/java/com/jakeapp/core/dao/HibernateLogEntryDao.java "SpringThreadBroker.getThreadForObject(this)" bash generateDao.sh core/src/main/java/com/jakeapp/core/dao/HibernateNoteObjectDao.java "SpringThreadBroker.getThreadForObject(this)" -# -# You can add arguments to the maven call by setting the MVNEXTRAARGS +# +# You can add arguments to the maven call by setting the MVNEXTRAARGS # environment variable. -# The dependency system does only work with the coreutils package, i.e., only on -# Linux. -# +# The dependency system does only work with the coreutils package, i.e., only on +# Linux. +# .PHONY: install jar packages package-win package-mac package-linux availablelater gui core fss fss-tests-base ics ics-xmpp commander start depstart instantquit quickstart console clean mrproper lazyclean diff --git a/commander/src/main/java/com/jakeapp/gui/console/Commander.java b/commander/src/main/java/com/jakeapp/gui/console/Commander.java index 66e9dfc2..44306a67 100755 --- a/commander/src/main/java/com/jakeapp/gui/console/Commander.java +++ b/commander/src/main/java/com/jakeapp/gui/console/Commander.java @@ -23,7 +23,7 @@ public abstract class Commander { public void run() { Commander.this.onShutdown(); } - + }); public Commander(String[] args) { @@ -68,7 +68,7 @@ protected void run(InputStream instream, boolean startwithhelp) { } catch (IOException e) { } } - + @SuppressWarnings("unchecked") private void addCommands() { // we are so cool, we use reflection diff --git a/commander/src/main/java/com/jakeapp/gui/console/commandline/CmdManager.java b/commander/src/main/java/com/jakeapp/gui/console/commandline/CmdManager.java index ad625252..e92045a7 100644 --- a/commander/src/main/java/com/jakeapp/gui/console/commandline/CmdManager.java +++ b/commander/src/main/java/com/jakeapp/gui/console/commandline/CmdManager.java @@ -11,7 +11,7 @@ public class CmdManager { private List commands = new LinkedList(); private boolean status_ok = true; - + public CmdManager(){ commands.add(new Command(){ @Override @@ -32,10 +32,10 @@ public boolean handleLine(String line) { } return false; } - + }); } - + public void registerCommand(Command c) { commands.add(c); } @@ -77,7 +77,7 @@ public void help() { System.out.println("\t\t" + c.getHelpString()); } } - + public void stop() { status_ok = false; } diff --git a/commander/src/main/java/com/jakeapp/gui/console/commandline/Command.java b/commander/src/main/java/com/jakeapp/gui/console/commandline/Command.java index dd195a77..36c3639a 100644 --- a/commander/src/main/java/com/jakeapp/gui/console/commandline/Command.java +++ b/commander/src/main/java/com/jakeapp/gui/console/commandline/Command.java @@ -3,8 +3,8 @@ public abstract class Command { /** * @param line full input line - * @return is this the right command? false if you are not the right command. true if the - * command got handled (independent of success) + * @return is this the right command? false if you are not the right command. true if the + * command got handled (independent of success) */ public abstract boolean handleLine(String line); diff --git a/commander/src/main/java/com/jakeapp/gui/console/commandline/LazyCommand.java b/commander/src/main/java/com/jakeapp/gui/console/commandline/LazyCommand.java index fcc920c4..8fee4d3a 100644 --- a/commander/src/main/java/com/jakeapp/gui/console/commandline/LazyCommand.java +++ b/commander/src/main/java/com/jakeapp/gui/console/commandline/LazyCommand.java @@ -37,8 +37,8 @@ public boolean handleLine(String line) { /** * @param args parameters. first element is the command name (has been verified already) - * @return is this the right command? false if you are not the right command. true if the - * command got handled (independent of success) + * @return is this the right command? false if you are not the right command. true if the + * command got handled (independent of success) */ public abstract boolean handleArguments(String[] args); } diff --git a/commander/src/site/apt/index.apt.vm b/commander/src/site/apt/index.apt.vm index 1bd0acf6..3f1aa472 100644 --- a/commander/src/site/apt/index.apt.vm +++ b/commander/src/site/apt/index.apt.vm @@ -7,10 +7,10 @@ About the Commander The commander (or gui-console) is a text-based interface to Jake. It is meant mainly for testing, demonstration of features and automation. - + However, it supports all commands of Jake. - + In the future, it is possible that it can be useful as a headless client for jake, mirroring and re-distributing changes. - + diff --git a/commander/src/test/java/com/jakeapp/gui/console/AnnounceRuns.java b/commander/src/test/java/com/jakeapp/gui/console/AnnounceRuns.java index 0419f736..9dc4d991 100644 --- a/commander/src/test/java/com/jakeapp/gui/console/AnnounceRuns.java +++ b/commander/src/test/java/com/jakeapp/gui/console/AnnounceRuns.java @@ -16,7 +16,7 @@ public class AnnounceRuns extends TestDBEnabledTestCase { private static final String obj = "00000000-0000-000b-0000-000000000001"; private static final String nonexistantobj = "FFFFFFFF-0000-000b-0000-000000000001"; - + @Override protected String getDbTemplateName() { return "oneuserWithOneProjectContainingNotes"; diff --git a/commander/src/test/java/com/jakeapp/gui/console/FifoStreamer.java b/commander/src/test/java/com/jakeapp/gui/console/FifoStreamer.java index edc26c3e..2f697989 100644 --- a/commander/src/test/java/com/jakeapp/gui/console/FifoStreamer.java +++ b/commander/src/test/java/com/jakeapp/gui/console/FifoStreamer.java @@ -4,7 +4,7 @@ import java.io.InputStream; /** - * strings to inputstream converter + * strings to inputstream converter * @author johannes */ class FifoStreamer extends InputStream { diff --git a/commander/src/test/java/com/jakeapp/gui/console/JakeCommanderRuns.java b/commander/src/test/java/com/jakeapp/gui/console/JakeCommanderRuns.java index aa6d5cb9..9d77ef02 100644 --- a/commander/src/test/java/com/jakeapp/gui/console/JakeCommanderRuns.java +++ b/commander/src/test/java/com/jakeapp/gui/console/JakeCommanderRuns.java @@ -14,7 +14,7 @@ /** * This class is (atm) for running manually in the IDE and not for inclusion in * build automation - * + * * @author johannes */ public class JakeCommanderRuns extends TmpdirEnabledTestCase { diff --git a/commander/src/test/java/com/jakeapp/gui/console/JakeCommanderXmppRuns.java b/commander/src/test/java/com/jakeapp/gui/console/JakeCommanderXmppRuns.java index a96582ad..f5684eb1 100644 --- a/commander/src/test/java/com/jakeapp/gui/console/JakeCommanderXmppRuns.java +++ b/commander/src/test/java/com/jakeapp/gui/console/JakeCommanderXmppRuns.java @@ -39,7 +39,7 @@ protected String getDbTemplateName() { public void setup() throws Exception { super.setup(); FSTestCommons.recursiveDelete(new File(".jake")); - + String pwd = new File(".").getAbsolutePath(); System.out.println("You are now in " + pwd); File projectdir = new File(pwd, project); diff --git a/commander/src/test/java/com/jakeapp/gui/console/PrimitivePokeRun.java b/commander/src/test/java/com/jakeapp/gui/console/PrimitivePokeRun.java index 26c7d8a0..0e8c0526 100644 --- a/commander/src/test/java/com/jakeapp/gui/console/PrimitivePokeRun.java +++ b/commander/src/test/java/com/jakeapp/gui/console/PrimitivePokeRun.java @@ -24,8 +24,8 @@ @RunWith(PrerequisiteAwareClassRunner.class) public class PrimitivePokeRun extends TmpdirEnabledTestCase { - - + + private String user; @Override @@ -33,7 +33,7 @@ public class PrimitivePokeRun extends TmpdirEnabledTestCase { public void setup() throws Exception { FSTestCommons.recursiveDelete(new File(".jake")); super.setup(); - + this.user = XmppTestEnvironment.getXmppId("poker"); XmppTestEnvironment.assureUserExists(XmppTestEnvironment.getHost(), "poker", "poker"); } @@ -42,7 +42,7 @@ public void setup() throws Exception { @Prerequisite(checker = XmppTestEnvironment.class) public void bugRun() { FifoStreamer fifo = new FifoStreamer(); - fifo.addLine("coreLogin " + this.user + " poker"); + fifo.addLine("coreLogin " + this.user + " poker"); fifo.addLine("login"); fifo.addLine("openProject " + this.tmpdir); fifo.addLine("startProject"); diff --git a/commander/src/test/java/com/jakeapp/jake/test/TestDBEnabledTestCase.java b/commander/src/test/java/com/jakeapp/jake/test/TestDBEnabledTestCase.java index d2e17fbb..3bd26b85 100644 --- a/commander/src/test/java/com/jakeapp/jake/test/TestDBEnabledTestCase.java +++ b/commander/src/test/java/com/jakeapp/jake/test/TestDBEnabledTestCase.java @@ -126,15 +126,15 @@ public void setup() throws Exception { File workdir = new File("."); copyFiles(templatedir, workdir, ".svn"); */ - + // The brutal way FSTestCommons.recursiveDelete(new File(".jake")); File workdir = new File("."); copyFiles(templatedir, workdir, ".svn"); - - + + File dbdir = new File(".jake"); - dbdir.mkdir(); + dbdir.mkdir(); Assert.assertTrue(folderExists(".jake")); log.info("Directory prepared with database template. "); } diff --git a/documentation/management/statusbericht-1/intro.tex b/documentation/management/statusbericht-1/intro.tex index 92f5a38e..2144dbef 100644 --- a/documentation/management/statusbericht-1/intro.tex +++ b/documentation/management/statusbericht-1/intro.tex @@ -3,44 +3,44 @@ \section{Status} Ein Kickoff-Treffen und ein Kickoff-Treffen mit dem Tutor wurden abgehalten. Es wurde auf Projekt und Rolleneinteilung geeinigt. -Das Projekt wurde in Untergruppen geteilt, die teilweise schon mit der Arbeit -begonnen haben: +Das Projekt wurde in Untergruppen geteilt, die teilweise schon mit der Arbeit +begonnen haben: \subsection{GUI} -Peter und Chris beschäftigen sich mit der GUI, genauer gesagt mit der Analyse -der Workflows/typischen Arbeitsszenarien, sowie später der Analyse der -derzeitigen Umsetzung. +Peter und Chris beschäftigen sich mit der GUI, genauer gesagt mit der Analyse +der Workflows/typischen Arbeitsszenarien, sowie später der Analyse der +derzeitigen Umsetzung. -Das Dokument Workflows wird in Woche 45 erwartet, das Dokument Analyse in +Das Dokument Workflows wird in Woche 45 erwartet, das Dokument Analyse in Woche 46. Darauffolgend soll später ein Dokument der Implementierungsvorschläge entstehen. \subsection{Codereview} -Dominik und Christopher analysieren den derzeitigen Codebestand auf -strukturelle Mängel. Das Codereviewdokument, das aus Problemen, -Behebungsvorschlägen und Ideen für neue Features besteht, ist bereits zur Hälfte +Dominik und Christopher analysieren den derzeitigen Codebestand auf +strukturelle Mängel. Das Codereviewdokument, das aus Problemen, +Behebungsvorschlägen und Ideen für neue Features besteht, ist bereits zur Hälfte fertiggestellt. Das Codereviewdokument wird zu Beginn der Woche 45 erwartet. \subsection{XMPP} -Johannes hat die Library "Muse" für die Implementierung des XMPP-Backends -ausgewählt. Entscheidend war Reife der Entwicklung, Vollständigkeit der +Johannes hat die Library "Muse" für die Implementierung des XMPP-Backends +ausgewählt. Entscheidend war Reife der Entwicklung, Vollständigkeit der Implementierung (XEPs) und Lizenzen. Da die Libraries allerdings sehr ähnliche -Konzepte verfolgen, sollte ein Austauschen, falls zu einem späteren Zeitpunkt +Konzepte verfolgen, sollte ein Austauschen, falls zu einem späteren Zeitpunkt notwendig, nicht übermäßig aufwändig sein. -Die Implementierung wird agil stattfinden: Entwicklungszyklenweise (etwa 2 -Wochen) wird geplant und implementiert. Die Entwicklung wird mit Woche 45 +Die Implementierung wird agil stattfinden: Entwicklungszyklenweise (etwa 2 +Wochen) wird geplant und implementiert. Die Entwicklung wird mit Woche 45 beginnen. \subsection{Qualitätsreview} -Das Review der bestehenden Dokumente wurde von Simon durchgeführt. Sie sind im -Wiki unter review:requirements und review:test\_cases verfügbar und auch diesem +Das Review der bestehenden Dokumente wurde von Simon durchgeführt. Sie sind im +Wiki unter review:requirements und review:test\_cases verfügbar und auch diesem Bericht beigelegt. -Das Review der Qualitätssicherung wird sich in den nächsten etwa 2 Wochen mit -der Verbesserung der Spezifikation des Projekts beschäftigen, in Zusammenarbeit +Das Review der Qualitätssicherung wird sich in den nächsten etwa 2 Wochen mit +der Verbesserung der Spezifikation des Projekts beschäftigen, in Zusammenarbeit mit den technischen Architekten. \section{Statusindikatoren} diff --git a/documentation/management/statusbericht-2/intro.tex b/documentation/management/statusbericht-2/intro.tex index 0905b405..7e5d2c5d 100644 --- a/documentation/management/statusbericht-2/intro.tex +++ b/documentation/management/statusbericht-2/intro.tex @@ -1,64 +1,64 @@ \setcounter{chapter}{1} \section{Status} -Es wurde festgestellt, dass Unklarheiten und unterschiedliche Ansichten über -die Detailziele der Phase herrschen. Daher wurden die Tätigkeiten der -Gruppen XMPP, GUI und Codereview verschoben und stattdessen an dem Dokument +Es wurde festgestellt, dass Unklarheiten und unterschiedliche Ansichten über +die Detailziele der Phase herrschen. Daher wurden die Tätigkeiten der +Gruppen XMPP, GUI und Codereview verschoben und stattdessen an dem Dokument SRS gearbeitet (Woche 44-46). -Gleichzeitig (Woche 45-46) wurde von der Qualitätssicherung die -Rahmenbedingungen und Dokumente der einzelnen Gruppen besprochen (siehe +Gleichzeitig (Woche 45-46) wurde von der Qualitätssicherung die +Rahmenbedingungen und Dokumente der einzelnen Gruppen besprochen (siehe Protokolle, etwa Code-Guidelines,). Es wurden die qualitativen Ziele des Projekts festgelegt. \subsection{Qualitative Ziele} -Die Arbeitszeit pro Projektmitglied soll nicht 150h überschreiten und -möglichst ausgeglichen zwischen Teammitgliedern sein. Falls nicht möglich, -sollen eher unwichtige Zusatzfeatures weggelassen werden als die Stundenzahl +Die Arbeitszeit pro Projektmitglied soll nicht 150h überschreiten und +möglichst ausgeglichen zwischen Teammitgliedern sein. Falls nicht möglich, +sollen eher unwichtige Zusatzfeatures weggelassen werden als die Stundenzahl grob zu überziehen. -Das Ziel ist, das Projekt am Ende des Semesters releasefertig zu haben. Wir -entscheiden uns, zum Open-Source-Release hinzuarbeiten und nicht bloss zur -LVA-Abgabe. Das Produkt soll gut genug sein um es anderen empfehlen zu +Das Ziel ist, das Projekt am Ende des Semesters releasefertig zu haben. Wir +entscheiden uns, zum Open-Source-Release hinzuarbeiten und nicht bloss zur +LVA-Abgabe. Das Produkt soll gut genug sein um es anderen empfehlen zu können und der Öffentlichkeit zu präsentieren. -Wann und unter welcher Lizenz das Release stattfindet ist dabei zweitrangig +Wann und unter welcher Lizenz das Release stattfindet ist dabei zweitrangig und noch offen. Die Performance des Programms soll möglichst Ressourcen-schonend sein. \subsection{Software Requirements Specification (SRS)} -Die SRS spezifiziert exakt, was der Benutzer von dem fertigen Produkt Jake zu +Die SRS spezifiziert exakt, was der Benutzer von dem fertigen Produkt Jake zu erwarten hat und macht die Vorstellungen und Detailziele der Phase explizit. Das Dokument ist beigelegt. \section{Derzeitiger Fortschritt} \subsection{GUI} -Auf Basis der SRS werden die Use cases von QA und GUI-Team erstellt. Des -weiteren werden die Programm-Workflows vom GUI-Team beschrieben (wie das -Programm bedient werden soll). +Auf Basis der SRS werden die Use cases von QA und GUI-Team erstellt. Des +weiteren werden die Programm-Workflows vom GUI-Team beschrieben (wie das +Programm bedient werden soll). Aus den Workflows soll später der GUI-Entwurf/Prototyp vom GUI-Team erstellt werden. \subsection{Technische Architektur} -Schnittstellen zwischen \emph{GUI} und \emph{core}-Komponente und einige andere müssen +Schnittstellen zwischen \emph{GUI} und \emph{core}-Komponente und einige andere müssen aufgrund der SRS überdacht und designed werden. Des weiteren werden zusätzliche, -neue Features (siehe SRS), etwa eine Liste zuletzt geöffneter Projekte, +neue Features (siehe SRS), etwa eine Liste zuletzt geöffneter Projekte, entworfen werden. \section{Planung} -Die Use-Cases mit Workflows sollten am 2.12. abgeschlossen sein. Der +Die Use-Cases mit Workflows sollten am 2.12. abgeschlossen sein. Der GUI-Entwurf/Prototyp wird zum MR2 fertig. -Ebenso soll beim MR2 ein Prototyp des XMPP-Backends auf Basis des alten +Ebenso soll beim MR2 ein Prototyp des XMPP-Backends auf Basis des alten Programms fertig sein. -Die Technische Architektur wird zum MR2 die neuen Komponenten/Klassendiagramme +Die Technische Architektur wird zum MR2 die neuen Komponenten/Klassendiagramme und Interfacedefinitionen abgeben. \section{Statusindikatoren} \subsection{Zeitplanung} -Die geplante Programmierung des XMPP-Backends hat sich verzögert und wird erst +Die geplante Programmierung des XMPP-Backends hat sich verzögert und wird erst mit 26.11. beginnen. \subsection{Inhaltliche Planung} diff --git a/documentation/management/statusbericht-2/qa.tex b/documentation/management/statusbericht-2/qa.tex index 94a8827c..c8b818ab 100644 --- a/documentation/management/statusbericht-2/qa.tex +++ b/documentation/management/statusbericht-2/qa.tex @@ -1,23 +1,23 @@ \section{Dokumentation und QA} -Zur Übersicht über die Dokumentation wurde im Wiki ein Documentation Center -eingerichtet\footnote{\texttt{http://sepm.doublesignal.com/wiki/doku.php?id=documentation\_center}}. +Zur Übersicht über die Dokumentation wurde im Wiki ein Documentation Center +eingerichtet\footnote{\texttt{http://sepm.doublesignal.com/wiki/doku.php?id=documentation\_center}}. Die Dokumentation gliedert sich in drei Bereiche: \begin{itemize} -\item \emph{Interne Dokumentation}: Kommunikation und Dokumentation innerhalb +\item \emph{Interne Dokumentation}: Kommunikation und Dokumentation innerhalb des Teams und des Projekts. Diese wird im Wiki in deutscher Sprache verfasst. -\item \emph{konkrete öffentliche Dokumentation}: Dokumentation die die konkrete -Implementierung betrifft und auch nach dem Abschluss von ASE noch von Bedeutung +\item \emph{konkrete öffentliche Dokumentation}: Dokumentation die die konkrete +Implementierung betrifft und auch nach dem Abschluss von ASE noch von Bedeutung ist. Konkrete technische Doku, konkrete UI Doku, etc. Dokumentiert in Maven. -\item \emph{allgemeine öffentliche Dokumentation}: Dokumentation die unabhängig +\item \emph{allgemeine öffentliche Dokumentation}: Dokumentation die unabhängig von einer konkreten Implementierung besteht. Dabei handelt es sich um die \emph -{specification}, die auch die use cases und die allgemeine UI methodology -enthält. Dokumentiert in \texttt{specification.pdf}. +{specification}, die auch die use cases und die allgemeine UI methodology +enthält. Dokumentiert in \texttt{specification.pdf}. \end{itemize} \subsubsection{QA} -Die Dokumente der QA werde erst im weiteren Verlauf des Projektes festgelegt -und erstellt. Vorgaben zu unit tests und der testing policy werden sich in den -\emph{coding guidelines} in Maven finden, GUI Tests werden mit \emph{mozilla -litmus}\footnote{http://dev.jakeapp.com:8080/tests/} organisiert. +Die Dokumente der QA werde erst im weiteren Verlauf des Projektes festgelegt +und erstellt. Vorgaben zu unit tests und der testing policy werden sich in den +\emph{coding guidelines} in Maven finden, GUI Tests werden mit \emph{mozilla +litmus}\footnote{http://dev.jakeapp.com:8080/tests/} organisiert. diff --git a/documentation/management/statusbericht-4/intro.tex b/documentation/management/statusbericht-4/intro.tex index 56903ce4..c50387d6 100755 --- a/documentation/management/statusbericht-4/intro.tex +++ b/documentation/management/statusbericht-4/intro.tex @@ -3,11 +3,11 @@ \section{Status} Das Projekt Jake konnte nach verlängerter Entwicklungszeit fertiggestellt werden. \section{Komponenten} -An den Komponenten \emph{FSS, ICS, ICS-XMPP} mussten lediglich kleine Änderungen und Bugfixes vorgenommen werden. +An den Komponenten \emph{FSS, ICS, ICS-XMPP} mussten lediglich kleine Änderungen und Bugfixes vorgenommen werden. Die großen Arbeitspakete seit dem letzten Bericht betrafen \emph{Core} und \emph{GUI}. \subsection{Domainobjects, Datenbank} -Sämtliche Domainobjekte wurden von Johannes im Februar reviewed und überarbeitet um eine darauf aufbauende Weiterentwicklung zu ermöglichen. Ebenso wurden die DAOs getestet und fertigimplementiert. +Sämtliche Domainobjekte wurden von Johannes im Februar reviewed und überarbeitet um eine darauf aufbauende Weiterentwicklung zu ermöglichen. Ebenso wurden die DAOs getestet und fertigimplementiert. \subsection{JakeCommander} Zum Testen und für einen Servermodus wurde eine durch Kommandozeile ansprechbare Implementierung geschrieben, die die meisten Use-Cases abdeckt. @@ -40,11 +40,11 @@ \section{Anhänge} \item Stundenlisten geführt bis 30.1. (ab Seite 18) \end{itemize} -Die Dokumente UI-Skizzen und -beschreibung, Risikoabschätzung, -Anwendungsfallbeschreibung, Komponentendiagramm und Domänenmodell wurden bereits +Die Dokumente UI-Skizzen und -beschreibung, Risikoabschätzung, +Anwendungsfallbeschreibung, Komponentendiagramm und Domänenmodell wurden bereits früher abgegeben und sind in der vorliegenden Version noch zutreffend. -Die Besprechungsprotokolle sind auf http://wiki.jakeapp.com/doku.php?id=protokolle:protokolle zu finden. +Die Besprechungsprotokolle sind auf http://wiki.jakeapp.com/doku.php?id=protokolle:protokolle zu finden. -Die Javadoc (Technische Dokumentation) ist auf http://wiki.jakeapp.com/doku.php?id=javadoc zu finden. +Die Javadoc (Technische Dokumentation) ist auf http://wiki.jakeapp.com/doku.php?id=javadoc zu finden. diff --git a/documentation/management/statusbericht-4/main.aux b/documentation/management/statusbericht-4/main.aux index 0aabcc8f..bd436924 100755 --- a/documentation/management/statusbericht-4/main.aux +++ b/documentation/management/statusbericht-4/main.aux @@ -1,4 +1,4 @@ -\relax +\relax \catcode`"\active \ifx\hyper@anchor\@undefined \global \let \oldcontentsline\contentsline @@ -9,7 +9,7 @@ \AtEndDocument{\let \contentsline\oldcontentsline \let \newlabel\oldnewlabel} \else -\global \let \hyper@last\relax +\global \let \hyper@last\relax \fi \select@language{ngerman} diff --git a/documentation/management/statusbericht-4/main.log b/documentation/management/statusbericht-4/main.log index cf9a3d25..257a379a 100755 --- a/documentation/management/statusbericht-4/main.log +++ b/documentation/management/statusbericht-4/main.log @@ -251,12 +251,12 @@ File: babel.def 2004/11/20 v3.8d Babel common definitions \babel@savecnt=\count88 \U@D=\dimen103 ) -\l@austrian = a dialect from \language\l@german +\l@austrian = a dialect from \language\l@german Package babel Info: Making " an active character on input line 91. ) (/usr/share/texmf/tex/generic/babel/ngermanb.ldf Language: ngermanb 2004/02/20 v2.6m new German support from the babel system -\l@naustrian = a dialect from \language\l@ngerman +\l@naustrian = a dialect from \language\l@ngerman )) (/usr/share/texmf/tex/latex/tools/multicol.sty Package: multicol 2004/02/14 v1.6e multicolumn formatting (FMi) @@ -356,7 +356,7 @@ Package hyperref Info: Link coloring OFF on input line 2638. File: hpdftex.def 2003/11/30 v6.74m Hyperref driver for pdfTeX (/usr/share/texmf/tex/latex/psnfss/pifont.sty -Package: pifont 2004/09/15 PSNFSS-v9.2 Pi font support (SPQR) +Package: pifont 2004/09/15 PSNFSS-v9.2 Pi font support (SPQR) LaTeX Font Info: Try loading font information for U+pzd on input line 63. (/usr/share/texmf/tex/latex/psnfss/upzd.fd @@ -589,12 +589,12 @@ File: umsb.fd 2002/01/19 v2.2g AMS font definitions ! pdfTeX warning (ext4): destination with the same identifier (name{page.1}) ha s been already used, duplicate ignored - - \penalty + + \penalty l.23 \sepmstart - -Package Fancyhdr Warning: \headheight is too small (12.0pt): + +Package Fancyhdr Warning: \headheight is too small (12.0pt): Make it at least 14.49998pt. We now make it that large for the rest of the document. This may cause the page layout to be inconsistent, however. @@ -633,7 +633,7 @@ Overfull \hbox (27.5126pt too wide) in paragraph at lines 49--50 //wiki.jakeapp.com/doku.php?id=javadoc [] -) AED: lastpage setting LastPage [3] (./main.aux) ) +) AED: lastpage setting LastPage [3] (./main.aux) ) Here is how much of TeX's memory you used: 4509 strings out of 94432 56516 string characters out of 1175566 diff --git a/documentation/projektauftrag/01_projektbeschreibung.tex b/documentation/projektauftrag/01_projektbeschreibung.tex index ea781970..e3e6037c 100644 --- a/documentation/projektauftrag/01_projektbeschreibung.tex +++ b/documentation/projektauftrag/01_projektbeschreibung.tex @@ -6,11 +6,11 @@ \section{Projektbeschreibung} \sepmprojectname soll den Grundstein für eine Plattform legen, die es erlaubt, über ein Netzwerk (z.B. das Internet) gemeinsam an Dateien beliebigen Formats zu arbeiten. Es soll ein Fat Client entwickelt werden, der alle Funktionen der im Projekt definierten Synchronisationsschnittstelle benutzt. Die Implementierung der Interclient Communication und Synchronisation Services ist aber erst in darauf folgenden Ausbauphasen, in Form eigenständiger Projekte, geplant. Änderungen an Dateien sollen vom Programm erkannt werden und mit Hilfe der Synchronisations- und Interclient Communication Services an andere User propagiert werden. In diesem Projekt soll nur die Phase 1 der folgenden Phaseneinteilung realisiert werden. \subsection{Phase 1, Fat Client} -In dieser Phase wird das Programm als Fat Client erstellt, dessen grafischen Oberfläche die vollständige Nutzbarkeit der unten aufgeführten Features zugänglich macht. +In dieser Phase wird das Programm als Fat Client erstellt, dessen grafischen Oberfläche die vollständige Nutzbarkeit der unten aufgeführten Features zugänglich macht. Die Netzwerkkommunikation zwischen verschiedenen Clients soll mithilfe eines Mock-Service simuliert werden. Dieser Service wird in dieser Phase die Zusammenarbeit mit anderen Clients simulieren, wodurch die Funktionalität des Programmes getestet werden kann. Neben diesem Mock-Service, welches die Interclient Communication Services der Anwendung kapselt, wird zusätzlich noch ein Synchronisationsinterface erstellt, welches es erlaubt, den Vorgang der Synchronisation zwischen den Clients auf verschiedene Weisen zu implementieren. -Die Synchronisation soll in dieser Phase ebenfalls mithilfe eines Mock-Services realisiert werden. Die Interclient Communication und Synchronisations-Mock-Services können dann, in möglichen späteren Projektphasen, durch entsprechende Implementierungen (z.B. XMPP für das Interclient Communication Service) ersetzt werden. Die für die Synchronisation notwendigen Elemente der Benutzeroberfläche sollen aber bereits in dieser Phase erstellt und an die entsprechenden Schnittstellen gebunden werden. +Die Synchronisation soll in dieser Phase ebenfalls mithilfe eines Mock-Services realisiert werden. Die Interclient Communication und Synchronisations-Mock-Services können dann, in möglichen späteren Projektphasen, durch entsprechende Implementierungen (z.B. XMPP für das Interclient Communication Service) ersetzt werden. Die für die Synchronisation notwendigen Elemente der Benutzeroberfläche sollen aber bereits in dieser Phase erstellt und an die entsprechenden Schnittstellen gebunden werden. \subsubsection{Aufgaben des Interclient Communication Service} \begin{itemize} diff --git a/documentation/projektauftrag/03_arbeitsziele.tex b/documentation/projektauftrag/03_arbeitsziele.tex index 3bad95e9..0b096d51 100644 --- a/documentation/projektauftrag/03_arbeitsziele.tex +++ b/documentation/projektauftrag/03_arbeitsziele.tex @@ -13,7 +13,7 @@ \subsection{Betriebswirtschaftliche Ziele} \subsection{Funktionale Ziele} \begin{itemize} -% Falls es noch keiner gesagt hat: Verben schreibt man klein, Substantiva groß. +% Falls es noch keiner gesagt hat: Verben schreibt man klein, Substantiva groß. \item Durch den Einsatz der Applikation wird es einfacher ad-hoc neue Dokumente der Projektgruppe zur Verfügung zu stellen oder Aktualisierungen an Bestehenden zu propagieren. Da dieser Austausch nicht mehr per Mail geschieht wird die Übersicht über die Daten erhöht, und Versionskonflikte mit alten lokalen Versionen stark verringert. \item Durch den Einsatz der Applikation können Aktualisierungen an Dateien anderen Projektmitgliedern schneller zugänglich gemacht werden. Da die Projektmitglieder, sofern möglich, immer die aktuellsten Versionen zur Verfügung haben, ist eine dynamischere Arbeitsweise möglich, die stärker auf Zusammenarbeit setzt. diff --git a/documentation/projektauftrag/05_komponenten.tex b/documentation/projektauftrag/05_komponenten.tex index 6ec5c150..414060bb 100644 --- a/documentation/projektauftrag/05_komponenten.tex +++ b/documentation/projektauftrag/05_komponenten.tex @@ -10,13 +10,13 @@ \section{Komponentendiagramm} % Es sollen zuerst die Aufgaben jeder Komponente beschrieben. % Danach kann auf Verbindung zu anderen Komponenten eingegangen werden: Nicht durch Abläufe, es sollen die Beziehungen beschrieben werden % Die Beziehung ist, dass der Core immer die Kontrolle hat, aber dass er eben auch auf Callbacks/Events von den anderen Komponente wartet -% Nicht die internen Abläufe beschreiben, und bei allen Komponenten auf gleichem Detailniveau bleiben. +% Nicht die internen Abläufe beschreiben, und bei allen Komponenten auf gleichem Detailniveau bleiben. % ~johannes \subsection{Core} -In der Core-Komponente befindet sich die Business Logic der Applikation. Der Core arbeitet hier sozusagen als Übersetzer zwischen den einzelnen Komponenten. So wird zum Beispiel im Core bestimmt, was die Applikation zu tun hat, wenn ein Benutzer in der Grafischen Benutzeroberfläche auf ``Aktualisieren'' drückt oder eine Datei löschen möchte. Da die komplette Logik im Core und nicht in der GUI selbst implementiert wird, ist es technisch leicht möglich, alternative User Interfaces anzubinden, ohne irgendwelche Programmlogik erneut zu programmieren. +In der Core-Komponente befindet sich die Business Logic der Applikation. Der Core arbeitet hier sozusagen als Übersetzer zwischen den einzelnen Komponenten. So wird zum Beispiel im Core bestimmt, was die Applikation zu tun hat, wenn ein Benutzer in der Grafischen Benutzeroberfläche auf ``Aktualisieren'' drückt oder eine Datei löschen möchte. Da die komplette Logik im Core und nicht in der GUI selbst implementiert wird, ist es technisch leicht möglich, alternative User Interfaces anzubinden, ohne irgendwelche Programmlogik erneut zu programmieren. Neben dem Bereitstellen der Funktionalität für das User Interface registriert sich der Core auch bei anderen Komponenten als Observer, um auf Ereignisse dieser Komponenten (z.B. das Verändern einer Datei im Dateisystem oder der Empfang einer Netzwerknachricht) reagieren zu können. Was genau beim Eintreffen eines Ereignisses geschieht, wird ausschließlich im Core festgelegt. Hierbei ändert allerdings nicht der Core selbst, z.B. eine Statusbar, vielmehr weist er die GUI Komponente auf Änderungen hin, die für den Benutzer von Interesse sind, oder die seine Aufmerksamkeit/seinen Input benötigen. \subsection{Graphical User Interface} @@ -24,7 +24,7 @@ \subsection{Graphical User Interface} Funktionalitäten. % Persistence NICHT Database Persistence, es ist nicht festgelegt dass wir eine Datenbank verwenden ~simon -\subsection{Persistence} +\subsection{Persistence} Die Persistence Komponente abstrahiert den Zugriff auf die Daten, die für den Betrieb gespeichert werden müssen. Diese umschließen nicht die Dateien. Es wird das Konzept des Data Hiding umgesetzt, wodurch erreicht werden kann, dass die anderen Komponenten nur auf definierte Weise die Daten verwenden. Für die Speicherung der Daten kann eine relationale Datenbank verwendet werden. \subsection{Synchronisation Services} @@ -33,16 +33,16 @@ \subsection{Synchronisation Services} \subsection{File System Services} Die File System Services kapselt den Zugriff auf Dateien im Dateisystem. Außerdem kann diese Komponente durch entsprechende Strategien feststellen, ob Dateien geändert wurden oder in die Projektordnerstruktur kopiert wurden und dies dem Core mitteilen, welcher wiederum entsprechende Aktionen veranlasst. -\subsection{Interclient Communication Service} -Der Interclient Communication Service kapselt die vollständige Kommunikation zwischen den Clients (über das Netzwerk) und gibt die entsprechenden Nachrichten an den Core weiter. So ist es leicht möglich, verschiedene Netzwerk-backends (z.B. XMPP oder RMI) zu unterstützen, welche für den Core und somit für den Benutzer transparent sind. Außerdem wird die Authentifizierung der Nutzer in dieser Komponente durchgeführt, was es erlaubt, die Anwendung unter anderem an verschiedenste Authentifizierungssysteme anzubinden. +\subsection{Interclient Communication Service} +Der Interclient Communication Service kapselt die vollständige Kommunikation zwischen den Clients (über das Netzwerk) und gibt die entsprechenden Nachrichten an den Core weiter. So ist es leicht möglich, verschiedene Netzwerk-backends (z.B. XMPP oder RMI) zu unterstützen, welche für den Core und somit für den Benutzer transparent sind. Außerdem wird die Authentifizierung der Nutzer in dieser Komponente durchgeführt, was es erlaubt, die Anwendung unter anderem an verschiedenste Authentifizierungssysteme anzubinden. \subsection{Schnittstellen} \subsubsection{GUI} -Die grafische Benutzeroberfläche greift auf eine Schnittstelle des Core's zu. Diese Schnittstelle stellt alle notwendigen Funktionen zur Verfügung um die Elemente der grafischen Benutzeroberfläche mit Inhalten zu füllen. Außerdem ruft die GUI beim vom Benutzer ausgelösten Events (z.B. das drücken einer Schaltfläche) die Funktion mit der entsprechenden Logik im Core auf. +Die grafische Benutzeroberfläche greift auf eine Schnittstelle des Core's zu. Diese Schnittstelle stellt alle notwendigen Funktionen zur Verfügung um die Elemente der grafischen Benutzeroberfläche mit Inhalten zu füllen. Außerdem ruft die GUI beim vom Benutzer ausgelösten Events (z.B. das drücken einer Schaltfläche) die Funktion mit der entsprechenden Logik im Core auf. \subsubsection{Interclient Communication Service} -Der ICS bietet eine Schnittstelle zum Zugriff auf die Netzwerkservices sowie zum registrieren als Beobachter an. Mit Hilfe des ICS kann sich der Core gegenüber dem Netzwerk authentifizieren und sowohl der Core als auch die anderen Komponenten Nachrichten und Objekte verschicken bzw. empfangen. +Der ICS bietet eine Schnittstelle zum Zugriff auf die Netzwerkservices sowie zum registrieren als Beobachter an. Mit Hilfe des ICS kann sich der Core gegenüber dem Netzwerk authentifizieren und sowohl der Core als auch die anderen Komponenten Nachrichten und Objekte verschicken bzw. empfangen. \subsubsection{File System Services} diff --git a/documentation/projektauftrag/08_projektabgrenzung.tex b/documentation/projektauftrag/08_projektabgrenzung.tex index 1a0bb038..c39ad686 100644 --- a/documentation/projektauftrag/08_projektabgrenzung.tex +++ b/documentation/projektauftrag/08_projektabgrenzung.tex @@ -1,4 +1,4 @@ -% Dieser Teil korrespondiert mit der Projektbeschreibung. +% Dieser Teil korrespondiert mit der Projektbeschreibung. % Er legt fest was unser Projekt nicht ist, und was daher auch nicht implementiert wird. \section{Projektabgrenzung} diff --git a/documentation/projektauftrag/10_dokumentation.tex b/documentation/projektauftrag/10_dokumentation.tex index 0de15b9e..b6bab8ed 100644 --- a/documentation/projektauftrag/10_dokumentation.tex +++ b/documentation/projektauftrag/10_dokumentation.tex @@ -5,20 +5,20 @@ \section{Informationswesen/Dokumentation} \subsection{Interne Kommunikation} Zur internen Kommunikation wird ein eigens eingerichtetes Wikisystem verwendet. -Ankündigungen und wichtige Mitteilungen werden über eine Mailingliste verteilt. -Die gesamte Projektgruppe trifft sich mindestens einmal pro Woche zu einem ein- bis eineinhalbstündigen Meeting. -Die Agenda für die Meetings wird zuvor im Wiki bekanntgegeben und kann dort diskutiert werden. +Ankündigungen und wichtige Mitteilungen werden über eine Mailingliste verteilt. +Die gesamte Projektgruppe trifft sich mindestens einmal pro Woche zu einem ein- bis eineinhalbstündigen Meeting. +Die Agenda für die Meetings wird zuvor im Wiki bekanntgegeben und kann dort diskutiert werden. \subsection{Externe Kommunikation} Die externe Kommunikation wird während der Übung über regelmäßig stattfindende Review-Meetings sowie über Email-Kommunikation mit unserem Tutor und Assistenten geführt. \subsection{Organisatorische Dokumentation} -Die organisatorische Dokumentation des Projekts wird über das Wiki abgewickelt. +Die organisatorische Dokumentation des Projekts wird über das Wiki abgewickelt. Protokolle, Stundenlisten, Projekttagebuch, etc. werden während der Dauer der Übung laufend aktualisiert. \subsection{Technische Dokumentation} -Die gesamte technische Dokumentation und Spezifikation wird über Maven abgewickelt. -Dies umfasst Dokumente der technischen Planung, Dokumente der Anforderungsspezifikation, +Die gesamte technische Dokumentation und Spezifikation wird über Maven abgewickelt. +Dies umfasst Dokumente der technischen Planung, Dokumente der Anforderungsspezifikation, Dokumente der Qualitätssicherung, Dokumentation auf Codeebene, Endbenutzer-Dokumente, etc. Sämtliche technischen Spezifikationen werden in Englisch verfasst. diff --git a/documentation/projektauftrag/ase/01_projektbeschreibung.tex b/documentation/projektauftrag/ase/01_projektbeschreibung.tex index d5d4e4e8..6f7f0176 100644 --- a/documentation/projektauftrag/ase/01_projektbeschreibung.tex +++ b/documentation/projektauftrag/ase/01_projektbeschreibung.tex @@ -6,11 +6,11 @@ \section{Projektbeschreibung} \sepmprojectname soll den Weiterbau einer Plattform darstellen, die es erlaubt, über ein Netzwerk (z.B. das Internet) gemeinsam an Dateien beliebigen Formats zu arbeiten. Es wurde in einem Vorgängerprojekt ein Fat Client entwickelt, der alle Funktionen der im Projekt definierten Synchronisationsschnittstelle benutzt. Die Implementierung der Interclient Communication und Synchronisation Services ist nun als Ausbauphase dieses Projekts durchzuführen. Änderungen an Dateien werden vom Programm erkannt werden und sollen mit Hilfe der Synchronisations- und Interclient Communication Services an andere User propagiert werden. In diesem Projekt soll nur die Phase 2 der folgenden Phaseneinteilung realisiert werden. \subsection{Phase 1, Fat Client} -In dieser Phase wird das Programm als Fat Client erstellt, dessen grafischen Oberfläche die vollständige Nutzbarkeit der unten aufgeführten Features zugänglich macht. +In dieser Phase wird das Programm als Fat Client erstellt, dessen grafischen Oberfläche die vollständige Nutzbarkeit der unten aufgeführten Features zugänglich macht. Die Netzwerkkommunikation zwischen verschiedenen Clients soll mithilfe eines Mock-Service simuliert werden. Dieser Service wird in dieser Phase die Zusammenarbeit mit anderen Clients simulieren, wodurch die Funktionalität des Programmes getestet werden kann. Neben diesem Mock-Service, welches die Interclient Communication Services der Anwendung kapselt, wird zusätzlich noch ein Synchronisationsinterface erstellt, welches es erlaubt, den Vorgang der Synchronisation zwischen den Clients auf verschiedene Weisen zu implementieren. -Die Synchronisation soll in dieser Phase ebenfalls mithilfe eines Mock-Services realisiert werden. Die Interclient Communication und Synchronisations-Mock-Services können dann, in möglichen späteren Projektphasen, durch entsprechende Implementierungen (z.B. XMPP für das Interclient Communication Service) ersetzt werden. Die für die Synchronisation notwendigen Elemente der Benutzeroberfläche sollen aber bereits in dieser Phase erstellt und an die entsprechenden Schnittstellen gebunden werden. +Die Synchronisation soll in dieser Phase ebenfalls mithilfe eines Mock-Services realisiert werden. Die Interclient Communication und Synchronisations-Mock-Services können dann, in möglichen späteren Projektphasen, durch entsprechende Implementierungen (z.B. XMPP für das Interclient Communication Service) ersetzt werden. Die für die Synchronisation notwendigen Elemente der Benutzeroberfläche sollen aber bereits in dieser Phase erstellt und an die entsprechenden Schnittstellen gebunden werden. \subsubsection{Aufgaben des Interclient Communication Service} \begin{itemize} @@ -30,7 +30,7 @@ \subsection{Phase 2, Networking / Synchronisation} Die Mock-Services werden durch konkrete Implementierungen des Interclient Communication Service und des Synchronisationsservice ersetzt. Für das Networkservice ist eine Lösung auf Basis des XMPP-Protokolles angedacht. Durch eine generischen Definition der Schnittstellen in Phase 1 kann dies aber auch mit beliebigen anderen Technologien erfolgen. -Insbesondere muss der Nachrichtenaustausch auf Basis von Daten-Paketen über XMPP gelöst werden, die Authentifizierung gegen XMPP, und die Distribution und Abgleichung der Daten und Metadaten. +Insbesondere muss der Nachrichtenaustausch auf Basis von Daten-Paketen über XMPP gelöst werden, die Authentifizierung gegen XMPP, und die Distribution und Abgleichung der Daten und Metadaten. Eine generische XMPP-Library wird für die Grundfunktionalitäten verwendet. \subsubsection{Weitere Ziele der Projektphase} @@ -41,8 +41,8 @@ \subsubsection{Weitere Ziele der Projektphase} \end{itemize} \subsection{Phase 3, Service Sharing} -In dieser Phase ist das zur Verfügung stellen lokaler Services (z.B. Printer Server) zwischen den -Projektmitgliedern geplant. Dadurch können TCP-Sockets am lokalen Computer oder im lokalen Netzwerk +In dieser Phase ist das zur Verfügung stellen lokaler Services (z.B. Printer Server) zwischen den +Projektmitgliedern geplant. Dadurch können TCP-Sockets am lokalen Computer oder im lokalen Netzwerk an die Projektmitglieder freigegeben werden, die diese dann durch Tunnelling (durch XMPP) benutzen können. Dazu ist das Tunnelling (mit Kapselung) und das Erkennen von Services zu implementieren. diff --git a/documentation/projektauftrag/ase/03_arbeitsziele.tex b/documentation/projektauftrag/ase/03_arbeitsziele.tex index c8b07810..75bdef42 100644 --- a/documentation/projektauftrag/ase/03_arbeitsziele.tex +++ b/documentation/projektauftrag/ase/03_arbeitsziele.tex @@ -13,7 +13,7 @@ \subsection{Betriebswirtschaftliche Ziele} \subsection{Funktionale Ziele} \begin{itemize} -% Falls es noch keiner gesagt hat: Verben schreibt man klein, Substantiva groß. +% Falls es noch keiner gesagt hat: Verben schreibt man klein, Substantiva groß. \item Durch den Einsatz der Applikation wird es einfacher ad-hoc neue Dokumente der Projektgruppe zur Verfügung zu stellen oder Aktualisierungen an Bestehenden zu propagieren. Da dieser Austausch nicht mehr per Mail geschieht wird die Übersicht über die Daten erhöht, und Versionskonflikte mit alten lokalen Versionen stark verringert. \item Durch den Einsatz der Applikation können Aktualisierungen an Dateien anderen Projektmitgliedern schneller zugänglich gemacht werden. Da die Projektmitglieder, sofern möglich, immer die aktuellsten Versionen zur Verfügung haben, ist eine dynamischere Arbeitsweise möglich, die stärker auf Zusammenarbeit setzt. diff --git a/documentation/projektauftrag/ase/05_komponenten.tex b/documentation/projektauftrag/ase/05_komponenten.tex index b174ca6c..cd938990 100644 --- a/documentation/projektauftrag/ase/05_komponenten.tex +++ b/documentation/projektauftrag/ase/05_komponenten.tex @@ -10,13 +10,13 @@ \section{Komponentendiagramm} % Es sollen zuerst die Aufgaben jeder Komponente beschrieben. % Danach kann auf Verbindung zu anderen Komponenten eingegangen werden: Nicht durch Abläufe, es sollen die Beziehungen beschrieben werden % Die Beziehung ist, dass der Core immer die Kontrolle hat, aber dass er eben auch auf Callbacks/Events von den anderen Komponente wartet -% Nicht die internen Abläufe beschreiben, und bei allen Komponenten auf gleichem Detailniveau bleiben. +% Nicht die internen Abläufe beschreiben, und bei allen Komponenten auf gleichem Detailniveau bleiben. % ~johannes \subsection{Core} -In der Core-Komponente befindet sich die Business Logic der Applikation. Der Core arbeitet hier sozusagen als Übersetzer zwischen den einzelnen Komponenten. So wird zum Beispiel im Core bestimmt, was die Applikation zu tun hat, wenn ein Benutzer in der Grafischen Benutzeroberfläche auf ``Aktualisieren'' drückt oder eine Datei löschen möchte. Da die komplette Logik im Core und nicht in der GUI selbst implementiert wird, ist es technisch leicht möglich, alternative User Interfaces anzubinden, ohne irgendwelche Programmlogik erneut zu programmieren. +In der Core-Komponente befindet sich die Business Logic der Applikation. Der Core arbeitet hier sozusagen als Übersetzer zwischen den einzelnen Komponenten. So wird zum Beispiel im Core bestimmt, was die Applikation zu tun hat, wenn ein Benutzer in der Grafischen Benutzeroberfläche auf ``Aktualisieren'' drückt oder eine Datei löschen möchte. Da die komplette Logik im Core und nicht in der GUI selbst implementiert wird, ist es technisch leicht möglich, alternative User Interfaces anzubinden, ohne irgendwelche Programmlogik erneut zu programmieren. Neben dem Bereitstellen der Funktionalität für das User Interface registriert sich der Core auch bei anderen Komponenten als Observer, um auf Ereignisse dieser Komponenten (z.B. das Verändern einer Datei im Dateisystem oder der Empfang einer Netzwerknachricht) reagieren zu können. Was genau beim Eintreffen eines Ereignisses geschieht, wird ausschließlich im Core festgelegt. Hierbei ändert allerdings nicht der Core selbst, z.B. eine Statusbar, vielmehr weist er die GUI Komponente auf Änderungen hin, die für den Benutzer von Interesse sind, oder die seine Aufmerksamkeit/seinen Input benötigen. \subsection{Graphical User Interface} @@ -24,7 +24,7 @@ \subsection{Graphical User Interface} Funktionalitäten. % Persistence NICHT Database Persistence, es ist nicht festgelegt dass wir eine Datenbank verwenden ~simon -\subsection{Persistence} +\subsection{Persistence} Die Persistence Komponente abstrahiert den Zugriff auf die Daten, die für den Betrieb gespeichert werden müssen. Diese umschließen nicht die Dateien. Es wird das Konzept des Data Hiding umgesetzt, wodurch erreicht werden kann, dass die anderen Komponenten nur auf definierte Weise die Daten verwenden. Für die Speicherung der Daten kann eine relationale Datenbank verwendet werden. \subsection{Synchronisation Services} @@ -33,9 +33,9 @@ \subsection{Synchronisation Services} \subsection{File System Services} Die File System Services kapselt den Zugriff auf Dateien im Dateisystem. Außerdem kann diese Komponente durch entsprechende Strategien feststellen, ob Dateien geändert wurden oder in die Projektordnerstruktur kopiert wurden und dies dem Core mitteilen, welcher wiederum entsprechende Aktionen veranlasst. -\subsection{Interclient Communication Service} -Der Interclient Communication Service kapselt die vollständige Kommunikation zwischen den Clients (über das Netzwerk) und gibt die entsprechenden Nachrichten an den Core weiter. So ist es leicht möglich, verschiedene Netzwerk-backends (z.B. XMPP oder RMI) zu unterstützen, welche für den Core und somit für den Benutzer transparent sind. Außerdem wird die Authentifizierung der Nutzer in dieser Komponente durchgeführt, was es erlaubt, die Anwendung unter anderem an verschiedenste Authentifizierungssysteme anzubinden. +\subsection{Interclient Communication Service} +Der Interclient Communication Service kapselt die vollständige Kommunikation zwischen den Clients (über das Netzwerk) und gibt die entsprechenden Nachrichten an den Core weiter. So ist es leicht möglich, verschiedene Netzwerk-backends (z.B. XMPP oder RMI) zu unterstützen, welche für den Core und somit für den Benutzer transparent sind. Außerdem wird die Authentifizierung der Nutzer in dieser Komponente durchgeführt, was es erlaubt, die Anwendung unter anderem an verschiedenste Authentifizierungssysteme anzubinden. \subsection{Schnittstelle GUI - Core} -Die grafische Benutzeroberfläche greift auf eine Schnittstelle des Core's zu. Diese Schnittstelle stellt alle notwendigen Funktionen zur Verfügung um die Elemente der grafischen Benutzeroberfläche mit Inhalten zu füllen. Außerdem ruft die GUI beim vom Benutzer ausgelösten Events (z.B. das drücken einer Schaltfläche) die Funktion mit der entsprechenden Logik im Core auf. +Die grafische Benutzeroberfläche greift auf eine Schnittstelle des Core's zu. Diese Schnittstelle stellt alle notwendigen Funktionen zur Verfügung um die Elemente der grafischen Benutzeroberfläche mit Inhalten zu füllen. Außerdem ruft die GUI beim vom Benutzer ausgelösten Events (z.B. das drücken einer Schaltfläche) die Funktion mit der entsprechenden Logik im Core auf. diff --git a/documentation/projektauftrag/ase/07_wbs.tex b/documentation/projektauftrag/ase/07_wbs.tex index c9b1a3da..08ae4247 100644 --- a/documentation/projektauftrag/ase/07_wbs.tex +++ b/documentation/projektauftrag/ase/07_wbs.tex @@ -2,5 +2,5 @@ \section{Arbeitsprogramm, Work Breakdown Structure} -Es gibt keine Work Breakdown Structure, da wir keinen klassischen, sondern +Es gibt keine Work Breakdown Structure, da wir keinen klassischen, sondern agilen Softwareentwicklungsprozess betreiben. diff --git a/documentation/projektauftrag/ase/08_projektabgrenzung.tex b/documentation/projektauftrag/ase/08_projektabgrenzung.tex index bd2f8e3e..6d5ec376 100644 --- a/documentation/projektauftrag/ase/08_projektabgrenzung.tex +++ b/documentation/projektauftrag/ase/08_projektabgrenzung.tex @@ -1,9 +1,9 @@ -% Dieser Teil korrespondiert mit der Projektbeschreibung. +% Dieser Teil korrespondiert mit der Projektbeschreibung. % Er legt fest was unser Projekt nicht ist, und was daher auch nicht implementiert wird. \section{Projektabgrenzung} \begin{itemize} - \item Im Rahmen der Laborübung ASE wird nur die zweite Phase laut Projektbeschreibung implementiert. + \item Im Rahmen der Laborübung ASE wird nur die zweite Phase laut Projektbeschreibung implementiert. \item Es ist nicht möglich, in Echtzeit gleichzeitig an einem Dokument zu arbeiten (wie etwa in Gobby oder Google Apps). \item Es soll kein SCM oder Versionsmanagement implementiert werden. Alte Versionen von Dateien werden nicht behalten und sind daher auch nicht wiederherstellbar. \item Da der Fokus auf Nutzungsumgebungen liegt, die primär binäre, beziehungweise proprietäre Formate verwenden, soll kein automatisches Mergen (etwa von Textdateien) implementiert werden. diff --git a/documentation/projektauftrag/ase/10_dokumentation.tex b/documentation/projektauftrag/ase/10_dokumentation.tex index 9d2a2d3c..62037b2f 100644 --- a/documentation/projektauftrag/ase/10_dokumentation.tex +++ b/documentation/projektauftrag/ase/10_dokumentation.tex @@ -5,20 +5,20 @@ \section{Informationswesen/Dokumentation} \subsection{Interne Kommunikation} Zur internen Kommunikation wird ein eigens eingerichtetes Wikisystem verwendet. -Ankündigungen und wichtige Mitteilungen werden über eine Mailingliste verteilt. -Die gesamte Projektgruppe trifft sich etwa einmal pro Woche zu einem ein- bis eineinhalbstündigen Meeting. -Die Agenda für die Meetings wird zuvor im Wiki bekanntgegeben und kann dort diskutiert werden. +Ankündigungen und wichtige Mitteilungen werden über eine Mailingliste verteilt. +Die gesamte Projektgruppe trifft sich etwa einmal pro Woche zu einem ein- bis eineinhalbstündigen Meeting. +Die Agenda für die Meetings wird zuvor im Wiki bekanntgegeben und kann dort diskutiert werden. \subsection{Externe Kommunikation} Die externe Kommunikation wird während der Übung über regelmäßig stattfindende Review-Meetings sowie über Email-Kommunikation mit unserem Tutor und Assistenten geführt. \subsection{Organisatorische Dokumentation} -Die organisatorische Dokumentation des Projekts wird über das Wiki abgewickelt. +Die organisatorische Dokumentation des Projekts wird über das Wiki abgewickelt. Protokolle, Stundenlisten, etc. werden während der Dauer der Übung laufend aktualisiert. \subsection{Technische Dokumentation} -Die gesamte technische Dokumentation und Spezifikation wird über Maven abgewickelt. -Dies umfasst Dokumente der technischen Planung, Dokumente der Anforderungsspezifikation, +Die gesamte technische Dokumentation und Spezifikation wird über Maven abgewickelt. +Dies umfasst Dokumente der technischen Planung, Dokumente der Anforderungsspezifikation, Dokumente der Qualitätssicherung, Dokumentation auf Codeebene, Endbenutzer-Dokumente, etc. Sämtliche technischen Spezifikationen werden in Englisch verfasst. diff --git a/documentation/projektvorschlag/content.tex b/documentation/projektvorschlag/content.tex index 9e9bd6e3..f8fd3aee 100644 --- a/documentation/projektvorschlag/content.tex +++ b/documentation/projektvorschlag/content.tex @@ -1,7 +1,7 @@ \chapter{Projektvorschlag} \thispagestyle{fancy} \section{Ausgangssituation} -Zusammenarbeit im Hinblick auf gemeinsames Bearbeiten von Dateien findet bei Projektmitgliedern, die örtlich getrennt sind, oft durch Austausch der Dokumente per Email statt. Dies bedeutet umfangreiche Mailarchive mit vielfacher Speicherung der Dateien. Die Verwaltung von Dateien unterschiedlicher Versionen wird oft durch simple Kopien gelöst. +Zusammenarbeit im Hinblick auf gemeinsames Bearbeiten von Dateien findet bei Projektmitgliedern, die örtlich getrennt sind, oft durch Austausch der Dokumente per Email statt. Dies bedeutet umfangreiche Mailarchive mit vielfacher Speicherung der Dateien. Die Verwaltung von Dateien unterschiedlicher Versionen wird oft durch simple Kopien gelöst. In Software-Projekten werden zentrale SCM (Source Code Management)-Server verwendet, über die hauptsächlich Text-Dateien versioniert werden. Dies ist in anderen Branchen eher untypisch. Der SCM-Server muss vom Internet erreichbar sein und verlangt technische Kenntnisse. Ist der zentrale Server nicht unter eigener Verwaltung, besteht ein Datensicherheitsrisiko. @@ -15,19 +15,19 @@ \section{Projektbeschreibung} Dieses Projekt soll den Grundstein für eine Plattform legen, die es erlaubt, über ein Netzwerk (z.B. das Internet) gemeinsam an Dateien beliebigen Formats zu arbeiten. Es soll ein Fat Client entwickelt werden, der alle Funktionen der Synchronisationsschnittstelle benutzt, die Implementierung der Netzwerk- und Synchronisationsservices ist aber erst in darauf folgenden Ausbauphasen in Form eigenständiger Projekte geplant. Änderungen an Dateien sollen vom Programm erkannt werden und mit Hilfe der Synchronisations- und Netzwerkservices an andere User propagiert werden. In diesem Projekt soll nur die unten beschrieben Phase 1 realisiert werden. \section{Zielgruppe/Scope} -Personen, die geringe bis mittlere Computererfahrung haben und in Projekten Dateien verschiedener Formate austauschen und zusammen bearbeiten möchten. +Personen, die geringe bis mittlere Computererfahrung haben und in Projekten Dateien verschiedener Formate austauschen und zusammen bearbeiten möchten. \subsubsection{Modellszenario} -Eine Projektgruppe, deren 3-12 Mitglieder auf verschiedenen Rechnern arbeiten, die vorwiegend online sind und gemeinsam 5-100 Dateien benutzen. Eine einzelne Datei wird dabei meist nur gleichzeitig von einem Benutzer bearbeitet. +Eine Projektgruppe, deren 3-12 Mitglieder auf verschiedenen Rechnern arbeiten, die vorwiegend online sind und gemeinsam 5-100 Dateien benutzen. Eine einzelne Datei wird dabei meist nur gleichzeitig von einem Benutzer bearbeitet. -Dieses Modellszenario könnte in kleinere Firmenprojekten oder in studentischen Projekten (eventuell neben einem SCM) Anwendung finden. Etwa Architekten, die in Projektordnern Formate wie Autocad und Word-Dokumente verwenden, aber in verschiedenen Standorten, z.B. Wien und Abu Dhabi verteilt sind. +Dieses Modellszenario könnte in kleinere Firmenprojekten oder in studentischen Projekten (eventuell neben einem SCM) Anwendung finden. Etwa Architekten, die in Projektordnern Formate wie Autocad und Word-Dokumente verwenden, aber in verschiedenen Standorten, z.B. Wien und Abu Dhabi verteilt sind. \section{Eingrenzung/Phased Release} \subsection{Phase 1, Fat Client} -In dieser Phase wird das Programm als Fat Client erstellt, dessen grafischen Oberfläche die vollständige Nutzbarkeit der unten aufgeführten Features benutzbar macht. +In dieser Phase wird das Programm als Fat Client erstellt, dessen grafischen Oberfläche die vollständige Nutzbarkeit der unten aufgeführten Features benutzbar macht. Die Netzwerkkommunikation zwischen verschiedenen Clients soll mithilfe eines Mock-Service simuliert werden. Dieser Service wird in dieser Phase die Zusammenarbeit mit anderen Clients simulieren, wodurch die Funktionalität des Programmes getestet werden kann. Neben diesem Mock-Service, welches die Netzwerkservices der Anwendung kapselt, wird zusätzlich noch ein Synchronisationsinterface erstellt, welches es erlaubt, den Vorgang der Synchronisation zwischen den Clients, auf verschiedene Weisen zu implementieren. -Die Synchronisation soll in dieser Phase ebenfalls mithilfe eines Mock-Services realisiert werden. Die Netzwerk- und Synchronisations-Mock-Services können dann in möglichen späteren Projektphasen durch entsprechende Implementierungen (z.B. XMPP für das Netzwerkservice) ersetzt werden. Die für die Synchronisation notwendigen Elemente der Benutzeroberfläche sollen aber bereits in dieser Phase erstellt und an die entsprechenden Schnittstellen gebunden werden. +Die Synchronisation soll in dieser Phase ebenfalls mithilfe eines Mock-Services realisiert werden. Die Netzwerk- und Synchronisations-Mock-Services können dann in möglichen späteren Projektphasen durch entsprechende Implementierungen (z.B. XMPP für das Netzwerkservice) ersetzt werden. Die für die Synchronisation notwendigen Elemente der Benutzeroberfläche sollen aber bereits in dieser Phase erstellt und an die entsprechenden Schnittstellen gebunden werden. \subsubsection{Aufgaben des Networkservice} Authentifizierung der Benutzer @@ -81,7 +81,7 @@ \section{Featureliste} \hline 3 & Es ist ersichtlich, wer welche Dienste freigibt und wer die freigegeben Dienste im Moment mitbenutzt. & Muss\\ \hline -\end{tabular} +\end{tabular} \section{Domänenmodell} \includegraphics[width=0.97\textwidth]{../uml/domain_model.png} diff --git a/documentation/reviews/code/review_technische_struktur.odt b/documentation/reviews/code/review_technische_struktur.odt index 84b25a8e..1c751e5b 100644 Binary files a/documentation/reviews/code/review_technische_struktur.odt and b/documentation/reviews/code/review_technische_struktur.odt differ diff --git a/documentation/specification/include/srs.tex b/documentation/specification/include/srs.tex index 6dd3aa60..c338645c 100644 --- a/documentation/specification/include/srs.tex +++ b/documentation/specification/include/srs.tex @@ -35,8 +35,8 @@ \section{Terms and Definitions} % directed graph!!! \item[member list] The member list is a set(unordered, unique) of \emph{project members} a user explicitly trusts. % unclear, what exactly is the explicit relation -\item[explicit trust relation] the \emph{explicit trust relation} ($Alice \sim Bob$) holds true, if $Alice$ explicitly trusts $Bob$. It is a neither transitive ($\exists a, b, c: a \sim b \wedge b \sim c \not\Rightarrow a \sim c$) nor symmetric ($\exists a, b: a \sim b \not\Rightarrow b \sim a$) relation. -\item[transitive trust relation] The \emph{transitive trust relation}($Alice \sim ^+ Bob$) holds true, if there exists a directed \emph{path} ($Alice \sim ^+ Bob : \Leftrightarrow \exists a_1, a_2, .., a_i: Alice \sim a_1 \sim ..\sim a_i \sim Bob$, i.e. the transitive hull) from $Alice$ to $Bob$. It is a transitive ($a \sim ^+ b \wedge b \sim ^+ c \Rightarrow a \sim ^+ c$) but not symmetric ($\exists a, b: a \sim ^+ b \wedge b \not\sim ^+ a$) relation. +\item[explicit trust relation] the \emph{explicit trust relation} ($Alice \sim Bob$) holds true, if $Alice$ explicitly trusts $Bob$. It is a neither transitive ($\exists a, b, c: a \sim b \wedge b \sim c \not\Rightarrow a \sim c$) nor symmetric ($\exists a, b: a \sim b \not\Rightarrow b \sim a$) relation. +\item[transitive trust relation] The \emph{transitive trust relation}($Alice \sim ^+ Bob$) holds true, if there exists a directed \emph{path} ($Alice \sim ^+ Bob : \Leftrightarrow \exists a_1, a_2, .., a_i: Alice \sim a_1 \sim ..\sim a_i \sim Bob$, i.e. the transitive hull) from $Alice$ to $Bob$. It is a transitive ($a \sim ^+ b \wedge b \sim ^+ c \Rightarrow a \sim ^+ c$) but not symmetric ($\exists a, b: a \sim ^+ b \wedge b \not\sim ^+ a$) relation. \item[neighborhood of project member $\mathbf{a_0}$] All project members that $a_0$ explicit trusts: $\{a_i: a_0 \sim ^ a_i\}$ \item[directed project graph] All project members along with their explicit trust relations form the directed project graph \item[web of trust] in a web of trust each member of the web trusts each other member. @@ -60,30 +60,30 @@ \subsubsection{Deleting a project} Projects may be deleted within Jake. If a project is deleted all files relating to this project MUST be either deleted from the file system or moved to the OS trash folder, whereas the latter method SHOULD be preferred. The user MUST be prompted to review the deletion and be either approve or decline it. The consequences of this operation MUST be clearly conveyed to the user. \subsection{Manage Files} -In Jake all files (i.e. \emph{local} and {project files}) are organized hierarchically in folders. New folders may be created within Jake. Files and folders may be moved within the project folder or be deleted from it. If a file/folder is deleted from the project folder, it MAY either be moved to the OS trash or to a dedicated trash folder inside the project folder. One of this options MUST be chosen for a concrete implementation. If the file/folder is moved to a dedicated trash folder, this trash folder MUST be hidden from the user within Jake, but the user MUST BE able to examine its contents, restore files/folders and empty it. +In Jake all files (i.e. \emph{local} and {project files}) are organized hierarchically in folders. New folders may be created within Jake. Files and folders may be moved within the project folder or be deleted from it. If a file/folder is deleted from the project folder, it MAY either be moved to the OS trash or to a dedicated trash folder inside the project folder. One of this options MUST be chosen for a concrete implementation. If the file/folder is moved to a dedicated trash folder, this trash folder MUST be hidden from the user within Jake, but the user MUST BE able to examine its contents, restore files/folders and empty it. -Files may be added to the project either by moving them into the project folder via the file system or by \emph{importing} them in Jake. These files are \emph{local files} as long as they are not announced. +Files may be added to the project either by moving them into the project folder via the file system or by \emph{importing} them in Jake. These files are \emph{local files} as long as they are not announced. Changes in the \emph{project folder} MUST be reflected in the application within an acceptable latency. -\emph{Local files} MAY violate filename constraints (length, illegal characters), \emph{project files} MUST NOT. If a filename violates filename contraints the file name MAY be altered in order to conform with the constraints. This SHOULD happen transparently and obvious to the user (i.e. Übung 1.pdf $\rightarrow$ Uebung\_1.pdf). If filenames are changed, the user MUST be prompted to review the change. He/she may either approve or decline the change. +\emph{Local files} MAY violate filename constraints (length, illegal characters), \emph{project files} MUST NOT. If a filename violates filename contraints the file name MAY be altered in order to conform with the constraints. This SHOULD happen transparently and obvious to the user (i.e. Übung 1.pdf $\rightarrow$ Uebung\_1.pdf). If filenames are changed, the user MUST be prompted to review the change. He/she may either approve or decline the change. Batch operations MUST be provided where applicable. Cached files from the operating system (e.g. \texttt{.DS\_STORE}, \texttt{thumbs.db}, \texttt{\_\_MACOSX}, \texttt{.trash} etc.) MUST NOT be part of a project and are therefore hidden from the user. \subsubsection{Announcing Files/Notes} -Only \emph{project files/notes} are shared among the \emph{project members}. In order to contribute a \emph{local file/note} to the project it must be \emph{announced}. +Only \emph{project files/notes} are shared among the \emph{project members}. In order to contribute a \emph{local file/note} to the project it must be \emph{announced}. -Changes or new files/notes do not affect the project unless announced. +Changes or new files/notes do not affect the project unless announced. If the user announces a file/note (or changes to it) he/she may specify an \emph{announce message} to provide additional informations for other project members about the modification/new file. In order to delete a file/note from the project the delete operation is announced to the other project members. \subsection{Manage Notes} -In Jake, a \emph{note} is associated generally with a project. Both \emph{local} and \emph{project notes} exist, where \emph{local notes} are notes that are not shared. They are NOT hierarchically ordered and reside in one common location within Jake. Notes are only accessible through Jake. Notes may be created, displayed, modified and deleted. -A note consists only of a \emph{body}. The first line of a note SHOULD be emphasized. The length of the note MAY be limited. +In Jake, a \emph{note} is associated generally with a project. Both \emph{local} and \emph{project notes} exist, where \emph{local notes} are notes that are not shared. They are NOT hierarchically ordered and reside in one common location within Jake. Notes are only accessible through Jake. Notes may be created, displayed, modified and deleted. +A note consists only of a \emph{body}. The first line of a note SHOULD be emphasized. The length of the note MAY be limited. Announcing notes works analogous to files. @@ -95,11 +95,11 @@ \subsection{Project Members and the Web of Trust} All project members in a project along with their \emph{explicit trust relation} form the directed \emph{project graph}. The \emph{explicit trust relations} are represented by the edges and the project members are represented by the nodes. -Each project member has a set of project members that he explicitly trusts. It is called the \emph{member list}. +Each project member has a set of project members that he explicitly trusts. It is called the \emph{member list}. \textbf{the web of trust section will be reformulated shortly} -% connectivity, directed, etc... -% Every connected \emph{project graph} (or connected subgraph) represents a \emph{web of trust}. In Jake, every participant in this web of trust may receive and send files from/to any other participant in the web, either directly or indirectly. +% connectivity, directed, etc... +% Every connected \emph{project graph} (or connected subgraph) represents a \emph{web of trust}. In Jake, every participant in this web of trust may receive and send files from/to any other participant in the web, either directly or indirectly. In general the \emph{project graph} is not complete. @@ -109,25 +109,25 @@ \subsubsection{Adding and Removing Users} Removing project members is not easy. A project member may only be completely removed from a project if he/she is not connected to the project graph anymore. This means, no other user has an \emph{explicit trust relation} to that user ($\not\exists a_i: a_i \sim ^+ a_0$) -For Example: $Alice \sim ^+ Bob$, $Bob \sim ^+ Eve$ and $Alice \sim ^+ Eve$. If Alice removes Eve from her \emph{member list} Eve still remains a project member, as long as there is at least one project member that trusts Eve ($\exists a_i: a_i \sim ^+ Eve$). Users SHOULD be made aware of the web of trust and its implications. +For Example: $Alice \sim ^+ Bob$, $Bob \sim ^+ Eve$ and $Alice \sim ^+ Eve$. If Alice removes Eve from her \emph{member list} Eve still remains a project member, as long as there is at least one project member that trusts Eve ($\exists a_i: a_i \sim ^+ Eve$). Users SHOULD be made aware of the web of trust and its implications. \subsubsection{Global Member List} -Jake MUST provide a \emph{global member list}. This list contains all project members of the project, i.e. all project members that are connected to the project member who creates the list. This list MUST be created with best effort, it is not reliable. This fact MUST be clearly communicated to the user. +Jake MUST provide a \emph{global member list}. This list contains all project members of the project, i.e. all project members that are connected to the project member who creates the list. This list MUST be created with best effort, it is not reliable. This fact MUST be clearly communicated to the user. \subsubsection{Add/Remove Member Alert} -A project member SHOULD be alerted if someone in the project adds or removes a member. Best effort, non reliable. +A project member SHOULD be alerted if someone in the project adds or removes a member. Best effort, non reliable. \subsection{Auto Add/Remove} -A project member may set an \emph{auto add/remove flag} at every project member in his/her member list (written as $\sim ^\pm$). Lets make things clear with a short example: $Alice \sim ^\pm Bob$. If Bob adds Carol Alice automatically adds Carol as well. If Bob removes Carol from his list Alice does that as well. The following problem may occur when removing project members: $Alice \sim ^\pm Bob$, $Alice \sim ^\pm Carol$, $Bob \sim Eve$ and $Carol \sim Eve$. Now Bob removes Eve from his member list. In that case Alice does not remove Eve. +A project member may set an \emph{auto add/remove flag} at every project member in his/her member list (written as $\sim ^\pm$). Lets make things clear with a short example: $Alice \sim ^\pm Bob$. If Bob adds Carol Alice automatically adds Carol as well. If Bob removes Carol from his list Alice does that as well. The following problem may occur when removing project members: $Alice \sim ^\pm Bob$, $Alice \sim ^\pm Carol$, $Bob \sim Eve$ and $Carol \sim Eve$. Now Bob removes Eve from his member list. In that case Alice does not remove Eve. -\emph{Auto add} is always stronger than \emph{auto remove}. Alice does not remove Eve unless Carol removes Eve and therefore no \emph{auto add} relations persist. +\emph{Auto add} is always stronger than \emph{auto remove}. Alice does not remove Eve unless Carol removes Eve and therefore no \emph{auto add} relations persist. The \emph{auto add/remove relation} ($a \sim ^\pm b$) is transitive ($a \sim ^\pm b \wedge b\sim ^\pm c \Rightarrow a \sim ^\pm c$) but not symmetric ($a \sim ^\pm b \not\Rightarrow b \sim ^\pm a$) \subsection{Sharing and Synchronization} A peer only communicates with other peers from the same project. A peer MUST only download files/notes from peers that are in its \emph{member list}. A peer MUST know which files are available from the peers in the \emph{member list} and offer this list to the user. -Folders are not synchronized explicitly. The user may not synchronize empty folders. Folders are only synchronized if they are needed by the contained files. (e.g if a file \texttt{foo/bar.txt} is created and synchronized, the folder \texttt{foo/} will be created to contain the file \texttt{bar.txt}. Empty folders MUST NOT be deleted automatically. +Folders are not synchronized explicitly. The user may not synchronize empty folders. Folders are only synchronized if they are needed by the contained files. (e.g if a file \texttt{foo/bar.txt} is created and synchronized, the folder \texttt{foo/} will be created to contain the file \texttt{bar.txt}. Empty folders MUST NOT be deleted automatically. A peer SHOULD always deliver any file/note to another peer in the project if requested. It MUST provide information about the available files to other peers from the project. It MUST NOT deliver any data to peers that are not in the project (at the time of the request, as far as the peer knows) @@ -151,7 +151,7 @@ \subsubsection{Conflict Resolution} Resolving conflicts in notes is limited to choosing one version or resolving the conflict later. \subsubsection{Soft Lock} -A file or note may be \emph{soft locked}. A \emph{soft lock} consists of a \emph{locking message}. This \emph{locking message} MAY be limited in length. Every user may append, modify or delete a soft lock. +A file or note may be \emph{soft locked}. A \emph{soft lock} consists of a \emph{locking message}. This \emph{locking message} MAY be limited in length. Every user may append, modify or delete a soft lock. Whenever an action is to be performed on a locked file or note that may change the file/note, the user MUST be prompted to review this operation and either decline or approve it. The locking message MUST be displayed along the prompt. @@ -161,12 +161,12 @@ \subsection{Application Start} Jake may be started without any project loaded and without being logged in. In this case, new projects may be created, the user may create a new jabber account, the user may login into the network or receive invitations to projects (requires login) \subsection{Pause/Resume a Project} -Projects may be paused and resumed. If a project is paused, changes MUST NOT be synchronized with other project members, changes to the project folder in the file system MUST NOT be monitored. The user may not work on a paused projects in Jake (no adding, no changing, no announcing, no browsing, no whatever...). The user may delete a paused project. +Projects may be paused and resumed. If a project is paused, changes MUST NOT be synchronized with other project members, changes to the project folder in the file system MUST NOT be monitored. The user may not work on a paused projects in Jake (no adding, no changing, no announcing, no browsing, no whatever...). The user may delete a paused project. Paused projects may be resumed at any time. \subsection{Open/Close a Project} -Projects may be opened and closed. As in other applications a project must be opened in order work on it. Jake is not aware of closed projects, as if the project never existed. +Projects may be opened and closed. As in other applications a project must be opened in order work on it. Jake is not aware of closed projects, as if the project never existed. \subsection{log in/out} The user may log on/off to/from the network service (XMPP in that case). @@ -189,10 +189,10 @@ \subsection{General Constraints} Jake MAY enforce additional constraints on strings if necessary. Though these constraints SHOULD affect the user as little as possible (replacing illegal characters in file names with '\_' is ok, only allowing \texttt{[a-zA-Z]} is not!) \subsubsection{Exceptions} -Jake MUST be able to tackle exceptions like \texttt{not enough disk space}, \texttt{no read/write access to file}, missing config files and things alike in a convenient manner. +Jake MUST be able to tackle exceptions like \texttt{not enough disk space}, \texttt{no read/write access to file}, missing config files and things alike in a convenient manner. \subsection{Error Messages} -Jakes error messages should be simple, clear and easy to understand. Problems should be described from a user's perspective and SHOULD NOT use terms and models that lie outside the user context (i.e. ''Network Error: could not open port 666''). If the user wants additional technical information it SHOULD be presented along the error message. +Jakes error messages should be simple, clear and easy to understand. Problems should be described from a user's perspective and SHOULD NOT use terms and models that lie outside the user context (i.e. ''Network Error: could not open port 666''). If the user wants additional technical information it SHOULD be presented along the error message. \subsection{Log Files} Jake MUST provide log files for files, notes and the whole project. A Log file is a chronological list that contains operations performed, the user who caused the operations, when the operation happened and which parts of the project have been influenced. It MAY also contain additional information. Compilation of a log is best effort, non reliable. @@ -206,14 +206,14 @@ \subsubsection{Rev. 2, 2008-11-15, Simon Wallner} Updated the SRS according the results of the SRS feedback meeting. Some parts are still unclear \subsubsection{Rev. 3, 2008-11-19, Simon Wallner} -Updated the SRS according the last meetings and feedback. The following has changed: +Updated the SRS according the last meetings and feedback. The following has changed: \begin{itemize} \item tags for notes are now OPTIONAL \item added option for saving conflicting files to another location \item fixed some typos \item clarified the definition of \emph{transitive trust relation}, changed the notation from $\sim ^*$ to $\sim ^+$. It might be more easily mistaken for the \emph{auto add/remove relation} but it is now consistent with the transitive hull syntax used in wikipedia. -\item note MUST always be downloaded if available, aka autopull notes +\item note MUST always be downloaded if available, aka autopull notes \end{itemize} Some points are still unclear: \begin{itemize} diff --git a/documentation/specification/include/use_cases.tex b/documentation/specification/include/use_cases.tex index af6a1b91..89928248 100644 --- a/documentation/specification/include/use_cases.tex +++ b/documentation/specification/include/use_cases.tex @@ -22,18 +22,18 @@ \part{Use Cases} \subsection{\ucid: \ucname} \begin{tabular}{|p{3.3cm}|p{12cm}|} \hline -ID & \ucid \\ -\hline +ID & \ucid \\ +\hline Name & \ucname \\ \hline Scope & \ucscope \\ \hline -%Status & \ucstatus \\ -%\hline -Summary & \ucsummary \\ +%Status & \ucstatus \\ +%\hline +Summary & \ucsummary \\ +\hline +Goal/Rationale & \ucrationale \\ \hline -Goal/Rationale & \ucrationale \\ -\hline Preconditions & \ucpreconditions \\ \hline Triggers & \uctriggers \\ @@ -58,7 +58,7 @@ \section{Terms and definitions, Fields} \item[ID] Unique \emph{ID} of the use case. Once set, it is immutable. \item[Name] Descriptive name of the use case. It should be short yet long enough to describe the use case. -\item[Scope] The scope of the use case, e.g \emph{per project, per file, etc}. The scope may be chained together like \emph{per project: per file}. +\item[Scope] The scope of the use case, e.g \emph{per project, per file, etc}. The scope may be chained together like \emph{per project: per file}. \item[Summary] Short summary of the use case. \item[Goal/Rationale] The \emph{goal} and the \emph{rationale} of the use case. What's its goal and why does it matter to the user. \item[Preconditions] Preconditions of the use case that must be met in order to perform this use case. @@ -67,7 +67,7 @@ \section{Terms and definitions, Fields} \item[Alternative Path] Deviating paths from the basic course of events. \item[Postconditions] Conditions that must be met after the use case has been executed. \item[Frequency of use] How often the use case will be used. This field is based on a wild guess and is usually something like, \emph{daily, weekly, monthly, etc}. -\item[See also] References to other use cases or other related information, e.g. \emph{log in} refers to \emph{log out} and vice versa. +\item[See also] References to other use cases or other related information, e.g. \emph{log in} refers to \emph{log out} and vice versa. \end{description} \section{General} @@ -167,7 +167,7 @@ \section{Project Management} \def\ucprimaryscenario{ \begin{enumerate} \item The user chooses to create a new project. -\item The user specifies a local project folder (which may, but doesn't have to, already exist) and a project name. +\item The user specifies a local project folder (which may, but doesn't have to, already exist) and a project name. \item The project is created and added to the list of active projects. \item Any files which already exist in the local folder become local files of this project. \end{enumerate} @@ -190,7 +190,7 @@ \section{Project Management} \def\uctriggers{An invitation is received (passive)} \def\ucprimaryscenario{ \begin{enumerate} -\item An invitation to a project from another Jake user is received. +\item An invitation to a project from another Jake user is received. \item The user is asked to accept/deny the invitation. \item The user selects a target directory for the new project. \item The project folder is created. @@ -718,7 +718,7 @@ \section{File Management - Local/Offline Operations} \def\ucprimaryscenario{ \begin{enumerate} \item The user selects a tagged file. -\item The user chooses to remove a tag from the file.~ +\item The user chooses to remove a tag from the file.~ \item The tag is removed from the file. \item The tag change is announced to other project members. \end{enumerate} diff --git a/documentation/templates/latex-template/main.tex b/documentation/templates/latex-template/main.tex index f5a232b3..8b9a9359 100755 --- a/documentation/templates/latex-template/main.tex +++ b/documentation/templates/latex-template/main.tex @@ -46,7 +46,7 @@ \def\sepmstart{ \begin{document} -\title{ \sepmdocumentname } +\title{ \sepmdocumentname } \author{\sepmauthors} \pagestyle{fancy} \lhead{\sepmlva} diff --git a/documentation/uml/use_case_2_class_diagram_mapping.txt b/documentation/uml/use_case_2_class_diagram_mapping.txt index 7f0478f8..3c98fc65 100644 --- a/documentation/uml/use_case_2_class_diagram_mapping.txt +++ b/documentation/uml/use_case_2_class_diagram_mapping.txt @@ -11,7 +11,7 @@ Abdeckung der Use Cases durch das IJakeGuiAccess: * [UC-01:04] manage object tags getTags() - JakeObject.getTags(), + JakeObject.getTags(), JakeObject.addTag(), JakeObject.removeTag() @@ -20,13 +20,13 @@ Abdeckung der Use Cases durch das IJakeGuiAccess: * [UC-01:05] delete object JakeObject.delete() - * [UC-01:06] synchronize project IJakeGuiAccess.logSync(), - IJakeGuiAccess.pullObjects(), + * [UC-01:06] synchronize project IJakeGuiAccess.logSync(), + IJakeGuiAccess.pullObjects(), IJakeGuiAccess.pushObjects() - * [UC-01:07] set object synchronization mode setAutoLogSync(), - setAutoObjectPush(), + * [UC-01:07] set object synchronization mode setAutoLogSync(), + setAutoObjectPush(), setAutoObjectPull() @@ -50,7 +50,7 @@ Abdeckung der Use Cases durch das IJakeGuiAccess: ProjectInvitation().decline(), IJakeGuiAccess.getProjectInvitation() - - [UC-02:05] removed + - [UC-02:05] removed * [UC-02:06] Add local comment to a project member ProjectMember.setComment(), @@ -60,7 +60,7 @@ Abdeckung der Use Cases durch das IJakeGuiAccess: [UC-03] Manage Project - * [UC-03:01] Create new Project IJakeGuiAccess.createProject(), + * [UC-03:01] Create new Project IJakeGuiAccess.createProject(), IJakeGuiAccess.getProject - [UC-03:02] removed - [UC-03:03] removed @@ -78,13 +78,13 @@ Abdeckung der Use Cases durch das IJakeGuiAccess: * [UC-04:08] Set automatic object push Project.setAutoObjectPush() * [UC-04:09] Set automatic object pull Project.setAutoObjectPull() - * [UC-04:10] Resolve version conflicts + * [UC-04:10] Resolve version conflicts * [UC-04:11] View Log IJakeGuiAccess.getLog() * [UC-04:12] Notify User of received message IJakeGuiAccess.registerReceiveMessageCallback() * [UC-04:13] Read incomming message IJakeGuiAccess.getNewMessages() - * [UC-04:14] Write message to project member ProjectMember.leaveMessage() + * [UC-04:14] Write message to project member ProjectMember.leaveMessage() UC-05: * [UC-05:01] Set authentication Information IJakeGuiAccess.setConfigOption() diff --git a/gui/src/main/java/com/jakeapp/gui/swing/ICoreAccess.java b/gui/src/main/java/com/jakeapp/gui/swing/ICoreAccess.java index 2e8dc01c..a043bbdc 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/ICoreAccess.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/ICoreAccess.java @@ -600,7 +600,7 @@ public List> getLog(Project project, * @return */ Account getPredefinedServiceCredential(String s); - + /** * register a file modification listener for a certain project. * @param project the project to listen to @@ -611,10 +611,10 @@ public List> getLog(Project project, /** * launch the file * @param fo - * @throws IOException - * @throws LaunchException - * @throws InvalidFilenameException - * @throws IllegalArgumentException + * @throws IOException + * @throws LaunchException + * @throws InvalidFilenameException + * @throws IllegalArgumentException */ public void launch(FileObject fo) throws IllegalArgumentException, InvalidFilenameException, LaunchException, IOException; } \ No newline at end of file diff --git a/gui/src/main/java/com/jakeapp/gui/swing/JakeMainApp.java b/gui/src/main/java/com/jakeapp/gui/swing/JakeMainApp.java index 0d6712e7..58f74d9a 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/JakeMainApp.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/JakeMainApp.java @@ -127,7 +127,7 @@ private static void macMenuSetup() { System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Jake"); installMacScrollbars(); } - + private static void lookAndFeelSetup(String[] args) { /** * Laf detection code - get the best for every system! diff --git a/gui/src/main/java/com/jakeapp/gui/swing/SpringCoreAccessImpl.java b/gui/src/main/java/com/jakeapp/gui/swing/SpringCoreAccessImpl.java index 49aef752..062a468a 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/SpringCoreAccessImpl.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/SpringCoreAccessImpl.java @@ -442,7 +442,7 @@ public Attributed getAttributed(T jakeObject) { } // first, look if we have a recent revision in the cache - // FIXME: the cache does not respect the attributes of a jake object. If somehow only the + // FIXME: the cache does not respect the attributes of a jake object. If somehow only the // attributes are changed (e.g. commit note) but note the jake object itself, the cache // returnes the outdated attributes!!! // TODO fix the bug described above by calling {@link AttributedCacheManager#invalidateCache} diff --git a/gui/src/main/java/com/jakeapp/gui/swing/actions/file/DeleteFileAction.java b/gui/src/main/java/com/jakeapp/gui/swing/actions/file/DeleteFileAction.java index a5e58f37..b6f0f3e1 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/actions/file/DeleteFileAction.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/actions/file/DeleteFileAction.java @@ -39,7 +39,7 @@ public DeleteFileAction() { @Override public void updateAction() { super.updateAction(); - + setEnabled(isEnabled() && getSelectedRowCount() > 0); } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/actions/file/LockFileAction.java b/gui/src/main/java/com/jakeapp/gui/swing/actions/file/LockFileAction.java index a3bfc9fd..ba48a759 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/actions/file/LockFileAction.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/actions/file/LockFileAction.java @@ -68,9 +68,9 @@ public void actionPerformed(ActionEvent e) { .getAttributed(getSelectedFile()); String promptStr = this.resourceMap.getString("promptLockWithComment"); - + if (!attributedFile.isLocked()) { - + JSheet.showInputSheet(JakeContext.getFrame(), promptStr, null, new SheetListener() { @Override public void optionSelected(SheetEvent evt) { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/CommitNoteAction.java b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/CommitNoteAction.java index 6ff7352c..e73ed94b 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/CommitNoteAction.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/CommitNoteAction.java @@ -34,24 +34,24 @@ public CommitNoteAction() { @Override public void actionPerformed(ActionEvent e) { ArrayList notes; - + /* for (Attributed attributedNote : this.getSelectedNotes()) { JakeMainApp.getCore().announceJakeObject(attributedNote.getJakeObject(), null); }*/ //this.refreshNotesPanel(); - + notes = new ArrayList( Attributed.castDownCollection( Attributed.extract(this.getSelectedNotes()) ) ); - + //TODO this hack may not be neccessary at all...remove it and see if issue 35 still works. for (JakeObject jo : notes) jo.setProject(getProject()); - + JakeExecutor.exec( new AnnounceJakeObjectTask( notes, diff --git a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/CreateNoteAction.java b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/CreateNoteAction.java index dfbd6ec9..a5e34818 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/CreateNoteAction.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/CreateNoteAction.java @@ -19,7 +19,7 @@ * */ public class CreateNoteAction extends NoteAction { - + private static final long serialVersionUID = 8883731800177455307L; public CreateNoteAction() { @@ -35,16 +35,16 @@ public void actionPerformed(ActionEvent event) { NoteObject newNote = new NoteObject( NotesPanel.getInstance().getProject(), JakeMainView.getMainView().getResourceMap().getString("NewNoteDefaultContent")); - + NotesPanel.getInstance().getNotesTableModel().setNoteToSelectLater(newNote); - + JakeMainApp.getCore().createNote(newNote); JakeStatusBar.updateMessage(); //this.refreshNotesPanel(); /* int row = NotesPanel.getInstance().getNotesTableModel().getRow(newNote); if (row > -1) { - NotesPanel.getInstance().getNotesTable().changeSelection(row, 0, false, false); + NotesPanel.getInstance().getNotesTable().changeSelection(row, 0, false, false); } */ } catch (NoteOperationFailedException e) { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/DeleteNoteAction.java b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/DeleteNoteAction.java index 81c37087..9daa5f30 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/DeleteNoteAction.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/DeleteNoteAction.java @@ -52,7 +52,7 @@ public void actionPerformed(ActionEvent event) { ResourceMap map = NotesPanel.getInstance().getResourceMap(); String[] options = {map.getString("confirmDeleteNote.ok"), map.getString("genericCancel")}; String text; - + if (cache.size() == 1) { //single delete if (cache.get(0).isLocked()) { //is locked UserInfo lockOwner = JakeMainApp.getCore().getUserInfo(cache.get(0).getLockLogEntry().getMember()); @@ -82,7 +82,7 @@ public void actionPerformed(ActionEvent event) { text = map.getString("confirmDeleteNotes.text"); } } - + JSheet.showOptionSheet(NotesPanel.getInstance(), text, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0], new SheetListener() { @Override @@ -90,7 +90,7 @@ public void optionSelected(SheetEvent evt) { Collection notes; Project project = null; NoteObject toSelectAfter = getUndeletedNoteToSelectLater(cache); - + if (evt.getOption() == 0) { notes = Attributed.castDownCollection(Attributed.extract(cache)); if (notes.size()>0) { @@ -101,7 +101,7 @@ public void optionSelected(SheetEvent evt) { } }); } - + /** * Returns a note that is not in the notes to be deleted and will be still in the * Notespanel after the delete operation has deleted. diff --git a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/SaveNoteAction.java b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/SaveNoteAction.java index e53e7c29..3883e5d5 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/SaveNoteAction.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/SaveNoteAction.java @@ -14,15 +14,15 @@ import java.awt.event.ActionEvent; /** - * Note action that saves the selected note. + * Note action that saves the selected note. * @author Simon * */ public class SaveNoteAction extends NoteAction { - + private static final long serialVersionUID = 196271937528474367L; private static final Logger log = Logger.getLogger(SaveNoteAction.class); - + public SaveNoteAction() { super(); @@ -35,7 +35,7 @@ public void actionPerformed(ActionEvent event) { String newContent = NotesPanel.getInstance().getNoteReaderText(); NoteObject cachedNote = this.getSelectedNote().getJakeObject(); cachedNote.setContent(newContent); - + log.debug("saving note with new content: " + newContent); try { NotesPanel.getInstance().getNotesTableModel().setNoteToSelectLater(cachedNote); @@ -44,12 +44,12 @@ public void actionPerformed(ActionEvent event) { ExceptionUtilities.showError(e); } } - + @Override public void updateAction() { if (this.hasSelectedNotes()) { // notes are selected this.setEnabled(true); - + if(this.getSelectedNote().isLocked()) { // the file is locked if (getSelectedNote().getLockLogEntry().getMember().equals(JakeContext.getCurrentUser())) { // local user has lock diff --git a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/SoftlockNoteAction.java b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/SoftlockNoteAction.java index 38103d89..8d45e24e 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/SoftlockNoteAction.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/actions/notes/SoftlockNoteAction.java @@ -40,7 +40,7 @@ public void actionPerformed(ActionEvent ignored) { log.debug("attributed note isLocal: " + attributedNote.isOnlyLocal()); if (!attributedNote.isOnlyLocal()) { log.debug("locking note: " + attributedNote + ", setting lock to: " + cachedNewLockingState); - JakeMainApp.getCore().setSoftLock(attributedNote.getJakeObject(), cachedNewLockingState, null); + JakeMainApp.getCore().setSoftLock(attributedNote.getJakeObject(), cachedNewLockingState, null); } } } @@ -50,7 +50,7 @@ public void updateAction() { if (this.hasSelectedNotes()) { this.isLocked = this.getSelectedNote().isLocked(); log.debug("the topmost selected note isLocked: " + this.isLocked + " isOnlyLocal: " + this.getSelectedNote().isOnlyLocal()); - + if (this.getSelectedNote().isOnlyLocal()) { this.setEnabled(false); } else { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/components/JakeToolbar.java b/gui/src/main/java/com/jakeapp/gui/swing/components/JakeToolbar.java index e02f072d..661b9f69 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/components/JakeToolbar.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/components/JakeToolbar.java @@ -64,7 +64,7 @@ public TriAreaComponent createToolBar() { toolBar.addComponentToLeft(createProjectButton, 10); // Add Files - Icon addFilesIcon = ImageLoader.getScaled(jakeMainView.getClass(), + Icon addFilesIcon = ImageLoader.getScaled(jakeMainView.getClass(), "/icons/toolbar-addfiles.png", 32); JButton jCreateAddFilesButton = new JButton(jakeMainView.getResourceMap().getString("toolbarAddFiles"), addFilesIcon); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/AbstractAnimatedIcon.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/AbstractAnimatedIcon.java index 7975490c..cf93c57d 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/AbstractAnimatedIcon.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/AbstractAnimatedIcon.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -19,7 +19,7 @@ import java.lang.ref.WeakReference; /** Provide animation of auto-generated animations. Makes use of the repaint - * tracking structure established by {@link AnimatedIcon}. + * tracking structure established by {@link AnimatedIcon}. */ public abstract class AbstractAnimatedIcon extends AnimatedIcon { private static final int DEFAULT_INTERVAL = 1000/24; @@ -28,25 +28,25 @@ public abstract class AbstractAnimatedIcon extends AnimatedIcon { private int repaintInterval; private int frame; private int frameCount; - + protected AbstractAnimatedIcon() { this(0); } - + protected AbstractAnimatedIcon(int frameCount) { this(frameCount, DEFAULT_INTERVAL); } - + protected AbstractAnimatedIcon(int frameCount, int interval) { this.frameCount = frameCount; setFrameInterval(interval); } - + /** Ensure the timer stops running, so it, too can be GC'd. */ protected void finalize() { timer.stop(); } - + /** Setting a frame interval of zero stops automatic animation. */ public void setFrameInterval(int interval) { repaintInterval = interval; @@ -68,17 +68,17 @@ else if (timer != null) { public int getFrameInterval() { return repaintInterval; } - + /** Returns the total number of frames. */ public int getFrameCount() { return frameCount; } - + /** Advance to the next animation frame. */ public void nextFrame() { setFrame(getFrame() + 1); } - + /** Set the current animation frame number. */ public void setFrame(int f) { this.frame = f; @@ -86,7 +86,7 @@ public void setFrame(int f) { frame = frame % frameCount; repaint(); } - + /** Returns the current animation frame number. */ public int getFrame() { return frame; @@ -97,7 +97,7 @@ public int getFrame() { public abstract int getIconWidth(); public abstract int getIconHeight(); - + protected synchronized void registerRepaintArea(Component c, int x, int y, int w, int h) { if (timer != null && !timer.isRunning()) { timer.start(); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/AbstractComponentDecorator.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/AbstractComponentDecorator.java index deebbcca..6a1ab72d 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/AbstractComponentDecorator.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/AbstractComponentDecorator.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -28,29 +28,29 @@ import java.util.Iterator; import java.util.List; -/** Provide a method for consistently augmenting the appearance of a given +/** Provide a method for consistently augmenting the appearance of a given * component by painting something on it after the component itself * gets painted. If not explicitly removed via {@link #dispose}, an instance * of this object will live as long as its target component.

- * By default, the decorator matches the location and size of the decorated - * component, but the bounds can be adjusted by overriding + * By default, the decorator matches the location and size of the decorated + * component, but the bounds can be adjusted by overriding * {@link #getDecorationBounds()}. The {@link #synch()} method should be * called whenever the bounds returned by {@link #getDecorationBounds()} would - * change. + * change. *

* The decoration is clipped to the bounds set on the decoration, which does * not necessarily need to be the same as the decorated component's bounds. * The decoration may extend beyond the decorated component bounds, or it may - * be reduced to a smaller region. + * be reduced to a smaller region. */ // NOTE: OSX 1.6 lacks hierarchy events that w32 sends on layer changes // TODO: should probably do some locking on Component.getTreeLock() // when moving the component -// TODO: need to synch underlying cursor when decorator covers more than +// TODO: need to synch underlying cursor when decorator covers more than // one component; the cursor should change to match custom cursors if the // decoration exceeds the component's bounds (would need to add mouse motion -// listener) +// listener) // TODO: set default layer according to decorated component's layer and z order // (have to calculate z order on 1.4 JVMs). public abstract class AbstractComponentDecorator { @@ -63,7 +63,7 @@ public abstract class AbstractComponentDecorator { * and the logical origin we want to pass to the {@link #paint} method. */ private Point originOffset = new Point(0, 0); - + private Painter painter; private JComponent component; private Container parent; @@ -86,8 +86,8 @@ public AbstractComponentDecorator(JComponent c, int layerOffset) { this(c, layerOffset, TOP); } - /** Create a decorator with the given position within its layer. - * Use {@link #TOP} to cover other decorations, or {@link #BOTTOM} + /** Create a decorator with the given position within its layer. + * Use {@link #TOP} to cover other decorations, or {@link #BOTTOM} * to be covered by other decorations.

* WARNING: BOTTOM doesn't currently work, probably a JLayeredPane bug * in either the code or documentation. @@ -108,19 +108,19 @@ public AbstractComponentDecorator(JComponent c, int layerOffset, int position) { } /** Set the text to be displayed when the mouse is over the decoration. - * @see JComponent#setToolTipText(String) + * @see JComponent#setToolTipText(String) */ public void setToolTipText(String text) { painter.setToolTipText(text); } - - /** Return the currently set default tooltip text. + + /** Return the currently set default tooltip text. * @see JComponent#setToolTipText */ public String getToolTipText() { return painter.getToolTipText(); } - + /** Provide for different tool tips depending on the actual location * over the decoration. Note that if you only override this * method, you must also invoke {@link #setToolTipText(String)} with @@ -130,7 +130,7 @@ public String getToolTipText() { public String getToolTipText(MouseEvent e) { return getToolTipText(); } - + /** Indicate whether the decoration is visible. The decoration * may be clipped by ancestor scroll panes or by being moved outside * if the visible region of its parent window. @@ -138,7 +138,7 @@ public String getToolTipText(MouseEvent e) { public boolean isVisible() { return painter.isVisible(); } - + /** Use this to change the visibility of the decoration. */ public void setVisible(boolean visible) { painter.setVisible(visible); @@ -173,7 +173,7 @@ else if (layeredChild == lp) { // NOTE: JLayeredPane doesn't properly repaint an overlapping // child when an obscured child calls repaint() if the two // are in the same layer, so we use the next-higher layer - // instead of simply using a different position within the + // instead of simply using a different position within the // layer. layer = base + layerOffset; if (layerOffset < 0) { @@ -209,7 +209,7 @@ else if (layeredChild == lp) { synch(); } - /** Ensure the size of the decorator matches the current + /** Ensure the size of the decorator matches the current * decoration bounds with appropriate clipping to viewports. */ protected void synch() { @@ -219,7 +219,7 @@ protected void synch() { Rectangle clipRect = clipDecorationBounds(decorated); Point pt = SwingUtilities.convertPoint(component, - clipRect.x, clipRect.y, + clipRect.x, clipRect.y, painterParent); if (clipRect.width <= 0 || clipRect.height <= 0) { setPainterBounds(-1, -1, 0, 0); @@ -242,7 +242,7 @@ protected Rectangle clipDecorationBounds(Rectangle decorated) { originOffset.x = decorated.x; originOffset.y = decorated.y; // If the the component is obscured (by a viewport or some - // other means), use the painter bounds to clip to the visible + // other means), use the painter bounds to clip to the visible // bounds. Doing may change the actual origin, so adjust our // origin offset accordingly Rectangle visible = getClippingRect(component, decorated); @@ -253,14 +253,14 @@ protected Rectangle clipDecorationBounds(Rectangle decorated) { originOffset.y += visible.y - decorated.y; return clipRect; } - + /** Return any clipping rectangle detected above the given component, * in the coordinate space of the given component. The given rectangle * is desired to be visible. - */ + */ private Rectangle getClippingRect(Container component, Rectangle desired) { Rectangle visible = component instanceof JComponent - ? ((JComponent)component).getVisibleRect() + ? ((JComponent)component).getVisibleRect() : new Rectangle(0, 0, component.getWidth(), component.getHeight()); Rectangle clip = new Rectangle(desired); if (desired.x >= visible.x && desired.y >= visible.y @@ -269,7 +269,7 @@ private Rectangle getClippingRect(Container component, Rectangle desired) { // desired rect is within the current clip rect } else if (component.getParent() != null) { - // Only apply the clip if it is actually smaller than the + // Only apply the clip if it is actually smaller than the // component's visible area if (component != painter.getParent() && (visible.x > 0 || visible.y > 0 @@ -283,7 +283,7 @@ else if (component.getParent() != null) { visible.x + visible.width - desired.x); desired.height = Math.min(desired.height, visible.y + visible.height - desired.y); - + // Check for clipping further up the hierarchy desired.x += component.getX(); desired.y += component.getY(); @@ -301,11 +301,11 @@ else if (component.getParent() != null) { * when overriding and referencing derived class state. */ protected Rectangle getDecorationBounds() { - return bounds != DEFAULT_BOUNDS + return bounds != DEFAULT_BOUNDS ? bounds : new Rectangle(0, 0, component.getWidth(), component.getHeight()); } - - /** Change the bounds of the decoration, relative to the decorated + + /** Change the bounds of the decoration, relative to the decorated * component. The special value {@link #DEFAULT_BOUNDS} means the bounds * will track the component bounds. */ @@ -318,19 +318,19 @@ public void setDecorationBounds(Rectangle bounds) { } synch(); } - - /** Change the bounds of the decoration, relative to the decorated + + /** Change the bounds of the decoration, relative to the decorated * component. */ public void setDecorationBounds(int x, int y, int w, int h) { setDecorationBounds(new Rectangle(x, y, w, h)); } - + protected void setPainterBounds(int x, int y, int w, int h) { painter.setBounds(x, y, w, h); repaint(); } - + /** Returns the decorated component. */ protected JComponent getComponent() { return component; } @@ -338,8 +338,8 @@ protected void setPainterBounds(int x, int y, int w, int h) { * track events. */ protected JComponent getPainter() { return painter; } - - /** Set the cursor to appear anywhere over the decoration bounds. + + /** Set the cursor to appear anywhere over the decoration bounds. * If null, the cursor of the decorated component will be used. */ public void setCursor(Cursor cursor) { @@ -353,7 +353,7 @@ public void repaint() { p.repaint(painter.getBounds()); } } - + /** Stop decorating. */ public void dispose() { // Disposal must occur on the EDT @@ -387,16 +387,16 @@ public void dispose() { /** Define the decoration's appearance. The point (0,0) represents * the upper left corner of the decorated component. - * The default clip mask will be the extents of the decoration bounds, as - * indicated by {@link #getDecorationBounds()}, which defaults to the + * The default clip mask will be the extents of the decoration bounds, as + * indicated by {@link #getDecorationBounds()}, which defaults to the * decorated component bounds. */ public abstract void paint(Graphics g); - + public String toString() { return super.toString() + " on " + getComponent(); } - + private static Field nComponents; static { try { @@ -407,7 +407,7 @@ public String toString() { nComponents = null; } } - + private static boolean useSimpleBackground() { return nComponents == null; } @@ -431,8 +431,8 @@ public void setDecoratedLayer(int base) { public int getDecoratedLayer() { return base; } - public boolean isBackgroundDecoration() { - return layerOffset < 0; + public boolean isBackgroundDecoration() { + return layerOffset < 0; } /** Set the cursor to something else. If null, the cursor of the * decorated component will be used. @@ -449,7 +449,7 @@ public void setCursor(Cursor cursor) { } /** Returns the cursor of the decorated component, or the last - * cursor set by {@link #setCursor}. + * cursor set by {@link #setCursor}. */ public Cursor getCursor() { return cursor != null ? cursor : component.getCursor(); @@ -466,7 +466,7 @@ public void paintComponent(Graphics g) { g2.dispose(); } /** Provide a decorator-specific tooltip, shown when within the - * decorator's bounds. + * decorator's bounds. */ public String getToolTipText(MouseEvent e) { return AbstractComponentDecorator.this.getToolTipText(e); @@ -475,8 +475,8 @@ public String toString() { return "Painter for " + AbstractComponentDecorator.this; } } - - /** Provides a shared background painting mechanism for multiple + + /** Provides a shared background painting mechanism for multiple * decorations. This ensures that the background is only painted once * if more than one background decorator is applied. */ @@ -514,10 +514,10 @@ private void restoreChildren(Container c, int count) { } catch(Exception e) { // ignore - } + } } } - + private void paintBackground(Graphics g, Component parent, JComponent jc) { int x = jc.getX(); int y = jc.getY(); @@ -525,7 +525,7 @@ private void paintBackground(Graphics g, Component parent, JComponent jc) { int h = jc.getHeight(); paintBackground(g.create(x, y, w, h), jc); } - + private void paintBackground(Graphics g, JComponent jc) { if (!jc.isShowing()) return; if (jc.isOpaque()) { @@ -591,7 +591,7 @@ private void paintForeground(Graphics g, JComponent jc) { ((JComponent)i.next()).setDoubleBuffered(true); } } - + /** Walk the list of "background" decorators and paint them. */ public void paint(Graphics g) { @@ -604,7 +604,7 @@ public void paint(Graphics g) { for (int i=kids.length-1;i >=0; i--) { if (kids[i] instanceof Painter) { Painter p = (Painter)kids[i]; - if (p.isBackgroundDecoration() + if (p.isBackgroundDecoration() && p.getDecoratedLayer() == layer) { painters.add(p); if (p.isShowing()) { @@ -634,7 +634,7 @@ else if (lp.getLayer(kids[i]) == layer paintBackground(g, lp, c); } } - + // Paint the bg decorators for (Iterator i=painters.iterator();i.hasNext();) { Painter p = (Painter)i.next(); @@ -661,7 +661,7 @@ public String toString() { } /** Tracks changes to component configuration. */ - private final class Listener extends ComponentAdapter + private final class Listener extends ComponentAdapter implements HierarchyListener, HierarchyBoundsListener, PropertyChangeListener { // NOTE: OSX (1.6) doesn't generate these the same as w32 diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/AnimatedIcon.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/AnimatedIcon.java index 6d449eef..487c4fb4 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/AnimatedIcon.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/AnimatedIcon.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -36,7 +36,7 @@ public class AnimatedIcon implements Icon { /** Cache results to reduce decoding overhead. */ private static Map decoded = new WeakHashMap(); - + /** Returns whether the given icon is an animated GIF. * @param icon * @return @@ -64,7 +64,7 @@ public static boolean isAnimated(Icon icon) { e.printStackTrace(); } /* - if (is == null) { + if (is == null) { try { // Beware: lots of hackery to obtain the image input stream // Be sure to catch security exceptions @@ -99,13 +99,13 @@ public static boolean isAnimated(Icon icon) { } return icon instanceof AnimatedIcon; } - + private ImageIcon original; private Set repaints = new HashSet(); /** For use by derived classes that don't have an original. */ protected AnimatedIcon() { } - + /** Create an icon that takes care of animating itself on components * which use a CellRendererPane. */ @@ -113,8 +113,8 @@ public AnimatedIcon(ImageIcon original) { this.original = original; new AnimationObserver(this, original); } - - /** Trigger a repaint on all components on which we've previously been + + /** Trigger a repaint on all components on which we've previously been * painted. */ protected synchronized void repaint() { @@ -149,7 +149,7 @@ protected void paintFrame(Component c, Graphics g, int x, int y) { protected void registerRepaintArea(Component c, int x, int y, int w, int h) { repaints.add(new RepaintArea(c, x, y, w, h)); } - + /** Object to encapsulate an area on a component to be repainted. */ private static class RepaintArea { public int x, y, w, h; @@ -171,7 +171,7 @@ public RepaintArea(Component c, int x, int y, int w, int h) { String hash = String.valueOf(x) + "," + y + ":" + c.hashCode(); this.hashCode = hash.hashCode(); } - /** Find the first ancestor not descending from a + /** Find the first ancestor not descending from a * {@link CellRendererPane}. */ private Component findNonRendererAncestor(Component c) { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/ComponentIcon.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/ComponentIcon.java index f07d388a..80244029 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/ComponentIcon.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/ComponentIcon.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -32,7 +32,7 @@ public class ComponentIcon implements Icon { public ComponentIcon(JComponent c) { this(c, false); } - /** Iconify the given component, indicating whether to include its border. + /** Iconify the given component, indicating whether to include its border. */ public ComponentIcon(JComponent c, boolean includeBorder) { this.component = c; @@ -48,7 +48,7 @@ public int getIconHeight() { } return h; } - + public int getIconWidth() { int w = component.getWidth(); if (w != 0 && !includeBorder) { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/JListMutable.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/JListMutable.java index eb762e50..1e72efdc 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/JListMutable.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/JListMutable.java @@ -295,7 +295,7 @@ void adjustFocusAndSelection(MouseEvent e) { Point p = e.getPoint(); int index = locationToIndex(p); - // The autoscroller can generate drag events outside the Table's range. + // The autoscroller can generate drag events outside the Table's range. if (index == -1) { return; } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/ListCellEditor.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/ListCellEditor.java index 04e50611..93a88368 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/ListCellEditor.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/ListCellEditor.java @@ -8,4 +8,4 @@ public interface ListCellEditor extends CellEditor { Component getListCellEditorComponent(JList list, Object value, boolean isSelected, int index); -} \ No newline at end of file +} \ No newline at end of file diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/MutableListModel.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/MutableListModel.java index e31a6a92..daa46bf4 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/MutableListModel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/MutableListModel.java @@ -7,4 +7,4 @@ public interface MutableListModel extends ListModel { public boolean isCellEditable(int index); public void setValueAt(Object value, int index); -} \ No newline at end of file +} \ No newline at end of file diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/Panner.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/Panner.java index 78363f65..c3c068c0 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/Panner.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/Panner.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -20,10 +20,10 @@ import java.beans.PropertyChangeListener; /** Component which scales any given {@link JComponent} into its bounds. - * The visible portion of the {@link JComponent} (as reported by + * The visible portion of the {@link JComponent} (as reported by * {@link JComponent#getVisibleRect}) is drawn as a rectangle in the scaled - * image. Dragging the rectangle will move the visible portion of the - * panned component within its scrolling context. + * image. Dragging the rectangle will move the visible portion of the + * panned component within its scrolling context. */ public class Panner extends JComponent { public static final int MINIMUM_WIDTH = 64; @@ -36,7 +36,7 @@ public class Panner extends JComponent { private float transparency = 0.9f; private boolean preserveAspect = true; private boolean includeBorder = true; - + /** Whether to center the thumbnail if the component doesn't match * the panned component's aspect ratio. */ @@ -47,7 +47,7 @@ public class Panner extends JComponent { private boolean attached; /** Listener for notifications when the panned component is scrolled. */ private ComponentListener listener = new PannedListener(); - + public Panner() { this(null); } @@ -74,7 +74,7 @@ public void setPreserveAspect(boolean preserve) { preserveAspect = preserve; thumbnail.setPreserveAspect(preserveAspect); } - + public void setIncludeBorder(boolean border) { if (border != includeBorder) { boolean old = includeBorder; @@ -82,7 +82,7 @@ public void setIncludeBorder(boolean border) { firePropertyChange("includeBorder", old, includeBorder); } } - + public void setTransparency(float t) { if (t != transparency) { float old = this.transparency; @@ -90,7 +90,7 @@ public void setTransparency(float t) { firePropertyChange("transparency", old, transparency); } } - + /** "Attach" to the panned component at the given location within * the component. Returns whether the attach was successful. */ @@ -122,9 +122,9 @@ public boolean attach(int x, int y) { } return attached; } - + public boolean isAttached() { return attached; } - + public void detach() { if (attached) { Container parent = getParent(); @@ -137,7 +137,7 @@ public void detach() { firePropertyChange("attached", true, false); } } - + /** Sets the center point of the current viewport. Coordinates are relative * to the Panner bounds. The viewport bounds will always be contained * within the thumbnail image. @@ -151,7 +151,7 @@ public void setViewportCenter(Point where) { double[] scale = scaleFactor(); Rectangle current = panned.getVisibleRect(); Dimension size = getDrawingSize(panned); - current.x = Math.min(size.width, + current.x = Math.min(size.width, Math.max(0, (int) Math.round(visible.x / scale[0]))); current.y = Math.min(size.height, @@ -159,7 +159,7 @@ public void setViewportCenter(Point where) { Math.round(visible.y / scale[1]))); panned.scrollRectToVisible(current); } - + protected Dimension getDrawingSize(JComponent component) { Dimension size = check(component.getSize()); Insets insets = component.getInsets(); @@ -169,7 +169,7 @@ protected Dimension getDrawingSize(JComponent component) { } return size; } - + /** Set the thumbnail alignment within the available space. */ public void setCentered(boolean set) { boolean oldCentered = centered; @@ -201,8 +201,8 @@ protected Dimension check(Dimension size) { size.height = Math.max(size.height, MINIMUM_HEIGHT); return size; } - - /** Return the actual thumbnail bounds, accounting for extra space + + /** Return the actual thumbnail bounds, accounting for extra space * required for this component's border and to maintain proper aspect ratio. */ public Rectangle getThumbnailBounds() { @@ -215,7 +215,7 @@ public Rectangle getThumbnailBounds() { } return new Rectangle(x, y, thumb.width, thumb.height); } - + /** Return a rectangle within the current component content bounds * equivalent to the visible rectangle within the panned component's * content bounds. @@ -240,29 +240,29 @@ public Rectangle getViewportBounds() { } private Dimension getThumbnailSize() { - return new Dimension(thumbnail.getIconWidth(), + return new Dimension(thumbnail.getIconWidth(), thumbnail.getIconHeight()); } - + private double[] scaleFactor() { if (panned == null) return new double[] { 1.0, 1.0 }; - + Dimension full = getDrawingSize(panned); Rectangle bounds = getThumbnailBounds(); - return new double[] { + return new double[] { (double)bounds.width / full.width, - (double)bounds.height / full.height + (double)bounds.height / full.height }; } - + /** Returns the preferred size, which will be the set preferred size * or the current size with an appropriate aspect ratio applied. * If there is no current panned component, no aspect ratio will be * applied. */ public Dimension getPreferredSize() { - if (isPreferredSizeSet()) + if (isPreferredSizeSet()) return super.getPreferredSize(); Dimension size = check(getThumbnailSize()); Insets insets = getInsets(); @@ -272,12 +272,12 @@ public Dimension getPreferredSize() { } return size; } - + /** Ensure the maximum size always has the correct aspect ratio. */ public Dimension getMaximumSize() { return isMaximumSizeSet() ? super.getMaximumSize() : getPreferredSize(); } - + /** Ensure the minimum size always has the correct aspect ratio. */ public Dimension getMinimumSize() { return isMinimumSizeSet() ? super.getMinimumSize() : getPreferredSize(); @@ -287,7 +287,7 @@ public void setBounds(int x, int y, int w, int h) { super.setBounds(x, y, w, h); setThumbnailSize(); } - + private void setThumbnailSize() { thumbnail.setPreserveAspect(preserveAspect); thumbnail.setSize(getDrawingSize(this)); @@ -297,7 +297,7 @@ private void setThumbnailSize() { thumbnail.setSize(getDrawingSize(this)); } } - + /** Paint the panned component in a thumbnail. */ public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; @@ -309,7 +309,7 @@ public void paint(Graphics g) { super.paint(g); if (panned == null) return; - + Rectangle bounds = getThumbnailBounds(); Shape oldClip = g2d.getClip(); try { @@ -320,9 +320,9 @@ public void paint(Graphics g) { finally { g2d.setClip(oldClip); } - + Color oldColor = g.getColor(); - + // Indicate the visible rect Rectangle visible = getViewportBounds(); g.setColor(VISIBLE_BOUNDS_COLOR); @@ -341,15 +341,15 @@ public void paint(Graphics g) { // the thumbnail outline may be smaller than the actual component g.setColor(BORDER_COLOR); g.drawRect(bounds.x, bounds.y, bounds.width-1, bounds.height-1); - + g.setColor(oldColor); } finally { g2d.setComposite(oldComposite); } } - - private final class PannedListener extends ComponentAdapter + + private final class PannedListener extends ComponentAdapter implements HierarchyListener, PropertyChangeListener { public void hierarchyChanged(HierarchyEvent e) { if ((e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0) { @@ -366,7 +366,7 @@ public void componentResized(ComponentEvent e) { revalidate(); repaint(); } - + public void componentMoved(ComponentEvent e) { repaint(); } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/ScaledIcon.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/ScaledIcon.java index c42a9e1d..af5533c5 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/ScaledIcon.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/ScaledIcon.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -27,7 +27,7 @@ */ // TODO: implement gravity when aspect ratio doesn't match public class ScaledIcon implements Icon { - + private final Icon icon; private int width; private int height; @@ -37,14 +37,14 @@ public class ScaledIcon implements Icon { public ScaledIcon(Icon icon) { this(icon, icon.getIconWidth(), icon.getIconHeight()); } - + /** Create an icon that properly scales to the desired size. The aspect * ratio will be preserved. */ public ScaledIcon(Icon icon, int width, int height) { this(icon, width, height, true); } - + /** Create an icon that properly scales to the desired size, and * whether to preserve the aspect ratio. */ @@ -57,11 +57,11 @@ public ScaledIcon(Icon icon, int width, int height, boolean preserveAspect) { public void setPreserveAspect(boolean p) { preserveAspect = p; } - + public void setSize(Dimension size) { setSize(size.width, size.height); } - + public void setSize(int w, int h) { if (preserveAspect) { double requested = (double)w/h; diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/SelectionIcon.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/SelectionIcon.java index 293b60a8..d93fe0fa 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/SelectionIcon.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/SelectionIcon.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -31,7 +31,7 @@ /** Paint an icon appropriately for a selection to ensure that the icon is * visible and to avoid having to generate minor icon variations. This may * mean a mouse-over, a selected button, or a selected row in a tree or - * table. + * table. * Primarily to make icons in selected rows of a table on Windows 2000 show up * properly, since that setup has a dark blue selection background which makes * any black pixels difficult to see. This class replaces any pixels of the @@ -110,11 +110,11 @@ public void paintIcon(Component c, Graphics g, int x, int y) { /** Composites the source image directly into the destination, ignoring the * destination pixels. Pixels found in the source which match the - * foreground or background colors are modified to new values. + * foreground or background colors are modified to new values. */ private class CustomComposite implements Composite { - public CompositeContext createContext(final ColorModel srcCM, - final ColorModel dstCM, + public CompositeContext createContext(final ColorModel srcCM, + final ColorModel dstCM, RenderingHints hints) { //System.out.println("create"); return new CompositeContext() { @@ -122,7 +122,7 @@ private boolean near(Color c1, Color c2, int tol) { int dr = Math.abs(c1.getRed() - c2.getRed()); int dg = Math.abs(c1.getGreen() - c2.getGreen()); int db = Math.abs(c1.getBlue() - c2.getBlue()); - return dr < TOLERANCE + return dr < TOLERANCE && dg < TOLERANCE && db < TOLERANCE && dr + dg + db < TOTAL_TOLERANCE; @@ -132,7 +132,7 @@ private int mix(int base, int tint, float pct) { } public void dispose() { } - public void compose(Raster src, Raster dst, + public void compose(Raster src, Raster dst, WritableRaster out) { int[] pout = new int[4]; int w = Math.min(src.getWidth(), out.getWidth()); @@ -149,7 +149,7 @@ public void compose(Raster src, Raster dst, pout[2] = srcCM.getBlue(pixel); pout[3] = alpha; Color color = new Color(pout[0], pout[1], - pout[2], pout[3]); + pout[2], pout[3]); if (near(color, fg, TOLERANCE) || near(color, sbg, TOLERANCE)) { pout[0] = sfg.getRed(); @@ -167,7 +167,7 @@ else if (near(color, bg, TOLERANCE)) { pout[1] = mix(sbg.getGreen(), pout[1], TINT); pout[2] = mix(sbg.getBlue(), pout[2], TINT); } - out.setPixel(out.getMinX()+x, + out.setPixel(out.getMinX()+x, out.getMinY()+y, pout); } } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/SmallLabel.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/SmallLabel.java index 16d53b37..f4e3ce36 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/SmallLabel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/SmallLabel.java @@ -19,7 +19,7 @@ public SmallLabel() { super(); this.setFont(this.smallFont); } - + public SmallLabel(String text) { super(text); this.setFont(this.smallFont); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/SmallShortenedLabel.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/SmallShortenedLabel.java index 2edf0ea6..9e38c880 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/SmallShortenedLabel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/SmallShortenedLabel.java @@ -7,7 +7,7 @@ import java.awt.*; /** - * A label with smaller font and the text is shortened (with "..." at the end) to a specific width. + * A label with smaller font and the text is shortened (with "..." at the end) to a specific width. * It the text would be longer, it is added as a tooltip. * @author Simon * @@ -15,9 +15,9 @@ public class SmallShortenedLabel extends SmallLabel { private static final long serialVersionUID = 4110706626176389735L; private final Font smallFont = UIManager.getFont("Label.font").deriveFont(12); - + private static int maxLength = 16; //FIXME: magic number preset. - + /** * set the maximum length for the label text. the text will be cut after len characters * and "..." will be appended. If the string is cut, the full string is added as a tooltip. @@ -26,12 +26,12 @@ public class SmallShortenedLabel extends SmallLabel { public static void setMaxLEngth(int len) { maxLength = len; } - + public SmallShortenedLabel() { super(); - + } - + public SmallShortenedLabel(String text) { super(); this.setText(text); @@ -42,7 +42,7 @@ public void setText(String text) { if (text.length() > maxLength) { this.setToolTipText(text); super.setText(StringUtilities.shorten(text, maxLength)); - } else + } else super.setText(text); - } + } } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/SpinningDial.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/SpinningDial.java index bd92ccbc..5facb0a1 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/SpinningDial.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/SpinningDial.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -57,7 +57,7 @@ public int getIconWidth() { protected float getStrokeWidth(int size) { return size/16f; } - + // TODO: move image snapshot up to abstract class protected void paintFrame(Component c, Graphics graphics, int x, int y) { int idx = getFrame(); @@ -65,7 +65,7 @@ protected void paintFrame(Component c, Graphics graphics, int x, int y) { int w = getIconWidth(); int h = getIconHeight(); int size = Math.min(w, h); - Image image = c != null + Image image = c != null ? c.getGraphicsConfiguration().createCompatibleImage(w, h, Transparency.TRANSLUCENT) : new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g = (Graphics2D)image.getGraphics(); @@ -77,7 +77,7 @@ protected void paintFrame(Component c, Graphics graphics, int x, int y) { float strokeWidth = getStrokeWidth(FULL_SIZE); float fraction = .6f; g.setStroke(new BasicStroke(strokeWidth, - BasicStroke.CAP_ROUND, + BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g.translate((float)w/2, (float)h/2); float scale = (float)size/FULL_SIZE; @@ -102,7 +102,7 @@ protected void paintFrame(Component c, Graphics graphics, int x, int y) { } graphics.drawImage(frames[idx], x, y, null); } - + public String toString() { return "SpinningDial(" + getIconWidth() + "x" + getIconHeight() + ")"; } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/SpinningDialWaitIndicator.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/SpinningDialWaitIndicator.java index 51a35c2b..d633327d 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/SpinningDialWaitIndicator.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/SpinningDialWaitIndicator.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -37,7 +37,7 @@ public class SpinningDialWaitIndicator extends WaitIndicator implements ActionLi private static final int MARGIN = 8; // margins take up 1/MARGIN_FRACTION when space is limited private static final int MARGIN_FRACTION = 8; - + private Timer timer; private int fade; private int verticalOffset; @@ -56,7 +56,7 @@ public SpinningDialWaitIndicator(JFrame frame) { public SpinningDialWaitIndicator(JComponent target) { this(target, null); } - + public SpinningDialWaitIndicator(final JComponent target, String text) { super(target); this.text = text; @@ -76,12 +76,12 @@ public int getIconHeight() { // Disable automatic animation dial.setFrameInterval(0); } - + public void setText(String text) { this.text = text; repaint(); } - + /** Fade the affected component to background, then apply a spinning * wait indicator. */ @@ -91,11 +91,11 @@ public void paint(Graphics graphics) { timer.start(); } Graphics2D g = (Graphics2D)graphics.create(); - + Rectangle r = getComponent().getVisibleRect(); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); Color bg = getComponent().getBackground(); g.setColor(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(), fade)); @@ -106,7 +106,7 @@ public void paint(Graphics graphics) { int x = r.x; if (text == null) x += (r.width - dial.getIconWidth())/2; - else + else x += dial.getIconWidth()/4; int y = r.y + verticalOffset + (r.height - verticalOffset - dial.getIconHeight())/2; dial.paintIcon(getPainter(), g, x, y); @@ -120,10 +120,10 @@ public void paint(Graphics graphics) { g.setColor(getComponent().getForeground()); g.drawString(text, x, y); } - + g.dispose(); } - + /** Remove the wait decoration. */ public void dispose() { if (timer != null) { @@ -132,7 +132,7 @@ public void dispose() { } super.dispose(); } - + /** First fade the background, then spin the dial. */ public void actionPerformed(ActionEvent e) { if (fade < FADE_THRESHOLD) { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/controls/WaitIndicator.java b/gui/src/main/java/com/jakeapp/gui/swing/controls/WaitIndicator.java index 0463e261..9fe0a286 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/controls/WaitIndicator.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/controls/WaitIndicator.java @@ -8,7 +8,7 @@ * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * Lesser General Public License for more details. */ package com.jakeapp.gui.swing.controls; @@ -34,7 +34,7 @@ public class WaitIndicator extends AbstractComponentDecorator implements KeyEven public WaitIndicator(JFrame frame) { this(frame.getLayeredPane()); } - + /** Place the wait indicator over the given component. */ public WaitIndicator(JComponent target) { super(target); @@ -56,7 +56,7 @@ public void dispose() { public boolean dispatchKeyEvent(KeyEvent e) { return SwingUtilities.isDescendingFrom(e.getComponent(), getComponent()); } - + /** The default dims the blocked component. */ public void paint(Graphics g) { Color bg = getComponent().getBackground(); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/dialogs/ResolveConflictDialog.java b/gui/src/main/java/com/jakeapp/gui/swing/dialogs/ResolveConflictDialog.java index 75681094..4d95fa7d 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/dialogs/ResolveConflictDialog.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/dialogs/ResolveConflictDialog.java @@ -220,7 +220,7 @@ private boolean isRemoteSelected() { */ private void resolveConflictAction() { log.debug("Resolving conflict action."); - + // if local file is selected, we have to announce that. if (isLocalSelected()) { try { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/dialogs/resources/JakeAboutDialog.properties b/gui/src/main/java/com/jakeapp/gui/swing/dialogs/resources/JakeAboutDialog.properties index d2a6be9c..39f32083 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/dialogs/resources/JakeAboutDialog.properties +++ b/gui/src/main/java/com/jakeapp/gui/swing/dialogs/resources/JakeAboutDialog.properties @@ -1,4 +1,4 @@ -title = About: ${Application.title} ${Application.version} +title = About: ${Application.title} ${Application.version} closeAboutBox.Action.text = &Close diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/ExceptionUtilities.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/ExceptionUtilities.java index 2490e073..c0365756 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/ExceptionUtilities.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/ExceptionUtilities.java @@ -115,7 +115,7 @@ private static void internalShowError(String msg, final Exception e) { exceptionQueue.add(new ExceptionSaver(e, msg)); } else { exceptionDisplayActive = true; - + String okMsg = "Ok"; int numExceptions = exceptionQueue.size(); if (numExceptions > 0) { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/FolderObject.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/FolderObject.java index c655bca4..334d2864 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/FolderObject.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/FolderObject.java @@ -72,7 +72,7 @@ public void setProject(Project project) { public Project getProject() { return project; } - + /** * Retrieves all FileObjects that are directly or indirectly under this * FolderObject @@ -81,11 +81,11 @@ public Project getProject() { */ public Collection flattenFolder() { Collection result = new ArrayList(); - + result.addAll(getFileChildren()); for (FolderObject childFolder : this.getFolderChildren()) result.addAll(childFolder.flattenFolder()); - + return result; } } \ No newline at end of file diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/JakeHelper.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/JakeHelper.java index 113f9d4b..ce7f907d 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/JakeHelper.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/JakeHelper.java @@ -64,7 +64,7 @@ public static void showJakeWebsite() { public static void showInfoMsg(String s) { showMsg(s, JOptionPane.INFORMATION_MESSAGE); } - + /** * Determine whether a jake object is editable. 'editable' in that case means that it is either * not locked or the lock owner equals the local user. diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/JakeMenuBar.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/JakeMenuBar.java index 31b7bae4..44fe3232 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/JakeMenuBar.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/JakeMenuBar.java @@ -94,7 +94,7 @@ public JakeMenuBar() { fileMenu.setText(resourceMap.getString("fileMenu.text")); fileMenu.add(new JMenuItem(new OpenFileAction())); - fileMenu.add(new JMenuItem(new ShowInBrowserFileAction())); + fileMenu.add(new JMenuItem(new ShowInBrowserFileAction())); fileMenu.add(new JMenuItem(new ResolveConflictFileAction())); fileMenu.addSeparator(); fileMenu.add(new JMenuItem(new AnnounceFileAction())); @@ -104,7 +104,7 @@ public JakeMenuBar() { fileMenu.add(new JMenuItem(new RenameFileAction())); fileMenu.add(new JMenuItem(new LockFileAction())); fileMenu.addSeparator(); - fileMenu.add(new JMenuItem(new InspectorFileAction())); + fileMenu.add(new JMenuItem(new InspectorFileAction())); fileMenu.add(new JMenuItem(new CreateFolderFileAction())); fileMenu.add(new JMenuItem(new ImportFileAction())); this.add(fileMenu); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/SheetHelper.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/SheetHelper.java index eec8a2a3..c1e253b7 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/SheetHelper.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/SheetHelper.java @@ -22,7 +22,7 @@ public class SheetHelper { * @return */ public static boolean showConfirm(String msg, String btn) { - + final boolean[] ret = new boolean[]{false}; ResourceMap map = FilePanel.getInstance().getResourceMap(); String[] options = {btn, map.getString("genericCancel")}; diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/StringHistory.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/StringHistory.java index 1e71a384..d716af6a 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/StringHistory.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/StringHistory.java @@ -91,7 +91,7 @@ public List getStringsMatching(String regularExpression) { } return result; } - + private void readHistoryFile() { try { if (filename != null && FileUtilities.exists(filename)) { @@ -103,12 +103,12 @@ private void readHistoryFile() { Log.warn("Error reading history from file \"" + filename + "\".", ex); } } - + private void writeHistoryFile() { if (filename == null) { return; } - + // Make sure that we don't write to disk off the EDT. // FIXME: this relies on the calling code not calling us too frequently; a timer might be a better idea. executor.execute(new Runnable() { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/StringUtilities.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/StringUtilities.java index da26bf4e..cf4d40e1 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/StringUtilities.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/StringUtilities.java @@ -6,7 +6,7 @@ * @author: studpete */ public class StringUtilities { - + /** * shortens a string to maxlength characters = "..." * @param str input string diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/dragdrop/JakeSourceListTransferHandler.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/dragdrop/JakeSourceListTransferHandler.java index 3f2f659c..a43825e7 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/dragdrop/JakeSourceListTransferHandler.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/dragdrop/JakeSourceListTransferHandler.java @@ -37,7 +37,7 @@ public boolean canImport(TransferHandler.TransferSupport support) { return false; } - // we only import files + // we only import files if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { return false; } @@ -149,7 +149,7 @@ public boolean importData(TransferHandler.TransferSupport support) { // FIXME: Eventually, this should import to a subfolder if we drop it above one // For now, drag and drop always goes to root folder String destFolder = "/"; - + log.debug("HELLO MY NAME IS BUG: add file to project: " + project + ", in folder: " + destFolder); JakeExecutor.exec(new ImportFileFolderTask(project, files, destFolder)); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/helpers/styler/AbstractStyler.java b/gui/src/main/java/com/jakeapp/gui/swing/helpers/styler/AbstractStyler.java index 359c1318..c657cc60 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/helpers/styler/AbstractStyler.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/helpers/styler/AbstractStyler.java @@ -23,7 +23,7 @@ public abstract class AbstractStyler implements Styler { private Painter invitationBackgroundPainter; public AbstractStyler() { - + loginBackgroundPainter = new SwingXGradientPainter(new Color(125, 125, 125), new Color(64, 64, 64)); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/listener/FileWatcherListenerMultiton.java b/gui/src/main/java/com/jakeapp/gui/swing/listener/FileWatcherListenerMultiton.java index 01b83a15..bfd77b92 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/listener/FileWatcherListenerMultiton.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/listener/FileWatcherListenerMultiton.java @@ -15,7 +15,7 @@ import java.util.Map; public class FileWatcherListenerMultiton { - private static final Logger log = Logger.getLogger(FileWatcherListenerMultiton.class); + private static final Logger log = Logger.getLogger(FileWatcherListenerMultiton.class); private static Map listeners = new HashMap(); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/models/EventsTableModel.java b/gui/src/main/java/com/jakeapp/gui/swing/models/EventsTableModel.java index b580c5bd..42b262d3 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/models/EventsTableModel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/models/EventsTableModel.java @@ -75,7 +75,7 @@ public void updateData() { getAttributedJakeObject().getJakeObject() : null, MaxLogEntriesShown); } - + this.fireTableDataChanged(); } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/panels/InspectorPanel.java b/gui/src/main/java/com/jakeapp/gui/swing/panels/InspectorPanel.java index efad8be4..1ffc5dcf 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/panels/InspectorPanel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/panels/InspectorPanel.java @@ -108,15 +108,15 @@ private void initComponents() { // header panel this.headerPanel = new JPanel(new MigLayout("fill")); this.headerPanel.setOpaque(false); - + this.icon = new JLabel(); this.headerPanel.add(this.icon, "w 64!, h 64!"); - + this.nameValue = new JLabel(); this.headerPanel.add(this.nameValue, "top"); - + this.sizeValue = new JLabel(); - this.headerPanel.add(this.sizeValue, "growx, top"); + this.headerPanel.add(this.sizeValue, "growx, top"); // meta panel this.metaPanel = new JPanel(new MigLayout("fill, wrap 2")); @@ -126,7 +126,7 @@ private void initComponents() { this.metaPanel.add(this.fullPathLabel, "right, hidemode 2"); this.fullPathValue = new SmallShortenedLabel(); this.metaPanel.add(this.fullPathValue, "growx, hidemode 2"); - + this.lastEditedLabel = new SmallLabel(getResourceMap().getString("lastEditedLabel")); this.metaPanel.add(this.lastEditedLabel, "right"); this.lastEditedValue = new SmallLabel(); @@ -146,7 +146,7 @@ private void initComponents() { this.metaPanel.add(this.lockedByLabel, "right"); this.lockedByValue = new SmallShortenedLabel(); this.metaPanel.add(this.lockedByValue, "growx"); - + this.uuidLabel = new SmallLabel(getResourceMap().getString("uuidLabel")); this.metaPanel.add(this.uuidLabel, "right"); this.uuidValue = new SmallShortenedLabel(); @@ -206,7 +206,7 @@ public void updatePanel() { this.fullPathLabel.setVisible(true); this.fullPathValue.setVisible(true); this.sizeValue.setVisible(true); - + this.emptyInspector.setVisible(false); this.noteFileInspector.setVisible(true); break; @@ -214,7 +214,7 @@ public void updatePanel() { this.sizeValue.setVisible(false); this.fullPathLabel.setVisible(false); this.fullPathValue.setVisible(false); - + this.emptyInspector.setVisible(false); this.noteFileInspector.setVisible(true); break; @@ -243,10 +243,10 @@ public void setFileObject(Attributed attributedFileObject) { if (attributedFileObject != null) { this.mode = Mode.FILE; this.getEventsTableModel().setJakeObject(attributedFileObject); - + //update fields... this.updateCommonFields(attributedFileObject); - + File file = null; try { file = JakeMainApp.getCore().getFile(attributedFileObject.getJakeObject()); @@ -308,7 +308,7 @@ public void setNoteObject(Attributed attributedNoteObject) { if (attributedNoteObject != null) { this.mode = Mode.NOTE; this.getEventsTableModel().setJakeObject(attributedNoteObject); - + // update fields this.updateCommonFields(attributedNoteObject); this.icon.setIcon(this.notesIcon); @@ -318,17 +318,17 @@ public void setNoteObject(Attributed attributedNoteObject) { this.mode = Mode.NONE; } } - + private void updateCommonFields(Attributed attributedJakeObject) { if (attributedJakeObject.getLastVersionEditor() != null) { this.lastEditorValue.setText(attributedJakeObject.getLastVersionEditor().toString()); } else { this.lastEditorValue.setText("local"); //FIXME: elaborate, i18n } - + this.lastEditedValue .setText(TimeUtilities.getRelativeTime(attributedJakeObject .getLastModificationDate())); - + this.sharedValue.setText(Boolean.toString((!attributedJakeObject.isOnlyLocal()))); if (attributedJakeObject.isLocked()) { @@ -339,7 +339,7 @@ private void updateCommonFields(Attributed attributedJakeO } this.uuidValue.setText("" + attributedJakeObject.getJakeObject().getUuid()); } - + @Override public void setProjectViewPanel(JakeMainView.ProjectView projectViewPanel) { diff --git a/gui/src/main/java/com/jakeapp/gui/swing/panels/InvitationPanel.java b/gui/src/main/java/com/jakeapp/gui/swing/panels/InvitationPanel.java index e7d9cb71..de6c077c 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/panels/InvitationPanel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/panels/InvitationPanel.java @@ -38,7 +38,7 @@ public class InvitationPanel extends JXPanel implements ContextChangedCallback { private final static int TableUpdateDelay = 60000; private JButton joinButton; private JoinProjectAction joinProjectAction; - + @SuppressWarnings("unused") private static final Logger log = Logger.getLogger(InvitationPanel.class); @@ -170,7 +170,7 @@ private void updatePanel() { } joinButton.setEnabled(folderTextField.getText().length() > 0); - + this.joinProjectAction.setProjectLocation(folderTextField.getText()); } } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/panels/NewsPanel.java b/gui/src/main/java/com/jakeapp/gui/swing/panels/NewsPanel.java index 9de00241..9e9bf018 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/panels/NewsPanel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/panels/NewsPanel.java @@ -176,7 +176,7 @@ public void actionPerformed(ActionEvent actionEvent) { if (dataReason.contains(DataReason.LogEntries)) { this.updatePanel(); - // fixme: need update on people change? + // fixme: need update on people change? //|| dataReason.contains(DataReason.User) } } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/panels/NotesPanel.java b/gui/src/main/java/com/jakeapp/gui/swing/panels/NotesPanel.java index 6837347a..78b0fed1 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/panels/NotesPanel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/panels/NotesPanel.java @@ -197,7 +197,7 @@ public void valueChanged(ListSelectionEvent e) { if (i!=this.getNotesTable().getSelectedRow()) { //this row was just de-selected this.notesTableModel.getNoteAtRow(i).getJakeObject().setContent(this.getNoteReaderText()); - + } }*/ //handle new selection diff --git a/gui/src/main/java/com/jakeapp/gui/swing/panels/UserPanel.java b/gui/src/main/java/com/jakeapp/gui/swing/panels/UserPanel.java index 64a26dc7..becd8762 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/panels/UserPanel.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/panels/UserPanel.java @@ -876,7 +876,7 @@ private void showPanel(UserPanels panel) { */ private void performLogin(MsgService msg, Account account) { JakeContext.setMsgService(msg); - + JakeExecutor.exec(new LoginAccountTask(msg, account, EventCore.get().getLoginStateListener())); diff --git a/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/AbstractTask.java b/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/AbstractTask.java index 248cbc7c..45c84942 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/AbstractTask.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/AbstractTask.java @@ -38,7 +38,7 @@ public abstract class AbstractTask extends private double progress; private String status; - + private StackTraceElement[] callerStackTrace = new Throwable().getStackTrace(); @Override @@ -49,9 +49,9 @@ final protected T doInBackground() throws Exception { error(e); } this.value.setListener(this); - + this.value.start(); - + s.acquire(); if (exception != null) throw exception; @@ -70,7 +70,7 @@ final public void error(Exception t) { JakeExecutor.removeTask(this); } } - + @Override final public void finished(T o) { s.release(); @@ -83,11 +83,11 @@ final protected void done() { } finally { JakeExecutor.removeTask(this); - } + } } protected void onDone() { - + } @Override @@ -118,7 +118,7 @@ public int hashCode() { // Fixme: is this a good idea? return getClass().toString().hashCode(); } - + @Override final public Exception getException() { return this.exception; diff --git a/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/DeleteJakeObjectsTask.java b/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/DeleteJakeObjectsTask.java index c2d8a909..11b7a2b5 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/DeleteJakeObjectsTask.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/DeleteJakeObjectsTask.java @@ -38,11 +38,11 @@ private Collection getJos() { private void setJos(Collection jos) { this.jos = jos; } - + private JakeObject getToSelectAfter() { return this.toSelectAfter; } - + private void setToSelectAfter(JakeObject toSelectAfter) { this.toSelectAfter = toSelectAfter; } @@ -91,7 +91,7 @@ private boolean containsNoteObjects() { private boolean containsFileObjects() { return this.jos.iterator().hasNext() && this.jos.iterator().next() instanceof FileObject; } - + @Override public void onDone() { // inform the core that there are new log entries available. diff --git a/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/IJakeTask.java b/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/IJakeTask.java index 997f8f19..84959808 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/IJakeTask.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/IJakeTask.java @@ -11,7 +11,7 @@ public interface IJakeTask extends Runnable { * @return */ public int hashCode(); - + /** * get the exception if the task failed, null if it was successful * @return diff --git a/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/InitCoreTask.java b/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/InitCoreTask.java index f377b061..367ad142 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/InitCoreTask.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/worker/tasks/InitCoreTask.java @@ -42,7 +42,7 @@ public InitCoreTask() { @Override public void done() { super.done(); - + boolean success = false; try { // get core & authenticate diff --git a/gui/src/main/java/com/jakeapp/gui/swing/xcore/EventCore.java b/gui/src/main/java/com/jakeapp/gui/swing/xcore/EventCore.java index 007fce23..eadecc2b 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/xcore/EventCore.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/xcore/EventCore.java @@ -132,8 +132,8 @@ public void fireProjectChanged(final ProjectChangedCallback.ProjectChangedEvent }; SwingUtilities.invokeLater(runner); } - - + + private void spreadProjectChanged(ProjectChangedCallback.ProjectChangedEvent ev) { for (ProjectChangedCallback callback : projectChanged) { @@ -297,7 +297,7 @@ public void fireContextChanged(ContextChangedCallback.Reason reason, Object cont for (ContextChangedCallback c : contextChangedListeners) { c.contextChanged(EnumSet.of(reason), context); } - + } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/xcore/JakeObjectAttributedCacheManager.java b/gui/src/main/java/com/jakeapp/gui/swing/xcore/JakeObjectAttributedCacheManager.java index ae9cefc0..8eb813c3 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/xcore/JakeObjectAttributedCacheManager.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/xcore/JakeObjectAttributedCacheManager.java @@ -44,10 +44,10 @@ public Attributed getCached(T jakeObject) { if(!enabled) return null; return (Attributed) cacheHash.get(jakeObject); - } - + } + /** - * deletes the corresponding cached Atrributed to a given jakeObject from the cache + * deletes the corresponding cached Atrributed to a given jakeObject from the cache * @param * @param jakeObject */ @@ -65,7 +65,7 @@ public void invalidateCache(T jakeObject) { */ public Attributed cacheObject(T jakeObject, Attributed jakeObjectAttributed) { - if(enabled) + if(enabled) getCacheHash().put(jakeObject, (Attributed) jakeObjectAttributed); return jakeObjectAttributed; } diff --git a/gui/src/main/java/com/jakeapp/gui/swing/xcore/PullPushAutomator.java b/gui/src/main/java/com/jakeapp/gui/swing/xcore/PullPushAutomator.java index 0015ff04..bf92b5e3 100644 --- a/gui/src/main/java/com/jakeapp/gui/swing/xcore/PullPushAutomator.java +++ b/gui/src/main/java/com/jakeapp/gui/swing/xcore/PullPushAutomator.java @@ -12,5 +12,5 @@ public PullPushAutomator(Project project) { this.project = project; } - + } diff --git a/gui/src/site/apt/index.apt.vm b/gui/src/site/apt/index.apt.vm index 4e47a791..1fb44666 100644 --- a/gui/src/site/apt/index.apt.vm +++ b/gui/src/site/apt/index.apt.vm @@ -4,10 +4,10 @@ The GUI - The GUI of Jake is a master-piece of user-interface design, mainly by + The GUI of Jake is a master-piece of user-interface design, mainly by Peter Steinberger. - - However, it is in need for a little love at the moment. + + However, it is in need for a little love at the moment. I still have hope we can motivate Peter to have another look at it. diff --git a/launcher/jake.sh b/launcher/jake.sh index 332cf38f..7285925d 100644 --- a/launcher/jake.sh +++ b/launcher/jake.sh @@ -5,7 +5,7 @@ appName=jake # env var $JAVA_OPTS is set with default values if not set defaultJAVA_OPTS='-Xms32M -Xmx384M -Djava.net.preferIPv4Stack=true' ################################################################## - + ################################################################## showmessage() { echo "$0 - $1" @@ -20,7 +20,7 @@ showmessage() { xmessage -center "$1" fi } - + ################################################################### #Detect DE for future message showings if [ "$KDE_FULL_SESSION" = "true" ]; then @@ -35,9 +35,9 @@ fi JAVA=java echo 'Starting Jake...' which $JAVA 2>&1 || { - showmessage "Cannot find Java.\nPlease install or correct your JAVA_HOME!"; + showmessage "Cannot find Java.\nPlease install or correct your JAVA_HOME!"; exit 2 } - + echo exec -a $appName $JAVA $JAVA_OPTS -jar $0 exec $JAVA $JAVA_OPTS -jar $0 diff --git a/src/site/apt/development.apt.vm b/src/site/apt/development.apt.vm index ee7fb901..fb4d8519 100644 --- a/src/site/apt/development.apt.vm +++ b/src/site/apt/development.apt.vm @@ -3,78 +3,78 @@ Become a contributer - Splendid, you would like to contribute! Welcome to the team. - + Splendid, you would like to contribute! Welcome to the team. + If you have questions, contact Johannes: {{{mailto:buchner.johannes@gmx.at} via email}} or {{{xmpp:buchner.johannes@amessage.at}via xmpp}} or {{{skype:johannes_buchner}via skype}}. - + You can also just go ahead and {{{http://jakeapp.git.sourceforge.net/}check out the code}}, or fork it on github. - + Architecture Jake is seperated into several components. - + * violet - - Central is the <> core, the implementation of the synchronisation, the protocol, + + Central is the <> core, the implementation of the synchronisation, the protocol, the log access, and all the user interactions (use cases). Find violet at {{http://jakeapp.sourceforge.net/violet/}}. -* GUI +* GUI - Currently a <> based on swing is implemented to access violet. + Currently a <> based on swing is implemented to access violet. Find the gui at {{http://jakeapp.sourceforge.net/gui/}}. - + Several frontends are thinkable, for instance you could build a web interface. Another frontend, primarily for testing, but possibly also for headless servers, is the . Find the commander at {{http://jakeapp.sourceforge.net/commander/}}. - + * Libraries / Subprojects Violet depends on several internal libraries: - -** FSS + +** FSS FSS is the file-system-service, providing computer-independent - addressing of files within a folder. + addressing of files within a folder. It also provides hashing, launching files, and watching for changes. Find the fss at {{http://jakeapp.sourceforge.net/fss/}}. - + ** ICS The ICS is a major component that provides low-level communication. - You can think of it as an interface to XMPP (the implementation for this - is ICS-XMPP. A good description of the task of the ICS is given on its + You can think of it as an interface to XMPP (the implementation for this + is ICS-XMPP. A good description of the task of the ICS is given on its project website. - - Find the ics at {{http://jakeapp.sourceforge.net/ics/}}, and ics-xmpp + + Find the ics at {{http://jakeapp.sourceforge.net/ics/}}, and ics-xmpp at {{http://jakeapp.sourceforge.net/ics-xmpp/}}. - - It is completely thinkable to implement a, say, ICQ implementation of the + + It is completely thinkable to implement a, say, ICQ implementation of the ICS that could be used instead of the XMPP implementation. - + ** AvailableLater AvailableLater (AVL) is a small library that provides a interface for asynchronous calls. - + Find availablelater at {{http://jakeapp.sourceforge.net/availablelater/}}. - + * External dependencies Violet and the GUI also take advantage on several external libraries: - + * macwidgets -- for nice GUI widgets - + * jarsync -- for rsync-like delta transmission - - * ice4j -- a ICE/STUN NAT traversal library. + + * ice4j -- a ICE/STUN NAT traversal library. This allows peer-to-peer connections through the internet. - + diff --git a/src/site/apt/download.apt.vm b/src/site/apt/download.apt.vm index 67f1e815..780b3b5f 100644 --- a/src/site/apt/download.apt.vm +++ b/src/site/apt/download.apt.vm @@ -4,32 +4,32 @@ Simple * Download and start Jake - + * LogIn or register (it's free, and you can use your google account! - + * Drop a directory into the app - + * Invite some people Download more to come as we progress the development. - + {{{http://sourceforge.net/api/file/index/project-id/555884/mtime/desc/limit/20/rss}Subscribe to releases folder}} March 2009 pre-release * {{{http://sourceforge.net/projects/jakeapp/files/releases/2009-March/090324171620_Jake.exe/download}Windows XP/Vista}} - + * {{{http://sourceforge.net/projects/jakeapp/files/releases/2009-March/090324171756_Jake.dmg/download}Mac OS 10.5, Intelx64}} - + * {{{http://sourceforge.net/projects/jakeapp/files/releases/2009-March/090324171822_jake.bin/download}Linux, Generic}} - + * {{{http://sourceforge.net/projects/jakeapp/files/releases/2009-March/090324171957_jake-current.jar/download}Just the jar please}} Quite old now, but works. - + Many things will be redone, but it illustrates the idea well. * {{{http://www.java.com/en/download/index.jsp}You need Java 6 - download now!}} diff --git a/src/site/apt/features.apt.vm b/src/site/apt/features.apt.vm index 740095c2..0f324950 100644 --- a/src/site/apt/features.apt.vm +++ b/src/site/apt/features.apt.vm @@ -10,17 +10,17 @@ About Jake Jake is a client application for collaboratively working on a folder. * Synchronizes a project folder between project members - + * Works on any computer and looks good - + * Is easy to use - + * No need to setup a server or anything complex. Start Jake, invite people, add your folder. - + * Secure - + * Works with file of any type, not just Office documents. - + * Users don't have to be online all the time. * Properties of Jake for Developers, IT management and Security Personal @@ -28,14 +28,14 @@ About Jake * Cross-platform (Windows, MacOS, Linux) * No central data storage server. - + * Data exchange is based on XMPP, a standardized protocol. This communication is encrypted from and to the XMPP server. Foreign users can not gain access to the data unless they have access to the XMPP server. You can use your own XMPP server (e.g. ejabberd) if you can not trust anyone else with your data. - + * Since you can use your own XMPP server, you can use Jake in a company internally, without connection to the Internet. Your data never leaves the building. - + * Supports direct, decentral communication. - + * Web of trust between users. - + * Open source, no ad/spyware or anything weird. diff --git a/src/site/apt/index.apt.vm b/src/site/apt/index.apt.vm index 87ef0b25..573bf7fb 100644 --- a/src/site/apt/index.apt.vm +++ b/src/site/apt/index.apt.vm @@ -8,14 +8,14 @@ Create. Invite. Share. <> is a collaborative file sharing tool that allows you to securely and easily share files on your computer with other people. <> {{{download.html}Download Jake Pre-release version built March 23, 2009}} - - * - + + * + [images/features_sync.png] Sync Ever needed to work on an assignment with your classmates? Or share some documents with your co-workers on another continent? Maybe you just need a foolproof way of keeping your work on two computers in sync? Then Jake is for you. - * + * [images/features_noserver.png] no server @@ -23,34 +23,34 @@ Create. Invite. Share. Why use a central server that can crash and lose your files? Your team owns your data, and we pride ourselves in keeping it this way. - * + * [images/features_allos.png] all operating systems Windows user? Linux nerd? Mac fanboy? We've got you covered. Jake runs on all platforms you can think of. Well, except the iPhone. Unless Apple decides to donate six iPhones to us. Feature Icon Keep track of your projects - * + * [images/features_events.png] Keep track of your projects Lost? No problem. Jake's simple timeline allows you to see what has recently changed in your project. - * + * [images/features_security.png] Security So the CIA won't read your grocery list. Or your WLAN-sniffing neighbor. Legal notice: Tinfoil hat not included. - - * + + * [images/features_opensource.png] Open source Because we love open source software as much as you do. This allows you to customise Jake to your needs, or just take a peek if you're curious. - * + * [images/buzz.png] Buzz about Jake - + {{{feed://search.twitter.com/search.atom?q=jakeapp}Keep up with the buzz}} diff --git a/src/site/apt/others.apt.vm b/src/site/apt/others.apt.vm index 9403fd7a..8d00480e 100644 --- a/src/site/apt/others.apt.vm +++ b/src/site/apt/others.apt.vm @@ -4,64 +4,64 @@ Difference between Jake and existing solutions First we can make a distinction into - + [[a]] data replication / mirroring - + This means backup, copying into one direction. Only one actor is active. - + Examples for this category: Rsync, Dropbox - + [[b]] data synchronisation / version control - + This means multiple actors are active and there might be conflicts between versions. - + Examples for this category: Mercurial, git - + Jake is in this category. Unique to Jake Looking for a product that provides version control and is - + * Secure - + * Open source - + * Cross-platform - + * Server-less - + What products are out there? - - We only know complex and clunky ones. - + + We only know complex and clunky ones. + Maybe you know others? - + Jake vs. Version control systems like svn, cvs, git, hg, ... - Jake does not keep old revisions itself, but keeps only a history of who did change what. - Thus it is not as powerful as these tools. - + Jake does not keep old revisions itself, but keeps only a history of who did change what. + Thus it is not as powerful as these tools. + Jake however has zero setup effort, and does not need you to have a central server. - - Jake is not intended for software developers, but for the average office - computer user of other professions. - + + Jake is not intended for software developers, but for the average office + computer user of other professions. + Jake intends to be hassle-free, easy to use and obvious. Jake vs. "Cloud services" such as Dropbox - Jake is distributed and does not have a central storage. + Jake is distributed and does not have a central storage. This solves many security concerns and dependencies. - - There are privacy concerns attached to putting your data into - someone elses hands. - + + There are privacy concerns attached to putting your data into + someone elses hands. + It is very difficult for a company to prove their - systems are secure. This is especially true + systems are secure. This is especially true when their software is not open source. - + Jake is safer since the data is not stored on a server, but only at the clients. diff --git a/src/site/apt/screenshots.apt.vm b/src/site/apt/screenshots.apt.vm index 3df00436..8802b7f6 100644 --- a/src/site/apt/screenshots.apt.vm +++ b/src/site/apt/screenshots.apt.vm @@ -3,9 +3,9 @@ More to come as we progress the development. - + Feel free to send in your own screenshots of Jake in action! - + Screenshots from the March 2009 pre-release [images/teaser_02.png] diff --git a/src/site/apt/security.apt.vm b/src/site/apt/security.apt.vm index 11bf59ef..6cb30c22 100644 --- a/src/site/apt/security.apt.vm +++ b/src/site/apt/security.apt.vm @@ -5,43 +5,43 @@ Security and Safety * Data integrity - We use strong cryptographic hashes to make sure the version that was - announced is the version you pull, even if the file was requested from a + We use strong cryptographic hashes to make sure the version that was + announced is the version you pull, even if the file was requested from a different peer. * Transfer security - - Files are transferred either - - * Through XMPP in-band (lowest speed). - + + Files are transferred either + + * Through XMPP in-band (lowest speed). + This is the same mechanism as if you sent a file through your IM client. - + All XMPP communication is TLS encrypted. You may use your own XMPP server to keep your data internal. - - * If both are in the same local network, directly through TCP sockets. - + + * If both are in the same local network, directly through TCP sockets. + In this case, the connection is AES encrypted. - - * Through Peer-to-Peer connections. - + + * Through Peer-to-Peer connections. + In this case, the connection is AES encrypted. - + These high encryption standards are common place in banking and data encryption. There is no snake oil here, we use well-tested, proven and established mechanisms. - + * File safety Just continue to use your current backup mechanism as is to avoid the tears of accidental deletes, pulls, overrides, etc. - - Also, Jake does not provide disk or file encryption, as this would be a - stupid idea. - There are other programs you can use in combination with Jake to achieve + + Also, Jake does not provide disk or file encryption, as this would be a + stupid idea. + There are other programs you can use in combination with Jake to achieve protection from data theft (e.g. stolen laptop). - + diff --git a/src/site/apt/tech.apt.vm b/src/site/apt/tech.apt.vm index 197d42da..ea8b7395 100644 --- a/src/site/apt/tech.apt.vm +++ b/src/site/apt/tech.apt.vm @@ -2,18 +2,18 @@ Technical Features Technical features - + Jake is a client application for collaboratively working on a folder. - + Here is an indepth explanation of how Jake works. * Jake communication ** XMPP - - Jake connects to the XMPP/Google talk server where your account is + + Jake connects to the XMPP/Google talk server where your account is and behaves similar to a IM client (but does not try to replace it). - + The smack library helps us with that. ** Peer-to-Peer File transfers diff --git a/src/site/apt/workflow.apt.vm b/src/site/apt/workflow.apt.vm index 43043dd2..b14c5bf0 100644 --- a/src/site/apt/workflow.apt.vm +++ b/src/site/apt/workflow.apt.vm @@ -3,12 +3,12 @@ Jake operations - To understand the "versioning" and conflict mechanism of Jake, we first + To understand the "versioning" and conflict mechanism of Jake, we first have to explain some key concepts. * Log - First, there is the log as the fundamental data structure. + First, there is the log as the fundamental data structure. This is basically a table of: *------+-----+-------+------+ @@ -27,9 +27,9 @@ The log data structure is a list of all operations that occurred. A user can announce (or commit) a file to state that this is a new version. This adds a new entry to the log. Announce is a local operation. - + * "LogSync" - + First, whenever possible, a logsync is initialized, where clients send each other their log and complete what the other doesn't have. * "Pull" @@ -38,10 +38,10 @@ The log data structure is a list of all operations that occurred. It can request from the user that issued the log entry, or from someone else. * What about ... Push? - + There is no push needed, as in a distributed system, there is no way to enforce a client to write something on their file system. - - However, there is , which tells other users, e.g. after a announce has + + However, there is , which tells other users, e.g. after a announce has been made, that they might want to do a LogSync now. Synchronization and Conflict resolution @@ -51,11 +51,11 @@ Synchronization and Conflict resolution * Locally available -- is in the file system The user may do a announce. - + * Remotely available -- has been announced by someone, but haven't gotten it yet. - + The user may do a pull. - + * Locally available and remotely the same -- in sync * Locally available and remotely different -- update available @@ -66,29 +66,29 @@ Synchronization and Conflict resolution - Obviously, two clients could create new file versions, and then there has to + Obviously, two clients could create new file versions, and then there has to be some method of resolving this conflict. - + One of the two users will have a earlier time stamp and one a later time stamp. If not, the user id is used as a symmetry breaker. - + First, both users may do a logsync and get each others log entries. - + The user that created the later version does not have a conflict. - + The user that created the earlier version is presented with a conflict dialog. - + Here, the user can - + [[a]] Pull the later version and throw away the own version - + [[b]] Re-announce his/her version - + To assist this choice, he/she may pull the later version and compare the two files, then either th - + A conflict is simply the fact that the locally modified and present file is a early version than an incomming log entry. - + This simple concept is powerful and covers all aspects of distributed versioning. diff --git a/src/site/resources/css/site.css b/src/site/resources/css/site.css index b5dd9912..d2bb3b91 100644 --- a/src/site/resources/css/site.css +++ b/src/site/resources/css/site.css @@ -1,8 +1,8 @@ -/* +/* from http://colorschemedesigner.com/#0040ziyoow0w0 - - 1 = normal, + + 1 = normal, 2 = bleak 3 = dark 4 = 5 = light diff --git a/src/site/resources/css/site.scss b/src/site/resources/css/site.scss index b35421f5..babaf1bf 100644 --- a/src/site/resources/css/site.scss +++ b/src/site/resources/css/site.scss @@ -1,38 +1,38 @@ -/* +/* from http://colorschemedesigner.com/#0040ziyoow0w0 - - 1 = normal, + + 1 = normal, 2 = bleak 3 = dark 4 = 5 = light red, violet, green-brown, green */ -$primary-1: #C25252; -$primary-2: #925252; -$primary-3: #7E1B1B; -$primary-4: #E17F7F; -$primary-5: #E19999; - -$secondary-a-1: #6E3981; -$secondary-a-2: #563861; -$secondary-a-3: #431354; -$secondary-a-4: #AB70C0; -$secondary-a-5: #B085C0; - -$secondary-b-1: #B9C051; -$secondary-b-2: #8C9051; -$secondary-b-3: #777D1A; -$secondary-b-4: #D9DF7E; -$secondary-b-5: #DBDF98; - -$complement-1: #419B41; -$complement-2: #427542; -$complement-3: #156515; -$complement-4: #74CD74; -$complement-5: #8CCD8C; +$primary-1: #C25252; +$primary-2: #925252; +$primary-3: #7E1B1B; +$primary-4: #E17F7F; +$primary-5: #E19999; + +$secondary-a-1: #6E3981; +$secondary-a-2: #563861; +$secondary-a-3: #431354; +$secondary-a-4: #AB70C0; +$secondary-a-5: #B085C0; + +$secondary-b-1: #B9C051; +$secondary-b-2: #8C9051; +$secondary-b-3: #777D1A; +$secondary-b-4: #D9DF7E; +$secondary-b-5: #DBDF98; + +$complement-1: #419B41; +$complement-2: #427542; +$complement-3: #156515; +$complement-4: #74CD74; +$complement-5: #8CCD8C; $bg: $secondary-b-5; $bg: black; @@ -78,13 +78,13 @@ body { background: $complement-1; border: 0; } - + #contentBox { background: $bg; margin-right: 0; color: $fg; } - + } table { font-size: small; @@ -203,7 +203,7 @@ h4 { #navcolumn li a:visited { color: $navigationvisitedfg; background-color: $navigationvisitedbg; -} +} table { color: black; diff --git a/src/site/resources/css/styles.css b/src/site/resources/css/styles.css index 0636e146..e1e51886 100755 --- a/src/site/resources/css/styles.css +++ b/src/site/resources/css/styles.css @@ -71,7 +71,7 @@ h3 { color: #6d6d6d; font-weight:normal; text-align:left; - margin-bottom: 20px; + margin-bottom: 20px; } h4 { diff --git a/violet/src/main/java/com/jakeapp/violet/actions/Actions.java b/violet/src/main/java/com/jakeapp/violet/actions/Actions.java index f2684642..cba0f80f 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/Actions.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/Actions.java @@ -5,10 +5,10 @@ /** * It was originally thought that this would be a exhaustive list of actions * that the gui can perform. - * + * * But it isn't, to avoid duplicate code. Pick the actions from * com.jakeapp.violet.actions.project - * + * */ public class Actions { diff --git a/violet/src/main/java/com/jakeapp/violet/actions/global/serve/ISyncListener.java b/violet/src/main/java/com/jakeapp/violet/actions/global/serve/ISyncListener.java index b6e4e075..003b453f 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/global/serve/ISyncListener.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/global/serve/ISyncListener.java @@ -8,28 +8,28 @@ public interface ISyncListener { /** * we received a poke. Do a LogSync when you get a chance! - * + * * @param user */ void poke(User user); /** * fyi, we started receiving logs from user user - * + * * @param user */ void startReceiving(User user); /** * fyi, we finished receiving logs from user user - * + * * @param user */ void finishedReceiving(User user); /** * Should we accept a filerequest for this jakeObject by this user? - * + * * @param user * @param jakeObject */ @@ -38,7 +38,7 @@ public interface ISyncListener { /** * Sending a file to the user user failed. There is no reason to be * concerned though, it happens. - * + * * @param user * @param fileName * @param error @@ -47,7 +47,7 @@ public interface ISyncListener { /** * We successfully sent a file to the user user. - * + * * @param user * @param fileName */ @@ -55,7 +55,7 @@ public interface ISyncListener { /** * Just a update on the progress of a sending transfer. - * + * * @param user * @param fileName * @param status diff --git a/violet/src/main/java/com/jakeapp/violet/actions/global/serve/ProjectRequestListener.java b/violet/src/main/java/com/jakeapp/violet/actions/global/serve/ProjectRequestListener.java index 2ae3e5ee..86a994c4 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/global/serve/ProjectRequestListener.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/global/serve/ProjectRequestListener.java @@ -59,7 +59,7 @@ public ProjectRequestListener(ProjectModel model, ISyncListener l) { /** * decides if we know about the subject of this request. - * + * * @param req * Incoming request * @return null if we don't know this version for some reason, the diff --git a/violet/src/main/java/com/jakeapp/violet/actions/global/serve/RequestHandlePolicy.java b/violet/src/main/java/com/jakeapp/violet/actions/global/serve/RequestHandlePolicy.java index 50a5dbd7..1ed49b86 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/global/serve/RequestHandlePolicy.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/global/serve/RequestHandlePolicy.java @@ -17,7 +17,7 @@ public interface RequestHandlePolicy { * corresponding to the providers are returned. The providers can be * accessed via * {@link com.com.jakeapp.violet.model.logentries.LogEntry#getMember()} - * + * * @param jo * @return the Logentries with the UserIds to try, a empty list if noone * could be found @@ -30,7 +30,7 @@ public interface RequestHandlePolicy { /** * Checks if it is ok to return the object. - * + * * @param from * @param jo * @return null if not allowed, the content otherwise @@ -40,7 +40,7 @@ public interface RequestHandlePolicy { /** * Checks if it is ok to return the log. - * + * * @param jo * @return whether retrieving is allowed * @param project diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/UserInfo.java b/violet/src/main/java/com/jakeapp/violet/actions/project/UserInfo.java index 95e9f54f..0399138a 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/UserInfo.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/UserInfo.java @@ -5,7 +5,7 @@ /** * Detailed information about the user - * + * * @see User */ public class UserInfo { diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/interact/UserOrderStrategy.java b/violet/src/main/java/com/jakeapp/violet/actions/project/interact/UserOrderStrategy.java index 09b7b642..1c46b1d5 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/interact/UserOrderStrategy.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/interact/UserOrderStrategy.java @@ -8,7 +8,7 @@ public interface UserOrderStrategy { /** * select and order the users - * + * * @param origin * the user that made the commit * @param users diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/interact/pull/FileRequestAction.java b/violet/src/main/java/com/jakeapp/violet/actions/project/interact/pull/FileRequestAction.java index 3c494230..fea63f1f 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/interact/pull/FileRequestAction.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/interact/pull/FileRequestAction.java @@ -33,7 +33,7 @@ /** * Downloads the file from another user. If storeInFss = false, the File where * it is stored is given back. - * + * * @author johannes */ class FileRequestAction extends AvailableLaterObject { diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/local/AllJakeObjectsView.java b/violet/src/main/java/com/jakeapp/violet/actions/project/local/AllJakeObjectsView.java index 7c21f4df..fe02afd7 100755 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/local/AllJakeObjectsView.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/local/AllJakeObjectsView.java @@ -11,7 +11,7 @@ /** * A view of all JakeObjects. Notification on changes. - * + * * @author johannes */ public class AllJakeObjectsView { diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/local/AllJakeObjectsViewAction.java b/violet/src/main/java/com/jakeapp/violet/actions/project/local/AllJakeObjectsViewAction.java index c717cef7..8c74eee0 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/local/AllJakeObjectsViewAction.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/local/AllJakeObjectsViewAction.java @@ -16,7 +16,7 @@ /** * Gets all JakeObject that ever were in the log (including remote-only, * deleted, ...). - * + * * @author johannes */ public class AllJakeObjectsViewAction extends diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/local/ChangePropertyAction.java b/violet/src/main/java/com/jakeapp/violet/actions/project/local/ChangePropertyAction.java index d5b827a3..ae5a734a 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/local/ChangePropertyAction.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/local/ChangePropertyAction.java @@ -35,7 +35,7 @@ public static String getBooleanString(Boolean b) { } /** - * + * * @param model * @param key * @param value diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/local/GetAllLogEntriesAction.java b/violet/src/main/java/com/jakeapp/violet/actions/project/local/GetAllLogEntriesAction.java index 886e5d4e..1f270bec 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/local/GetAllLogEntriesAction.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/local/GetAllLogEntriesAction.java @@ -10,7 +10,7 @@ /** * Gets the full log - * + * * @author johannes */ public class GetAllLogEntriesAction extends diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/local/GetLogEntriesAction.java b/violet/src/main/java/com/jakeapp/violet/actions/project/local/GetLogEntriesAction.java index dc829a18..9e3d1337 100644 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/local/GetLogEntriesAction.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/local/GetLogEntriesAction.java @@ -11,7 +11,7 @@ /** * Gets the log of this {@link JakeObject} - * + * * @author johannes */ public class GetLogEntriesAction extends diff --git a/violet/src/main/java/com/jakeapp/violet/actions/project/local/SyncStatusCalculator.java b/violet/src/main/java/com/jakeapp/violet/actions/project/local/SyncStatusCalculator.java index d300471f..e6ddcb92 100755 --- a/violet/src/main/java/com/jakeapp/violet/actions/project/local/SyncStatusCalculator.java +++ b/violet/src/main/java/com/jakeapp/violet/actions/project/local/SyncStatusCalculator.java @@ -4,7 +4,7 @@ /** * struct for giving over to the gui - * + * * @author johannes */ public class SyncStatusCalculator { diff --git a/violet/src/main/java/com/jakeapp/violet/gui/Passwords.java b/violet/src/main/java/com/jakeapp/violet/gui/Passwords.java index a4a78416..a94c2103 100644 --- a/violet/src/main/java/com/jakeapp/violet/gui/Passwords.java +++ b/violet/src/main/java/com/jakeapp/violet/gui/Passwords.java @@ -7,7 +7,7 @@ /** * Password storage -- implementations must not keep passwords in memory. - * + * * This is for the GUI, the core should not use it, it should only receive * passwords. */ @@ -15,7 +15,7 @@ public abstract class Passwords extends Observable implements Model { /** * load password, if available - * + * * @param user * User id * @return null if not found @@ -24,7 +24,7 @@ public abstract class Passwords extends Observable implements Model { /** * save password - * + * * @param user * User id * @param pw @@ -36,7 +36,7 @@ public abstract void storeForUser(String user, String pw) /** * remove password if stored. - * + * * @param user * User id * @throws IOException diff --git a/violet/src/main/java/com/jakeapp/violet/model/Context.java b/violet/src/main/java/com/jakeapp/violet/model/Context.java index 3e140c75..c9eb805e 100644 --- a/violet/src/main/java/com/jakeapp/violet/model/Context.java +++ b/violet/src/main/java/com/jakeapp/violet/model/Context.java @@ -4,15 +4,15 @@ /** * MVC-like pattern. - * + * * The model is the data structure behind everything. All should point to it. - * + * * The user can perform data modifications using actions. Actions operate on the * model. - * + * * The user can view data using views. First, a action to request a view is * called, which creates the view. The view observes the model. - * + * *

  *           Model
  *           ^   ^
@@ -20,13 +20,13 @@
  *         /       \
  *    Actions ---> View
  * 
- * + * * Furthermore, a view can provoke an action call. Never is the view allowed to * modify the model. - * + * * Actions are NOT blocking calls with a return value. They are stateful * operations that can be observed. - * + * */ public class Context { diff --git a/violet/src/main/java/com/jakeapp/violet/model/IJakeObjectModificationListener.java b/violet/src/main/java/com/jakeapp/violet/model/IJakeObjectModificationListener.java index 1dc924ac..b8262e34 100644 --- a/violet/src/main/java/com/jakeapp/violet/model/IJakeObjectModificationListener.java +++ b/violet/src/main/java/com/jakeapp/violet/model/IJakeObjectModificationListener.java @@ -3,7 +3,7 @@ /** * Objects listening for log modifications have to implement this. - * + * * @author johannes */ public interface IJakeObjectModificationListener { @@ -11,7 +11,7 @@ public interface IJakeObjectModificationListener { /** * method to be implemented by an modification listener to get notified of * changes - * + * * @param file * the FileObject changed */ diff --git a/violet/src/main/java/com/jakeapp/violet/model/ILogModificationListener.java b/violet/src/main/java/com/jakeapp/violet/model/ILogModificationListener.java index 19310f09..42efaf6b 100644 --- a/violet/src/main/java/com/jakeapp/violet/model/ILogModificationListener.java +++ b/violet/src/main/java/com/jakeapp/violet/model/ILogModificationListener.java @@ -2,7 +2,7 @@ /** * Objects listening for log modifications have to implement this. - * + * * @author johannes */ public interface ILogModificationListener { @@ -17,7 +17,7 @@ public enum ModifyActions { /** * method to be implemented by an modification listener to get notified of * changes - * + * * @param file * the FileObject changed * @param action diff --git a/violet/src/main/java/com/jakeapp/violet/model/Log.java b/violet/src/main/java/com/jakeapp/violet/model/Log.java index 68eaf457..60e6d645 100644 --- a/violet/src/main/java/com/jakeapp/violet/model/Log.java +++ b/violet/src/main/java/com/jakeapp/violet/model/Log.java @@ -14,14 +14,14 @@ public interface Log { /** * connect to the log. Do this after creating this - * + * * @throws Exception */ void connect() throws SQLException; /** * connect to the log. Do this after creating this - * + * * @throws Exception */ void disconnect() throws SQLException; @@ -34,7 +34,7 @@ public interface Log { /** * Retrieve a LogEntry. - * + * * @param uuid * the uuid of the requested LogEntry * @returns the LogEntry with the given UUID @@ -47,7 +47,7 @@ LogEntry getById(UUID uuid, boolean includeUnprocessed) /** * change the processed field of a logEntry. Note that the * logEntry handed in is now invalid. - * + * * @param logEntry * the LogEntry that is to be changed. * @throws NoSuchLogEntryException @@ -57,7 +57,7 @@ LogEntry getById(UUID uuid, boolean includeUnprocessed) /** * Get all unprocessed LogEntries. - * + * * @return all unprocessed LogEntries of the Project * @throws SQLException */ @@ -66,7 +66,7 @@ LogEntry getById(UUID uuid, boolean includeUnprocessed) /** * Get the unprocessed LogEntries for a specific * JakeObject. - * + * * @param jakeObject * @return the unprocessed LogEntries of the specific JakeObject * @throws SQLException @@ -76,7 +76,7 @@ LogEntry getById(UUID uuid, boolean includeUnprocessed) /** * Check if a JakeObject has unprocessed * LogEntries - * + * * @param jakeObject * @return Whether unprocessed LogEntries of the JakeObject exist * @throws SQLException @@ -93,7 +93,7 @@ LogEntry getById(UUID uuid, boolean includeUnprocessed) /** * Get all LogEntrys stored in the database for one Project. - * + * * @param includeUnprocessed * Whether to look at unprocessed LogEntries as well * @return List of LogEntrys @@ -104,7 +104,7 @@ LogEntry getById(UUID uuid, boolean includeUnprocessed) /** * Get all LogEntrys stored in the database concerning a specific * JakeObject. - * + * * @param jakeObject * the JakeObject in question. * @param includeUnprocessed @@ -118,7 +118,7 @@ List getAllOfJakeObject(JakeObject jakeObject, /** * Retrieves the most recent LogEntry of any LogAction for a * given JakeObject. - * + * * @param jakeObject * the JakeObject in question. * @param includeUnprocessed @@ -143,7 +143,7 @@ LogEntry getLastOfJakeObject(JakeObject jakeObject, /** * Gets the first {@link LogEntry}. - * + * * @throws NoSuchLogEntryException * @throws SQLException */ @@ -152,7 +152,7 @@ LogEntry getLastOfJakeObject(JakeObject jakeObject, /** * This methods sets all LogEntries with the same belongsTo object previous * to this one to processed - * + * * @param logEntry * @throws SQLException */ diff --git a/violet/src/main/java/com/jakeapp/violet/model/LogImpl.java b/violet/src/main/java/com/jakeapp/violet/model/LogImpl.java index de7a35b3..1937ce63 100644 --- a/violet/src/main/java/com/jakeapp/violet/model/LogImpl.java +++ b/violet/src/main/java/com/jakeapp/violet/model/LogImpl.java @@ -22,9 +22,9 @@ /** * Implementation of Log - * + * * @author user - * + * */ public class LogImpl implements Log { diff --git a/violet/src/main/java/com/jakeapp/violet/model/attributes/Attributed.java b/violet/src/main/java/com/jakeapp/violet/model/attributes/Attributed.java index 993613bc..f0a95e21 100755 --- a/violet/src/main/java/com/jakeapp/violet/model/attributes/Attributed.java +++ b/violet/src/main/java/com/jakeapp/violet/model/attributes/Attributed.java @@ -7,7 +7,7 @@ /** * Additional information about the synchronization status of a JakeObject - * + * * @author johannes */ public class Attributed extends JakeObjectStatus { @@ -64,7 +64,7 @@ public JakeObject getJakeObject() { /** * Get the last modification date - * + * * @return */ public long getLastModificationDate() { diff --git a/violet/src/main/java/com/jakeapp/violet/model/attributes/JakeObjectStatus.java b/violet/src/main/java/com/jakeapp/violet/model/attributes/JakeObjectStatus.java index 4a285c86..f0530735 100755 --- a/violet/src/main/java/com/jakeapp/violet/model/attributes/JakeObjectStatus.java +++ b/violet/src/main/java/com/jakeapp/violet/model/attributes/JakeObjectStatus.java @@ -9,7 +9,7 @@ * This is the JakeObjectStatus - the base class for AttributedJakeObject. * Describing Infos about a domain object are saved here. Primary User: * FileObject, NoteObject. - * + * * @author johannes, peter */ public class JakeObjectStatus { @@ -90,7 +90,7 @@ public LogEntry getLastVersionLogEntry() { /** * Returns the Last Editor of this Object. Failsafe variant. - * + * * @return returns null of no LogEntry */ public User getLastVersionEditor() { @@ -129,7 +129,7 @@ public boolean isDeletable() { /** * Checks if the object is in conflict. - * + * * @return */ public boolean isInConflict() { diff --git a/violet/src/main/java/com/jakeapp/violet/model/attributes/SyncStatus.java b/violet/src/main/java/com/jakeapp/violet/model/attributes/SyncStatus.java index e01394aa..722994d7 100755 --- a/violet/src/main/java/com/jakeapp/violet/model/attributes/SyncStatus.java +++ b/violet/src/main/java/com/jakeapp/violet/model/attributes/SyncStatus.java @@ -1,5 +1,5 @@ /** - * + * */ package com.jakeapp.violet.model.attributes; diff --git a/violet/src/main/java/com/jakeapp/violet/model/exceptions/NoSuchLogEntryException.java b/violet/src/main/java/com/jakeapp/violet/model/exceptions/NoSuchLogEntryException.java index e2527e7e..005b87ed 100644 --- a/violet/src/main/java/com/jakeapp/violet/model/exceptions/NoSuchLogEntryException.java +++ b/violet/src/main/java/com/jakeapp/violet/model/exceptions/NoSuchLogEntryException.java @@ -3,7 +3,7 @@ /** * Exception that is thrown if a LogEntry that was searched for by * a method was not found. - * + * * @author domdorn */ public class NoSuchLogEntryException extends Exception { @@ -23,7 +23,7 @@ public NoSuchLogEntryException() { * Constructs a new exception with the specified detail message. The cause * is not initialized, and may subsequently be initialized by a call to * {@link #initCause}. - * + * * @param message * the detail message. The detail message is saved for later * retrieval by the {@link #getMessage()} method. @@ -37,7 +37,7 @@ public NoSuchLogEntryException(String message) { *

* Note that the detail message associated with cause is * not automatically incorporated in this exception's detail message. - * + * * @param message * the detail message (which is saved for later retrieval by the * {@link #getMessage()} method). @@ -59,7 +59,7 @@ public NoSuchLogEntryException(String message, Throwable cause) { * constructor is useful for exceptions that are little more than wrappers * for other throwables (for example, * {@link java.security.PrivilegedActionException}). - * + * * @param cause * the cause (which is saved for later retrieval by the * {@link #getCause()} method). (A null value is diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/files/IRequestMarshaller.java b/violet/src/main/java/com/jakeapp/violet/protocol/files/IRequestMarshaller.java index 84f88159..9241bc0e 100644 --- a/violet/src/main/java/com/jakeapp/violet/protocol/files/IRequestMarshaller.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/files/IRequestMarshaller.java @@ -6,7 +6,7 @@ public interface IRequestMarshaller { /** * Serialize the file request - * + * * @param msg * @return */ @@ -14,7 +14,7 @@ public interface IRequestMarshaller { /** * De-serialize the file request - * + * * @param incomingMessage * @param from * @return diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/files/RequestFileMessage.java b/violet/src/main/java/com/jakeapp/violet/protocol/files/RequestFileMessage.java index a2b281ea..3e0db40b 100644 --- a/violet/src/main/java/com/jakeapp/violet/protocol/files/RequestFileMessage.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/files/RequestFileMessage.java @@ -8,11 +8,11 @@ /** * Request - * + * * - full file (type = "file"). file:UUID -- uuid is identifier - * + * * - delta (type = "delta"). delta:UUID -- uuid is identifier - * + * * - signature (type = "signature"). signature:relpath -- relpath is identifier */ public class RequestFileMessage extends Message { @@ -61,7 +61,7 @@ public String getIdentifier() { /** * Requesting the full file - * + * * @param projectId * Project * @param user @@ -78,7 +78,7 @@ public static RequestFileMessage createRequestFileMessage(UUID projectId, /** * Requesting the logs - * + * * @param projectId * Project * @param user @@ -94,7 +94,7 @@ public static RequestFileMessage createRequestLogsMessage(UUID projectId, /** * Requesting a delta update file - * + * * @param projectId * Project * @param user @@ -112,7 +112,7 @@ public static RequestFileMessage createRequestDeltaMessage(UUID projectId, /** * Requesting a signature of what the current checksums are, so that a delta * can be created - * + * * @param projectId * Project * @param user diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/files/RequestMarshaller.java b/violet/src/main/java/com/jakeapp/violet/protocol/files/RequestMarshaller.java index 4225a122..d81fa679 100644 --- a/violet/src/main/java/com/jakeapp/violet/protocol/files/RequestMarshaller.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/files/RequestMarshaller.java @@ -19,7 +19,7 @@ public class RequestMarshaller implements IRequestMarshaller { /* * (non-Javadoc) - * + * * @see * com.jakeapp.violet.protocol.files.IRequestMarshaller#serialize(com.jakeapp * .violet.protocol.files.RequestFileMessage) @@ -33,7 +33,7 @@ public String serialize(RequestFileMessage msg) { /* * (non-Javadoc) - * + * * @see * com.jakeapp.violet.protocol.files.IRequestMarshaller#decodeRequestFileMessage * (java.lang.String, com.jakeapp.jake.ics.UserId) diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/invites/IInvitationHandler.java b/violet/src/main/java/com/jakeapp/violet/protocol/invites/IInvitationHandler.java index 5b341930..b7666848 100644 --- a/violet/src/main/java/com/jakeapp/violet/protocol/invites/IInvitationHandler.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/invites/IInvitationHandler.java @@ -8,7 +8,7 @@ public interface IInvitationHandler { /** * Adding another IProjectInvitationListener to the list of * listeners. - * + * * @param invitationListener * the IProjectInvitationListener listener to be * added. @@ -19,7 +19,7 @@ void registerInvitationListener( /** * Remove the given IProjectInvitationListener from the list of * listeners (if it exists) - * + * * @param invitationListener * the IProjectInvitationListener listener to be * removed. diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/invites/IProjectInvitationListener.java b/violet/src/main/java/com/jakeapp/violet/protocol/invites/IProjectInvitationListener.java index 667e39d0..b8b7c282 100755 --- a/violet/src/main/java/com/jakeapp/violet/protocol/invites/IProjectInvitationListener.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/invites/IProjectInvitationListener.java @@ -16,7 +16,7 @@ public interface IProjectInvitationListener { /** * You have been invited by user to the Project p We store the project p in * the local database as state invited - * + * * @param inviter * The User who invited us to the * Project diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/invites/ProjectInvitationHandler.java b/violet/src/main/java/com/jakeapp/violet/protocol/invites/ProjectInvitationHandler.java index a713e564..f7f1ccde 100755 --- a/violet/src/main/java/com/jakeapp/violet/protocol/invites/ProjectInvitationHandler.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/invites/ProjectInvitationHandler.java @@ -30,7 +30,7 @@ public class ProjectInvitationHandler implements IMessageReceiveListener, /** * Method implemented from IMessageReceiveListener, to handle * incoming packets. - * + * * @param from_userid * the user id which sent the message * @param content @@ -71,7 +71,7 @@ public static String createInviteMessage(String projectname, UUID id) { * Adds an IProjectInvitationListener to the list of * IProjectInvitationListeners to get notified when an * Invitation-Event occurs. - * + * * @param invitationListener * the IProjectInvitationListener to be added to the * list @@ -85,7 +85,7 @@ public void registerInvitationListener( /** * Removes this IProjectInvitationListener from the list of * IProjectInvitationListeners. - * + * * @param invitationListener * the IProjectInvitationListener to be removed from * the list diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/msg/ILogEntryMarshaller.java b/violet/src/main/java/com/jakeapp/violet/protocol/msg/ILogEntryMarshaller.java index b1a2171c..79b5f55e 100644 --- a/violet/src/main/java/com/jakeapp/violet/protocol/msg/ILogEntryMarshaller.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/msg/ILogEntryMarshaller.java @@ -12,7 +12,7 @@ public interface ILogEntryMarshaller { /** * serialize the log entries - * + * * @param projectid * @param logs * @return @@ -23,7 +23,7 @@ public abstract void packLogEntries(UUID projectid, List logs, /** * de-serialize the log entries - * + * * @param projectid * @param logs * @return diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/msg/IMessageMarshaller.java b/violet/src/main/java/com/jakeapp/violet/protocol/msg/IMessageMarshaller.java index 1a24765e..cfe3e491 100644 --- a/violet/src/main/java/com/jakeapp/violet/protocol/msg/IMessageMarshaller.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/msg/IMessageMarshaller.java @@ -8,7 +8,7 @@ public interface IMessageMarshaller { /** * de-serialize the poke message - * + * * @param s * message in string format * @param from @@ -20,7 +20,7 @@ public abstract PokeMessage decodePokeMessage(String s, UserId from) /** * serialize the poke message - * + * * @param msg * @return * @throws IOException diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/msg/impl/LogEntryMarshaller.java b/violet/src/main/java/com/jakeapp/violet/protocol/msg/impl/LogEntryMarshaller.java index 36f0c622..faebd991 100644 --- a/violet/src/main/java/com/jakeapp/violet/protocol/msg/impl/LogEntryMarshaller.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/msg/impl/LogEntryMarshaller.java @@ -28,7 +28,7 @@ public class LogEntryMarshaller implements ILogEntryMarshaller { /* * (non-Javadoc) - * + * * @see * com.jakeapp.violet.protocol.msg.ILogEntryMarshaller#packLogEntries(java * .util.UUID, java.util.List, java.io.OutputStream) @@ -45,7 +45,7 @@ public void packLogEntries(UUID projectid, List logs, /* * (non-Javadoc) - * + * * @see * com.jakeapp.violet.protocol.msg.ILogEntryMarshaller#unpackLogEntries( * java.util.UUID, java.io.InputStream) @@ -63,7 +63,7 @@ public List unpackLogEntries(UUID projectid, InputStream is) /* * (non-Javadoc) - * + * * @see * com.jakeapp.violet.protocol.msg.ILogEntryMarshaller#serializeLogEntry * (com.jakeapp.violet.model.LogEntry) @@ -78,7 +78,7 @@ public String serializeLogEntry(LogEntry le) throws IOException { /* * (non-Javadoc) - * + * * @see * com.jakeapp.violet.protocol.msg.ILogEntryMarshaller#deSerializeLogEntry * (java.lang.String) diff --git a/violet/src/main/java/com/jakeapp/violet/protocol/msg/impl/MessageMarshaller.java b/violet/src/main/java/com/jakeapp/violet/protocol/msg/impl/MessageMarshaller.java index ca616ed5..4a56ce70 100644 --- a/violet/src/main/java/com/jakeapp/violet/protocol/msg/impl/MessageMarshaller.java +++ b/violet/src/main/java/com/jakeapp/violet/protocol/msg/impl/MessageMarshaller.java @@ -29,7 +29,7 @@ public class MessageMarshaller implements IMessageMarshaller { /* * (non-Javadoc) - * + * * @see * com.jakeapp.violet.protocol.msg.IMessageMarshaller#decodePokeMessage( * java.lang.String, com.jakeapp.jake.ics.UserId) @@ -54,7 +54,7 @@ public PokeMessage decodePokeMessage(String s, UserId from) /* * (non-Javadoc) - * + * * @see * com.jakeapp.violet.protocol.msg.IMessageMarshaller#serialize(com.jakeapp * .violet.protocol.msg.PokeMessage) diff --git a/violet/src/site/resources/logsync.pic b/violet/src/site/resources/logsync.pic index 093e46ee..12b50756 100644 --- a/violet/src/site/resources/logsync.pic +++ b/violet/src/site/resources/logsync.pic @@ -1,7 +1,7 @@ .PS down C: box "active" fill 0.1 rad 0.25 -"\fB\f4\mkLogSync\rt\ul\ul\ul\ul\ul\ul\ul\ul\ul" at C + (2,0.5) +"\fB\f4\mkLogSync\rt\ul\ul\ul\ul\ul\ul\ul\ul\ul" at C + (2,0.5) S: box "inactive" at C + (4,0) fill 0.1 rad 0.25 C1: box "logsync" at C - (0,1) line from C.s to C1.n @@ -17,7 +17,7 @@ arrow C3: box "collect" at C2 - (0,1) "collecting relevant" rjust "log entries" rjust \ "for each file" rjust "last log entries" rjust "and number of log entries" rjust \ - at C3 - (0.5,0) + at C3 - (0.5,0) S3: box "recv" at C3 + (4,-0.5) arrow from C3.e to S3.w dashed "UUID list" above move to S3.s diff --git a/violet/src/site/resources/poke.pic b/violet/src/site/resources/poke.pic index 7a15fd4e..3815e862 100644 --- a/violet/src/site/resources/poke.pic +++ b/violet/src/site/resources/poke.pic @@ -1,7 +1,7 @@ .PS down C: box "active" fill 0.1 rad 0.25 -"\fB\f4\mkPoke\rt\ul\ul\ul\ul" at C + (2,0.5) +"\fB\f4\mkPoke\rt\ul\ul\ul\ul" at C + (2,0.5) S: box "inactive" at C + (4,0) fill 0.1 rad 0.25 C0: box "announce" at C - (0,1) line from C.s to C0.n "makes changes " rjust diff --git a/violet/src/site/resources/pull.pic b/violet/src/site/resources/pull.pic index 18b86b02..3840ba61 100644 --- a/violet/src/site/resources/pull.pic +++ b/violet/src/site/resources/pull.pic @@ -2,14 +2,14 @@ down C: box "active" fill 0.1 rad 0.25 S: box "inactive" at C + (4,0) fill 0.1 rad 0.25 -"\fB\f4\mkFile Requests\rt\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul" at C + (2,0.5) +"\fB\f4\mkFile Requests\rt\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul\ul" at C + (2,0.5) C1: box "request " at C - (0,1) width 1.25 line from C.s to C1.n S1: box "recv" at S - (0,1.5) arrow from C1.e to S1.w dashed "FileRequest " above "" above move to S1.s arrow -S11: box "Mechanism 1" width 1.5 +S11: box "Mechanism 1" width 1.5 S2: box "Mechanism 2" width 1.5 at S11 + (0, -2) move to S11.s line dotted down @@ -35,6 +35,6 @@ arrow " ok" ljust C5: box "store" move to C3.s arrow to C3 + (-0.75,-2) "failed " rjust above -C6: box "re-request" +C6: box "re-request" arrow from C4.s to C6.ne " not ok" above rjust .PE diff --git a/violet/src/test/java/com/jakeapp/core/AllowSlowChecker.java b/violet/src/test/java/com/jakeapp/core/AllowSlowChecker.java index 51ff1201..23a83585 100755 --- a/violet/src/test/java/com/jakeapp/core/AllowSlowChecker.java +++ b/violet/src/test/java/com/jakeapp/core/AllowSlowChecker.java @@ -1,5 +1,5 @@ /** - * + * */ package com.jakeapp.core;