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ó.