The minimum requirement is to implement two classes, one for the service declaration and one for the implementation itself.
The sample is a dataset user service that simply displays a "hello" message, it can be launched from the action menu of a dataset:
The service implementation class must implement the interface UserService<DatasetEntitySelection>
:
/** * This service displays hello world! */ public class HelloWordService implements UserService<DatasetEntitySelection> { public HelloWordService() { } @Override public void setupDisplay( UserServiceSetupDisplayContext<DatasetEntitySelection> aContext, UserServiceDisplayConfigurator aConfigurator) { // Set bottom bar UIButtonSpecNavigation closeButton = aConfigurator.newCloseButton(); closeButton.setDefaultButton( true ); aConfigurator.setLeftButtons(closeButton); // Set content callback aConfigurator.setContent( this ::writeHelloWorld); } private void writeHelloWorld( UserServicePaneContext aPaneContext, UserServicePaneWriter aWriter) { // Display Hello World! aWriter.add( "<div " ); aWriter.addSafeAttribute( "class" , UICSSClasses.CONTAINER_WITH_TEXT_PADDING); aWriter.add( ">" ); aWriter.add( "Hello World!" ); aWriter.add( "</div>" ); } @Override public void setupObjectContext( UserServiceSetupObjectContext<DatasetEntitySelection> aContext, UserServiceObjectContextBuilder aBuilder) { // No context yet. } @Override public void validate(UserServiceValidateContext<DatasetEntitySelection> aContext) { // No custom validation is necessary. } @Override public UserServiceEventOutcome processEventOutcome( UserServiceProcessEventOutcomeContext<DatasetEntitySelection> aContext, UserServiceEventOutcome anEventOutcome) { // By default do not modify the outcome. return anEventOutcome; } } |
The declaration class must implement the interface UserServiceDeclaration.OnDataset
:
/** * Declaration for service hello world! */ public class HelloWorldServiceDeclaration implements UserServiceDeclaration.OnDataset { // The service key identifies the user service. private static final ServiceKey serviceKey = ServiceKey.forName( "HelloWorld" ); public HelloWorldServiceDeclaration() { } @Override public ServiceKey getServiceKey() { return serviceKey; } @Override public UserService<DatasetEntitySelection> createUserService() { // Creates an instance of the user service. return new HelloWordService(); } @Override public void defineActivation(ActivationContextOnDataset aContext) { // The service is activated for all datasets instanciated with // the associated data model (see next example). } @Override public void defineProperties(UserServicePropertiesDefinitionContext aContext) { // This label is displayed in menus that can execute the user service. aContext.setLabel( "Hello World Service" ); } @Override public void declareWebComponent(WebComponentDeclarationContext aContext) { } } |
In this sample, the user service is registered by a data model. The data model needs to define a schema extension that implements the following code:
public class CustomSchemaExtensions implements SchemaExtensions { @Override public void defineExtensions(SchemaExtensionsContext aContext) { // Register the service. aContext.registerUserService( new HelloWorldServiceDeclaration()); } } |
For details on the declaration of schema extensions, see SchemaExtensions
.