This chapter supplies you with the basic knowledge about overridden components, internal APIs implemented in eXo Knowledge. Also, you will know how to set up a default template for the FAQ portlet, and how to create a sample action extension in Wiki.

In this chapter, there are the following main topics:

There are some extension points in eXo Knowledge, so that you can control how these components work by implementing or extending default implementations, then reconfigure these new components in the configuration.xml file.

To use ForumEventLifeCycle class, do the following steps:

1. Create a new class that extends ForumEventListener.

For example: class ABCActivityPublisher

2. Override fuctions in this created class. In each function, you can write anythings to meet your needs.

3. Add a new configuration to the configuration.xml file with the type that is the class created in the Step 1.

To use the AnswerEventLifeCycle class, do the following steps:

1. Create a new class that extends AnswerEventListener.

For example: ABCActivityPublisher

2. Override fuctions in this created class. In each function, you can write anything to meet your needs.

3. Add a new configuration to the configuration.xml file with the type that is the class created in the Step 1.

Applications of eXo Knowledge, such as Forum, Answers and Polls, use REST services to communicate with the server. This section describes REST Services of internal APIs.

The Forum application of eXo Knowledge uses the ForumWebservice to provide all APIs to work with Forum, such as filtering IPs, viewing RSS, and more.

Service name Service URL Description Location
ForumWebservice $portalName/ $restcontextname/ ks/forum/ Call extended services of the Forum application.

* Maven groupId: org.exoplatform.ks

* ArtifactId: exo.ks.web.webservice

Use the following APIs to build all the functions of the Forum application:

Name Description Service URL endpoint Parameters Expected values
getMessage Get all new posts with the number based on the maxcount value. $portalName/ $restcontextname/ ks/forum/getmessage/ String maxcount integer
filterIps Ban IPs with no access to Forum. $portalName/ $restcontextname/ ks/forum/filter/ String str String in the IP format.
filterIpBanForum Ban IPs with no access to a specific Forum. $portalName/ $restcontextname/ ks/forum/ filterIpBanforum/

String forumId

String str

string in the IP format, string in the Forum format
filterTagNameForum Do the quick search for tags that returns the list of tags. $portalName/ $restcontextname/ ks/forum/ filterTagNameForum/

String str

String userAndTopicId

Tag name

id of user and topic

viewrss Process the request by users when they want to view RSS. $portalName/ $restcontextname/ ks/forum/rss/ String resourceid

category id

forum id

topic id

userrss Process the request by users when they want to view their own collected RSS. $portalName /$restcontextname/ ks/forum/rss/user/ String resourceid username id

The Answers application of eXo Knowledge uses the FAQWebservice to view RSS.

Service name Service URL Description Location
FAQWebservice $portalName/ $restcontextname/ ks/faq Call the extended services of the Answers application.

* Maven groupId: org.exoplatform.ks

* ArtifactId: exo.ks.eXoApplication. faq.service

Use the following APIs to build all the functions of Answers application:

Name Description Service URL endpoint Parameters Expected values
viewrss View RSS $portalName/ $restcontextname/ ks/faq/rss/ String resourceid category id, question id

The Polls application of eXo Knowledge uses the PollWebservice to create and interact with the Polls gadget.

Service name Service URL Description Location
PollWebservice $portalName/ $restcontextname/ private/ks/poll Call extended services of the Polls application.

* Maven groupId: org.exoplatform.ks

* ArtifactId: exo.ks.eXoApplication. poll.service

Use the following APIs to build all functions of the Answers application:

Name Description Service URL endpoint Parameters Expected values
viewPoll Return data of the Polls system $portalName/ $restcontextname/ private/ks/poll/ viewpoll/ String pollId id of poll
votePoll Update data for the Polls with the returned id $portalName/ $restcontextname/ private/ks/poll /votepoll/

String pollId

String indexVote

id of poll

integer

Configuration plug-in is used to automatically set up a default template for the FAQ portlet. When the FAQ service starts, it will get values which are returned from the TemplatePlugin component to initialize the template for the FAQ portlet.

The template configuration plug-in is configured in the templates-configuration.xml file.

In details:

At runtime of the FAQ Service, FAQService component is called, then templates-configuration.xml file is executed. The component-plugin named addTemplatePlugin will be referred to org.exoplatform.faq.service.TemplatePlugin- to execute some objects and create default data for the Forum application.

The properties of template configuration plug-in are defined in the init-params tag as follows:

Name Description Value
viewerTemplate Path of file template. war:/ks-extension/ks/faq/templates/ FAQViewerPortlet.gtmpl
Function name Param Return Description
getCategoryInfo Empty CategoryInfo object Get the object CategoryInfo
arrangeList (List< String > list): List of path A new list is arranged Arrange a list of path.
render (String): The content of answers or comments A new string is converted by function render Render the content of answers or comments.
Param Type Description
id String The jcr node name of the category node.
path String The jcr node path of the category node.
name String The name of the category.
pathName List<String> The path to the category includes a list of category names.
questionInfos List<QuestionInfo> The list of QuestionInfo object.
subCateInfos List<SubCategoryInfo> The list of SubCategoryInfo object.
Param Type Description
id String The jcr node name of the question node.
question String The content of the question.
details String Details of the question.
answers List<String> The list of answers for the question.

The params of this class are the same as those of the CategoryInfo class. See here for more information.

This section describes how to create a sample action extension in Wiki.

After reading this section, you can add your own actions to the Wiki toolbar. In the following example, you are going to add a new action on the Wiki toolbar to view the Wiki markup of a page.

Create a Maven project which has the following directory structure:

Navigating in the project's folder, you will see the following structure:

Here is the content of the pom.xml file:




<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.acme</groupId>
  <artifactId>example</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>eXo Wiki action - Example</name>
  <description>eXo Wiki action - Example</description>
  <dependencies>
    <dependency>
      <groupId>org.exoplatform.portal</groupId>
      <artifactId>exo.portal.webui.core</artifactId>
      <version>3.2.0-PLF-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.exoplatform.commons</groupId>
      <artifactId>exo.platform.commons.webui.ext</artifactId>
      <version>1.1.3-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.exoplatform.ks</groupId>
      <artifactId>exo.ks.eXoApplication.wiki.service</artifactId>
      <version>2.2.4-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.exoplatform.ks</groupId>
      <artifactId>exo.ks.eXoApplication.wiki.webapp</artifactId>
      <version>2.2.4-SNAPSHOT</version>
      <type>jar</type>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Edit the ViewSourceActionComponent class as below:



package com.acme;
import java.util.Arrays;
import java.util.List;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.ext.filter.UIExtensionFilter;
import org.exoplatform.webui.ext.filter.UIExtensionFilters;
import org.exoplatform.wiki.commons.Utils;
import org.exoplatform.wiki.mow.core.api.wiki.PageImpl;
import org.exoplatform.wiki.webui.UIWikiContentDisplay;
import org.exoplatform.wiki.webui.UIWikiPageContentArea;
import org.exoplatform.wiki.webui.UIWikiPortlet;
import org.exoplatform.wiki.webui.control.action.core.AbstractEventActionComponent;
import org.exoplatform.wiki.webui.control.filter.IsViewModeFilter;
import org.exoplatform.wiki.webui.control.listener.MoreContainerActionListener;
@ComponentConfig (
  template = "app:/templates/wiki/webui/control/action/AbstractActionComponent.gtmpl",
  events = {
        @EventConfig(listeners = ViewSourceActionComponent.ViewSourceActionListener.class)
    }
)
public class ViewSourceActionComponent extends AbstractEventActionComponent {
  public static final String                   ACTION  = "ViewSource";
  private static final List<UIExtensionFilter> FILTERS = Arrays.asList(new UIExtensionFilter[] { new IsViewModeFilter() });
  @UIExtensionFilters
  public List<UIExtensionFilter> getFilters() {
    return FILTERS;
  }
  @Override
  public String getActionName() {
    return ACTION;
  }
  @Override
  public boolean isAnchor() {
    return false;
  }
  public static class ViewSourceActionListener extends MoreContainerActionListener<ViewSourceActionComponent> {
    @Override
    protected void processEvent(Event<ViewSourceActionComponent> event) throws Exception {
      UIWikiPortlet wikiPortlet = event.getSource().getAncestorOfType(UIWikiPortlet.class);
      UIWikiContentDisplay contentDisplay = wikiPortlet.findFirstComponentOfType(UIWikiPageContentArea.class)
                                                       .getChildById(UIWikiPageContentArea.VIEW_DISPLAY);
      PageImpl wikipage = (PageImpl) Utils.getCurrentWikiPage();
      contentDisplay.setHtmlOutput(wikipage.getContent().getText());
      event.getRequestContext().addUIComponentToUpdateByAjax(contentDisplay);
    }
  }
}

Edit the configuration.xml file as below:

Besides the MoreExtensionContainer type, action extension may be one of these following types:

Type Description
org.exoplatform.wiki.webui.control.UIPageToolBar Actions will be placed on the Wiki page toolbar at the view mode.
org.exoplatform.wiki.webui.control.AddExtensionContainer Actions will be placed on the Add Page drop-down list on the Wiki page toolbar at the view mode.
org.exoplatform.wiki.webui.control.MoreExtensionContainer Actions will be placed on the More drop-down list on the Wiki page toolbar at the view mode.
org.exoplatform.wiki.webui.control.UISubmitToolBar Actions will be placed on the Wiki page toolbar at the edit mode.
org.exoplatform.wiki.webui.control.UIEditorTabs Actions will be placed the on Wiki editor tabs.
org.exoplatform.wiki.webui.control.BrowseExtensionContainer Actions will be placed on the Browse drop-down list at the view mode.
org.exoplatform.wiki.webui.popup.UIWikiSettingContainer Actions will be placed on the Wiki setting tabs.
Copyright © 2009-2012. All rights reserved. eXo Platform SAS