[haiku-depot-web] [haiku-depot-web-app] 4 new revisions pushed by haiku.li...@xxxxxxxxx on 2013-12-26 08:05 GMT

  • From: haiku-depot-web-app@xxxxxxxxxxxxxx
  • To: haiku-depot-web@xxxxxxxxxxxxx
  • Date: Thu, 26 Dec 2013 08:05:35 +0000

master moved from add7d5718fc2 to 4e0799542c71

4 new revisions:

Revision: 12ed1b18a7ac
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Mon Dec 23 10:02:34 2013 UTC
Log:      + shift all documentation to latex
http://code.google.com/p/haiku-depot-web-app/source/detail?r=12ed1b18a7ac

Revision: 1bd5d17378ca
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Mon Dec 23 10:27:25 2013 UTC
Log:      + corrections to the documentation after testing
http://code.google.com/p/haiku-depot-web-app/source/detail?r=1bd5d17378ca

Revision: d804a89f4f2d
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Mon Dec 23 10:36:29 2013 UTC
Log: + added license details to the latex source and added comments in the ...
http://code.google.com/p/haiku-depot-web-app/source/detail?r=d804a89f4f2d

Revision: 4e0799542c71
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Wed Dec 25 11:13:03 2013 UTC
Log: + provide a guid-based version for the web resources that are download...
http://code.google.com/p/haiku-depot-web-app/source/detail?r=4e0799542c71

==============================================================================
Revision: 12ed1b18a7ac
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Mon Dec 23 10:02:34 2013 UTC
Log:      + shift all documentation to latex

http://code.google.com/p/haiku-depot-web-app/source/detail?r=12ed1b18a7ac

Added:
 /haikudepotserver-docs/pom.xml
 /haikudepotserver-docs/src/main/latex/docs/docs.tex
 /haikudepotserver-docs/src/main/latex/docs/img-datamodel.pdf
 /haikudepotserver-docs/src/main/latex/docs/part-api.tex
 /haikudepotserver-docs/src/main/latex/docs/part-buildandrelease.tex
 /haikudepotserver-docs/src/main/latex/docs/part-config.tex
 /haikudepotserver-docs/src/main/latex/docs/part-datamodel.tex
 /haikudepotserver-docs/src/main/latex/docs/part-deployment.tex
 /haikudepotserver-docs/src/main/latex/docs/part-development.tex
 /haikudepotserver-docs/src/main/latex/docs/part-overview.tex
Deleted:
 /docs/api.md
 /docs/configguide.md
 /docs/deploymentguide.md
 /docs/developmentguide.md
Modified:
 /.gitignore
 /pom.xml

=======================================
--- /dev/null
+++ /haikudepotserver-docs/pom.xml      Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,28 @@
+<project
+        xmlns="http://maven.apache.org/POM/4.0.0";
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd";>
+
+    <parent>
+        <artifactId>haikudepotserver-parent</artifactId>
+        <groupId>org.haikuos</groupId>
+        <relativePath>../haikudepotserver-parent</relativePath>
+        <version>1.0.1-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.haikuos</groupId>
+    <artifactId>haikudepotserver-docs</artifactId>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>latex-maven-plugin</artifactId>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
=======================================
--- /dev/null
+++ /haikudepotserver-docs/src/main/latex/docs/docs.tex Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,45 @@
+\documentclass[a4paper,11pt]{article}
+\usepackage{graphicx}
+\usepackage{amssymb}
+\usepackage{color}
+\usepackage{hyperref}
+\usepackage{longtable}
+
+\font\srccode = cmtt10
+\font\example = cmss9
+
+\textwidth = 6.5 in
+\textheight = 9 in
+\oddsidemargin = 0.0 in
+\evensidemargin = 0.0 in
+\topmargin = 0.0 in
+\headheight = 0.0 in
+\headsep = 0.0 in
+\parskip = 0.2in
+\parindent = 0.0in
+\hypersetup{
+    colorlinks = true
+}
+
+\newtheorem{theorem}{Theorem}
+\newtheorem{corollary}[theorem]{Corollary}
+\newtheorem{definition}{Definition}
+
+\begin{document}
+
+\title{Haiku Depot Server}
+
+\maketitle
+
+\pagebreak
+
+\input{part-overview}
+\input{part-datamodel}
+\input{part-config}
+\input{part-buildandrelease}
+\input{part-deployment}
+\input{part-development}
+\input{part-api}
+
+\end{document}
+\end
=======================================
--- /dev/null   
+++ /haikudepotserver-docs/src/main/latex/docs/img-datamodel.pdf Mon Dec 23 10:02:34 2013 UTC
Binary file, no diff available.
=======================================
--- /dev/null
+++ /haikudepotserver-docs/src/main/latex/docs/part-api.tex Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,194 @@
+\section{API}
+
+\subsection{General}
+
+This information applies to all areas of the API for the system; both JSON-RPC and REST packaged.
+
+\subsubsection{Clients}
+
+A client of this system's API may be a desktop application (eg; Haiku Depot) or may be logic in a web page where the web page is using some java-script to call back to the server.
+
+\subsubsection{API Version}
+
+The application generally refers to ``api 1'' in anticipation that at some point there is the {\it possibility} that a second, incompatible API may be required.
+
+\subsubsection{Object References}
+
+When objects such as packages or users are referred to in the API, the database primary key is {\bf not} used. Instead either a natural or artifical identifier is employed. For example, in the case of a package, the package's name may be used. In the case of a screen-shot, a GUID (unique identifier) will be used to identify a particular screenshot.
+
+\subsubsection{Reference Data}
+
+Reference data means data in the application that is generally invariant. Examples include the mime types, natural language, url types and so on. In these cases, an API will generally provide for access to the list of reference data. The client is expected to obtain such reference data as necessary and cache reference data locally.
+
+\subsubsection{Invocations and Transport}
+
+The term ``invocation'' refers to a request-response cycle from the client software into the application server over the HTTP protocol. Each API invocation is made in a {\it stateless} manner in that each invocation is not dependent on the prior invocation.
+
+\subsubsection{Authentication}
+
+Authentication of invocations uses basic authentication for both REST and JSON-RPC. This procedure involves an HTTP header being included in each invocation that identifies the user and also provides their password. The value of the header includes a base-64 encoded string of the username and password, separated by a colon. This is an example of such a header;
+
+\framebox{\tt Authorization: Basic dXNlcjpwYXNzd29yZA}
+
+If the authentication fails then the request will continue unauthenticated; there is no `challenge' returned back to the caller. As part of the continuation of the invocation, an http 401 or 403 response maybe returned if authorization checks have failed. A special API exists to provide a means to test an authentication for the purposes of a login panel or similar.
+
+The application does not support cookie-based authentication.
+
+\subsection{JSON-RPC API}
+
+Most API is vended as \href{http://www.jsonrpc.org}{JSON-RPC} encoded HTTP POST invocations. The data transfer objects (DTOs) that describe the request and the response data as well as the APIs' interfaces exist in the ``haikudepotserver-api'' module in the java package;
+
+\framebox{\tt org.haikuos.haikudepotserver.api1}
+
+The documentation and list of available methods can be obtained by viewing the java interfaces and model objects in that module.
+
+\subsubsection{Example: Get a Package}
+
+In this example, the client knows the {\it name} of the package and would like to get the details of the package. The java model objects that document the data required in request and the data that can be expected in the response can be found in the project. The request model is;
+
+\framebox{\tt org.haikuos.haikudepotserver.api1.model.pkg.GetPkgRequest}
+
+The response model is;
+
+\framebox{\tt org.haikuos.haikudepotserver.api1.model.pkg.GetPkgResult}
+
+The actual server method that is invoked as a result of this request can be found at;
+
+\framebox{\tt org.haikuos.haikudepotserver.api1.PkgApi\#getPkg(..)}
+
+You will notice at the top of this interface, there is an annotation that describes the path or ``endpoint'' for this API. In this case it is ``{\tt /api/v1/pkg}''. Given a host and port, this can be extrapolated into a URL that can be used to invoke to this method. An example would be;
+
+\framebox{\tt http://localhost:8080/api/v1/pkg}
+
+The invocation is made using the HTTP protocol to such a URL with the method POST. The Content-Type HTTP header must be set to "{\tt application/json}" for both the request and the response. The request object would look something like this;
+
+\begin{verbatim}
+{
+ "jsonrpc":"2.0",
+ "id":4143431,
+ "method":"getPkg",
+ "params":[{
+   "name":"apr",
+   "architectureCode":"x86",
+   "versionType":"NONE"
+ }]
+}
+\end{verbatim}
+
+All going well, the following (abridged) form of response would be sent back to the client;
+
+\begin{verbatim}
+{
+ "jsonrpc":"2.0",
+ "id":4143431,
+ "result":{
+  "name":"apr",
+  "hasIcon":true,
+  "canEdit":false,
+  "versions":[],
+  "modifyTimestamp":12345678
+ }
+}
+\end{verbatim}
+
+See the \href{http://www.jsonrpc.org}{JSON-RPC} web site for examples of the response envelope format for the scenario in which an error has arisen in the invocation.
+
+\subsubsection{Error Codes}
+
+A set of known JSON-RPC error codes are agreed between the client and server. See the JSON-RPC specification for known error codes used for transport-related issues such as invalid parameters. Application-specific error codes are documented in the java source at;
+
+\framebox{\tt org.haikuos.haikudepotserver.api1.support.Constants}
+
+Some errors such as the validation error (code {\tt -32800}) may also carry additional data that provides detail as to the nature of the error that has arisen. Java logic for assembling the error payloads can be found at;
+
+\framebox{\tt org.haikuos.haikudepotserver.api1.support.ErrorResolverImpl}
+
+\subsection{REST API}
+
+REST API is generally required where data is inappropriate to encode as JSON-RPC. This tends to be situations where the data is binary in nature. An example of this is where a package icon needs to be uploaded.
+
+\subsubsection{Entry Point}
+
+This API will provide the web application's HTML user interface.
+
+\begin{itemize}
+\item HTTP Method : GET
+\item Path : /
+\item Response Content-Type : text/html
+\end{itemize}
+
+\subsubsection{Import Repository Data}
+
+This API provides a mechanism by which an external client is able to trigger the application to start importing package-related data from a remote repository. This API is provided as REST because the client is likely to be scripted using a scripting language and REST is the most appropriate protocol to employ in this situation. This invocation will trigger the import process, but the import process will execute in a background thread in the application server and will not block the client.
+
+\begin{itemize}
+\item HTTP Method : GET
+\item Path : /importrepositorydata
+\item Response Content-Type : text/plain
+\item Query Parameters
+  \begin{itemize}
+ \item {\bf code} : Identifies the repository from which data should be obtained
+  \end{itemize}
+\item Expected HTTP Status Codes
+  \begin{itemize}
+  \item {\bf 200} : The import job was accepted
+  \item {\bf 400} : The code was not supplied in the request
+  \end{itemize}
+\end{itemize}
+
+An example URL is;
+
+\framebox{\tt http://localhost:8080/importrepositorydata?code=haikuportsprod}
+
+\subsubsection{Get Package Icon}
+
+This API is able to provide the icon for a package. If there is no icon stored then this method will provide a fall-back image.
+
+\begin{itemize}
+\item HTTP Method : GET
+\item Path : /pkgicon/$<$pkgname$>$.png
+\item Response Content-Type : image/png
+\item Query Parameters
+  \begin{itemize}
+ \item {\bf size} : Either 16 or 32 for the number of pixels; other values are not allowed
+  \end{itemize}
+\item Expected HTTP Status Codes
+  \begin{itemize}
+  \item {\bf 200} : The icon is provided in the response
+  \item {\bf 415} : The path did not include ".png" or the size is invalid
+  \item {\bf 400} : The package name was not supplied
+  \item {\bf 404} : The package was not found
+  \end{itemize}
+\end{itemize}
+
+An example URL is;
+
+\framebox{\tt http://localhost:8080/pkgicon/apr.png?size=32}
+
+\subsubsection{Put Package Icon}
+
+This API is able to store an icon for a given size for a package.
+
+\begin{itemize}
+\item HTTP Method : PUT
+\item Path : /pkgicon/$<$pkgname$>$.png
+\item Query Parameters
+  \begin{itemize}
+ \item {\bf size} : Either 16 or 32 for the number of pixels; other values are not allowed
+  \end{itemize}
+\item Expected HTTP Status Codes
+  \begin{itemize}
+  \item {\bf 200} : The icon was stored
+ \item {\bf 415} : The path did not include ".png" or the size is invalid or the supplied data is not in PNG format or the size of the suppied data does not agree with the size specified in the query parameter. + \item {\bf 404} : The package identified in the path was not able to be found
+  \item {\bf 400} : The package name was not supplied
+  \end{itemize}
+\end{itemize}
+
+An example URL is;
+
+\framebox{\tt http://localhost:8080/pkgicon/apr.png?size=32}
+
+
+
+
=======================================
--- /dev/null
+++ /haikudepotserver-docs/src/main/latex/docs/part-buildandrelease.tex Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,43 @@
+\section{Build and Release}
+\label{buildandrelease}
+
+This section covers how to build the application server and how to produce release builds of it.
+
+\subsection{Building}
+
+The build process uses the \href{http://maven.apache.org}{Apache Maven} build tool. This is discussed in the prerequisites at \ref{prerequisites}.
+
+From source code, you can obtain a build by issuing the following command from the UNIX shell;
+
+\framebox{\tt mvn package}
+
+Given the state of the source code, this will produce build artifacts. Note that this may take some time for the first build because it will need to download various dependencies from the internet.
+
+\subsection{Release}
+
+A maven project has a ``version'' which is either a final version such as ``2.3.1'' or is a {\it snapshot} version such as ``2.3.2-SNAPSHOT''. The snapshot version is the version under which the next release is being done. Once it is ready, a release is made wherein that source-code is fixed to the version number without the trailing ``-SNAPSHOT'' and then the snapshot version is incremented. The release yields a tag in the SCM in order to be able to reproduce the source-code for that release against a release version. The tag will have a form such as ``haikudepotserver-2.3.2''.
+
+ The release process uses the maven 'release' system although there are two caveats;
+
+ \begin{itemize}
+ \item The release is made in the local git repository and is then pushed to remote repository {\bf manually} --- this differs from the typical behaviour where the changes are pushed to the remote repository automatically a number of times through the release process. + \item The build product(s) will not be copied to a remote maven repository (distribution management) because there is presently no such repository available.
+ \end{itemize}
+
+ To undertake a release, all changes in the local repository must be committed. Note that during the release process, the user will be prompted to supply version numbers at the console. The following commands will cause a release to be undertaken;
+
+ \begin{verbatim}
+ mvn clean
+ mvn release:prepare
+ mvn release:perform
+ git push
+ git push --tags
+ \end{verbatim}
+
+ In order to obtain source code state for a particular release, first pull changes from the remote repository and then checkout the source at the particular tag;
+
+ \begin{verbatim}
+ git checkout tags/haikudepotserver-2.3.2
+ \end{verbatim}
+
+ From there it will be possible to create a build product for that particular release.
=======================================
--- /dev/null
+++ /haikudepotserver-docs/src/main/latex/docs/part-config.tex Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,42 @@
+\section{Configuration}
+\label{config}
+
+The application server is configured using a standard java properties file. This same format is used in different ways for either an actual deployment or a development environment.
+
+A typical java properties file has the following general form;
+
+\begin{verbatim}
+# Comment
+key1=value
+key2=value
+\end{verbatim}
+
+There are a number of keys which are described below.
+
+\subsection{Database-Related}
+
+\subsubsection{\tt jdbc.driver}
+
+Class name of the JDBC driver employed.
+
+example : \framebox{\tt org.postgresql.Driver}
+
+\subsubsection{\tt jdbc.url}
+
+JDBC connect URL to the main database
+
+example : \framebox{jdbc:postgres://localhost:5432/haikudepotserver}
+
+\subsubsection{{\tt jdbc.username} and {\tt jdbc.password}}
+
+Database user's username and password
+
+\subsubsection{\tt flyway.migrate}
+
+Set this to ``true'' if you would like database schema migrations to be applied automatically as necessary. Generally this should be configured to ``true''.
+
+\subsection{Web-Related}
+
+\subsubsection{\tt webresourcegroup.separated}
+
+Some web resources such as javascript file can be concatinated for efficiency. Setting this configuration key to ``true'' will mean that such resources are delivered to browsers as separated files; less efficient, but easier to debug.
=======================================
--- /dev/null
+++ /haikudepotserver-docs/src/main/latex/docs/part-datamodel.tex Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,11 @@
+\section{Data Model}
+
+\begin{figure}
+\centering
+\vspace{.2in}
+\includegraphics[width=6.5in]{img-datamodel.pdf}
+\caption{Data model for the Haiku Desktop application.}
+\label{\thefigure}
+\end{figure}
+
+Figure {\thefigure} shows the approximate data model for the application server. Note that not all of this data model may be implemented; it is a {\it work in progress}.
=======================================
--- /dev/null
+++ /haikudepotserver-docs/src/main/latex/docs/part-deployment.tex Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,66 @@
+\section{Deployment}
+
+This section outlines the approximate steps to build and deploy the web application-server. The application-server build process produces a `stand-alone' java program. This build artifact is a packaged `jar' file that contains the \href{http://tomcat.apache.org}{Tomcat} servlet container as well as the web application. Upon launching, it will unbundle necessary parts and start-up listening on a socket for inbound HTTP requests.
+
+\fcolorbox{red}{white}{\parbox{\textwidth}{\color{red} The default database installs a user with the nickname of 'root' with a known password of 'p4mphl3t'. This password {\bf must} be changed before the system is made available over a network.}}
+
+A further point to note is that the API-related HTTP traffic into the application server uses basic-authentication. This technique exposes the username and password as a base64 encoded string in the HTTP payload. For this reason it is advised that HTTP traffic to and from the application server be transported as secure HTTP (https) in order to prevent a third party from reading the HTTP headers and extracting a user's authentication details.
+
+Please see \ref{prerequisites} for prerequisites required for running this software and \ref{buildandrelease} for information about obtaining a build product and possibly also creating a release version. The build product that you will require for deployment can be found at;
+
+\framebox{\tt haikudepotserver-webapp/target/haikudepotserver-webapp-1.2.3-war-exec.jar}
+
+Note that the leaf-name will vary depending on the release that is being build. You should also refer to \ref{config} for details of the format and keys for the configuration file. You will need to create a configuration file for your deployment.
+
+To launch the binary with 256 megabytes of heap memory, issue a command similar to;
+
+\begin{verbatim}
+java \
+ -Xmx256m \
+ -Djava.awt.headless=true \
+ -Dconfig.properties=/opt/haikudepotserver/config.properties \
+ -jar haikudepotserver-webapp-1.2.3-war-exec.jar \
+ -resetExtract \
+ -extractDirectory /var/cache/haikudepotserver-webapp
+\end{verbatim}
+
+By default the logging will be streamed to stdout/stderr. It is possible to configure this using a \href{http://logback.qos.ch/}{logback} logging configuration file.
+
+There are a handful of other easily-accessed command line options which can be used to fine-tune the deployment. These can be viewed by executing the binary as follows;
+
+\begin{verbatim}
+java \
+ -jar haikudepotserver-webapp-1.2.3-war-exec.jar \
+ -h
+\end{verbatim}
+
+\subsection{Setting Up Repositories}
+\label{settinguprepositories}
+
+{\it Note that this section is temporary until a user-interface exists for this.}
+
+The application server will pull ".hpkr" files from remote repositories that contain information about the packages at that repository. At the time of writing, it is necessary to configure the repositories by hand. A repository can be added using a SQL shell.
+
+In this ficticious example, an ".hpkr" file has been placed in the temporary directory. The following SQL command can be executed to add a repository that pulls the ".hpkr" from the temporary directory. In reality, the real repositories will have an internet-accessible URL.
+
+\begin{verbatim}
+INSERT INTO
+  haikudepot.repository (
+    id, active, create_timestamp, modify_timestamp,
+    architecture_id, code, url)
+  VALUES (
+    nextval('haikudepot.repository_seq'), true, now(), now(),
+    (SELECT id FROM haikudepot.architecture WHERE code='x86'),
+    'test',
+    'file:///tmp/repo.hpkr');
+\end{verbatim}
+
+In order to prompt the system to import this ".hpkr" file and populate some repository data into the system, you can use the curl tool as follows;
+
+\framebox{\tt curl "http://localhost:8080/importrepositorydata?code=test"}
+
+\subsection{Accessing the Web Environment}
+
+Once running, the web environment will be accessible from;
+
+\framebox{\tt http://localhost:8080/}
=======================================
--- /dev/null
+++ /haikudepotserver-docs/src/main/latex/docs/part-development.tex Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,23 @@
+\section{Development}
+
+This section covers how to setup the system for development purposes. First review \ref{prerequisites} for prerequisites. The project consists of a number of modules. "haikudepotserver-webapp" is the application server module. You should configure a {\it development} configuration file at the following location relative to the top-level of the source;
+
+\framebox{\tt haikudepotserver-webapp/src/main/resources/local.properties}
+
+See \ref{config} for details on the format and keys for this configuration file.
+
+Some of the project source-files (web resources) are downloaded from the internet on the first build. Your first step should be to undertake this first build by issuing this command from the top level of the project;
+
+\framebox{\tt mvn compile}
+
+This will compile the source code and in the process, download any necessary resources.
+
+To start-up the application server for development purposes, issue the following command from the same top level of the project;
+
+\framebox{\tt mvn org.apache.tomcat.maven:tomcat7-maven-plugin:2.1:run}
+
+This may take some time to start-up; especially the first time. Once it has started-up, it should be possible to connect to the application server using the following URL;
+
+\framebox{\tt http://localhost:8080/}
+
+There won't be any repositories or data loaded, and because of this, it is not possible to view any data. See \ref{settinguprepositories} for details on how to setup a repository and load-up some data to view.
=======================================
--- /dev/null
+++ /haikudepotserver-docs/src/main/latex/docs/part-overview.tex Mon Dec 23 10:02:34 2013 UTC
@@ -0,0 +1,53 @@
+\section{Overview and General Information}
+
+These documents cover an ``application-server'' called ``Haiku Depot Server'' which aims to provide an internet application that stores and allows interaction with software packages for the \href{http://www.haiku-os.org}{Haiku Operating System}.
+
+The application-server is able to communicate with remote repositories to retrieve ``Haiku Package Repository'' (.hpkr) files. .hpkr files contain a some detail of the packages that are stored at that repository. The application server is able to consume the .hpkr data and will populate its own internal database with some of the information that it contains.
+
+The application-server then provides an HTTP-vended API to that data as well as a web user-interface to the data. The system is able to augment the .hpkr sourced data with additional detail such as;
+
+\begin{itemize}
+\item Screenshots
+\item Icons
+\item Comments
+\end{itemize}
+
+\subsection{Hosted Source Code}
+
+The source code is hosted at;
+
+\framebox{http://code.google.com/p/haiku-depot-web-app/}
+
+\subsection{Prerequisites}
+\label{prerequisites}
+
+\begin{itemize}
+\item \href{https://community.java.net/open-jdk}{Java} $\geqslant$ 1.6
+\item \href{http://maven.apache.org}{Maven} $\geqslant$ 3.0.3
+\item \href{http://www.postgres.org}{Postgres} database $\geqslant$ 9.1
+\end{itemize}
+
+Note that on a debian host, these prerequisites can be installed with;
+
+\begin{verbatim}
+apt-get install default-jdk
+apt-get install maven
+apt-get install postgresql postgresql-client
+\end{verbatim}
+
+\subsubsection{Basic Postgres Setup}
+
+The setup discussed here is very simplistic as it is not possible to envisage all of the possible environmental factors involved in a production deployment. By this point, the Postgres database product is now installed on a UNIX-like computer system and is running as the system user 'postgres'. Create a new database with the following command;
+
+\framebox{\tt sudo -u postgres createuser -P -E haikudepotserver}
+
+Now create the database;
+
+\framebox{\tt sudo -u postgres createdb -O haikudepotserver haikudepotserver}
+
+You can check the login to the database works by opening a SQL terminal;
+
+\framebox{\tt psql -h localhost -U haikudepotserver haikudepotserver}
+
+Note that the database schema objects will be automatically configured by the application-server as it launches.
+
=======================================
--- /docs/api.md        Wed Dec 18 09:17:36 2013 UTC
+++ /dev/null
@@ -1,174 +0,0 @@
-# API
-
-## General
-
-This information applies to all areas of the API for the system.
-
-### Clients
-
-A client of this system's API may be a desktop application (eg; Haiku Depot) or may be logic in a web page where the web page is using some java-script to call back to the server.
-
-### API Version
-The application generally refers to "api 1" in anticipation that at some point there is the _possibility_ that a second, incompatible API may be required.
-
-### Object References
-When objects such as packages or users are referred to in the API, the database primary key is **not** used. Instead either a natural or artifical identifier is employed. For example, in the case of a package, the package's name may be used. In the case of a screen-shot, a GUID (unique identifier) will be used to identify a particular screenshot.
-
-### Reference Data
-Reference data means data in the application that is generally invariant. Examples include the mime types, natural language, url types and so on. In these cases, an API will generally provide for access to the list of reference data. The client is expected to obtain such reference data as necessary and cache reference data locally.
-
-### Invocations and Transport
-The term _invocation_ refers to a request-response cycle from the client software into the application server over the HTTP protocol. Each API invocation is made in a _stateless_ manner in that each invocation is not dependent on the prior invocation.
-
-### Authentication
-Authentication of invocations uses [basic authentication](http://en.wikipedia.org/wiki/Basic_access_authentication) for both REST and JSON-RPC. This procedure involves an HTTP header being included in each invocation that identifies the user and also provides their password. The value of the header includes a base-64 encoded string of the username and password, separated by a colon. This is an example;
-
-```
-Authorization: Basic dXNlcjpwYXNzd29yZA==
-```
-
-If the authentication fails then the request will continue unauthenticated; there is no 'challenge' returned back to the caller. A special API exists to provide a means to test an authentication.
-
-The application does not support cookie-based authentication.
-
-## JSON-RPC API
-
-Most API is vended as JSON-RPC(http://www.jsonrpc.org) encoded HTTP POST invocations. The data transfer objects (DTOs) that describe the request and the response data as well as the APIs' interfaces exist in the "haikudepotserver-api" module in the java package "org.haikuos.haikudepotserver.api1".
-
-The documentation and list of available methods can be obtained by viewing the java interfaces and model objects in that module.
-
-### Exmaple; Get a Package
-
-In this example, the client knows the _name_ of the package and would like to get the details of the package. The java model objects that document the data required in request and the data that can be expected in the response can be found in the project;
-
-* org.haikuos.haikudepotserver.api1.model.pkg.GetPkgRequest
-* org.haikuos.haikudepotserver.api1.model.pkg.GetPkgResult
-
-The method that is invoked can be found at;
-
-```
-org.haikuos.haikudepotserver.api1.PkgApi#getPkg(..)
-```
-
-You will notice at the top of this interface, there is an annotation that describes the path or "endpoint" for this API. In this case it is "/api/v1/pkg". Given a host and port, this can be extrapolated into a URL that can be used to invoke to this method;
-
-```
-http://localhost:8080/api/v1/pkg
-```
-
-The invocation is made using the HTTP protocol with the method POST. The Content-Type HTTP header must be set to "application/json" for both the request and the response. The request object would look something like this;
-
-```
-{
- "jsonrpc":"2.0",
- "id":4143431,
- "method":"getPkg",
- "params":[{
-   "name":"apr",
-   "architectureCode":"x86",
-   "versionType":"NONE"
- }]
-}
-```
-
-All going well, the following (abridged) form of response would be sent back to the client;
-
-```
-{
- "jsonrpc":"2.0",
- "id":4143431,
- "result":{
-  "name":"apr",
-  "hasIcon":true,
-  "canEdit":false,
-  "versions":[],
-  "modifyTimestamp":12345678
- }
-}
-```
-
-See the [JSON-RPC](http://www.jsonrpc.org) web site for examples of the response envelope format for the scenario in which an error has arisen in the invocation.
-
-### Error Codes
-
-A set of known JSON-RPC error codes are agreed between the client and server. See the JSON-RPC 'specification' for known error codes used for transport-related issues such as invalid parameters. Application-specific error codes are documented in the java source at;
-
-* org.haikuos.haikudepotserver.api1.support.Constants
-
-Some errors such as the validation error (code -32800) may also carry additional data that provides detail as to the nature of the error that has arisen. Java logic for assembling the error payloads can be found at;
-
-* org.haikuos.haikudepotserver.api1.support.ErrorResolverImpl
-
-## REST API
-
-REST API is generally required where data is inappropriate to encode as JSON-RPC. This tends to be situations where the data is binary in nature. An example of this is where a package icon needs to be uploaded.
-
-### Entry Point
-This API will provide the web application's HTML user interface.
-
-* HTTP Method : GET
-* Path : /
-* Response _Content-Type_ : text/html
-
-### Import Repository Data
-
-This API provides a mechanism by which an external client is able to trigger the application to start importing package-related data from a remote repository. This API is provided as REST because the client is likely to be scripted using a scripting language and REST is the most appropriate protocol to employ in this situation. This invocation will trigger the import process, but the import process will execute in a background thread in the application server and will not block the client.
-
-* HTTP Method : GET
-* Path : /importrepositorydata
-* Response _Content-Type_ : text/plain
-* Query Parameters
-       *  **code** : Identifies the repository from which data should be 
obtained
-* Expected HTTP Status Codes
-       * **200** : The import job was accepted
-       * **400** : The code was not supplied in the request
-
-An example URL is;
-
-```
-http://localhost:8080/importrepositorydata?code=haikuportsprod
-```
-
-### Get Package Icon
-
-This API is able to provide the icon for a package. If there is no icon stored then this method will provide a fall-back image.
-
-* HTTP Method : GET
-* Path : /pkgicon/<pkgname>.png
-* Response _Content-Type_ : image/png
-* Query Parameters
- * **size** : Either 16 or 32 for the number of pixels; other values are not allowed
-* Expected HTTP Status Codes
-       * **200** : The icon is provided in the response
-       * **415** : The path did not include ".png" or the size is invalid
-       * **400** : The package name was not supplied
-       * **404** : The package was not found
-
-An example URL is;
-
-```
-http://localhost:8080/pkgicon/apr.png?size=32
-```
-
-### Put Package Icon
-
-This API is able to store an icon for a given size for a package.
-
-* HTTP Method : PUT
-* Path : /pkgicon/<pkgname>.png
-* Query Parameters
- * **size** : Either 16 or 32 for the number of pixels; other values are not allowed
-* Expected HTTP Status Codes
-       * **200** : The icon was stored
- * **415** : The path did not include ".png" or the size is invalid or the supplied data is not in PNG format or the size of the suppied data does not agree with the size specified in the query parameter.
-       * **404** : The package identified in the path was not able to be found
-       * **400** : The package name was not supplied
-
-An example URL is;
-
-```
-http://localhost:8080/pkgicon/apr.png?size=32
-```
-
-
-
=======================================
--- /docs/configguide.md        Wed Dec 18 09:17:36 2013 UTC
+++ /dev/null
@@ -1,27 +0,0 @@
-# Configuration Guide
-
-The application is configured using a standard java properties file. The typical format has this form;
-
-```
-# Comment
-key1=value
-key2=value
-```
-
-There are a number of keys which are described below.
-
-## Database
-
-| Key | Description |Sample|
-|:----|:------------|:-----|
-| ```jdbc.driver```|This is the class name of the JDBC driver employed.| ```org.postgresql.Driver```| -|```jdbc.url```|This is the JDBC connect URL to the main database| ```jdbc:postgres://localhost:5432/haikudepotserver```|
-|```jdbc.username```|Database user's username|-|
-|```jdbc.password```|Database user's password|-|
-|```flyway.migrate```|Set this to true if you would like database schema migrations to be applied automatically as necessary. Generally this should be configured to true.|true|
-
-## Web
-
-| Key | Description |Sample|
-|:----|:------------|:-----|
-| ```webresourcegroup.separated```|Some web resources such as javascript file can be concatinated for efficiency. Setting this configuration key to true will mean that such resources are delivered to browsers as separated files; less efficient, but easier to debug.|false|
=======================================
--- /docs/deploymentguide.md    Wed Dec 18 09:17:36 2013 UTC
+++ /dev/null
@@ -1,128 +0,0 @@
-# Deployment Guide
-
-This document outlines the approximate steps to build and deploy the web application-server. The application-server build process produces a 'stand-alone' java program. This build artifact is a packaged 'jar' file.
-
-## Warning; Root User
-
-The default database installs a user with the nickname of 'root' with a known password of 'p4mphl3t'. This password **must** be changed before the system is made available.
-
-## Java and Maven
-
-The application server runs in a java process. For this reason, your deployment environment should have java 1.6 or better available. On a [Debian](http://www.debian.org) 7.x host, it is possible to install java with;
-
-```
-apt-get install default-jdk
-```
-
-In order to build the application server, it is necessary to install [Apache Maven](http://maven.apache.org) version 3 or better. On a [Debian](http://www.debian.org) 7.x host, it is possible to install maven with;
-
-```
-apt-get install maven
-```
-
-## Database
-
-The actual database configuration for a production environment may differ from that described here. These setup steps are simplistic as it is not possible to envisage all of the possible environmental factors involved in a production deployment.
-
-The application server stores its operational data in a relational database. The database _product_ that this project uses is [Postgres](http://www.postgres.org). You should install Postgres version 9.1 or better. This document does not cover platform installation of Postgres although it is possible to install the necessary Postgres database and tools on a [Debian](http://www.debian.org) 7.x host with;
-
-```
-apt-get install postgresql postgresql-client
-```
-
-### Setup Database and User for Development
-
-By this point, the Postgres database _product_ is now installed on a UNIX-like computer system and is running as the UNIX user 'postgres'. Create a new database with the following command;
-
-```
-sudo -u postgres createuser -P -E haikudepotserver
-```
-
-Now create the database;
-
-```
-sudo -u postgres createdb -O haikudepotserver haikudepotserver
-```
-
-### Check Login
-
-You can check the login to the database works by opening a SQL terminal;
-
-```
-psql -h localhost -U haikudepotserver haikudepotserver
-```
-
-### Configure Schema Objects
-
-The application server will populate and configure the schema objects itself as it first loads. Subject to correct configuration, subsequent versions of the application server will then upgrade the database schema objects as necessary as the application server launches.
-
-## Obtaining the Build Product
-
-To build the application server, it is necessary to have an internet connection. The build process may take some time to complete for the first build because many dependencies will need to be downloaded from the internet.
-
-### Development / Snapshot Build
-
-From the top level of the project, issue the following command to build all of the artifacts; `mvn clean && mvn package`. This will produce a deployment artifact at;
-
-```
-haikudepotserver-webapp/target/haikudepotserver-webapp-1.0.1-SNAPSHOT-war-exec.jar
-```
-
-The actual filename may vary depending on the version being built.
-
-## Launching
-
-To launch the binary with 256 megabytes of heap memory, issue a command similar to;
-
-```
-java \
- -Xmx256m \
- -Dconfig.properties=/opt/haikudepotserver/config.properties \
- -jar haikudepotserver-webapp-1.2.3-war-exec.jar \
- -resetExtract \
- -extractDirectory /var/cache/haikudepotserver-webapp
-```
-
-The configuration properties file is documented separately. You will need to create a configuration file for your deployment environment.
-
-By default the logging will be streamed to stdout/stderr. It is possible to configure this using a [logback](http://logback.qos.ch/) logging configuration file.
-
-The binary runs as an [Apache Tomcat](http://tomcat.apache.org/) server. There are a handful of other easily-accessed command line options which can be used to fine-tune the deployment. These can be viewed by executing the binary as follows;
-
-```
-java \
- -jar haikudepotserver-webapp-1.2.3-war-exec.jar
- -h
-```
-
-## Setting Up Repositories
-
-The application server will pull ".hpkr" files from remote repositories that contain information about the packages at that repository. At the time of writing, it is necessary to configure the repositories by hand. A repository can be added using a SQL shell.
-
-In this ficticious example, an ".hpkr" file has been placed in the temporary directory. The following SQL command can be executed to add a repository that pulls the ".hpkr" from the temporary directory. In reality, the real repositories will have an internet-accessible URL.
-
-```
-INSERT INTO
-  haikudepot.repository (
-    id, active, create_timestamp, modify_timestamp,
-    architecture_id, code, url)
-  VALUES (
-    nextval('haikudepot.repository_seq'), true, now(), now(),
-    (SELECT id FROM haikudepot.architecture WHERE code='x86'),
-    'test',
-    'file:///tmp/repo.hpkr');
-```
-
-In order to prompt the system to import this ".hpkr" file and populate some repository data into the system, you can use the curl tool as follows;
-
-```
-curl "http://localhost:8080/importrepositorydata?code=test";
-```
-
-## Accessing the Web Environment
-
-Once running, the web environment will be accessible from;
-
-```
-http://localhost:8081/
-```
=======================================
--- /docs/developmentguide.md   Wed Dec 18 09:17:36 2013 UTC
+++ /dev/null
@@ -1,34 +0,0 @@
-# Development Guide
-
-Many of the setup steps for development cross-over with the actual deployment and so this should be read along-side the deployment guide. The prerequisites are largely the same;
-
-* Java and Maven
-* Postgres
-
-The project consists of a number of modules. The "haikudepotserver-webapp" is the application server module. You should configure a **development** configuration file at the following location relative to the top-level of the source;
-
-```
-haikudepotserver-webapp/src/main/resources/local.properties
-```
-
-See the accompanying configuration document for details on the form of these configuration files.
-
-Some of the project source-files (web resources) are downloaded from the internet on the first build. Your first step should be to undertake a build by issuing this command from the top level of the project;
-
-```
-mvn package
-```
-
-To start-up the application server for development purposes, issue the following command from the same top level of the project;
-
-```
-mvn org.apache.tomcat.maven:tomcat7-maven-plugin:2.1:run
-```
-
-This may take some time to start-up; especially the first time. Once it has started-up, it should be possible to connect to the application server using the following URL;
-
-```
-http://localhost:8080/
-```
-
-There won't be any repositories or data loaded, and because of this, it is not possible to view any data. See the deployment guide for details on how to setup a repository and load it in.
=======================================
--- /.gitignore Thu Dec 19 10:26:09 2013 UTC
+++ /.gitignore Mon Dec 23 10:02:34 2013 UTC
@@ -3,6 +3,7 @@
 target
 haikudepotserver-webapp/src/main/webapp/bootstrap/**
 haikudepotserver-webapp/src/main/webapp/js/lib/*.js
+haikudepotserver-webapp/src/main/webapp/js/lib/*.map
 haikudepotserver-webapp/src/main/resources/local.properties


=======================================
--- /pom.xml    Fri Dec 20 06:30:50 2013 UTC
+++ /pom.xml    Mon Dec 23 10:02:34 2013 UTC
@@ -11,6 +11,7 @@
         <module>haikudepotserver-api1</module>
         <module>haikudepotserver-packagefile</module>
         <module>haikudepotserver-parent</module>
+        <module>haikudepotserver-docs</module>
     </modules>

     <!--

==============================================================================
Revision: 1bd5d17378ca
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Mon Dec 23 10:27:25 2013 UTC
Log:      + corrections to the documentation after testing

http://code.google.com/p/haiku-depot-web-app/source/detail?r=1bd5d17378ca

Modified:
 /haikudepotserver-docs/src/main/latex/docs/part-config.tex
 /haikudepotserver-docs/src/main/latex/docs/part-deployment.tex

=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-config.tex Mon Dec 23 10:02:34 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-config.tex Mon Dec 23 10:27:25 2013 UTC
@@ -25,7 +25,7 @@

 JDBC connect URL to the main database

-example : \framebox{jdbc:postgres://localhost:5432/haikudepotserver}
+example : \framebox{jdbc:postgresql://localhost:5432/haikudepotserver}

 \subsubsection{{\tt jdbc.username} and {\tt jdbc.password}}

=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-deployment.tex Mon Dec 23 10:02:34 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-deployment.tex Mon Dec 23 10:27:25 2013 UTC
@@ -18,7 +18,7 @@
 java \
  -Xmx256m \
  -Djava.awt.headless=true \
- -Dconfig.properties=/opt/haikudepotserver/config.properties \
+ -Dconfig.properties=file:///opt/haikudepotserver/config.properties \
  -jar haikudepotserver-webapp-1.2.3-war-exec.jar \
  -resetExtract \
  -extractDirectory /var/cache/haikudepotserver-webapp

==============================================================================
Revision: d804a89f4f2d
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Mon Dec 23 10:36:29 2013 UTC
Log: + added license details to the latex source and added comments in the README file to outline access to the documentation

http://code.google.com/p/haiku-depot-web-app/source/detail?r=d804a89f4f2d

Modified:
 /README.TXT
 /haikudepotserver-docs/src/main/latex/docs/docs.tex
 /haikudepotserver-docs/src/main/latex/docs/part-api.tex
 /haikudepotserver-docs/src/main/latex/docs/part-buildandrelease.tex
 /haikudepotserver-docs/src/main/latex/docs/part-config.tex
 /haikudepotserver-docs/src/main/latex/docs/part-datamodel.tex
 /haikudepotserver-docs/src/main/latex/docs/part-deployment.tex
 /haikudepotserver-docs/src/main/latex/docs/part-development.tex
 /haikudepotserver-docs/src/main/latex/docs/part-overview.tex

=======================================
--- /README.TXT Wed Dec 18 09:17:36 2013 UTC
+++ /README.TXT Mon Dec 23 10:36:29 2013 UTC
@@ -3,4 +3,9 @@

This collection of files represents the source code for the "Haiku Depot Server"; a web-services and HTML environment for working with Haiku packages. This is a maven java project that primarily builds an application server. Further -documentation regarding this project can be found in the "haikudepotserver-docs" directory. +documentation regarding this project can be found in the "haikudepotserver-docs" directory. The documentation is in +LaTeX format and, assuming a LaTeX distribution is installed, it can be built by issuing the command...
+
+  mvn latex:latex
+
+...from the top level of the "haikudepotserver-docs" directory.
=======================================
--- /haikudepotserver-docs/src/main/latex/docs/docs.tex Mon Dec 23 10:02:34 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/docs.tex Mon Dec 23 10:36:29 2013 UTC
@@ -1,3 +1,8 @@
+% -----------
+% Copyright 2013, Andrew Lindesay
+% Distributed under the terms of the MIT License.
+% -----------
+
 \documentclass[a4paper,11pt]{article}
 \usepackage{graphicx}
 \usepackage{amssymb}
=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-api.tex Mon Dec 23 10:02:34 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-api.tex Mon Dec 23 10:36:29 2013 UTC
@@ -1,3 +1,8 @@
+% -----------
+% Copyright 2013, Andrew Lindesay
+% Distributed under the terms of the MIT License.
+% -----------
+
 \section{API}

 \subsection{General}
=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-buildandrelease.tex Mon Dec 23 10:02:34 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-buildandrelease.tex Mon Dec 23 10:36:29 2013 UTC
@@ -1,3 +1,8 @@
+% -----------
+% Copyright 2013, Andrew Lindesay
+% Distributed under the terms of the MIT License.
+% -----------
+
 \section{Build and Release}
 \label{buildandrelease}

=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-config.tex Mon Dec 23 10:27:25 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-config.tex Mon Dec 23 10:36:29 2013 UTC
@@ -1,3 +1,8 @@
+% -----------
+% Copyright 2013, Andrew Lindesay
+% Distributed under the terms of the MIT License.
+% -----------
+
 \section{Configuration}
 \label{config}

=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-datamodel.tex Mon Dec 23 10:02:34 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-datamodel.tex Mon Dec 23 10:36:29 2013 UTC
@@ -1,3 +1,8 @@
+% -----------
+% Copyright 2013, Andrew Lindesay
+% Distributed under the terms of the MIT License.
+% -----------
+
 \section{Data Model}

 \begin{figure}
=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-deployment.tex Mon Dec 23 10:27:25 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-deployment.tex Mon Dec 23 10:36:29 2013 UTC
@@ -1,3 +1,8 @@
+% -----------
+% Copyright 2013, Andrew Lindesay
+% Distributed under the terms of the MIT License.
+% -----------
+
 \section{Deployment}

This section outlines the approximate steps to build and deploy the web application-server. The application-server build process produces a `stand-alone' java program. This build artifact is a packaged `jar' file that contains the \href{http://tomcat.apache.org}{Tomcat} servlet container as well as the web application. Upon launching, it will unbundle necessary parts and start-up listening on a socket for inbound HTTP requests.
=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-development.tex Mon Dec 23 10:02:34 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-development.tex Mon Dec 23 10:36:29 2013 UTC
@@ -1,3 +1,8 @@
+% -----------
+% Copyright 2013, Andrew Lindesay
+% Distributed under the terms of the MIT License.
+% -----------
+
 \section{Development}

This section covers how to setup the system for development purposes. First review \ref{prerequisites} for prerequisites. The project consists of a number of modules. "haikudepotserver-webapp" is the application server module. You should configure a {\it development} configuration file at the following location relative to the top-level of the source;
=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-overview.tex Mon Dec 23 10:02:34 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-overview.tex Mon Dec 23 10:36:29 2013 UTC
@@ -1,3 +1,8 @@
+% -----------
+% Copyright 2013, Andrew Lindesay
+% Distributed under the terms of the MIT License.
+% -----------
+
 \section{Overview and General Information}

These documents cover an ``application-server'' called ``Haiku Depot Server'' which aims to provide an internet application that stores and allows interaction with software packages for the \href{http://www.haiku-os.org}{Haiku Operating System}.
@@ -11,6 +16,10 @@
 \item Icons
 \item Comments
 \end{itemize}
+
+\subsection{License}
+
+The license can be found in the file {\tt LICENSE.TXT} at the top level of the project source.

 \subsection{Hosted Source Code}


==============================================================================
Revision: 4e0799542c71
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Wed Dec 25 11:13:03 2013 UTC
Log: + provide a guid-based version for the web resources that are downloaded and included locally in the source

http://code.google.com/p/haiku-depot-web-app/source/detail?r=4e0799542c71

Added:
/haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/model/WebResourceGroupService.java
 /haikudepotserver-webapp/src/main/resources/webresources.properties
Modified:
 /.gitignore
 /haikudepotserver-docs/src/main/latex/docs/part-buildandrelease.tex
 /haikudepotserver-webapp/pom.xml
 /haikudepotserver-webapp/src/etc/ant/fetchwebresources-build.xml
/haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/WebResourceGroupTag.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/controller/EntryPointController.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/controller/WebResourceGroupController.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/model/WebResourceGroup.java
 /haikudepotserver-webapp/src/main/resources/spring/application-context.xml
/haikudepotserver-webapp/src/main/resources/spring/webresourcegroup-context.xml
 /haikudepotserver-webapp/src/main/webapp/WEB-INF/views/entryPoint.jsp
 /pom.xml

=======================================
--- /dev/null
+++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/model/WebResourceGroupService.java Wed Dec 25 11:13:03 2013 UTC
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2013, Andrew Lindesay
+ * Distributed under the terms of the MIT License.
+ */
+
+package org.haikuos.haikudepotserver.web.model;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+import java.util.List;
+
+/**
+ * <p>This service just keeps all of the web resource groups together and also keeps any properties that are necessary
+ * to access the web resources in one place.</p>
+ */
+
+public class WebResourceGroupService {
+
+    private String guid;
+
+    private List<WebResourceGroup> webResourceGroups;
+
+    public String getGuid() {
+        return guid;
+    }
+
+    public void setGuid(String guid) {
+        this.guid = guid;
+    }
+
+    public List<WebResourceGroup> getWebResourceGroups() {
+        return webResourceGroups;
+    }
+
+ public void setWebResourceGroups(List<WebResourceGroup> webResourceGroups) {
+        this.webResourceGroups = webResourceGroups;
+    }
+
+ public Optional<WebResourceGroup> getWebResourceGroup(final String code) {
+        Preconditions.checkNotNull(code);
+        return Iterables.tryFind(
+                getWebResourceGroups(),
+                new Predicate<WebResourceGroup>() {
+                    @Override
+ public boolean apply(org.haikuos.haikudepotserver.web.model.WebResourceGroup input) {
+                        return input.getCode().equals(code);
+                    }
+                }
+        );
+    }
+}
=======================================
--- /dev/null
+++ /haikudepotserver-webapp/src/main/resources/webresources.properties Wed Dec 25 11:13:03 2013 UTC
@@ -0,0 +1,4 @@
+# This property is supplied by the maven build system in order to coordinate the version of the web resources that is +# downloaded using the ant task and which is distributed out to web clients.
+
+webresources.guid=${webresources.guid}
=======================================
--- /.gitignore Mon Dec 23 10:02:34 2013 UTC
+++ /.gitignore Wed Dec 25 11:13:03 2013 UTC
@@ -2,8 +2,7 @@
 *.iml
 target
 haikudepotserver-webapp/src/main/webapp/bootstrap/**
-haikudepotserver-webapp/src/main/webapp/js/lib/*.js
-haikudepotserver-webapp/src/main/webapp/js/lib/*.map
+haikudepotserver-webapp/src/main/webapp/js/lib/**
 haikudepotserver-webapp/src/main/resources/local.properties


=======================================
--- /haikudepotserver-docs/src/main/latex/docs/part-buildandrelease.tex Mon Dec 23 10:36:29 2013 UTC +++ /haikudepotserver-docs/src/main/latex/docs/part-buildandrelease.tex Wed Dec 25 11:13:03 2013 UTC
@@ -12,9 +12,9 @@

The build process uses the \href{http://maven.apache.org}{Apache Maven} build tool. This is discussed in the prerequisites at \ref{prerequisites}.

-From source code, you can obtain a build by issuing the following command from the UNIX shell; +From source code, you can obtain a clean build by issuing the following command from the UNIX shell;

-\framebox{\tt mvn package}
+\framebox{\tt mvn clean && mvn package}

Given the state of the source code, this will produce build artifacts. Note that this may take some time for the first build because it will need to download various dependencies from the internet.

=======================================
--- /haikudepotserver-webapp/pom.xml    Wed Dec 18 09:46:25 2013 UTC
+++ /haikudepotserver-webapp/pom.xml    Wed Dec 25 11:13:03 2013 UTC
@@ -17,18 +17,39 @@

     <properties>

+        <!--
+ This random UUID identifies the current version of the web-resources. If this value is bumped, the effect + is that new resources will be downloaded from the internet. Use the UNIX command "uuidgen" to get a new
+        identifier.
+        -->
+
+ <webresources.guid>79A1B854-6665-4254-B24C-E40564DCA393</webresources.guid>
+
+        <!--
+ These are the versions of web-resources that are downloaded as part of this version of web resources
+        -->
         <angularuibootstrapjs.version>0.6.0</angularuibootstrapjs.version>
         <angularuiutils.version>0.4.0</angularuiutils.version>
         <angularjs.version>1.2.0</angularjs.version>
         <base64js.version>0.1.3</base64js.version>
+        <bootstrap.version>3.0.0</bootstrap.version>
         <underscorejs.version>1.5.2</underscorejs.version>
         <momentjs.version>2.3.1</momentjs.version>

-        <!-- ANT -->
+        <!--
+ These are the source (base URLs) for the web resources to be downloaded from.
+        -->
+
         <js.angularjsurl>http://code.angularjs.org</js.angularjsurl>
         <js.cdnurl>http://cdnjs.cloudflare.com/ajax/libs</js.cdnurl>
-        <js.libsroot>${basedir}/src/main/webapp/js/lib</js.libsroot>
- <bootstrap.root>${basedir}/src/main/webapp/bootstrap</bootstrap.root> + <bootstrap.url>https://github.com/twbs/bootstrap/releases/download</bootstrap.url>
+
+        <!--
+ These are the locations within the project into which the web-resources will be saved.
+        -->
+
+ <js.libsroot>${basedir}/src/main/webapp/js/lib/${webresources.guid}</js.libsroot> + <bootstrap.root>${basedir}/src/main/webapp/bootstrap/${webresources.guid}</bootstrap.root>

     </properties>

@@ -132,6 +153,24 @@
     </dependencies>

     <build>
+
+        <resources>
+            <resource>
+                <directory>${basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>webresources.properties</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${basedir}/src/main/resources</directory>
+                <filtering>false</filtering>
+                <excludes>
+                    <exclude>webresources.properties</exclude>
+                </excludes>
+            </resource>
+        </resources>
+
         <plugins>


=======================================
--- /haikudepotserver-webapp/src/etc/ant/fetchwebresources-build.xml Fri Dec 20 09:53:18 2013 UTC +++ /haikudepotserver-webapp/src/etc/ant/fetchwebresources-build.xml Wed Dec 25 11:13:03 2013 UTC
@@ -17,6 +17,10 @@
     </target>

     <target name="js">
+
+        <mkdir dir="${js.libsroot}"/>
+        <mkdir dir="${bootstrap.root}"/>
+
         <!-- user interface / events / mvc -->
<get src="${js.angularjsurl}/${angularjs.version}/angular.js" dest="${js.libsroot}/angular.js" skipexisting="true" /> <get src="${js.angularjsurl}/${angularjs.version}/angular.min.js" dest="${js.libsroot}/angular-min.js" skipexisting="true" />
@@ -46,9 +50,9 @@
     </target>

<target name="bootstrap" depends="bootstrap.check" unless="bootstrap.present"> - <get src="https://github.com/twbs/bootstrap/releases/download/v3.0.0/bootstrap-3.0.0-dist.zip"; dest="${java.io.tmpdir}/bootstrap-3.0.0-dist.zip" /> - <unzip src="${java.io.tmpdir}/bootstrap-3.0.0-dist.zip" dest="${bootstrap.root}"/>
-        <delete file="${java.io.tmpdir}/bootstrap-3.0.0-dist.zip"/>
+ <get src="${bootstrap.url}/v${bootstrap.version}/bootstrap-${bootstrap.version}-dist.zip" dest="${java.io.tmpdir}/bootstrap-${bootstrap.version}-dist.zip" /> + <unzip src="${java.io.tmpdir}/bootstrap-${bootstrap.version}-dist.zip" dest="${bootstrap.root}"/> + <delete file="${java.io.tmpdir}/bootstrap-${bootstrap.version}-dist.zip"/>
     </target>

     <target name="main" depends="bootstrap,js"/>
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/WebResourceGroupTag.java Wed Dec 11 08:25:33 2013 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/WebResourceGroupTag.java Wed Dec 25 11:13:03 2013 UTC
@@ -5,8 +5,10 @@

 package org.haikuos.haikudepotserver.web;

+import com.google.common.base.Optional;
 import com.google.common.net.MediaType;
 import org.haikuos.haikudepotserver.web.model.WebResourceGroup;
+import org.haikuos.haikudepotserver.web.model.WebResourceGroupService;
 import org.springframework.context.ApplicationContext;
 import org.springframework.web.context.support.WebApplicationContextUtils;
 import org.springframework.web.servlet.tags.form.AbstractHtmlElementTag;
@@ -48,11 +50,14 @@
HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();

ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext()); - WebResourceGroup webResourceGroup = ctx.getBean(getCode() + WebResourceGroup.SUFFIX_BEANNAME, WebResourceGroup.class); + WebResourceGroupService service = ctx.getBean(WebResourceGroupService.class); + Optional<WebResourceGroup> webResourceGroupOptional = service.getWebResourceGroup(getCode());

-        if(null==webResourceGroup) {
+        if(!webResourceGroupOptional.isPresent()) {
throw new JspException("unable to find the web resource group with the code '"+getCode()+"'");
         }
+
+        WebResourceGroup webResourceGroup = webResourceGroupOptional.get();

// if they are to be separated then render a script tag for each one; otherwise just render one
         // script tag that will join them all together.
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/controller/EntryPointController.java Wed Dec 11 08:25:33 2013 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/controller/EntryPointController.java Wed Dec 25 11:13:03 2013 UTC
@@ -5,10 +5,15 @@

 package org.haikuos.haikudepotserver.web.controller;

+import org.haikuos.haikudepotserver.web.model.WebResourceGroupService;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;

+import javax.annotation.Resource;
+import java.io.IOException;
+
 /**
* <p>This controller renders the default HTML entry point into the application. As this is <em>generally</em> a * single page application, this controller will just render that single page.</p>
@@ -17,6 +22,14 @@
 @Controller
 @RequestMapping("/")
 public class EntryPointController {
+
+    @Resource
+    WebResourceGroupService webResourceGroupService;
+
+    @ModelAttribute("webResourcesGuid")
+    public String getWebResourcesGuid() throws IOException {
+        return webResourceGroupService.getGuid();
+    }

     @RequestMapping(method = RequestMethod.GET)
     public String entryPoint() {
=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/controller/WebResourceGroupController.java Wed Dec 11 08:25:33 2013 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/controller/WebResourceGroupController.java Wed Dec 25 11:13:03 2013 UTC
@@ -5,12 +5,14 @@

 package org.haikuos.haikudepotserver.web.controller;

+import com.google.common.base.Optional;
 import com.google.common.base.Strings;
 import com.google.common.io.ByteStreams;
 import com.google.common.net.HttpHeaders;
 import com.google.common.net.MediaType;
 import org.haikuos.haikudepotserver.web.model.WebResourceGroup;
 import org.haikuos.haikudepotserver.support.Closeables;
+import org.haikuos.haikudepotserver.web.model.WebResourceGroupService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeansException;
@@ -42,6 +44,9 @@

     public final static String KEY_CODE = "code";

+    @javax.annotation.Resource
+    WebResourceGroupService webResourceGroupService;
+
     private ApplicationContext applicationContext;

     @Override
@@ -61,33 +66,28 @@
response.getWriter().print(String.format("the code is required"));
         }
         else {
+ Optional<WebResourceGroup> webResourceGroupOptional = webResourceGroupService.getWebResourceGroup(code);

-            String beanId = code + WebResourceGroup.SUFFIX_BEANNAME;
-            WebResourceGroup webResourceGroup = null;
-
-            try {
- webResourceGroup = applicationContext.getBean(beanId, WebResourceGroup.class);
-            }
-            catch(NoSuchBeanDefinitionException nsbde) {
- // this is ignored because the fact that the webResourceGroup is not defined will
-                // result in a 404 anyway.
-            }
+            if(
+                    !webResourceGroupOptional.isPresent() ||
+ null==webResourceGroupOptional.get().getResources() || + 0==webResourceGroupOptional.get().getResources().size()) {

- if(null==webResourceGroup || null==webResourceGroup.getResources() || 0==webResourceGroup.getResources().size()) {
                 response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.PLAIN_TEXT_UTF_8.toString()); response.getWriter().print(String.format("unable to find script group; %s",code));
+
             }
             else {
                 response.setStatus(HttpServletResponse.SC_OK);
- response.setHeader(HttpHeaders.CONTENT_TYPE, webResourceGroup.getMimeType()); + response.setHeader(HttpHeaders.CONTENT_TYPE, webResourceGroupOptional.get().getMimeType());
                 OutputStream outputStream = null;

                 try {

                     outputStream = response.getOutputStream();

- for(String resource : webResourceGroup.getResources()) { + for(String resource : webResourceGroupOptional.get().getResources()) { Resource r = applicationContext.getResource(resource);
                         InputStream inputStream = null;

=======================================
--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/model/WebResourceGroup.java Wed Dec 11 08:25:33 2013 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/web/model/WebResourceGroup.java Wed Dec 25 11:13:03 2013 UTC
@@ -17,8 +17,6 @@

 public class WebResourceGroup {

-    public final static String SUFFIX_BEANNAME = "WebResourceGroup";
-
     private String code;

     private List<String> resources;
=======================================
--- /haikudepotserver-webapp/src/main/resources/spring/application-context.xml Wed Dec 18 09:17:36 2013 UTC +++ /haikudepotserver-webapp/src/main/resources/spring/application-context.xml Wed Dec 25 11:13:03 2013 UTC
@@ -18,6 +18,7 @@
         <property name="ignoreResourceNotFound" value="true"/>
         <property name="locations">
             <list>
+                <value>classpath:webresources.properties</value>
                 <value>classpath:local.properties</value>
                 <value>${config.properties}</value>
             </list>
=======================================
--- /haikudepotserver-webapp/src/main/resources/spring/webresourcegroup-context.xml Wed Dec 11 08:25:33 2013 UTC +++ /haikudepotserver-webapp/src/main/resources/spring/webresourcegroup-context.xml Wed Dec 25 11:13:03 2013 UTC
@@ -4,83 +4,94 @@
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd";>

-    <!--
- These are third party libraries that the system requires as imports into the single-page application.
-    -->
+ <bean class="org.haikuos.haikudepotserver.web.model.WebResourceGroupService">

- <bean id="libScriptsWebResourceGroup" class="org.haikuos.haikudepotserver.web.model.WebResourceGroup">
-        <property name="code" value="libScripts"></property>
- <property name="separated" value="${webresourcegroup.separated:false}"></property>
-        <property name="mimeType" value="application/javascript"/>
-        <property name="resources">
+        <property name="guid" value="${webresources.guid}"></property>
+
+        <property name="webResourceGroups">
             <list>
-                <value>/js/lib/base64-min.js</value>
-                <value>/js/lib/moment-min.js</value>
-                <value>/js/lib/underscore-min.js</value>
-                <value>/js/lib/angular-min.js</value>
-                <value>/js/lib/angular-route-min.js</value>
-                <value>/js/lib/ui-bootstrap-tpls.js</value>
-                <value>/js/lib/angular-ui.js</value>
-                <value>/js/lib/base64-min.js</value>
-            </list>
-        </property>
-    </bean>

-    <!--
- These are java-script resources that are part of the application's single-page application.
-    -->
+                <!--
+ These are third party libraries that the system requires as imports into the single-page application.
+                -->

- <bean id="appScriptsWebResourceGroup" class="org.haikuos.haikudepotserver.web.model.WebResourceGroup">
-        <property name="code" value="appScripts"></property>
- <property name="separated" value="${webresourcegroup.separated:false}"></property>
-        <property name="mimeType" value="application/javascript"/>
-        <property name="resources">
-            <list>
-                <value>/js/app/haikudepotserver.js</value>
-                <value>/js/app/routes.js</value>
-                <value>/js/app/constants.js</value>
+ <bean class="org.haikuos.haikudepotserver.web.model.WebResourceGroup">
+                    <property name="code" value="libScripts"></property>
+ <property name="separated" value="${webresourcegroup.separated:false}"></property> + <property name="mimeType" value="application/javascript"/>
+                    <property name="resources">
+                        <list>
+ <value>/js/lib/${webresources.guid}/base64-min.js</value> + <value>/js/lib/${webresources.guid}/moment-min.js</value> + <value>/js/lib/${webresources.guid}/underscore-min.js</value> + <value>/js/lib/${webresources.guid}/angular-min.js</value> + <value>/js/lib/${webresources.guid}/angular-route-min.js</value> + <value>/js/lib/${webresources.guid}/ui-bootstrap-tpls.js</value> + <value>/js/lib/${webresources.guid}/angular-ui.js</value> + <value>/js/lib/${webresources.guid}/base64-min.js</value>
+                        </list>
+                    </property>
+                </bean>
+
+                <!--
+ These are java-script resources that are part of the application's single-page application.
+                -->
+
+ <bean class="org.haikuos.haikudepotserver.web.model.WebResourceGroup">
+                    <property name="code" value="appScripts"></property>
+ <property name="separated" value="${webresourcegroup.separated:false}"></property> + <property name="mimeType" value="application/javascript"/>
+                    <property name="resources">
+                        <list>
+                            <value>/js/app/haikudepotserver.js</value>
+                            <value>/js/app/routes.js</value>
+                            <value>/js/app/constants.js</value>
+
+ <value>/js/app/directive/bannerdirective.js</value> + <value>/js/app/directive/spinnerdirective.js</value> + <value>/js/app/directive/versionlabeldirective.js</value> + <value>/js/app/directive/breadcrumbsdirective.js</value> + <value>/js/app/directive/messagedirective.js</value> + <value>/js/app/directive/errormessagesdirective.js</value> + <value>/js/app/directive/pkgicondirective.js</value> + <value>/js/app/directive/pkglabeldirective.js</value> + <value>/js/app/directive/filesupplydirective.js</value>

-                <value>/js/app/directive/bannerdirective.js</value>
-                <value>/js/app/directive/spinnerdirective.js</value>
-                <value>/js/app/directive/versionlabeldirective.js</value>
-                <value>/js/app/directive/breadcrumbsdirective.js</value>
-                <value>/js/app/directive/messagedirective.js</value>
-                <value>/js/app/directive/errormessagesdirective.js</value>
-                <value>/js/app/directive/pkgicondirective.js</value>
-                <value>/js/app/directive/pkglabeldirective.js</value>
-                <value>/js/app/directive/filesupplydirective.js</value>
+ <value>/js/app/controller/viewpkgcontroller.js</value> + <value>/js/app/controller/homecontroller.js</value> + <value>/js/app/controller/errorcontroller.js</value> + <value>/js/app/controller/createusercontroller.js</value> + <value>/js/app/controller/viewusercontroller.js</value> + <value>/js/app/controller/authenticateusercontroller.js</value> + <value>/js/app/controller/editpkgiconcontroller.js</value>

-                <value>/js/app/controller/viewpkgcontroller.js</value>
-                <value>/js/app/controller/homecontroller.js</value>
-                <value>/js/app/controller/errorcontroller.js</value>
-                <value>/js/app/controller/createusercontroller.js</value>
-                <value>/js/app/controller/viewusercontroller.js</value>
- <value>/js/app/controller/authenticateusercontroller.js</value>
-                <value>/js/app/controller/editpkgiconcontroller.js</value>
+ <value>/js/app/service/jsonrpcservice.js</value> + <value>/js/app/service/messagesourceservice.js</value> + <value>/js/app/service/userstateservice.js</value> + <value>/js/app/service/referencedataservice.js</value> + <value>/js/app/service/pkgiconservice.js</value>

-                <value>/js/app/service/jsonrpcservice.js</value>
-                <value>/js/app/service/messagesourceservice.js</value>
-                <value>/js/app/service/userstateservice.js</value>
-                <value>/js/app/service/referencedataservice.js</value>
-                <value>/js/app/service/pkgiconservice.js</value>
+                        </list>
+                    </property>
+                </bean>

-            </list>
-        </property>
-    </bean>
+                <!--
+ These are CSS resources that are part of the application's single-page application.
+                -->

-    <!--
- These are CSS resources that are part of the application's single-page application.
-    -->
+ <bean class="org.haikuos.haikudepotserver.web.model.WebResourceGroup"> + <property name="code" value="appStylesheets"></property> + <property name="separated" value="${webresourcegroup.separated:false}"></property>
+                    <property name="mimeType" value="text/css"/>
+                    <property name="resources">
+                        <list>
+                            <value>/css/haikudepotserver.css</value>
+                            <value>/css/home.css</value>
+                            <value>/css/createuser.css</value>
+                        </list>
+                    </property>
+                </bean>

- <bean id="appStylesheetsWebResourceGroup" class="org.haikuos.haikudepotserver.web.model.WebResourceGroup">
-        <property name="code" value="appStylesheets"></property>
- <property name="separated" value="${webresourcegroup.separated:false}"></property>
-        <property name="mimeType" value="text/css"/>
-        <property name="resources">
-            <list>
-                <value>/css/haikudepotserver.css</value>
-                <value>/css/home.css</value>
-                <value>/css/createuser.css</value>
             </list>
         </property>
     </bean>
=======================================
--- /haikudepotserver-webapp/src/main/webapp/WEB-INF/views/entryPoint.jsp Wed Dec 11 08:25:33 2013 UTC +++ /haikudepotserver-webapp/src/main/webapp/WEB-INF/views/entryPoint.jsp Wed Dec 25 11:13:03 2013 UTC
@@ -15,7 +15,7 @@

     <meta name="viewport" content="width=device-width, initial-scale=1.0">

-    <link rel="stylesheet" href="/bootstrap/dist/css/bootstrap.min.css">
+ <link rel="stylesheet" href="/bootstrap/<c:out value="${webResourcesGuid}"></c:out>/dist/css/bootstrap.min.css">
     <link rel="icon" type="image/png" href="/img/haikudepot16.png" >

     <hds:webresourcegroup code="libScripts"/>
=======================================
--- /pom.xml    Mon Dec 23 10:02:34 2013 UTC
+++ /pom.xml    Wed Dec 25 11:13:03 2013 UTC
@@ -7,11 +7,11 @@
     <version>1.0.1-SNAPSHOT</version>

     <modules>
-        <module>haikudepotserver-webapp</module>
         <module>haikudepotserver-api1</module>
         <module>haikudepotserver-packagefile</module>
         <module>haikudepotserver-parent</module>
         <module>haikudepotserver-docs</module>
+        <module>haikudepotserver-webapp</module>
     </modules>

     <!--

Other related posts:

  • » [haiku-depot-web] [haiku-depot-web-app] 4 new revisions pushed by haiku.li...@xxxxxxxxx on 2013-12-26 08:05 GMT - haiku-depot-web-app