Copy Skeleton Collector Project
Copy the sample collector project into a new directory in the collectors folder and give it a name to match the collector you are building (eg pivotalTracker). In the pom.xml file, change the artifactId, name and optionally the groupId elements, like so:
<project>
<groupId>com.capitalone.dashboard</groupId>
<artifactId>pivotal-tracker-collector</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>Pivotal Tracker Collector</name>
...
</project>
The pom file includes all of the dependencies you will need to interact with the Dashboard Application MongoDB instance, such as Model classes and Repositories.
Extending the Collector
If you need to store extra configuration for your collector, you can create a class that extends Collector and add new fields to store configuration information that is specific to your collector.
package com.capitalone.dashboard.collector;
import com.capitalone.dashboard.model.Collector;
/**
* Collect Features from PivotalTracker
*/
public class PivotalTrackerCollector extends Collector {
private String apiToken;
public String getApiToken() {
return apiToken;
}
public void setApiToken(String apiToken) {
this.apiToken = apiToken;
}
}
If you decide to take this approach, you will also need to create a Spring Data repository interface that extends from BaseCollectorRepository.
package com.capitalone.dashboard.repository;
import com.capitalone.dashboard.model.PivotalTrackerCollector;
public interface PivotalTrackerCollectorRepository extends BaseCollectorRepository<PivotalTrackerCollector> {
}
Extending CollectorItem
Create a class that extends CollectorItem and add new fields to store information that identifies a unique item within the tool. In the Pivotal Tracker example, we will add a projectId field to CollectorItem so that each project’s features can be tracked.
package com.capitalone.dashboard.collector;
import com.capitalone.dashboard.model.CollectorItem;
public class PivotalTrackerCollectorItem extends CollectorItem {
private long projectId;
public long getProjectId() {
return projectId;
}
public void setProjectId(long projectId) {
this.projectId = projectId;
}
}
Create CollectorTask
Create a class that extends the abstract CollectorTask and implement the required abstract methods.
getCollector() Method
The getCollector
method should return a prototypical instance of your Collector subclass (for example, PivotalTrackerCollector
). This
method is only used the very first time your collector runs so that your collector instance can be registered in the collector’s collection in MongoDB.
getCollectorRepository() Method
This method should return a reference to your custom collector repository.
getCron() Method
This method should return the cron expression to schedule how often your collector executes.
collect() Method
The collect method holds the business logic for your collector. This method is called on a schedule based on the value you provide from the getCron() method..
Spring Singleton
The CollectorTask class is a Spring bean singleton. Use the constructor to inject any Spring beans that are required to execute the logic of your collector (eg MongDB repositories such as FeatureRepository).
Example
package com.capitalone.dashboard.collector;
/**
* Collects Features from Pivotal Tracker
*/
public class PivotalTrackerCollectorTask extends CollectorTask<PivotalTrackerCollector> {
private final FeatureRepository featureRepository;
private final PivotalTrackerCollectorRepository pivotalTrackerCollectorRepository;
@Value("${cron}") // Injected from application.properties
private String cron;
@Value("${apiToken}") // Injected from application.properties
private String apiToken
@Autowired
public PivotalTrackerCollectorTask(TaskScheduler taskScheduler,
FeatureRepository featureRepository,
PivotalTrackerCollectorRepository pivotalTrackerCollectorRepository) {
super(taskScheduler, "Pivotal Tracker");
this.featureRepository = featureRepository;
this.pivotalTrackerCollectorRepository = pivotalTrackerCollectorRepository;
}
@Override
public PivotalTrackerCollector getCollector() {
PivotalTrackerCollector collector = new PivotalTrackerCollector();
collector.setName("Pivotal Tracker"); // Must be unique to all collectors for a given Dashboard Application instance
collector.setCollectorType(CollectorType.Feature);
collector.setEnabled(true);
collector.setApiToken(apiToken);
return collector;
}
@Override
public BaseCollectorRepository<PivotalTrackerCollectorRepository> getCollectorRepository() {
return pivotalTrackerCollectorRepository;
}
@Override
public String getCron() {
return cron;
}
@Override
public void collect(PivotalTrackerCollector collector) {
// Collector logic
PivotalTrackerApi api = new PivotalTrackerApi(collector.getApiToken());
for (Project project : api.getProjects()) {
PivotalTrackerCollectorItem collectorItem = getOrCreateCollectorItems(project.getProjectId());
// Naive implementation
deleteFeaturesFor(collectorItem);
addFeaturesFor(collectorItem, project.getStories());
}
}
private PivotalTrackerCollectorItem getOrCreateCollectorItem(long projectId) {
// ...
}
private void deleteFeaturesFor(PivotalTrackerCollectorItem collectorItem) {
// ...
}
private void addFeaturesFor(PivotalTrackerCollectorItem collectorItem, List<Story> stories) {
// ...
}
}
Building and Deploying
Run mvn install
to package the collector into an executable JAR file. Copy this file to your server and launch it using
java -JAR pivotal-tracker-collector.jar. You will need to provide an application.properties file that contains information about how
to connect to the Dashboard MongoDB database instance, as well as any custom properties that your collector requires. See
the Spring Boot documentation
for information about sourcing this properties file.
Sample application.properties
File
#Database Name
spring.data.mongodb.database=dashboard
#Database HostName could also be ip address
spring.data.mongodb.host=localhost
#Database Port
spring.data.mongodb.port=27017
#Database Username
spring.data.mongodb.username=foo
#Database Password
spring.data.mongodb.password=bar
#Collector schedule
cron=* 30 * * * *
#Pivotal Tracker Token
apiToken=HJBKJHG76JHG%^$^jhJH