Crear su propio 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, registros) en el panel derecho (navegador).
Para crear su propio adaptador, debe crear una nueva clase que implemente la interfaz StackMetadataAdapter:
package com.openkm.plugin.stack;
import com.openkm.frontend.client.bean.*;import com.openkm.frontend.client.widget.filebrowser.GWTFilter;import net.xeoh.plugins.base.Plugin;
import java.util.List;import java.util.Map;
/** * */public interface StackMetadataAdapter extends Plugin { public String getName(); public boolean isPropertyGroupHidden(String pgName); public GWTFolder getProperties(String fldPath); public List<GWTFolder> getChildren(String fldPath, boolean extraColumns, Map<String, GWTFilter> mapFilter); public List<GWTDocument> getDocumentMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace); public List<GWTRecord> getRecordMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace); public List<GWTMail> getMailMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace); public List<GWTFolder> getFolderMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace, String language);}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) | GWTFolder | Devuelve las propiedades de la carpeta. |
| getChildren(String fldPath, boolean extraColumns, Map<String, GWTFilter> mapFilter) | 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 recuperar las carpetas hijas. Estas carpetas se muestran en el árbol como nodos hijos. |
| getDocumentMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace) | 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 recuperar los documentos hijos. Estos documentos se muestran en el explorador, en el panel derecho. |
| getRecordMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace) | List |
Devuelve una lista de registros. Cuando se elige un nodo de carpeta en el árbol (panel izquierdo), se llama a este método para recuperar los registros hijos. Estos registros se muestran en el explorador, en el panel derecho. |
| getMailMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace) | 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 recuperar los correos hijos. Estos correos se muestran en el explorador, en el panel derecho. |
| getFolderMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace, String language) | 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 recuperar las carpetas hijas. Estas carpetas se muestran en el explorador, en el panel derecho. |
- El parámetro GWTWorkspace gwtUserWorkspace se utiliza internamente para copiar objetos de la API (Document, Folder, Record, Mail) a objetos GWT (GWTDocument, GWTFolder, GWTRecord, GWTMail).
- Ejemplo de código:
- El parámetro Map<String, GWTFilter> mapFilter? se utiliza internamente para el filtrado. Solo recibe algún valor cuando el filtrado está habilitado en la interfaz de usuario
- Ejemplo de código:
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.OKMSearch;import com.openkm.bean.*;import com.openkm.bean.form.*;import com.openkm.core.Config;import com.openkm.dao.KeyValueDAO;import com.openkm.dao.bean.KeyValue;import com.openkm.frontend.client.bean.*;import com.openkm.frontend.client.widget.filebrowser.GWTFilter;import com.openkm.plugin.stack.StackMetadataAdapter;import com.openkm.servlet.frontend.util.FolderComparator;import com.openkm.util.GWTUtil;import com.openkm.util.pagination.FilterUtils;import net.xeoh.plugins.base.annotations.PluginImplementation;import org.slf4j.Logger;import org.slf4j.LoggerFactory;
import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Map;
/** */@PluginImplementationpublic class ParentChildStackMetadataAdapter implements StackMetadataAdapter { private static Logger log = LoggerFactory.getLogger(ParentChildStackMetadataAdapter.class);
@Override public String getName() { return "Parent Child Stack Metadata Adapter"; }
@Override public List<GWTFolder> getFolderMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace, String language) { List<GWTFolder> 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.getInstance().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; } } } } } }
List<Folder> results = OKMSearch.getInstance().getFoldersByPropertyValue(null, group, property, value); for (Folder fld : results) { folderList.add(GWTUtil.copy(fld, gwtUserWorkspace)); } }
if (mapFilter != null) { FilterUtils.filter(gwtUserWorkspace, folderList, mapFilter); }
Collections.sort(folderList, FolderComparator.getInstance(language));
} catch (Exception e) { log.error(e.getMessage(), e); }
return folderList; }
@Override public List<GWTDocument> getDocumentMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace) { List<GWTDocument> 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.getInstance().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; } } } } } }
List<Document> results = OKMSearch.getInstance().getDocumentsByPropertyValue(null, group, property, value);
for (Document doc : results) { docList.add(GWTUtil.copy(doc, gwtUserWorkspace)); } }
} catch (Exception e) { log.error(e.getMessage(), e); }
return docList; }
@Override public List<GWTRecord> getRecordMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace) { List<GWTRecord> 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.getInstance().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; } } } } } }
List<Record> results = OKMSearch.getInstance().getRecordsByPropertyValue(null, group, property, value); for (Record rec : results) { recordList.add(GWTUtil.copy(rec, gwtUserWorkspace)); } }
}catch(Exception e) { log.error(e.getMessage(), e); }
return recordList; }
@Override public List<GWTMail> getMailMetadataChildren(String fldPath, Map<String, GWTFilter> mapFilter, GWTWorkspace gwtUserWorkspace) { List<GWTMail> 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.getInstance().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; } } } } } }
List<Mail> results = OKMSearch.getInstance().getMailsByPropertyValue(null, group, property, value);
for (Mail mail : results) { mailList.add(GWTUtil.copy(mail, gwtUserWorkspace)); } }
}catch(Exception e) { log.error(e.getMessage(), e); }
return mailList; }
@Override public List<GWTFolder> getChildren(String fldPath, boolean extraColumns, Map<String, GWTFilter> mapFilter) { List<GWTFolder> folderList = new ArrayList<>();
try { switch (fldPath.split("/").length - 1) { case 1: // getting group level for (PropertyGroup pg : OKMPropertyGroup.getInstance().getAllGroups(null)) { // Only represent metadata groups which have some representable object ( select or suggestbox ) boolean hasValidChildren = false;
for (FormElement formElement : OKMPropertyGroup.getInstance().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) { GWTFolder gWTFolder = new GWTFolder(); String path = fldPath + "/" + pg.getName(); gWTFolder.initMetadata(path, pg.getLabel(), OKMPropertyGroup.getInstance().getPropertyGroupForm(null, pg.getName()).size() > 0); folderList.add(gWTFolder); } } break;
case 2: // getting property level String grpName = fldPath.substring(fldPath.lastIndexOf("/") + 1); for (FormElement formElement : OKMPropertyGroup.getInstance().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()) { GWTFolder gWTFolder = new GWTFolder(); String path = fldPath + "/" + formElement.getName(); gWTFolder.initMetadata(path, formElement.getLabel(), false); folderList.add(gWTFolder); } } else if (formElement instanceof SuggestBox || formElement instanceof CheckBox) { GWTFolder gWTFolder = new GWTFolder(); String path = fldPath + "/" + formElement.getName(); gWTFolder.initMetadata(path, formElement.getLabel(), false); folderList.add(gWTFolder); } } } break;
case 3: // getting property value first level String subFolder[] = fldPath.split("/"); grpName = subFolder[2]; String propertyName = subFolder[3];
for (FormElement formElement : OKMPropertyGroup.getInstance().getPropertyGroupForm(null, grpName)) { if (formElement.getName().equals(propertyName)) { if (formElement instanceof Select) { for (Option option : ((Select) formElement).getOptions()) { GWTFolder gWTFolder = new GWTFolder(); String path = fldPath + "/" + option.getValue(); gWTFolder.initMetadata(path, option.getLabel(), false); folderList.add(gWTFolder); } } 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 : KeyValueDAO.getKeyValues(sb.getTable(), sqlFilter)) { GWTFolder gWTFolder = new GWTFolder(); String path = fldPath + "/" + keyValue.getKey(); gWTFolder.initMetadata(path, keyValue.getValue(), false); folderList.add(gWTFolder); } } else if (formElement instanceof CheckBox) { GWTFolder gWTFolder = new GWTFolder(); String path = fldPath + "/true"; gWTFolder.initMetadata(path, "true", false); folderList.add(gWTFolder); gWTFolder = new GWTFolder(); path = fldPath + "/false"; gWTFolder.initMetadata(path, "false", false); folderList.add(gWTFolder); } 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.getInstance().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)) { GWTFolder gWTFolder = new GWTFolder(); String path = fldPath + "/" + option.getValue(); gWTFolder.initMetadata(path, option.getLabel(), false); folderList.add(gWTFolder); } } } } } 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 GWTFolder getProperties(String fldPath) { GWTFolder gWTFolder = new GWTFolder();
try { String grpName = ""; String propertyName = ""; String subFolder[] = fldPath.split("/");
switch (fldPath.split("/").length - 1) { case 1: gWTFolder.initMetadata(fldPath, OKMPropertyGroup.getInstance().getAllGroups(null).size() > 0); break;
case 2: // group level grpName = fldPath.substring(fldPath.lastIndexOf("/") + 1); String label = "";
for (PropertyGroup pg : OKMPropertyGroup.getInstance().getAllGroups(null)) { if (pg.getName().equals(grpName)) { label = pg.getLabel(); break; } }
gWTFolder.initMetadata(fldPath, label, OKMPropertyGroup.getInstance().getPropertyGroupForm(null, grpName).size() > 0); break;
case 3: // property level grpName = subFolder[2]; propertyName = subFolder[3];
for (FormElement formElement : OKMPropertyGroup.getInstance().getPropertyGroupForm(null, grpName)) { if (formElement.getName().equals(propertyName)) { gWTFolder.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.getInstance().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)) { gWTFolder.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 : KeyValueDAO.getKeyValues(sb.getTable(), sqlFilter)) { if (keyValue.getKey().equals(value)) { gWTFolder.initMetadata(fldPath, keyValue.getValue(), false); break; } } } else if (formElement instanceof CheckBox) { gWTFolder.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.getInstance().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)) { gWTFolder.initMetadata(fldPath, option.getLabel(), false); break; } } } } } break;
} } catch (Exception e) { log.error(e.getMessage(), e); }
return gWTFolder; }}?
?