1. Shared Access Layer Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1 SAL Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1 SAL Version Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.2 SAL Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.3 Adding WebSudo Support to your Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.4 Adding SAL Dependency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.5 SAL Code Samples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 SAL Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1 Shared Access Layer 2.5 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2 Shared Access Layer 2.4 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.3 Shared Access Layer 2.3 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.4 Shared Access Layer 2.2 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.5 Shared Access Layer 2.1 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.6 Shared Access Layer 2.0.17 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.7 Shared Access Layer 2.0.16 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.8 Shared Access Layer 2.0.15 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.9 Shared Access Layer 2.0.14 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.10 Shared Access Layer 2.0.13 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.11 Shared Access Layer 2.0.12 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.12 Shared Access Layer 2.0.11 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.13 Shared Access Layer 2.0.10 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.14 Shared Access Layer 2.0.7 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.15 Shared Access Layer 2.0.6 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.16 Shared Access Layer 2.0.5 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.17 Shared Access Layer 2.0.4 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.18 Shared Access Layer 2.0.3 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.19 Shared Access Layer 2.0.2 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.20 Shared Access Layer 2.0.1 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.21 Shared Access Layer 2.0 Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.22 Shared Access Layer 1.0 Release Notes - Internal Only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 SAL Development Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.1 SAL FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.1.1 SAL Issue Tracker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
3
5
6
13
15
15
16
16
17
17
17
18
19
19
20
20
20
21
21
21
21
22
22
22
22
23
23
23
25
25
25
26
Shared Access Layer Documentation
Getting Started
The Shared Access Layer, or SAL for short, provides a consistent, cohesive API to common plugin tasks, regardless of the Atlassian
application into which your plugin is deployed. SAL is most useful for cross-application plugin development. If you are developing your plugin
for a single application only, you can simply use the application's own API. If your plugin will run in two applications or more, you will find
SAL's services useful. These common services include, but are not limited to:
Job scheduling
Internationalisation lookups
Persistence for plugin settings
A plugin upgrade framework
SAL is a component of the Atlassian plugin development platform. Start by setting up your plugin development environment. Check our SAL
availability guide, then take a look at the SAL services.
Main Topics
Adding SAL Dependency
What to put in your plugin's pom to use SAL.
Atlassian Plugin SDK
Get started with developing an Atlassian plugin.
SAL Services
Take a look at the services that SAL offers.
Atlassian Development Hubs
Developer Network
Plugin Framework
Gadgets
REST APIs
Confluence
JIRA
GreenHopper
Bamboo
Crowd
FishEye/Crucible
JIRA Mobile Connect
Resources
Javadoc
Release notes
Installation guide
Using SAL to store plugin settings
Help
SAL FAQ
Answers from the community
Mailing lists at my.atlassian.com
Feature requests and bug reports
Atlassian developer blog
Atlassian Developer Blog
Plugin Driven Development- Developing JIRA's new Project Configuration pages
The road to HAMS 3.0 - Transaction boundaries
Make your plugin sizzle with new Plugin Exchange enhancements
Testing's In Session
AtlasCamp 2011
SAL Development
The developer documentation is for people who want to use SAL when developing plugins for the Atlassian applications.
On this page:
About the Shared Access Layer (SAL)
How it Works
Using a SAL Service
About the Shared Access Layer (SAL)
The Shared Access Layer, or SAL for short, provides a consistent, cohesive API to common plugin tasks, regardless of the Atlassian
application into which your plugin is deployed. SAL is most useful for cross-application plugin development. If you are developing your plugin
for a single application only, you can simply use the application's own API. If your plugin will run in two applications or more, you will find
SAL's services useful. These common services include, but are not limited to:
Job scheduling
Internationalisation lookups
Persistence for plugin settings
A plugin upgrade framework
SAL is one of the ingredients in the Atlassian plugin development platform, along with the Atlassian Plugin Framework version 2.
If you want to see the how SAL fits into the platform, take a look at the overview of the plugin development platform.
If you are interested in the Atlassian Plugin Framework 2, see the plugin framework documentation.
How it Works
The diagram below gives a conceptual overview of SAL as a layer between a plugin and the applications (JIRA, Confluence and FishEye).
Let's assume that the plugin provides a portal on a JIRA dashboard, and that it needs to store a user preference setting.
The dashboard plugin sends a request to SAL, asking for the preference to be saved in JIRA. SAL communicates with JIRA via the SAL JIRA
plugin.
Alternatively, the dashboard plugin may need to save the preference in Confluence. The dashboard plugin will use the same SAL API call,
specifying Confluence as the application. SAL will handle the communications with Confluence.
Here is another diagram, giving more detail of SAL in action. Again, let's assume that the dashboard plugin allows users to save a preference
to JIRA.
Using a SAL Service
To use a SAL service, you will need to declare a component import module in your atlassian-plugin.xml. For example, if you want to
get the UserManager, the component import would look like this:
<component-import key="userManager" interface="com.atlassian.sal.api.user.UserManager" />
You also need to update you project's pom.xml to include SAL:
<dependency>
<groupId>com.atlassian.sal</groupId>
<artifactId>sal-api</artifactId>
<version>2.0.0</version>
<scope>provided</scope>
</dependency>
Please refer to the list of available SAL services.
RELATED TOPICS
SAL Services
Plugin Framework
SAL Version Matrix
The matrix below shows the applications which include and support the Shared Access Layer. The applications are listed horizontally across
the top and the SAL versions are listed vertically on the left.
Version numbers next to a tick
show the earliest release of the application which supports the relevant SAL version.
Version numbers in brackets show a future application release expected to support the relevant SAL version.
Bamboo
SAL 2.0
Confluence
Bamboo 2.3
SAL 2.1
SAL 2.2
Crowd
Confluence 3.0
Crucible
FishEye
1.6.5
1.6.5
Crowd 2.0
Confluence 3.3
Bamboo 3.0
Confluence 3.4
JIRA
JIRA 4.0
JIRA 4.2
Crowd 2.2
Crucible 2.4
FishEye 2.4
JIRA 4.3
SAL 2.3
(Confluence 4.0)
SAL 2.6
Crowd 2.3
JIRA 4.4
There is also a detailed list of services available per application.
SAL is bundled with all application versions as shown in the above table. You do not need to install SAL into any application.
RELATED TOPICS
SAL Documentation Home
SAL Services
Below is a list of the services provided by the Atlassian Shared Access Layer. You will find more developer help in the Javadoc.
On this page:
Service Descriptions and Examples
com.atlassian.sal.api
ApplicationProperties
com.atlassian.sal.api.auth
AuthenticationController
AuthenticationListener
Authenticator
LoginUriProvider
com.atlassian.sal.api.component
ComponentLocator
com.atlassian.sal.api.executor
ThreadLocalDelegateExecutorFactory
com.atlassian.sal.api.license
LicenseHandler
com.atlassian.sal.api.lifecycle
LifecycleAware
LifecycleManager
com.atlassian.sal.api.message
I18nResolver
LocaleResolver
Message
MessageCollection
com.atlassian.sal.api.net
Request
RequestFactory
Response
ResponseException
ResponseHandler
com.atlassian.sal.api.net.auth
Authenticator
com.atlassian.sal.api.pluginsettings
PluginSettings
PluginSettingsFactory
com.atlassian.sal.api.project
ProjectManager
com.atlassian.sal.api.scheduling
PluginJob
PluginScheduler
com.atlassian.sal.api.search
ResourceType
SearchMatch
SearchProvider
SearchResults
com.atlassian.sal.api.search.parameter
SearchParameter
com.atlassian.sal.api.search.query
SearchQuery
SearchQueryParser
com.atlassian.sal.api.transaction
TransactionCallback
TransactionTemplate
com.atlassian.sal.api.timezone
TimeZoneManager
com.atlassian.sal.api.upgrade
PluginUpgradeManager
PluginUpgradeTask
com.atlassian.sal.api.user
UserManager
UserResolutionException
Services Available per Application
Service Descriptions and Examples
com.atlassian.sal.api
ApplicationProperties
Exposes key application settings such as the base URL, application name, build information and version number.
Example — Obtaining base url of the application:
public class DefaultStudioInfo
{
private final ApplicationProperties applicationProperties;
public DefaultStudioInfo(final ApplicationProperties applicationProperties)
{
this.applicationProperties = applicationProperties;
}
public String getCurrentAppBaseUrl()
{
return applicationProperties.getBaseUrl();
}
}
com.atlassian.sal.api.auth
AuthenticationController
Allows the host application to communicate about when authentication should be performed and users allowed to login.
AuthenticationListener
Allows the underlying framework to take some actions on authentication events.
Authenticator
Marker interface for classes that can authenticate requests.
LoginUriProvider
Provides the URI to redirect users to so that they can log in before they can authorise consumer requests to access their data.
com.atlassian.sal.api.component
ComponentLocator
Gives access to the application's component container instances.
com.atlassian.sal.api.executor
ThreadLocalDelegateExecutorFactory
Factory to create Executor instances that delegate to a specific Executor and ensure the executed code runs in the same thread local
context.
com.atlassian.sal.api.license
LicenseHandler
Handles setting and retrieving the application's license.
com.atlassian.sal.api.lifecycle
LifecycleAware
Marks a class that wants to execute code on certain application-level lifecycle stages.
LifecycleManager
Interface to be used to trigger lifecycle events. Handles lifecycle events by calling LifecycleAware methods on registered beans.
com.atlassian.sal.api.message
I18nResolver
Resolves an internationalisation key or key/argument pair to its internationalised message.
LocaleResolver
Used to retrieve the user's locale, based on the remote users preferences, or the preferred locale as specified in the request or finally
defaulting to the system locale if no preferred locale is set.
Message
Encapsulates a message before it has been resolved via an I18N resolver.
MessageCollection
A collection of messages that have not been resolved.
com.atlassian.sal.api.net
Request
Represents a request to retrieve data. To execute a request call Request#execute(ResponseHandler).
RequestFactory
Provides a factory for making HTTP requests with optional authentication.
Example — Running remote search:
public class RemoteSearcher
{
private final String url;
private static final String SEARCH_PLUGIN_PATH = "/plugins/servlet/studio/search";
private final RequestFactory<?> requestFactory;
public RemoteSearcher(final String url, final RequestFactory<?> requestFactory)
{
this.url = url;
this.requestFactory = requestFactory;
}
public SearchResults search(final String remoteUser, final String query)
{
final String fullUrl = url + SEARCH_PLUGIN_PATH + "?query=" + URIUtil.encodeWithinQuery(query);
final Request<?> request = requestFactory.createRequest(MethodType.GET, fullUrl);
request.addTrustedTokenAuthentication(); // this takes username from ThreadLocal
try
{
// parse the response
final String responseString = request.execute();
return (SearchResults) XStreamUtils.fromXML(responseString);
}
catch (final ResponseException e)
{
throw new RuntimeException("Search for " + query + " on " + fullUrl + " failed.", e);
}
}
}
Response
Represents the response when calling Request#execute(ResponseHandler).
ResponseException
Exception thrown by Request#execute(ResponseHandler) and Request#handle(ResponseHandler).
ResponseHandler
Callback interface used by Request#execute(ResponseHandler) method. Implementation of this interface performs actual handling of
the response.
com.atlassian.sal.api.net.auth
Authenticator
Marker interface for an authenticator.
com.atlassian.sal.api.pluginsettings
PluginSettings
Provides access to settings globally or per project/space/repository.
Example — Saving and retrieving custom settings per project:
public class CustomProjectSettings
{
private final PluginSettingsFactory pluginSettingsFactory;
private final String projectKey;
public CustomProjectSettings(final PluginSettingsFactory pluginSettingsFactory, final String
projectKey)
{
this.pluginSettingsFactory = pluginSettingsFactory;
this.projectKey = projectKey;
}
public void setValue(final String key, final String value)
{
final PluginSettings settings = pluginSettingsFactory.createSettingsForKey(projectKey);
settings.put(key, value);
}
public Object getValue(final String key)
{
final PluginSettings settings = pluginSettingsFactory.createSettingsForKey(projectKey);
return settings.get(key);
}
}
PluginSettingsFactory
One feature provided by SAL is storage of plugin settings, for global and project-specific settings. You will create a PluginSettings object
via a PluginSettingsFactory, which uses the abstract factory pattern. Refer to the developer blog post on Storing plugin settings with
the abstract factory pattern.
com.atlassian.sal.api.project
ProjectManager
Provides a list of projects. A project may represent different things depending on the application. For example, in Confluence it is a space, in
Bamboo it is a build plan, and in JIRA it is a project.
com.atlassian.sal.api.scheduling
PluginJob
A job to be executed by the PluginScheduler.
PluginScheduler
Schedules plugin jobs programmatically.
com.atlassian.sal.api.search
ResourceType
Defines the more information about the search resource (e.g. JIRA, wiki).
SearchMatch
A single match for a query (e.g. an issue, a wiki page, a commit). The match contains a URL, title and possibly an excerpt. The
resourceType contains more information about the source of this searchMatch.
SearchProvider
Executes search queries. Allows for simple string based searches in an application.
SearchResults
Provides searchresults for a query.
com.atlassian.sal.api.search.parameter
SearchParameter
Allows you to specify additional properties for a search as string value pairs. For example this could specify a fixforversion=3.12 in
JIRA, or application=crucible in FishEye.
com.atlassian.sal.api.search.query
SearchQuery
Utility to help with creating a query string.
SearchQueryParser
Parses a search query.
com.atlassian.sal.api.transaction
TransactionCallback
A simple callback that needs to be provided with an action to run in the doInTransaction method. It is assumed that if anything goes
wrong, doInTransaction will throw a RuntimeException and the calling transactionTemplate will roll back the transaction.
TransactionTemplate
com.atlassian.sal.api.timezone
TimeZoneManager
Available since SAL 2.6.
Provides timezone information about the users and about the application.
com.atlassian.sal.api.upgrade
PluginUpgradeManager
Provides a plugin upgrade framework that will recognise PluginUpgradeTask tasks and run them on startup.
PluginUpgradeTask
com.atlassian.sal.api.user
UserManager
Provides simplified access to users across various applications, and performs user authentication checks.
UserResolutionException
Services Available per Application
The matrix below shows the services available to each version of the Atlassian applications that support the Shared Access Layer. The
applications are listed horizontally across the top and the SAL versions are listed vertically on the left.
Version numbers in brackets indicate a future application release expected to support the relevant SAL services.
A tick
A cross
SAL Service
shows that the SAL service is available to the relevant version of the application.
means that the service is not available to the relevant version of the application.
JIRA
(JIRA
Confluence
FishEye/
FishEye/
Crowd
Bamboo
3.13
4.0)
3.0
Crucible
Crucible
2.0
2.3
1.6.5
2.0
RefImpl
com.atlassian.sal.api
ApplicationProperties
com.atlassian.sal.api.auth
AuthenticationController
AuthenticationListener
Authenticator
LoginUriProvider
com.atlassian.sal.api.component
ComponentLocator
com.atlassian.sal.api.executor
ThreadLocalDelegateExecutorFactory
com.atlassian.sal.api.license
LicenseHandler
com.atlassian.sal.api.lifecycle
LifecycleAware
LifecycleManager
com.atlassian.sal.api.message
I18nResolver
LocaleResolver
Message
MessageCollection
com.atlassian.sal.api.net
Request
RequestFactory
Response
ResponseException
ResponseHandler
com.atlassian.sal.api.net.auth
Authenticator
com.atlassian.sal.api.pluginsettings
PluginSettings
PluginSettingsFactory
com.atlassian.sal.api.project
ProjectManager
com.atlassian.sal.api.scheduling
PluginJob
PluginScheduler
com.atlassian.sal.api.search
ResourceType
SearchMatch
SearchProvider
SearchResults
com.atlassian.sal.api.search.parameter
SearchParameter
com.atlassian.sal.api.search.query
SearchQuery
SearchQueryParser
com.atlassian.sal.api.transaction
TransactionCallback
TransactionTemplate
com.atlassian.sal.api.upgrade
PluginUpgradeManager
PluginUpgradeTask
com.atlassian.sal.api.user
UserManager
UserResolutionException
RELATED TOPICS
Javadoc
SAL Development
Adding WebSudo Support to your Plugin
Available:
SAL 2.2 and later; REST 2.2 and later.
Support for Secure Administrator Sessions, called 'WebSudo', was added in Confluence 3.3 (see documentation) and JIRA 4.3 (see
documentation). When an administrator who is logged into Confluence or JIRA attempts to access an administration function, they are
prompted to log in again.
All the Atlassian applications will support WebSudo sessions at some point. As of SAL version 2.2 and REST 2.2 it is possible to enforce
WebSudo from within a plugin if the host application supports it.
SAL 2.2 supports programmatic access to a WebSudoManager that you can use from within your servlet or servlet filter. As of version 2.2 of
the Atlassian REST plugin module, you can add annotations to REST resources.
Servlet Example
You can use the com.atlassian.sal.api.websudo.WebSudoManager to check for secure administrator sessions and to enforce the
WebSudo protection for the current request.
The call to WebSudoManager#enforceWebSudoProtection(javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse) will cause the host application to
redirect the user to an authentication form if, and only if, the current request is not WebSudo protected.
package com.example.myplugin.servlet;
import static com.google.common.base.Preconditions.checkNotNull;
// import [...]
public final class MyManagerServlet extends HttpServlet
{
private final UserManager userManager;
private final WebSudoManager webSudoManager;
public MyManagerServlet(final UserManager userManager,
final WebSudoManager webSudoManager)
{
this.userManager = checkNotNull(userManager, "userManager");
this.webSudoManager = checkNotNull(webSudoManager, "webSudoManager");
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
{
// WebSudo
try {
webSudoManager.willExecuteWebSudoRequest(request);
// This request will be WebSudo protected
// Add your custom code here
} catch(WebSudoSessionException wes) {
webSudoManager.enforceWebSudoProtection(request, response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
{
// WebSudo
try {
webSudoManager.willExecuteWebSudoRequest(request);
// This request will be WebSudo protected
// Add your custom code here
} catch(WebSudoSessionException wes) {
// Send an error or redirect the user to
the initial form.
response.sendError(HttpServletResponse.SC_FORBIDDEN);
}
}
}
REST Example
SAL provides two annotations that you can use to control secure administrator sessions. You can apply the annotations on a package, type
or method level.
The com.atlassian.sal.api.websudo.WebSudoRequired annotation will require WebSudo protection. On the other hand,
com.atlassian.sal.api.websudo.WebSudoNotRequired allows REST resources to bypass WebSudo protection if this annotation is
applied to a more specific element.
The following example adds a package level annotation that enforces WebSudo protection but allows the REST resource ATestResource
to bypass it.
Enforce WebSudo protection for all the resources in the com.example.myplugin.rest.resources.admin package:
com/example/myplugin/rest/resources/admin/package-info.java:
@WebSudoRequired
package com.example.myplugin.rest.resources.admin;
import com.atlassian.sal.api.websudo.WebSudoRequired;
To exclude a resource, you can add the annotation com.atlassian.sal.api.websudo.WebSudoNotRequired:
@Path("/test/{key}")
@WebSudoNotRequired
public class ATestResource
{
// [...]
@GET
public Response get(@PathParam("key") String key)
{
// ....
return ...
}
}
This prevents WebSudo protection from being enforced for the ATestResource REST resource.
Adding SAL Dependency
Add this to the dependencies section of your pom.xml.
POM Dependency
<dependency>
<groupId>com.atlassian.sal</groupId>
<artifactId>sal-api</artifactId>
<version>2.0.17</version>
<scope>provided</scope> <!-- Uses the application's SAL instead of bundling it into the
plugin. -->
</dependency>
Version 2.0.17 of the API is known to be compatible with JIRA 4.2, Confluence 3.4, FishEye/Crucible 2.2 and Bamboo 2.6.
SAL Code Samples
Using PluginSettings
Add this to your atlassian-plugin.xml. It will only work with a version 2 plugin.
atlassian-plugin.xml
<atlassian-plugin key="your-plugin-key" name="Your plugin name" plugins-version="2">
<!-- Makes PluginSettingsFactory available to your plugin. -->
<component-import key="pluginSettingsFactory"
interface="com.atlassian.sal.api.pluginsettings.PluginSettingsFactory" />
<!-- other stuff here -->
</atlassian-plugin>
Example class
public class Example {
final PluginSettingsFactory pluginSettingsFactory;
public Example(PluginSettingsFactory pluginSettingsFactory) {
this.pluginSettingsFactory = pluginSettingsFactory;
}
public void storeSomeInfo(String key, String value) {
// createGlobalSettings is nice and fast, so there's no need to cache it (it's memoised
when necessary).
pluginSettingsFactory.createGlobalSettings().put("my-plugin-namespace" + key, value);
}
public Object getSomeInfo(String key) {
return pluginSettingsFactory.createGlobalSettings().get("my-plugin-namespace" + key);
}
public void storeSomeInfo(String projectKey, String key, String value) {
// createSettingsForKey is nice and fast, so there's no need to cache it (it's memoised
when necessary).
pluginSettingsFactory.createSettingsForKey(projectKey).put("my-plugin-namespace" + key,
value);
}
public Object getSomeInfo(String projectKey, String key) {
return pluginSettingsFactory.createSettingsForKey(projectKey).get("my-plugin-namespace" +
key);
}
}
SAL Release Notes
Current released version
Shared Access Layer 2.2 has now been released — see the Shared Access Layer 2.2 Release Notes.
Shared Access Layer Release Notes
Shared Access Layer 2.5 Release Notes
Shared Access Layer 2.4 Release Notes
Shared Access Layer 2.3 Release Notes
Shared Access Layer 2.2 Release Notes
Shared Access Layer 2.1 Release Notes
Shared Access Layer 2.0.17 Release Notes
Shared Access Layer 2.0.16 Release Notes
Shared Access Layer 2.0.15 Release Notes
Shared Access Layer 2.0.14 Release Notes
Shared Access Layer 2.0.13 Release Notes
Shared Access Layer 2.0.12 Release Notes
Shared Access Layer 2.0.11 Release Notes
Shared Access Layer 2.0.10 Release Notes
Shared Access Layer 2.0.7 Release Notes
Shared Access Layer 2.0.6 Release Notes
Shared Access Layer 2.0.5 Release Notes
Shared Access Layer 2.0.4 Release Notes
Shared Access Layer 2.0.3 Release Notes
Shared Access Layer 2.0.2 Release Notes
Shared Access Layer 2.0.1 Release Notes
Shared Access Layer 2.0 Release Notes
Shared Access Layer 1.0 Release Notes - Internal Only
Shared Access Layer 2.5 Release Notes
5 April 2011
With pleasure, Atlassian presents the Shared Access Layer (SAL) 2.5.
List of Fixes in this Release
JIRA Issues (1 issues)
Key
Summary
SAL-153
Add getRawText() support to I18nResolver
Priority
Status
Resolved
Shared Access Layer 2.4 Release Notes
27 January 2011
With pleasure, Atlassian presents the Shared Access Layer (SAL) 2.4.
List of Fixes in this Release
JIRA Issues (6 issues)
Key
Summary
Priority
Status
SAL-146
SAL should provide a component that can be used to validate xsrf tokens
Resolved
SAL-145
SAL documentation does not inform of max key length
Resolved
SAL-142
Add XSRF token support
Resolved
SAL-141
The definitions of Admin and SystemAdmin should be better clarified in UserManager javadoc.
Resolved
SAL-140
Entity enclosing requests cannot be redirected without user intervention!
Resolved
SAL-138
Add Help Path api to SAL
Resolved
Shared Access Layer 2.3 Release Notes
14 October 2010
With pleasure, Atlassian presents the Shared Access Layer (SAL) 2.3.
The main feature of this release is the option to disable automatic redirects. In earlier versions of SAL, the HttpClientRequest automatically
follows redirects. SAL 2.3 adds a new option to the SAL request interface: setFollowRedirects. Set it to false to turn off automatic
redirects. This is useful if you want to implement your own redirects. The default behaviour is to follow redirects.
Complete List of Fixes in this Release
JIRA Issues (2 issues)
Key
Summary
Priority
Status
SAL-134
Allow users to disable automatic redirects
Resolved
SAL-133
remove sal-ctk since it's been moved to platform (REFAPP)
Resolved
Shared Access Layer 2.2 Release Notes
13 September 2010
With pleasure, Atlassian presents the Shared Access Layer (SAL) 2.2.
Highlights of this release:
Secure administrator sessions. Confluence provides support for secure administrator sessions, called 'WebSudo'. When an
administrator who is logged into Confluence attempts to access an administration function, they are prompted to log in again.
Eventually, all the Atlassian applications will support WebSudo sessions. As of SAL version 2.2 and REST 2.2 it is possible to
enforce WebSudo from within a plugin if the host application supports it. See the documentation.
Cross-application API for accessing user profiles. SAL's UserManager API now supports a uniform way of retrieving user
information such as user full name, email address, profile picture URI, and profile page URI.
public interface UserManager
{
/**
* Returns a {@code UserProfile object} for the specified user or null if no user
can be found
* @param username The username of the user whose profile is requested
* @return The user's profile or null
* @since 2.2.0
*/
UserProfile getUserProfile(String username);
...
You can inject it into any service.
public MyService(UserManager userManager)
{
...
UserProfile profile = userManager.getUserProfile(username);
...
}
Support of special characters in PluginSettings. In earlier releases, special characters such as newline or form feed could
corrupt the data persisted through AbstractStringPluginSettings (if your PluginSettings implementation uses it). This problem has
been fixed.
Complete List of Fixes in this Release
JIRA Issues (14 issues)
Key
Summary
SAL-132 standardize dependency versioning
SAL-131
Improve the WebSudoManager to make it explicit that an HttpServletRequest is requesting a web sudo
protected resource
SAL-130 Upgrade PLUG to 2.6.0-beta2
SAL-129 Create a release note for SAL 2.2.0
SAL-127 Add a getUserProfile method that returns a user profile with full name, profile link, and profile pic
SAL-124 AbstractI18nResolver.getText(String) passes an empty array to getText(String, Serializable...)
SAL-123 Add a new Request.execute(ResponseHandler) method that returns a generic result
SAL-119 Provide a WebSudo API for plugin developers
SAL-116 Move RefImpl plugins to REFAPP
SAL-115 Need a cross-product method to fetch a user profile URL
SAL-113 Serialisation of PluginSettings properties to XML fails to escape illegal control characters
SAL-102 PluginScheduler.unscheduleJob(UNKNOWN_JOB) throws an exception in fecru, but not in jira
SAL-88
Shared Application Access Layer API Plugin documentation has an incorrect description
SAL-75
SAL PluginSettings serialisation uses new line characters and vertical tabs
Priority Status
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Shared Access Layer 2.1 Release Notes
10 June 2010
With pleasure, Atlassian presents the Shared Access Layer (SAL) 2.1.
This version of SAL provides the following new capabilities:
Get the application's display name. SAL's ApplicationProperties now provides a getDisplayName() method as well as
the existing getApplicationName() method. Use the new method to get the application's display name, as configured by the
administrator.
Use the default locale on internationalisation calls. The I18nResolver will fall back to the default locale if none is supplied.
Simply call the method getAllTranslationsForPrefix(String prefix) without supplying a locale.
Find out whether a user is a system administrator or just an administrator. The UserManager API now offers an isAdmin()
method. You can use the new method along with the existing isSystemAdmin() method to distinguish administrators from system
administrators. This is useful for applications such as Confluence and JIRA, which have two levels of administrative permissions.
Complete List of Fixes in this Release
JIRA Issues (9 issues)
Key
Summary
SAL-110 Upgrade dependency to Plugins 2.5
SAL-109 Remove unused product plugins
SAL-108 implement isAdmin permission
SAL-105 ArrayIndexOutOfBoundsException encountered in PluginSettings when trying to retrieve an empty Map
SAL-101 Document plugin upgrade tasks are only ran on startup
SAL-99
Update base POM to version 23
SAL-62
TransactionTemplate/TransactionCallback shoud use generics
SAL-60
Add getInstanceName() to ApplicationProperties
SAL-48
I18nResolver's get all translations for a specific prefix should fall back to the default locale if none is
supplied
Priority Status
Resolved
Resolved
Closed
Resolved
Resolved
Resolved
Resolved
Resolved
Resolved
Shared Access Layer 2.0.17 Release Notes
28 January 2009
The Atlassian Shared Access Layer (SAL) 2.0.17 is now available. This release contains just one fix: A JIRA search request will now search
the issue comments as well as title and description.
Fixes in this Release
JST-2122 – Studio Search looks up different results to the click-through JIRA search
Shared Access Layer 2.0.16 Release Notes
30 November 2009
The Atlassian Shared Access Layer (SAL) 2.0.16 is now available. This is a bug-fix release that solves the problems listed below. In addition,
the SAL JIRA plugin now contains an upgrade task to update the fully qualified class name of the JIRA scheduler service. This is required
because JiraPluginSchedulerService has been promoted to a first-level public class (JST-1914).
Fixes in this Release
JIRA Issues (3 issues)
Type Key
Summary
Assignee
BeanCurrentlyInCreationException
thrown when binding existing
SAL-100 plugin upgrade tasks to plugin
Alex Wei
upgrade manager that is being
constructed
SAL-96
SAL JIRA plugin settings returns
the key instead of the old value
from remove()
SAL-95
SAL implementations that use
AbstractStringPluginSettings
James
return the new value instead of the Roper
old from put()
Unassigned
Reporter Priority Status
Resolution Created Updated Due
Alex Wei
Fixed
Nov 29,
2009
Nov 30,
2009
Fixed
Oct 13,
2009
Oct 13,
2009
Fixed
Oct 13,
2009
Oct 13,
2009
Resolved
James
Roper
Resolved
James
Roper
Resolved
Shared Access Layer 2.0.15 Release Notes
29 September 2009
The Atlassian Shared Access Layer (SAL) 2.0.15 is now available. This release provides a feature required by a future Confluence release,
and a change to the life cycle manager in the Atlassian Reference Implementation (refapp).
Complete List of Fixes in this Release
JIRA Issues (2 issues)
Type Key
Summary
Assignee Reporter Priority Status
Resolution Created Updated Due
Implement
SAL-94 getAllTranslationsForPrefix() method
in ConfluenceI18NResolver
Xu-Heng
Tjhin
Xu-Heng
Tjhin
Resolved
Fixed
Sep 27,
2009
Sep 28,
2009
Change Lifecycle manager in refapp
SAL-93 to respond to dynamically installed
plugins better
Don
Brown
Don
Brown
Resolved
Fixed
Sep 13,
2009
Sep 13,
2009
Shared Access Layer 2.0.14 Release Notes
14 September 2009
The Atlassian Shared Access Layer (SAL) 2.0.14 is now available. This release fixes a couple of bugs.
Complete List of Fixes in this Release
JIRA Issues (2 issues)
Type Key
Summary
Assignee
Reporter Priority Status
Resolution Created Updated Due
SAL-90
Crowd has refactored packages
breaking SAL Crowd Plugin
Shihab
Hamid
Shihab
Hamid
Resolved
Fixed
Sep 10,
2009
Sep 13,
2009
SAL-89
NullPointerException in
JiraPluginSchedulerService
Justus
Pendleton
Mark
Lassau
Resolved
Fixed
Sep 09,
2009
Sep 13,
2009
Shared Access Layer 2.0.13 Release Notes
11 September 2009
The Atlassian Shared Access Layer (SAL) 2.0.13 is now available. This is a bug-fix release and includes some Javadoc updates.
Complete List of Fixes in this Release
JIRA Issues (5 issues)
Type Key
Summary
Assignee
Reporter Priority Status
Resolution Created Updated
Upgrade SAL to compile and run against
the latest JIRA trunk code
Unassigned
Mark
Lassau
Resolved
Fixed
Aug 27,
2009
Aug 31,
2009
When adding a service through SAL,
SAL-81 sometimes ClassNotFound Exceptions are
thrown on startup.
Mark
Lassau
Mark
Lassau
Resolved
Fixed
Aug 26,
2009
Aug 27,
2009
sal-fisheye-plugin
SAL-80 FisheyeLoginUriProvider.getLoginUri
Tom
Tom
Aug 26,
Aug 27,
SAL-82
Fixed
returns URI with incorrect origUrl
Davies
Davies
Resolved
SAL-73
Add javadocs to the API that say Map is
now supported
Eric
Dalgliesh
Eric
Dalgliesh
Resolved
SAL-47
Improve Javadocs on
Eric
PluginSettingsFactory.createSettingsForKey Dalgliesh
Richard
Wallace
Resolved
2009
2009
Fixed
Jul 13,
2009
Jul 29,
2009
Fixed
May 01,
2009
Jul 30,
2009
Shared Access Layer 2.0.12 Release Notes
24 July 2009
The Atlassian Shared Access Layer (SAL) 2.0.12 is now available. This release fixes a memory leak when disabling the SAL plugin
Complete List of Fixes in this Release
JIRA Issues (1 issues)
Type Key
Summary
MemoryLeak when restarting
plugins system,
DefaultLifecycleManager does
SAL-76
not unregister with the
PluginEventManager on
destruction
Assignee
Reporter
Priority Status
Unassigned
Jed
Wesley-Smith
Resolved
Resolution Created Updated Due
Fixed
Jul 23,
2009
Jul 23,
2009
Shared Access Layer 2.0.11 Release Notes
14 July 2009
The Atlassian Shared Access Layer (SAL) 2.0.11 is now available. This release includes a new property to optionally use an in-memory
plugin settings store
Complete List of Fixes in this Release
JIRA Issues (1 issues)
Type Key
Summary
System property to explicitly disable
SAL-74 on-disk persistence for RefImpl
PluginSettings
Assignee Reporter Priority Status
Resolution Created Updated Due
John
Kodumal
Fixed
Tim
Moore
Resolved
Jul 14,
2009
Jul 30,
2009
Shared Access Layer 2.0.10 Release Notes
The Shared Access Layer 2.0.10 has been released.
An upgrade is recommended for all users. Atlassian OAuth 1.0.beta12 is compatible with 2.0.10, but not with versions 2.0.7 – 2.0.9, which
introduced an accidental API-breaking change. Upgrading will also allow plugins to store maps of strings (not only lists, properties and
strings) in their plugin settings.
JIRA Issues (2 issues)
Type Key
Summary
SAL-70 PluginSettings does not support maps
Assignee Reporter Priority Status
Resolution Created
Eric
Dalgliesh
Fixed
Jul 08,
2009
Fixed
Jul 13,
2009
API-breaking change to
Tim
SAL-71 com.atlassian.sal.api.auth.Authenticator.Result.Success
Moore
in 2.0.7
Eric
Dalgliesh
Resolved
Tim
Moore
Resolved
Shared Access Layer 2.0.7 Release Notes
1 June 2009
The Atlassian Shared Access Layer (SAL) 2.0.7 is now available. This release supports the upcoming Crowd 2.0 release and the use of the
JIRA home directory in application properties.
Complete List of Fixes in this Release
JIRA Issues (2 issues)
Key
Summary
Priority
Status
SAL-59
JIRA home directory not returned by application properties
Resolved
SAL-57
Crowd integration for SAL will not work with the 2.0 release of Crowd
Resolved
Shared Access Layer 2.0.6 Release Notes
14 May 2009
The Atlassian Shared Access Layer (SAL) 2.0.6 is now available. The CTK test suite has been updated to show only failures that are really
failures.
Complete List of Fixes in this Release
JIRA Issues (4 issues)
Key
Summary
Priority Status
SAL-56
The UserManager implementation in the FishEye plugin should return null is the username parameter is
null
Resolved
SAL-54 Sane component locator impl for refapp
Resolved
SAL-51 CTK should only report failures that are really failures
Resolved
SAL-50 Confluence plugin settings operations should use transaction
Resolved
Shared Access Layer 2.0.5 Release Notes
6 May 2009
The Atlassian Shared Access Layer (SAL) 2.0.5 is now available.
Complete List of Fixes in this Release
JIRA Issues (1 issues)
Key
Summary
SAL-49
Confluence DefaultUserManager should return a com.atlassian.user.User instead of a principal
Priority
Status
Resolved
Shared Access Layer 2.0.4 Release Notes
7 May 2009
The Atlassian Shared Access Layer (SAL) 2.0.4 is now available. This release contains better support for internationalisation in the Bamboo
plugin.
Complete List of Fixes in this Release
JIRA Issues (1 issues)
Key
Summary
SAL-53
Fix bamboo SAL I18n Support to work with gadgets -- BAM-3903
Priority
Status
Closed
Shared Access Layer 2.0.3 Release Notes
1 May 2009
The Atlassian Shared Access Layer (SAL) 2.0.3 is now available. This release contains bug fixes to SeraphLoginUriProvider and the
Compatability Test Kit (CTK) running under Resin 3.0.
Complete List of Fixes in this Release
JIRA Issues (2 issues)
Key
Summary
Priority
Status
SAL-46
SeraphLoginUriProvider uses LinkLoginURL when it should use LoginURL
Resolved
SAL-45
Compatibility Testing Kit Plugin broken for Confluence running under Resin
Resolved
Shared Access Layer 2.0.2 Release Notes
21 April 2009
The Atlassian Shared Access Layer (SAL) 2.0.2 is now available. This release contains improvements for the FishEye, Bamboo and JIRA
plugins. The Compatability Test Kit (CTK) now includes tests to cover the new authentication APIs.
Complete List of Fixes in SAL 2.0.2
JIRA Issues (2 issues)
Key
Summary
Priority
Status
SAL-43
Basic CTK tests for authentication APIs
Resolved
SAL-42
SeraphLoginUriProvider needs to prefix the url with the applications baseurl
Resolved
Shared Access Layer 2.0.1 Release Notes
15 April 2009
The Atlassian Shared Access Layer (SAL) 2.0.1 is now available. This release contains a new Bamboo plugin and SAL implementation
improvements for the JIRA and Crowd plugins.
Complete List of Fixes in SAL 2.0.1
JIRA Issues (2 issues)
Key
Summary
SAL-41
JIRA plugin's default user manager returns a new Principal object instead of using the existing OS User
object
SAL-38 sal-crowd-plugin will not function in Crowd trunk
Priority Status
Resolved
Resolved
Shared Access Layer 2.0 Release Notes
26 March 2009
With pleasure, Atlassian presents the Shared Access Layer 2.0.
SAL 2.0 is the first public release of the Shared Access Layer, a component of the Atlassian plugin development platform. SAL provides the
API which plugin developers use to access common services across Atlassian applications. Does your plugin need to store a user setting in
JIRA or Confluence? All you need to know is the standard SAL API. SAL will reformat the request and pass it on to the application.
SAL 2.0 supports version 2.2 of the Atlassian Plugin Framework.
In these Release Notes:
Where SAL Fits In
What SAL Does
List of Fixes in this Release
Don't have SAL Yet?
Take a look at the developer overview and follow our installation guide.
Comments, Requests and Feedback
We would love your feedback. Please log your requests, bug reports and comments in our issue tracker.
Where SAL Fits In
The diagram below gives a conceptual overview of SAL as a layer between a plugin and the Atlassian applications like JIRA, Confluence and
FishEye. Let's assume that the plugin provides a portal on a JIRA dashboard, and that it needs to store a user preference setting.
The dashboard plugin sends a request to SAL, asking for the preference to be saved in JIRA. SAL communicates with JIRA via the SAL JIRA
plugin.
Alternatively, the dashboard plugin may need to save the preference in Confluence. The dashboard plugin will use the same SAL API call,
specifying Confluence as the application. SAL will handle the communications with Confluence.
What SAL Does
SAL gives your plugins access to a number of services in the application. Below are just some of them:
Job scheduling
Internationalisation lookups
Persistence for plugin settings
A framework for plugin upgrades
For more information, take a look at the developer overview.
List of Fixes in this Release
JIRA Issues (20 issues)
Key
Summary
SAL-39 Clarification on some interfaces
SAL-37 Authenticator.Result constructor does not allow message or principal to be null
SAL-36 Home directory in application properties
SAL-35 Please review services and release notes for SAL 2.0
SAL-34 Backport SAL-29 to the 2.0 branch
Priority Status
Resolved
Resolved
Resolved
Resolved
Resolved
SAL-33 Move LoginUriProvider from OAuth project to SAL
Resolved
SAL-32 Add or set user-specified headers on request
Resolved
SAL-31 AuthenticationController, AuthenticationListener, and UserResolver moved into SAL from OAuth plugin
Resolved
SAL-30 UserResolver for resolving usernames to Principal objects
Resolved
SAL-27 Implement LocaleResolver for Confluence SAL
Resolved
SAL-24 Implement FishEye I18nResolver
Resolved
SAL-21 All impl classes of PluginSettings return the val param instead of the value removed
SAL-19
Resolved
The use of the following com.atlassian.sal.api.ApplicationProperties#getApplicationName can be
misleading
Resolved
SAL-18 Add API improvements to access the BuildUtils of our products.
Resolved
SAL-17 Provide an API to get the current user's locale.
Closed
SAL-16 getRemoteUsername that takes a ServletRequest
Resolved
SAL-13 Upgrade/merge fisheye sal to plugins 2.
Resolved
SAL-11 SAL response considers 2XX and 3XX except for 200 errors
SAL-8
Occasional NPE on startup
SAL-5
Pass list of listeners into constructor for lifecyclemanager
Resolved
Resolved
Resolved
Shared Access Layer 1.0 Release Notes - Internal Only
Atlassian staff only
This page is visible to Atlassian staff only. SAL 1.0 has not been publicly released. The first release for external
developers will probably be SAL 2.0
Complete List of Fixes in this Release
JIRA Issues (2 issues)
Key
Summary
SAL-10
Change ThreadLocalContextManager into ThreadLocalDelegatingExecutorFactory
Resolved
SAL-9
Remove getUserSettings method in plugin settings
Resolved
SAL Development Resources
SAL FAQ
SAL FAQ
Priority
Status
SAL FAQ
Known issues, hints and tips and answers to commonly raised questions about the Shared Access Layer:
SAL Issue Tracker
SAL Issue Tracker
Below is a list of the open issues for SAL, drawn from the Atlassian issue tracker.
Before reporting a bug or requesting a new feature, please take a look to see if it has already been reported.
If you find a likely-looking issue, click the link to find more information and possible workarounds.
JIRA Issues (25 issues)
Type Key
SAL-174
Summary
Reporter
Add a getUserPreferencesUrl method to UserProfile and update javadoc for
UserProfile.getProfilePageUri
Eric Dalgliesh
SAL-173 Allow customization of indexing and searching
SAL-171
Specify and test for what data can be stored inside a PluginSettings List, Map or Properties
object
Dan Rosen
Richard
Atkins
Status
Open
Open
Open
SAL-170 Add api for accessible product's date, time, and datetime preference formats
Ben Woskow
SAL-169 ThreadLocalDelegateExecutorService does not override submit() methods
Arun Bhalla
SAL-168 Request API needs to be completely redone
Richard
Wallace
Open
SAL-167 Request.addTrustedTokenAuthentication() methods should be deprecated in favour of UAL
Tim
Pettersen
Open
SAL-166 Implement authentication for MS ISA proxy, with NTLM authentication (use NTCredentials)
Adrien Ragot
SAL-165 I18nResolver should have a getText method that takes a Locale to use
Richard
Wallace
Open
SAL-163 Move SAL builds off HBAC
Joseph
Walton
Open
SAL-158 PluginSettings is fundamentally broken
Jed
Wesley-Smith Open
SAL-155 Cross product checks for if the application is currently running
James Roper
SAL-152 DefaultPluginUpgradeManager doesn't lookup message i18n keys
Tim
Pettersen
Open
SAL-151 Add a method that returns a prefixed plugin settings to PluginSettingsFactory
Cheryl
Jerozal
Open
SAL-148 Support GET-after-POST redirect style in HttpClientRequest
Tom Davies
SAL-144 PluginScheduler repeatInterval is not used within the method scheduleJob
BLAISE
Bruno
Open
Open
Open
Open
Open
Open
SAL-128
Add a new UserManager method to return the application's default / anonymous profile picture
URI
John
Kodumal
Open
SAL-126
Remove type parameters from Request, RequestFactory, ResponseHandler and
ReturningResponseHandler
Richard
Wallace
Open
SAL-125 Expose the name of the host application through ApplicationProperties
Erik van Zijst
Open
SAL-121 Provide XStreams Converter out-of-box
SAL-120
PluginSettings should provide methods that accept a Converter out-of-box to ease the pain of
trying to use it store complex objects.
Alex Wei
Alex Wei
SAL-118 Email Notifications Service
Anna Lyons
SAL-117 Request should facilitate streaming uploads
Erik van Zijst
SAL-114 Create new method for getting base url (configured and url from the request)
Anatoli
Kazatchkov
SAL-106 Support named arguments in i18n replacement
Don Brown
Open
Open
Open
Open
Open
Open
© Copyright 2026 Paperzz