Lista de Conteúdos que relacionados aos outros conteúdos
Exemplo de um serviço que tem duas sources do tipo contentTable. Nesse cenário, um source é uma lista de livros e outro uma lista de autores. Agora, na interface de lista de livros, queremos não só visualizar o nome do autor, mas também visualizar a foto dele. O pattern usado para renderizar a interface quick list é no XML ter dois dados tabulares: um da lista de livros e outro da lista só de autores relacionados aos livros na lista. O trabalho de juntar essas duas listas em uma só vai ser deixado para a camada de apresentação (seja XSL ou JavaScript), que não faz parte desse exemplo.
servicedefinition.xml
<?xml version="1.0" encoding="UTF-8"?>
<serviceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/servicedefinition.xsd">
<service name="STR_SERVICE_NAME" type="lum_content">
<description>STR_SERVICE_DESCRIPTION</description>
<workflow enabled="true"/>
</service>
<interfaces>
<!-- user interfaces -->
<interface id="quicklist" name="STR_QUICK_LIST" type="lum_contentQuickList"></interface>
<interface id="list" name="STR_LIST" type="lum_contentList"></interface>
<interface id="details" name="STR_DETAILS" type="lum_contentDetails"/>
<!-- administration interfaces -->
<interface id="administration" name="STR_ADMINISTRATION" type="lum_contentAdministrationList"></interface>
<interface id="add" name="STR_ADD" type="lum_contentAdministrationAddPropertyPage"></interface>
<interface id="edit" name="STR_EDIT" type="lum_contentAdministrationEditPropertyPage"></interface>
<interface id="authorAdministration" name="Autor Administração" type="lum_contentAdministrationList"></interface>
<interface id="addAuthorAdministration" name="Adicionar Autor" type="lum_contentAdministrationAddPropertyPage"></interface>
<interface id="editAuthorAdministration" name="Editar Autor" type="lum_contentAdministrationEditPropertyPage"></interface>
</interfaces>
</serviceDefinition>
A chave nesse douidefinition.xml é o filtro do source authors que traz só os autores que estão na lista de livros. Repare que o defaultValue é do formato source:fieldId, que passa para a implementação do filtro de onde pegar os valores do filtro.
douidefinition.xml
<?xml version="1.0" encoding="UTF-8"?>
<doui:douiDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:doui="http://www.lumis.com.br/lumisportal/xsd/doui" xmlns:control="http://www.lumis.com.br/douicontrols">
<service>
<sources>
<source id="book" type="contentTable">
<table>samplebook</table>
<fields>
<field id="id" name="id" dataType="guid" required="true" isPrimaryKey="true" display="false" />
<field id="title" name="Título" dataType="string" required="true" isPrimaryName="true" />
<field id="introduction" name="Introdução" dataType="text" isIntroduction="true" />
<field id="details" name="Detalhes" dataType="html" required="true" />
<field id="authorContentId" name="Autor" dataType="guid" lookupRelationId="author" lookupFieldId="name">
<defaultInputControl>
<control:lum_dropDownList optionsSourceId="author" textFieldId="name" valueFieldId="contentId" />
</defaultInputControl>
</field>
</fields>
<metaData>
<workflow/>
</metaData>
<relations>
<relation id="author">
<relationField fieldId="authorContentId" foreignFieldId="contentId" />
</relation>
</relations>
</source>
<source id="author" type="contentTable">
<table>sampleauthor</table>
<fields>
<field id="id" name="id" dataType="guid" required="true" isPrimaryKey="true" display="false" />
<field id="name" name="Título" dataType="string" required="true" isPrimaryName="true" />
<field id="image" name="Imagem" dataType="media" isIntroductionImage="true" />
</fields>
<metaData>
<workflow/>
</metaData>
</source>
</sources>
</service>
<interfaces>
<interface id="quicklist">
<sources>
<source id="book">
<fields inherit="all" />
</source>
<source id="author">
<filters>
<filter id="contentId" operator="in" required="true" defaultValue="book:authorContentId" className="br.com.sample.components.service.samplebooks.SourceFieldValuesFilter"/>
</filters>
</source>
</sources>
<controls>
<control:lum_tabularData sourceId="book" />
<control:lum_tabularData id="authorList" sourceId="author" />
</controls>
</interface>
<interface id="authorAdministration">
<sources>
<source id="author"></source>
</sources>
</interface>
<interface id="addAuthorAdministration">
<sources>
<source id="author"></source>
</sources>
</interface>
<interface id="editAuthorAdministration">
<sources>
<source id="author"></source>
</sources>
</interface>
</interfaces>
</doui:douiDefinition>
SourceFieldValuesFilter.java
package br.com.sample.components.service.samplebooks;
import java.util.ArrayList;
import java.util.List;
import lumis.doui.source.ISourceData;
import lumis.doui.source.TabularData;
import lumis.doui.table.filter.TableSourceFilter;
import lumis.portal.PortalException;
import lumis.util.XmlUtil;
import lumis.util.query.IQueryValue;
import lumis.util.query.QueryValue;
import org.w3c.dom.Node;
public class SourceFieldValuesFilter extends TableSourceFilter
{
@Override
protected IQueryValue calculateFilterValue(Node filterNode) throws PortalException
{
String defaultValue = XmlUtil.readAttributeString("defaultValue", filterNode);
if(defaultValue == null)
return null;
String[] sourceIdAndFieldId = defaultValue.split(":");
if(sourceIdAndFieldId.length != 2)
return null;
String sourceId = sourceIdAndFieldId[0];
String fieldId = sourceIdAndFieldId[1];
TabularData data = (TabularData)this.getSource().getSourceContainer().getSourceById(sourceId).getData();
List<String> filterValue = new ArrayList<String>();
for(ISourceData row : data.getRows())
{
String fieldValue = row.get(fieldId, String.class);
if(fieldValue != null)
{
if(!filterValue.contains(fieldValue))
filterValue.add(fieldValue);
}
}
if(filterValue.size() > 0)
{
return new QueryValue(filterValue.toArray());
}
else
{
return null;
}
}
}
O xml gerado pela lista rápida interface vai ter dua dados tabular. Um de livros e outro só de autores que estão na lista de livros. A camada de renderização (xsl/javascript) deveria tratar a visualização desses duas listas num só.