Codebeamer Development
The following pages contain information about development opportunities and processes with Codebeamer, such as:
• Codebeamer API-reference, -extensions and plugin development.
• Wiki plugin development.
• Jenkins plugin development.
• Word template development for Codebeamer, etc.
|
Some pages contain procedural information, while others only refer to the pages containing documentation of the related developer tools of the processes in question.
|
Codebeamer Developer's Guide
This manual is intended for developers and describes concepts that you need to understand in order to use Codebeamer Web APIs to extend it using its various extension points.
Codebeamer is a
Spring
based
Java application, running as a
Web Service in an
Apache Tomcat® container.
The
Apache Tomcat®
provides the container for the
Codebeamer (
cb) web application and is responsible for
• Accepting and handling incoming HTTP requests.
• Providing threads for the request processing.
• Routing the requests to the Codebeamer web application via the appropriate filters.
The tomcat server configuration, for e.g.:
• Listen ports.
• Request protocols.
• Thread pool parameters.
Are defined in /tomcat/conf/server.xml in the Codebeamer installation directory.
The request routing and filter configuration for the
Codebeamer (
cb)
Web Application
is defined in
/tomcat/webapps/cb/WEB-INF/web.xml in the
Codebeamer installation directory.
The
context
for the
Codebeamer application is provided by the
Spring Framework
, not via Tomcat:
• Bean instantiation and lifecycle management.
◦ Application startup and shutdown.
• Dependency injection.
• Transaction management.
• Internal request routing according to the
path of the request
URL
to the appropriate controllers.
The standard application context for Codebeamer is defined via applicationContext.xml in /tomcat/webapps/cb/WEB-INF/lib/cb.jar.
Customer specific application context enhancements can be defined via my-applicationContext.xml in /tomcat/webapps/cb/WEB-INF/classes
To add custom beans, e.g.
Listeners or
Workflow Actions:
• Add the compiled bean classes to /tomcat/webapps/cb/WEB-INF/classes.
• Or, if the beans are packed into a
JAR
, add the JAR to
/tomcat/webapps/cb/WEB-INF/lib.
Depending on the type of bean, you may also have to deploy additional resources, e.g.
• Custom resource
localizations via
my-ApplicationResources[locale].properties in
/tomcat/webapps/cb/WEB-INF/classes.
• Velocity
template files have to be added to the appropriate
/tomcat/webapps/cb/config/templates sub-directory, e.g:
◦ /email - for email subject and body templates.
◦ /wiki-plugin - for Wiki plugin templates.
◦ /widget - for dashboard widget templates.
In order for custom beans (e.g.
Listeners or
Workflow Actions) to be recognized and used by the
Spring Framework
• A
<bean> configuration
must be added to
/tomcat/webapps/cb/WEB-INF/classes/my-applicationContext.xml ◦ For e.g:
[{ColorCode syntax='java'
<bean id="exampleBean" class="com.intland.codebeamer.example.ExampleBean">
...
</bean>
}]
• Or (preferred), it will be automatically detected by the
Component
scan during
Codebeamer startup, if
◦ The
package
of your custom bean is a sub-package of
com.intland.codebeamer,
◦ e.g.
[{ColorCode syntax='java'
package com.intland.codebeamer.example;
import org.springframework.stereotype.Component;
@Component("exampleBean")
public class ExampleBeam {
}
}]
Standard Codebeamer Bean types
Controllers
Controllers are the
HTTP
Request end-points.
They are responsible for validating and handling incoming requests and producing an appropriate response.
Depending on the type of controller or end-point, the request/response body can contain
HTML
or
JSON
Controllers should be annotated as
@Controller and each
HTTP
end-points as
@RequestMapping, where the value is the path in the request
URL
relative to the web application context path (
/cb)
For example: The definition of the
TrackerController and it's
REST API (v1) end-points for
• POST http://{server}:{port}/cb/tracker
• GET http://{server}:{port}/cb/tracker/{trackerId}
[{ColorCode syntax='java'
package com.intland.codebeamer.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
import com.intland.codebeamer.controller.ControllerUtils;
import com.intland.codebeamer.controller.support.ResponseView;
import com.intland.codebeamer.controller.support.RequestView;
import com.intland.codebeamer.manager.TrackerManager;
import com.intland.codebeamer.persistence.dto.TrackerDto;
import com.intland.codebeamer.persistence.dto.UserDto;
@Controller("trackerController")
public class TrackerController {
@Autowired
private TrackerManager trackerManager;
@RequestMapping(value = "/tracker", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseView
public TrackerDto createTracker(HttpServletRequest request, @RequestView("TrackerDetails") TrackerDto tracker)
throws AccessRightsException, ChangeVetoedException, IllegalArgumentException, ArtifactNameConflictException {
UserDto user = ControllerUtils.getCurrentUser(request);
trackerManager.create(user, tracker, request);
return tracker;
}
@RequestMapping(value = "/tracker/{trackerId}", method = RequestMethod.GET)
@ResponseView("TrackerDetails")
public TrackerDto getTracker(HttpServletRequest request, @PathVariable("trackerId") Integer trackerId) {
UserDto user = ControllerUtils.getCurrentUser(request);
TrackerDto tracker = trackerManager.findById(user, trackerId);
if (tracker == null) {
throw new ResourceNotFoundException("/tracker/" + trackerId);
}
return tracker;
}
@RequestMapping(value = "/proj/tracker/workflowGraph.spr", method = RequestMethod.GET)
public String displayTransitionsGraph(HttpServletRequest request, @RequestParam("tracker_id") Integer trackerId, Model model) throws AccessRightsException, PluginException {
UserDto user = ControllerUtils.getCurrentUser(request);
...
model.addAttribute("graphHtmlMarkup", result);
return "/bugs/tracker/workflowGraph.jsp";
}
}
}]
The first two methods are
REST API (v1) end-points.
The @ResponseView annotation will make sure, that the return value and any throw exceptions will be transformed into a proper JSON response.
The @RequestView annotation can be used, to transform the JSON request body into an internal Codebeamer entity.
Use @RequestBody get the raw JSON content.
The third method is an
HTML
endpoint.
The return value is the (relative) path to the
HTML
page or
JSP
to return (View).The page will show the data added to the specified Model.
Alternatively, you could return Model and View (JSP path) as a ModelAndView object.
EntityControllers
An EntityControllers is a special type of controller, that is responsible for a specific type of Codebeamer entity, e.g
• User
• Project
• Tracker
• Tracker Item
Typically an EntityController will convert the information from the received request into internal Data Transfer Objects (DTO) and then pass them on to the responsible EntityManager (see below).
E.g. the TrackerController shown partially above is the controller for Tracker entities, that are represented within Codebeamer as TrackerDto objects.
Data (Model) to be returned will be converted into an appropriate View, e.g.
• JSON
via a
@ResponseView, or
EntityManagers
An Entity Manager is a special type of component, that is responsible for the lifecycle (create, update, delete) and retrieving of Codebeamer entities of a specific type, e.g.
• UserManager is responsible for Users, User Groups and User Licenses,
• ProjectManager is responsible for Projects, Project Roles and Project Members,
• TrackerManager for Trackers and their configuration (Permissions, Fields, Workflow, ...)
The
Entity Manager is also responsible for applying proper entity access control and informing any
''Entity''Listeners about lifecycle events on their managed entity.
EntityDAO
An EntityDAO is a special type of component, that is responsible for the persistence (create, update, delete) and retrieving of Codebeamer entities of a specific type in the database.
Data
Access
Objects use
MyBatis
to map
Data
Transfer
Objects to Database objects (tables, rows, views, columns) and vice versa, and to create, update, delete and retrieve data in the database via
JDBC
The
EntityDAO is also responsible for maintaining the application level
EntityCache, which is an
EHCache
of the most recently used entities of that type.
Each
EHCache
and also the EHCacheManager is itself a component.
Components
We have learned about some special types of components already above:
• EntityManagers
• EntityDAOs
• EntityCaches
There are a lot more:
• DefaultEntityListeners
• EntityContextMenuBuilders
• etc.
Custom Components
Some of the default Codebeamer controllers and managers allow to add custom add-ons/plug-ins to extend their basic functionality: