|
DeveloperGuide
Hints for developers of this UI.
Featured 1.0 IntroductionThe ProjectBrowser is intended to provide an efficient means for developers to create new analyses for Hackystat that are amenable to representation within a basic web application. Examples of appropriate analyses would be simple charts or tables displaying analyses on data. Examples of analyses that would probably not be appropriate include animations or 3D representations of analyses with sophisticated user interactions. For these latter types of analyses, you might want to consider a framework like Prefuse or Processing. The ProjectBrowser system provides the following benefits:
While the ProjectBrowser takes care of a significant amount of house-keeping details, these benefits require one significant cost: You Need To Learn Wicket. While Wicket is a very elegant Java-based web application framework, it is quite non-traditional in its approach, and the online documentation is, well, of uneven quality. After a certain amount of pain and suffering with the online (free) documentation, I eventually realized that I could greatly reduce the learning curve by buying the prelease copy of Wicket In Action. While significant editing remains to be done on this book, I can say that it would not have been possible to make an initial release of the ProjectBrowser in five days without it. If you do not know Wicket, and wish to develop a Hackystat analysis using the ProjectBrowser, I highly recommend that you take the plunge and buy this book and save yourself a week or so of flailing around. 2.0 Installation and buildingIf you have built any of the other Hackystat services, then you will find that the ProjectBrowser builds in a very standard way. Download the code, and run "ant -f verify.build.xml" to see that everything is OK. Here's what a run of verify looks like: admin01:~/hackystat-projects/hackystat-ui-wicket johnson$ ant -f verify.build.xml
Buildfile: verify.build.xml
[echo]
[echo] Hackystat ProjectBrowser Verification Task
[echo]
[echo] System and Environment settings:
[echo] Ant version: Apache Ant version 1.7.0 compiled on December 13 2006
[echo] Checkstyle Home: /Users/johnson/java/checkstyle-4.3
[echo] Emma Home: /Users/johnson/java/emma-2.0.5312
[echo] FindBugs Home: /Users/johnson/java/findbugs-1.2.0
[echo] Java version: 1.5.0_07
[echo] JavaMail Home: /Users/johnson/java/javamail-1.4
[echo] JUnit Home: /Users/johnson/java/junit4.4
[echo] PMD Home: /Users/johnson/java/pmd-4.0
[echo] SensorBase Home: /Users/johnson/hackystat-projects/hackystat-sensorbase-uh
[echo] DailyProjectData Home: /Users/johnson/hackystat-projects/hackystat-analysis-dailyprojectdata
[echo] Telemetry Home: /Users/johnson/hackystat-projects/hackystat-analysis-telemetry
[echo] Wicket Home: /Users/johnson/java/apache-wicket-1.3.2
[echo] Jetty Home: /Users/johnson/java/Jetty-6.1.9
[echo] SLF4J Home: /Users/johnson/java/slf4j-1.5.0
[echo]
[echo] This task fails the build unless all of the following are true:
[echo] * System compiles without warnings or errors.
[echo] * JavaDocs can be built without warnings or errors.
[echo] * JUnit test cases all pass.
[echo] * Checkstyle of source code generates no warnings.
[echo] * PMD generates no warnings.
[echo] * FindBugs generates no warnings.
[echo]
[echo] It also runs the Emma code coverage tool and prints a summary report.
[echo]
clean:
[delete] Deleting directory /Users/johnson/hackystat-projects/hackystat-ui-wicket/build
compile:
[mkdir] Created dir: /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/classes
[javac] Compiling 15 source files to /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/classes
[copy] Copying 25 files to /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/classes
checkstyle.tool:
[mkdir] Created dir: /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/checkstyle
[checkstyle] Running Checkstyle 4.3 on 15 files
checkstyle.sensor:
[hacky-checkstyle] 23 Checkstyle sensor data instances created.
[hacky-checkstyle] These instances were transmitted to: http://dasha.ics.hawaii.edu:9876/sensorbase/ (0 secs.)
checkstyle:
junit.tool:
[mkdir] Created dir: /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/junit
[junit] Running org.hackystat.projectbrowser.page.sensordata.TestSensorDataPage
[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 4.83 sec
[junit] Output:
[junit] Loading SensorBase properties from: /Users/johnson/.hackystat/sensorbase/sensorbase.properties
[junit] Loading DailyProjectData properties from: /Users/johnson/.hackystat/dailyprojectdata/dailyprojectdata.properties
[junit] Loading Telemetry properties from: /Users/johnson/.hackystat/telemetry/telemetry.properties
[junit] Loading ProjectBrowser properties from: /Users/johnson/.hackystat/projectbrowser/projectbrowser.properties
[junit]
[junit] Error:
[junit] 04/10 21:16:12 Derby: previously initialized.
[junit] 04/10 21:16:13 Host: http://localhost:9976/sensorbase/
[junit] 04/10 21:16:13 SensorBase Properties:
[junit] sensorbase.hostname = localhost
[junit] sensorbase.context.root = sensorbase
[junit] sensorbase.port = 9976
[junit] sensorbase.admin.email = admin@hackystat.org
[junit] sensorbase.admin.password = admin@hackystat.org
[junit] sensorbase.db.dir = /Users/johnson/.hackystat/sensorbase/testdb
[junit] sensorbase.xml.dir = /Users/johnson/hackystat-projects/hackystat-ui-wicket/xml
[junit] sensorbase.db.impl = org.hackystat.sensorbase.db.derby.DerbyImplementation
[junit] sensorbase.logging.level = INFO
[junit] sensorbase.restlet.logging = false
[junit] sensorbase.smtp.host = mail.hawaii.edu
[junit] sensorbase.test.install = true
[junit] 04/10 21:16:13 Maximum Java heap size (bytes): 66650112
[junit] 04/10 21:16:13 SensorBase (Version 8.1.315) now running.
[junit] 04/10 21:16:14 Host: http://localhost:9977/dailyprojectdata/
[junit] 04/10 21:16:14 DailyProjectData Properties:
[junit] dailyprojectdata.sensorbase.host = http://localhost:9976/sensorbase
[junit] dailyprojectdata.hostname = localhost
[junit] dailyprojectdata.context.root = dailyprojectdata
[junit] dailyprojectdata.port = 9977
[junit] dailyprojectdata.logging.level = INFO
[junit] dailyprojectdata.test.install = true
[junit] dailyprojectdata.cache.enabled = false
[junit] dailyprojectdata.cache.max.life = 365
[junit] dailyprojectdata.cache.capacity = 50000
[junit] 04/10 21:16:14 SensorBase http://localhost:9976/sensorbase was contacted successfully.
[junit] 04/10 21:16:14 DailyProjectData (Version 8.x.326) now running.
[junit] 04/10 21:16:14 Host: http://localhost:9978/telemetry/
[junit] 04/10 21:16:14 Telemetry Properties:
[junit] telemetry.sensorbase.host = http://localhost:9976/sensorbase
[junit] telemetry.dailyprojectdata.host = http://localhost:9977/dailyprojectdata
[junit] telemetry.hostname = localhost
[junit] telemetry.context.root = telemetry
[junit] telemetry.logging.level = INFO
[junit] telemetry.def.dir = /Users/johnson/hackystat-projects/hackystat-ui-wicket/definitions
[junit] telemetry.port = 9978
[junit] telemetry.test.install = true
[junit] telemetry.cache.enabled = false
[junit] telemetry.cache.max.life = 365
[junit] telemetry.cache.capacity = 50000
[junit] 04/10 21:16:14 Loading built-in telemetry chart/report/stream/y-axis definitions.
[junit] 04/10 21:16:14 chart DevTime(member, cumulative)
[junit] 04/10 21:16:14 chart UnitTest(mode, member, cumulative)
[junit] 04/10 21:16:14 chart Commit(member, cumulative)
[junit] 04/10 21:16:14 chart Churn(member, cumulative)
[junit] 04/10 21:16:14 chart Coverage(mode, granularity)
[junit] 04/10 21:16:14 chart CyclomaticComplexity(mode, threshold, tool)
[junit] 04/10 21:16:14 chart FileMetric(sizemetric, tool)
[junit] 04/10 21:16:14 chart CodeIssue(tool, type)
[junit] 04/10 21:16:14 chart Build(member, result, type, cumulative)
[junit] 04/10 21:16:14 streams DevTimeStream(member, cumulative)
[junit] 04/10 21:16:14 streams CyclomaticComplexityStream(mode, threshold, tool)
[junit] 04/10 21:16:14 streams UnitTestStream(mode, member, cumulative)
[junit] 04/10 21:16:14 streams CommitStream(member, cumulative)
[junit] 04/10 21:16:14 streams ChurnStream(member, cumulative)
[junit] 04/10 21:16:14 streams CoverageStream(mode, granularity)
[junit] 04/10 21:16:14 streams FileMetricStream(sizemetric, tool)
[junit] 04/10 21:16:14 streams CodeIssueStream(tool, type)
[junit] 04/10 21:16:14 streams BuildStream(member, result, type, cumulative)
[junit] 04/10 21:16:14 y-axis yAxis(label)
[junit] 04/10 21:16:14 Telemetry directory not available: /Users/johnson/hackystat-projects/hackystat-ui-wicket/definitions
[junit] 04/10 21:16:14 Service SensorBase http://localhost:9976/sensorbase was contacted successfully.
[junit] 04/10 21:16:14 Service DailyProjectData http://localhost:9977/dailyprojectdata was contacted successfully.
[junit] 04/10 21:16:14 Telemetry (Version 8.1.315) now running.
[junit] 04/10 21:16:14 Telemetry prefetch directory not available: /Users/johnson/hackystat-projects/hackystat-ui-wicket/prefetch
[junit] 04/10 21:16:14 ProjectBrowser Properties:
[junit] projectbrowser.sensorbase.host = http://localhost:9976/sensorbase/
[junit] projectbrowser.dailyprojectdata.host = http://localhost:9977/dailyprojectdata/
[junit] projectbrowser.telemetry.host = http://localhost:9978/telemetry/
[junit] projectbrowser.logging.level = INFO
[junit] projectbrowser.wicket.configuration = null
[junit] projectbrowser.admin.email = johnson@hawaii.edu
[junit] 130 [main] INFO org.apache.wicket.Application - [ProjectBrowserApplication] init: Wicket core library initializer
[junit] 132 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IBehaviorListener, method=public abstract void org.apache.wicket.behavior.IBehaviorListener.onRequest()]
[junit] 132 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IBehaviorListener, method=public abstract void org.apache.wicket.behavior.IBehaviorListener.onRequest()]
[junit] 132 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IFormSubmitListener, method=public abstract void org.apache.wicket.markup.html.form.IFormSubmitListener.onFormSubmitted()]
[junit] 132 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IFormSubmitListener, method=public abstract void org.apache.wicket.markup.html.form.IFormSubmitListener.onFormSubmitted()]
[junit] 133 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=ILinkListener, method=public abstract void org.apache.wicket.markup.html.link.ILinkListener.onLinkClicked()]
[junit] 133 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=ILinkListener, method=public abstract void org.apache.wicket.markup.html.link.ILinkListener.onLinkClicked()]
[junit] 133 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IOnChangeListener, method=public abstract void org.apache.wicket.markup.html.form.IOnChangeListener.onSelectionChanged()]
[junit] 134 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IOnChangeListener, method=public abstract void org.apache.wicket.markup.html.form.IOnChangeListener.onSelectionChanged()]
[junit] 134 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IRedirectListener, method=public abstract void org.apache.wicket.IRedirectListener.onRedirect()]
[junit] 134 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IRedirectListener, method=public abstract void org.apache.wicket.IRedirectListener.onRedirect()]
[junit] 134 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IResourceListener, method=public abstract void org.apache.wicket.IResourceListener.onResourceRequested()]
[junit] 135 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IResourceListener, method=public abstract void org.apache.wicket.IResourceListener.onResourceRequested()]
[junit] 135 [main] INFO org.apache.wicket.protocol.http.WebApplication - [ProjectBrowserApplication] Started Wicket version 1.3.2 in development mode
[junit] ********************************************************************
[junit] *** WARNING: Wicket is running in DEVELOPMENT mode. ***
[junit] *** ^^^^^^^^^^^ ***
[junit] *** Do NOT deploy to your live server(s) without changing this. ***
[junit] *** See Application#getConfigurationType() for more information. ***
[junit] ********************************************************************
[junit] 984 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IActivePageBehaviorListener, method=public abstract void org.apache.wicket.behavior.IBehaviorListener.onRequest()]
[junit] 1017 [main] INFO org.apache.wicket.protocol.http.MockHttpServletRequest - Redirecting to /ProjectBrowserApplication/ProjectBrowserApplication/?wicket:interface=:2::::
[junit]
[junit] Derby shutdown hook results: Derby system shutdown.
junit.report:
[junitreport] Processing /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/junit/TESTS-TestSuites.xml to /tmp/null126637448
[junitreport] Loading stylesheet jar:file:/Users/johnson/java/apache-ant-1.7.0/lib/ant-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl
[junitreport] Transform time: 469ms
[junitreport] Deleting: /tmp/null126637448
junit.sensor:
[hacky-junit] 1 UnitTest sensor data instances created.
[hacky-junit] These instances were transmitted to: http://dasha.ics.hawaii.edu:9876/sensorbase/ (0 secs.)
junit:
javadoc:
[mkdir] Created dir: /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/javadoc
[javadoc] Generating Javadoc
[javadoc] Javadoc execution
[javadoc] Loading source files for package org.hackystat.projectbrowser...
[javadoc] Loading source files for package org.hackystat.projectbrowser.authentication...
[javadoc] Loading source files for package org.hackystat.projectbrowser.page...
[javadoc] Loading source files for package org.hackystat.projectbrowser.page.dailyprojectdata...
[javadoc] Loading source files for package org.hackystat.projectbrowser.page.projects...
[javadoc] Loading source files for package org.hackystat.projectbrowser.page.sensordata...
[javadoc] Loading source files for package org.hackystat.projectbrowser.page.telemetry...
[javadoc] Loading source files for package org.hackystat.projectbrowser.test...
[javadoc] Constructing Javadoc information...
[javadoc] Standard Doclet version 1.5.0_07
[javadoc] Building tree for all the packages and classes...
[javadoc] Building index for all the packages and classes...
[javadoc] Building index for all classes...
findbugs.tool:
[mkdir] Created dir: /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/findbugs
[findbugs] Running FindBugs...
[findbugs] The following classes needed for analysis were missing:
[findbugs] javax.xml.bind.JAXBContext
[findbugs] Missing classes: 1
[findbugs] Classes needed for analysis were missing
[findbugs] Output saved to /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/findbugs/findbugs.xml
findbugs.report:
[xslt] Processing /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/findbugs/findbugs.xml to /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/findbugs/findbugs-default.html
[xslt] Loading stylesheet /Users/johnson/java/findbugs-1.2.0/src/xsl/default.xsl
findbugs.sensor:
[hacky-findbugs] 15 CodeIssues sensor data instances created.
[hacky-findbugs] These instances were transmitted to: http://dasha.ics.hawaii.edu:9876/sensorbase/ (0 secs.)
findbugs:
emma.tool:
[mkdir] Created dir: /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma
[instr] processing instrumentation path ...
[instr] instrumentation path processed in 121 ms
[instr] [15 class(es) instrumented, 0 resource(s) copied]
[instr] metadata merged into [/Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/metadata.emma] {in 3 ms}
[junit] Running org.hackystat.projectbrowser.page.sensordata.TestSensorDataPage
[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 4.517 sec
[junit] Output:
[junit] EMMA: collecting runtime coverage data ...
[junit] Loading SensorBase properties from: /Users/johnson/.hackystat/sensorbase/sensorbase.properties
[junit] Loading DailyProjectData properties from: /Users/johnson/.hackystat/dailyprojectdata/dailyprojectdata.properties
[junit] Loading Telemetry properties from: /Users/johnson/.hackystat/telemetry/telemetry.properties
[junit] Loading ProjectBrowser properties from: /Users/johnson/.hackystat/projectbrowser/projectbrowser.properties
[junit]
[junit] Error:
[junit] 04/10 21:16:31 Derby: previously initialized.
[junit] 04/10 21:16:33 Host: http://localhost:9976/sensorbase/
[junit] 04/10 21:16:33 SensorBase Properties:
[junit] sensorbase.hostname = localhost
[junit] sensorbase.context.root = sensorbase
[junit] sensorbase.port = 9976
[junit] sensorbase.admin.email = admin@hackystat.org
[junit] sensorbase.admin.password = admin@hackystat.org
[junit] sensorbase.db.dir = /Users/johnson/.hackystat/sensorbase/testdb
[junit] sensorbase.xml.dir = /Users/johnson/hackystat-projects/hackystat-ui-wicket/xml
[junit] sensorbase.db.impl = org.hackystat.sensorbase.db.derby.DerbyImplementation
[junit] sensorbase.logging.level = INFO
[junit] sensorbase.restlet.logging = false
[junit] sensorbase.smtp.host = mail.hawaii.edu
[junit] sensorbase.test.install = true
[junit] 04/10 21:16:33 Maximum Java heap size (bytes): 66650112
[junit] 04/10 21:16:33 SensorBase (Version 8.1.315) now running.
[junit] 04/10 21:16:33 Host: http://localhost:9977/dailyprojectdata/
[junit] 04/10 21:16:33 DailyProjectData Properties:
[junit] dailyprojectdata.sensorbase.host = http://localhost:9976/sensorbase
[junit] dailyprojectdata.hostname = localhost
[junit] dailyprojectdata.context.root = dailyprojectdata
[junit] dailyprojectdata.port = 9977
[junit] dailyprojectdata.logging.level = INFO
[junit] dailyprojectdata.test.install = true
[junit] dailyprojectdata.cache.enabled = false
[junit] dailyprojectdata.cache.max.life = 365
[junit] dailyprojectdata.cache.capacity = 50000
[junit] 04/10 21:16:33 SensorBase http://localhost:9976/sensorbase was contacted successfully.
[junit] 04/10 21:16:33 DailyProjectData (Version 8.x.326) now running.
[junit] 04/10 21:16:33 Host: http://localhost:9978/telemetry/
[junit] 04/10 21:16:33 Telemetry Properties:
[junit] telemetry.sensorbase.host = http://localhost:9976/sensorbase
[junit] telemetry.dailyprojectdata.host = http://localhost:9977/dailyprojectdata
[junit] telemetry.hostname = localhost
[junit] telemetry.context.root = telemetry
[junit] telemetry.logging.level = INFO
[junit] telemetry.def.dir = /Users/johnson/hackystat-projects/hackystat-ui-wicket/definitions
[junit] telemetry.port = 9978
[junit] telemetry.test.install = true
[junit] telemetry.cache.enabled = false
[junit] telemetry.cache.max.life = 365
[junit] telemetry.cache.capacity = 50000
[junit] 04/10 21:16:33 Loading built-in telemetry chart/report/stream/y-axis definitions.
[junit] 04/10 21:16:33 chart DevTime(member, cumulative)
[junit] 04/10 21:16:33 chart UnitTest(mode, member, cumulative)
[junit] 04/10 21:16:33 chart Commit(member, cumulative)
[junit] 04/10 21:16:33 chart Churn(member, cumulative)
[junit] 04/10 21:16:33 chart Coverage(mode, granularity)
[junit] 04/10 21:16:33 chart CyclomaticComplexity(mode, threshold, tool)
[junit] 04/10 21:16:33 chart FileMetric(sizemetric, tool)
[junit] 04/10 21:16:33 chart CodeIssue(tool, type)
[junit] 04/10 21:16:33 chart Build(member, result, type, cumulative)
[junit] 04/10 21:16:33 streams DevTimeStream(member, cumulative)
[junit] 04/10 21:16:33 streams CyclomaticComplexityStream(mode, threshold, tool)
[junit] 04/10 21:16:33 streams UnitTestStream(mode, member, cumulative)
[junit] 04/10 21:16:33 streams CommitStream(member, cumulative)
[junit] 04/10 21:16:33 streams ChurnStream(member, cumulative)
[junit] 04/10 21:16:33 streams CoverageStream(mode, granularity)
[junit] 04/10 21:16:33 streams FileMetricStream(sizemetric, tool)
[junit] 04/10 21:16:33 streams CodeIssueStream(tool, type)
[junit] 04/10 21:16:33 streams BuildStream(member, result, type, cumulative)
[junit] 04/10 21:16:33 y-axis yAxis(label)
[junit] 04/10 21:16:33 Telemetry directory not available: /Users/johnson/hackystat-projects/hackystat-ui-wicket/definitions
[junit] 04/10 21:16:34 Service SensorBase http://localhost:9976/sensorbase was contacted successfully.
[junit] 04/10 21:16:34 Service DailyProjectData http://localhost:9977/dailyprojectdata was contacted successfully.
[junit] 04/10 21:16:34 Telemetry (Version 8.1.315) now running.
[junit] 04/10 21:16:34 Telemetry prefetch directory not available: /Users/johnson/hackystat-projects/hackystat-ui-wicket/prefetch
[junit] 04/10 21:16:34 ProjectBrowser Properties:
[junit] projectbrowser.sensorbase.host = http://localhost:9976/sensorbase/
[junit] projectbrowser.dailyprojectdata.host = http://localhost:9977/dailyprojectdata/
[junit] projectbrowser.telemetry.host = http://localhost:9978/telemetry/
[junit] projectbrowser.logging.level = INFO
[junit] projectbrowser.wicket.configuration = null
[junit] projectbrowser.admin.email = johnson@hawaii.edu
[junit] 142 [main] INFO org.apache.wicket.Application - [ProjectBrowserApplication] init: Wicket core library initializer
[junit] 144 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IBehaviorListener, method=public abstract void org.apache.wicket.behavior.IBehaviorListener.onRequest()]
[junit] 144 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IBehaviorListener, method=public abstract void org.apache.wicket.behavior.IBehaviorListener.onRequest()]
[junit] 145 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IFormSubmitListener, method=public abstract void org.apache.wicket.markup.html.form.IFormSubmitListener.onFormSubmitted()]
[junit] 145 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IFormSubmitListener, method=public abstract void org.apache.wicket.markup.html.form.IFormSubmitListener.onFormSubmitted()]
[junit] 145 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=ILinkListener, method=public abstract void org.apache.wicket.markup.html.link.ILinkListener.onLinkClicked()]
[junit] 145 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=ILinkListener, method=public abstract void org.apache.wicket.markup.html.link.ILinkListener.onLinkClicked()]
[junit] 146 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IOnChangeListener, method=public abstract void org.apache.wicket.markup.html.form.IOnChangeListener.onSelectionChanged()]
[junit] 146 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IOnChangeListener, method=public abstract void org.apache.wicket.markup.html.form.IOnChangeListener.onSelectionChanged()]
[junit] 146 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IRedirectListener, method=public abstract void org.apache.wicket.IRedirectListener.onRedirect()]
[junit] 146 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IRedirectListener, method=public abstract void org.apache.wicket.IRedirectListener.onRedirect()]
[junit] 147 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IResourceListener, method=public abstract void org.apache.wicket.IResourceListener.onResourceRequested()]
[junit] 147 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IResourceListener, method=public abstract void org.apache.wicket.IResourceListener.onResourceRequested()]
[junit] 147 [main] INFO org.apache.wicket.protocol.http.WebApplication - [ProjectBrowserApplication] Started Wicket version 1.3.2 in development mode
[junit] ********************************************************************
[junit] *** WARNING: Wicket is running in DEVELOPMENT mode. ***
[junit] *** ^^^^^^^^^^^ ***
[junit] *** Do NOT deploy to your live server(s) without changing this. ***
[junit] *** See Application#getConfigurationType() for more information. ***
[junit] ********************************************************************
[junit] 849 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IActivePageBehaviorListener, method=public abstract void org.apache.wicket.behavior.IBehaviorListener.onRequest()]
[junit] 881 [main] INFO org.apache.wicket.protocol.http.MockHttpServletRequest - Redirecting to /ProjectBrowserApplication/ProjectBrowserApplication/?wicket:interface=:2::::
[junit]
[junit] Derby shutdown hook results: Derby system shutdown.
[report] processing input files ...
[report] 2 file(s) read and merged in 3 ms
[report] writing [xml] report to [/Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/coverage.xml] ...
[report] writing [txt] report to [/Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/coverage.txt] ...
[report] writing [html] report to [/Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/coverage.html] ...
[delete] Deleting directory /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/classes
emma.report:
[report] processing input files ...
[report] 2 file(s) read and merged in 1 ms
[report] writing [xml] report to [/Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/coverage.xml] ...
[report] writing [txt] report to [/Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/coverage.txt] ...
[report] writing [html] report to [/Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/coverage.html] ...
emma.sensor:
[hacky-emma] 15 Coverage sensor data instances created.
[hacky-emma] These instances were transmitted to: http://dasha.ics.hawaii.edu:9876/sensorbase/ (2 secs.)
emma.echo:
[xslt] Processing /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/coverage.xml to /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/emma/coverage.brief.txt
[xslt] Loading stylesheet /Users/johnson/hackystat-projects/hackystat-ui-wicket/lib/emma/hackystat.emma.xsl
[concat] Emma Coverage summary
[concat] class: 73% (11/15)
[concat] method: 70% (42/60)
[concat] block: 67% (689/1036)
[concat] line: 63% (147.4/235)
emma:
pmd.tool:
[mkdir] Created dir: /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/pmd
[pmd] No problems found!
pmd.report:
[xslt] Processing /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/pmd/pmd.xml to /Users/johnson/hackystat-projects/hackystat-ui-wicket/build/pmd/pmd-report-per-class.html
[xslt] Loading stylesheet /Users/johnson/java/pmd-4.0/etc/xslt/pmd-report-per-class.xslt
pmd.sensor:
[hacky-pmd] 15 Code Issue sensor data instances created.
[hacky-pmd] These instances were transmitted to: http://dasha.ics.hawaii.edu:9876/sensorbase/ (1 secs.)
pmd:
verify:
BUILD SUCCESSFUL
Total time: 49 secondsWhat you'll discover when you try to run verify is that you will need to download three new packages and setup their corresponding environment variables:
This is, of course, in additional to the uku million "normal" packages and environment variables that you set up as part of regular Hackystat development. Let us know if you run into any problems getting verify to pass in your environment. 3.0 Hints for developmentOnce you get the system to build successfully in your environment, it is time to try to extend it. Here's some hints. 3.1 Make a mockup of your pageOne of the several cool features of Wicket is that you create "plain" html files containing sample data that can be rendered in a browser to show how your system will look in production. Through the magic of the wicket:id tags, the sample data will disappear once the html file is used in the actual webapp. (If you don't understand what I just wrote, please take my advice and buy the Wicket In Action book.) So, to start, make a mockup of what you want your page to look like. To do this, create a copy of ProjectBrowserBasePage.html and save it into the webapp/ directory. Now remove the <child></child> tag and replace that section with your own pages content. When you display this page in a browser, it should display what the page will look like in the completed web app. If you need to add new div tags or whatever, you can edit the webapp/style/boilerplate/screen.css file. Please be careful when you do this. If you are modifying pre-existing markup as opposed to adding new markup for your own page, please consult the group first. Note that any html page in the webapp/ directory is ignored in the actual ProjectBrowser application. The html pages used are in the same package as their corresponding Java class. The reason to mockup your pages in this directory is so that the CSS stylesheets are found. 3.2 Edit ProjectBrowserBasePageYou will need to add a few lines of code to ProjectBrowserBasePage.java and ProjectBrowserBasePage.html to create a new tab in the web app that, when clicked, sends the user to your new page. If, by reading the code, it is not obvious to you how to do that, then ask for help. Before committing your change, be sure to run 'ant -f verify.build.xml' to make sure you have not introduced any Checkstyle, JUnit, PMD, or FindBugs errors. 3.3 Create a new package to hold your page's implementationOnce you have a mockup, create a new subpackage of org.hackystat.projectbrowser.page to hold the implementation of your analysis and associated display. It is useful to take a look at the public methods of the ProjectBrowserSession class, as these methods provide you with information about the user accessing your page. If you think this API should be extended, please let us know. 3.4 Test your pageWicket has a WicketTester class that makes it quite easy to do unit testing, and there is a ProjectBrowserTestHelper class that makes it even easier. See the TestSensorDataPage class for an example to help you get started. Don't be lame: provide (at the very least) test cases for "happy path" processing! Even these will make the system easier to modify and maintain in the future and avoid releases with embarrassing bugs. 3.5 Run verify before every commitThe ProjectBrowser class is under continuous integration, so be sure to run "ant -f verify.build.xml" before every commit and ensure that all of the QA passes. Otherwise, the CI build will break and an embarrassing email about you will be sent to the hackystat-dev mailing list. |