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í.
Descripción de los métodos
Sección titulada «Descripción de los métodos»| 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;
@PluginImplementationpublic 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; }
}