Ir al contenido

Creating your own Stack Metadata Adapter ( obsoleto )

La clase StackMetadata implementa la lógica que controla lo que se muestra en la pila de metadatos - nodos del árbol en el panel izquierdo - y sus objetos (documentos, nodos, carpetas, expedientes) en el panel derecho (explorador).

Puede crear su propio Stack Metadata Adapter.

Condiciones:

  • La nueva clase Stack Metadata Adapter debe implementar la interfaz “StackMetadataAdapter”.
  • La nueva clase Stack Metadata Adapter debe declararse bajo el paquete “com.openkm.plugin.stack.metadata”.
  • La nueva clase Stack Metadata Adapter debe estar anotada con “@PluginImplementation”.
  • La nueva clase Stack Metadata Adapter debe extender “BasePlugin”.

Interfaz Stack Metadata Adapter:

package com.openkm.plugin.stack;
import com.openkm.bean.Document;
import com.openkm.bean.Folder;
import com.openkm.bean.Mail;
import com.openkm.bean.Record;
import net.xeoh.plugins.base.Plugin;
import java.util.List;
public interface StackMetadataAdapter extends Plugin {
String getName();
boolean isPropertyGroupHidden(String pgName);
Folder getProperties(String fldPath);
List<Folder> getChildren(String fldPath);
List<Document> getDocumentMetadataChildren(String fldPath);
List<Record> getRecordMetadataChildren(String fldPath);
List<Mail> getMailMetadataChildren(String fldPath);
List<Folder> getFolderMetadataChildren(String fldPath);
}

La nueva clase debe cargarse en el paquete com.openkm.plugin.stack.metadata, porque el sistema de plugins de la aplicación intentará cargarla desde ahí.

Método Tipo Descripción
getName() String Devuelve el nombre que se muestra en la tabla de plugins.
isPropertyGroupHidden(String pgName) boolean Devuelve si los campos de metadatos están ocultos.
getProperties(String fldPath) Folder Devuelve las propiedades de la carpeta.
getChildren(String fldPath) List Devuelve una lista de carpetas.
Cuando se elige un nodo de carpeta en el árbol (panel izquierdo), se llama a este método para obtener las carpetas hijas. Estas carpetas se muestran en el árbol como nodos hijos.
getDocumentMetadataChildren(String fldPath) List Devuelve una lista de documentos.
Cuando se elige el nodo de carpeta en el árbol (panel izquierdo), se llama a este método para obtener los documentos hijos. Estos documentos se muestran en el explorador (panel derecho).
getRecordMetadataChildren(String fldPath) List Devuelve una lista de expedientes.
Cuando se elige un nodo de carpeta en el árbol (panel izquierdo), se llama a este método para obtener los expedientes hijos. Estos expedientes se muestran en el explorador (panel derecho).
getMailMetadataChildren(String fldPath) List Devuelve una lista de correos.
Cuando se elige un nodo de carpeta en el árbol (panel izquierdo), se llama a este método para obtener los correos hijos. Estos correos se muestran en el explorador (panel derecho).
getFolderMetadataChildren(String fldPath) List Devuelve una lista de carpetas.
Cuando se elige un nodo de carpeta en el árbol (panel izquierdo), se llama a este método para obtener las carpetas hijas. Estas carpetas se muestran en el explorador (panel derecho).

Ejemplo de implementación de Stack Metadata

Sección titulada «Ejemplo de implementación de Stack Metadata»
package com.openkm.plugin.stack.metadata;
import com.openkm.api.OKMPropertyGroup;
import com.openkm.api.OKMRepository;
import com.openkm.api.OKMSearch;
import com.openkm.bean.*;
import com.openkm.bean.form.*;
import com.openkm.core.Config;
import com.openkm.db.bean.KeyValue;
import com.openkm.db.service.KeyValueSrv;
import com.openkm.plugin.BasePlugin;
import com.openkm.plugin.stack.StackMetadataAdapter;
import net.xeoh.plugins.base.annotations.PluginImplementation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
@PluginImplementation
public class ParentChildStackMetadataAdapter extends BasePlugin implements StackMetadataAdapter {
private static Logger log = LoggerFactory.getLogger(ParentChildStackMetadataAdapter.class);
@Autowired
private OKMPropertyGroup okmPropertyGroup;
@Autowired
private OKMRepository okmRepository;
@Autowired
private KeyValueSrv keyValueSrv;
@Autowired
private OKMSearch okmSearch;
@Override
public String getName() {
return "Parent Child Metadata Adapter";
}
@Override
public List<Folder> getFolderMetadataChildren(String fldPath) {
List<Folder> folderList = new ArrayList<>();
try {
// Metadata value level
if (fldPath.startsWith("/" + Repository.METADATA) && (fldPath.split("/").length - 1) >= 4) {
String subFolder[] = fldPath.split("/");
String group = subFolder[2];
String property = subFolder[subFolder.length - 2];
String value = subFolder[subFolder.length - 1];
// In this case we are always in a select with parent Element
// We need to find de property name, because in property we have the parent value
if (subFolder.length - 1 > 4) {
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, group)) {
if (formElement instanceof Select) {
Select select = (Select) formElement;
if (select.getParentElement() != null && !select.getParentElement().isEmpty()) {
for (Option option : ((Select) formElement).getOptions()) {
if (option.getValue().equalsIgnoreCase(value)) {
property = select.getName();
break;
}
}
}
}
}
}
folderList = okmSearch.getFoldersByPropertyValue(null, group, property, value);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return folderList;
}
@Override
public List<Document> getDocumentMetadataChildren(String fldPath) {
List<Document> docList = new ArrayList<>();
try {
// Case metadata at value level
if (fldPath.split("/").length - 1 >= 4) {
String subFolder[] = fldPath.split("/");
String group = subFolder[2];
String property = subFolder[subFolder.length - 2];
String value = subFolder[subFolder.length - 1];
// In this case we are always in a select with parent Element
// We need to find de property name, because we have the parent value
if (subFolder.length - 1 > 4) {
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, group)) {
if (formElement instanceof Select) {
Select select = (Select) formElement;
if (select.getParentElement() != null && !select.getParentElement().isEmpty()) {
for (Option option : ((Select) formElement).getOptions()) {
if (option.getValue().equalsIgnoreCase(value)) {
property = select.getName();
break;
}
}
}
}
}
}
docList = okmSearch.getDocumentsByPropertyValue(null, group, property, value);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return docList;
}
@Override
public List<Record> getRecordMetadataChildren(String fldPath) {
List<Record> recordList = new ArrayList<>();
try {
// Case metadata at value level
if (fldPath.split("/").length - 1 >= 4) {
String subFolder[] = fldPath.split("/");
String group = subFolder[2];
String property = subFolder[subFolder.length - 2];
String value = subFolder[subFolder.length - 1];
// In this case we are always in a select with parent Element
// We need to find de property name, because we have the parent value
if (subFolder.length - 1 > 4) {
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, group)) {
if (formElement instanceof Select) {
Select select = (Select) formElement;
if (select.getParentElement() != null && !select.getParentElement().isEmpty()) {
for (Option option : ((Select) formElement).getOptions()) {
if (option.getValue().equalsIgnoreCase(value)) {
property = select.getName();
break;
}
}
}
}
}
}
recordList = okmSearch.getRecordsByPropertyValue(null, group, property, value);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return recordList;
}
@Override
public List<Mail> getMailMetadataChildren(String fldPath) {
List<Mail> mailList = new ArrayList<>();
try {
// Case metadata at value level
if (fldPath.split("/").length - 1 >= 4) {
String subFolder[] = fldPath.split("/");
String group = subFolder[2];
String property = subFolder[subFolder.length - 2];
String value = subFolder[subFolder.length - 1];
// In this case we are always in a select with parent Element
// We need to find de property name, because we have the parent value
if (subFolder.length - 1 > 4) {
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, group)) {
if (formElement instanceof Select) {
Select select = (Select) formElement;
if (select.getParentElement() != null && !select.getParentElement().isEmpty()) {
for (Option option : ((Select) formElement).getOptions()) {
if (option.getValue().equalsIgnoreCase(value)) {
property = select.getName();
break;
}
}
}
}
}
}
mailList = okmSearch.getMailsByPropertyValue(null, group, property, value);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return mailList;
}
@Override
public List<Folder> getChildren(String fldPath) {
List<Folder> folderList = new ArrayList<>();
try {
switch (fldPath.split("/").length - 1) {
case 1: // getting group level
for (PropertyGroup pg : okmPropertyGroup.getAllGroups(null)) {
// Only represent metadata groups which have some representable object ( select or suggestbox )
boolean hasValidChildren = false;
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, pg.getName())) {
if (!isPropertyGroupHidden(pg.getName())) {
if (!isPropertyGroupHidden(formElement.getName()) && (formElement instanceof Select || formElement instanceof SuggestBox || formElement instanceof CheckBox)) {
hasValidChildren = true;
break;
}
}
}
if (hasValidChildren) {
Folder folder = new Folder();
String path = fldPath + "/" + pg.getName();
folder.initMetadata(path, pg.getLabel(),
okmPropertyGroup.getPropertyGroupForm(null, pg.getName()).size() > 0);
folderList.add(folder);
}
}
break;
case 2: // getting property level
String grpName = fldPath.substring(fldPath.lastIndexOf("/") + 1);
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, grpName)) {
if (!isPropertyGroupHidden(formElement.getName())) {
if (formElement instanceof Select) {
Select select = (Select) formElement;
// Only draw select with no parent
if (select.getParentElement() == null || select.getParentElement().isEmpty()) {
Folder folder = new Folder();
String path = fldPath + "/" + formElement.getName();
folder.initMetadata(path, formElement.getLabel(), false);
folderList.add(folder);
}
} else if (formElement instanceof SuggestBox || formElement instanceof CheckBox) {
Folder folder = new Folder();
String path = fldPath + "/" + formElement.getName();
folder.initMetadata(path, formElement.getLabel(), false);
folderList.add(folder);
}
}
}
break;
case 3: // getting property value first level
String subFolder[] = fldPath.split("/");
grpName = subFolder[2];
String propertyName = subFolder[3];
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, grpName)) {
if (formElement.getName().equals(propertyName)) {
if (formElement instanceof Select) {
for (Option option : ((Select) formElement).getOptions()) {
Folder folder = new Folder();
String path = fldPath + "/" + option.getValue();
folder.initMetadata(path, option.getLabel(), false);
folderList.add(folder);
}
} else if (formElement instanceof SuggestBox) {
SuggestBox sb = ((SuggestBox) formElement);
String sqlFilter = sb.getFilterQuery();
// replacing filter parameter, if exist
sqlFilter = sqlFilter.replaceAll("\\{0\\}", "");
for (KeyValue keyValue : keyValueSrv.getKeyValues(sb.getTable(), sqlFilter)) {
Folder folder = new Folder();
String path = fldPath + "/" + keyValue.getKey();
folder.initMetadata(path, keyValue.getValue(), false);
folderList.add(folder);
}
} else if (formElement instanceof CheckBox) {
Folder folder = new Folder();
String path = fldPath + "/true";
folder.initMetadata(path, "true", false);
folderList.add(folder);
folder = new Folder();
path = fldPath + "/false";
folder.initMetadata(path, "false", false);
folderList.add(folder);
}
break;
}
}
break;
default: // getting property value for select with parent elements
subFolder = fldPath.split("/");
grpName = subFolder[2];
String pgValue = subFolder[subFolder.length - 1];
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, grpName)) {
if (formElement instanceof Select) {
Select select = (Select) formElement;
if (select.getParentElement() != null && !select.getParentElement().isEmpty()) {
for (Option option : select.getOptions()) {
if (option.getParentValue().equalsIgnoreCase(pgValue)) {
Folder folder = new Folder();
String path = fldPath + "/" + option.getValue();
folder.initMetadata(path, option.getLabel(), false);
folderList.add(folder);
}
}
}
}
}
break;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return folderList;
}
/**
* If if a given property or property group is hidden.
*
* @param pgName The name of the property or property group.
* @return Is property group is hidden or not by Config.
*/
@Override
public boolean isPropertyGroupHidden(String pgName) {
boolean isHidden = false;
for (String metadata : Config.STACK_METADATA_HIDDEN_PROPERTIES) {
if (pgName.equalsIgnoreCase(metadata)) {
isHidden = true;
break;
}
}
return isHidden;
}
@Override
public Folder getProperties(String fldPath) {
Folder folder = new Folder();
try {
String grpName = "";
String propertyName = "";
String subFolder[] = fldPath.split("/");
switch (fldPath.split("/").length - 1) {
case 1:
folder = okmRepository.getMetadataFolder(null);
break;
case 2: // group level
grpName = fldPath.substring(fldPath.lastIndexOf("/") + 1);
String label = "";
for (PropertyGroup pg : okmPropertyGroup.getAllGroups(null)) {
if (pg.getName().equals(grpName)) {
label = pg.getLabel();
break;
}
}
List<FormElement> props = okmPropertyGroup.getPropertyGroupForm(null, grpName);
folder.initMetadata(fldPath, label, props.size() > 0);
break;
case 3: // property level
grpName = subFolder[2];
propertyName = subFolder[3];
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, grpName)) {
if (formElement.getName().equals(propertyName)) {
folder.initMetadata(fldPath, formElement.getLabel(), false);
break;
}
}
break;
case 4: // value level
grpName = subFolder[2];
propertyName = subFolder[3];
String value = subFolder[4];
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, grpName)) {
if (formElement.getName().equals(propertyName)) {
if (formElement instanceof Select) {
Select select = (Select) formElement;
// Only select with no parent
if (select.getParentElement() == null || select.getParentElement().isEmpty()) {
for (Option option : ((Select) formElement).getOptions()) {
if (option.getValue().equals(value)) {
folder.initMetadata(fldPath, option.getLabel(), false);
break;
}
}
}
} else if (formElement instanceof SuggestBox) {
SuggestBox sb = ((SuggestBox) formElement);
String sqlFilter = sb.getFilterQuery();
sqlFilter = sqlFilter.replaceAll("\\{0\\}", ""); // replacing filter parameter, if exist
for (KeyValue keyValue : keyValueSrv.getKeyValues(sb.getTable(), sqlFilter)) {
if (keyValue.getKey().equals(value)) {
folder.initMetadata(fldPath, keyValue.getValue(), false);
break;
}
}
} else if (formElement instanceof CheckBox) {
folder.initMetadata(fldPath, value, false);
}
break;
}
}
break;
default: // value level for select with parent
grpName = subFolder[2];
String pgValue = subFolder[subFolder.length - 1];
for (FormElement formElement : okmPropertyGroup.getPropertyGroupForm(null, grpName)) {
if (formElement instanceof Select) {
Select select = (Select) formElement;
// Only select with no parents
if (select.getParentElement() != null && !select.getParentElement().isEmpty()) {
for (Option option : ((Select) formElement).getOptions()) {
if (option.getValue().equalsIgnoreCase(pgValue)) {
folder.initMetadata(fldPath, option.getLabel(), false);
break;
}
}
}
}
}
break;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return folder;
}
}