Difference between revisions of "Core extensions"
(3 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
− | This kind of | + | This kind of extension enables you to add features at OpenKM Core level, implementing extension points. Actually there are a couple of methods which can be extended in this way but the list will grow as needed. |
{{Warning|This kind of extensions are in development and only available in trunk. We expect to be included in a future OpenKM 5.2 release.}} | {{Warning|This kind of extensions are in development and only available in trunk. We expect to be included in a future OpenKM 5.2 release.}} | ||
− | First of all, lets an extension sample. Suppose you want to disable the uploading of certain type of documents in a folder. You need to create a Java project with your favorite IDE (or CLI), create a class which implements an interface and create a JAR archive. This generated archive should be placed | + | First of all, lets create an extension sample. Suppose you want to disable the uploading of certain type of documents in a folder. You need to create a Java project with your favorite IDE (or CLI), create a class which implements an interface and create a JAR archive. This generated archive should be placed in the '''$JBOSS_HOME/plugins''' directory. |
− | + | That's all! The plugin will be used next time you restart JBoss. But more interesting. You can also refresh your plugins without restarting the application server. To do so, go to Administration > Scripting and execute this command: | |
com.openkm.extension.core.ExtensionManager.getInstance().reset(); | com.openkm.extension.core.ExtensionManager.getInstance().reset(); | ||
Line 15: | Line 15: | ||
<source lang="java"> | <source lang="java"> | ||
+ | package com.openkm.sample.extension; | ||
+ | |||
public class MyDocumentExtension implements DocumentExtension { | public class MyDocumentExtension implements DocumentExtension { | ||
@Override | @Override | ||
Line 33: | Line 35: | ||
</source> | </source> | ||
− | These two methods represent two extension points in the document created action. The first one ('''preCreate''') will be executed BEFORE the document is created. The second one ('''postCreate''') will be executed AFTER the document creation. The '''getOrder''' method actually is not important but if you have many registered DocumentExtensions, | + | These two methods represent two extension points in the document created action. The first one ('''preCreate''') will be executed BEFORE the document is created. The second one ('''postCreate''') will be executed AFTER the document creation. The '''getOrder''' method actually is not important but if you have many registered DocumentExtensions, it may be useful to force an execution order. |
So, we want to reject a document creation when placed in a folder. Our objective is the '''preCreate''' method: | So, we want to reject a document creation when placed in a folder. Our objective is the '''preCreate''' method: | ||
Line 42: | Line 44: | ||
AccessDeniedException, ExtensionException { | AccessDeniedException, ExtensionException { | ||
try { | try { | ||
− | if (parentNode.get().getPath().equals("/okm:root/forbidden")) { | + | if (parentNode.get().getPath().equals("/okm:root/forbidden") && doc.get().getMimeType().equals("application/pdf")) { |
− | throw new AccessDeniedException(" | + | throw new AccessDeniedException("Can't upload PDF documents here"); |
} | } | ||
} catch (RepositoryException e) { | } catch (RepositoryException e) { | ||
Line 51: | Line 53: | ||
</source> | </source> | ||
− | The hard work has been done. Now, to declare this class as an extension you need to add the '''@PluginImplementation''' annotation. To use this annotation you need to include the library '''jspf-1.0.1.jar''' as a project dependency. You can download this library from http://code.google.com/p/jspf/. This is the class once all the | + | The hard work has been done. Now, to declare this class as an extension you need to add the '''@PluginImplementation''' annotation. To use this annotation you need to include the library '''jspf-1.0.1.jar''' as a project dependency. You can download this library from http://code.google.com/p/jspf/. This is the class once all the steps have been finished: |
<source lang="java"> | <source lang="java"> | ||
+ | package com.openkm.sample.extension; | ||
+ | |||
+ | import net.xeoh.plugins.base.annotations.PluginImplementation; | ||
+ | |||
@PluginImplementation | @PluginImplementation | ||
public class MyDocumentExtension implements DocumentExtension { | public class MyDocumentExtension implements DocumentExtension { |
Latest revision as of 16:16, 20 October 2011
This kind of extension enables you to add features at OpenKM Core level, implementing extension points. Actually there are a couple of methods which can be extended in this way but the list will grow as needed.
This kind of extensions are in development and only available in trunk. We expect to be included in a future OpenKM 5.2 release. |
First of all, lets create an extension sample. Suppose you want to disable the uploading of certain type of documents in a folder. You need to create a Java project with your favorite IDE (or CLI), create a class which implements an interface and create a JAR archive. This generated archive should be placed in the $JBOSS_HOME/plugins directory.
That's all! The plugin will be used next time you restart JBoss. But more interesting. You can also refresh your plugins without restarting the application server. To do so, go to Administration > Scripting and execute this command:
com.openkm.extension.core.ExtensionManager.getInstance().reset();
Let's see how you can implement this plugin.
Plugin implementation
We will create a class called MyDocumentExtension, extending from DocumentExtension:
package com.openkm.sample.extension;
public class MyDocumentExtension implements DocumentExtension {
@Override
public int getOrder() {
return 0;
}
@Override
public void preCreate(Session session, Ref<Node> parentNode, Ref<File> content, Ref<Document> doc) {
// To be implemented
}
@Override
public void postCreate(Session session, Ref<Node> parNode, Ref<Node> docNode, Ref<Document> doc) {
// To be implemented
}
}
These two methods represent two extension points in the document created action. The first one (preCreate) will be executed BEFORE the document is created. The second one (postCreate) will be executed AFTER the document creation. The getOrder method actually is not important but if you have many registered DocumentExtensions, it may be useful to force an execution order.
So, we want to reject a document creation when placed in a folder. Our objective is the preCreate method:
@Override
public void preCreate(Session session, Ref<Node> parentNode, Ref<File> content, Ref<Document> doc) throws
AccessDeniedException, ExtensionException {
try {
if (parentNode.get().getPath().equals("/okm:root/forbidden") && doc.get().getMimeType().equals("application/pdf")) {
throw new AccessDeniedException("Can't upload PDF documents here");
}
} catch (RepositoryException e) {
new ExtensionException(e.getMessage());
}
}
The hard work has been done. Now, to declare this class as an extension you need to add the @PluginImplementation annotation. To use this annotation you need to include the library jspf-1.0.1.jar as a project dependency. You can download this library from http://code.google.com/p/jspf/. This is the class once all the steps have been finished:
package com.openkm.sample.extension;
import net.xeoh.plugins.base.annotations.PluginImplementation;
@PluginImplementation
public class MyDocumentExtension implements DocumentExtension {
@Override
public int getOrder() {
return 0;
}
public void preCreate(Session session, Ref<Node> parentNode, Ref<File> content, Ref<Document> doc) throws
AccessDeniedException, ExtensionException {
try {
if (parentNode.get().getPath().equals("/okm:root/forbidden") && doc.get().getMimeType().equals("application/pdf")) {
throw new AccessDeniedException("Can't upload PDF documents here");
}
} catch (RepositoryException e) {
new ExtensionException(e.getMessage());
}
}
@Override
public void postCreate(Session session, Ref<Node> parNode, Ref<Node> docNode, Ref<Document> doc) {
}
}