Utilizar o DataList como metadado no modelo de dados.

cancel
Showing results for 
Search instead for 
Did you mean: 
marcosjunior
Member II

Utilizar o DataList como metadado no modelo de dados.

Bom dia,
Gostaria de saber se alguém chegou a conseguir utilizar o componente DataList customizado ou não que fica disponível dentro dos sites, ser adicionado como metadado no modelo.
De forma que no formulário do modelo eu consiga ter um combo-box dinâmico.

Ao invés de criar constraints fixas e adicionar ao modelo, imagino que eu possa obter por referencia ao dl:dataListItem mas até agora não obtive sucesso.

Smiley Very Happy
7 Replies
gsdenys
Member II

Re: Utilizar o DataList como metadado no modelo de dados.

Marcos,

    Eu suponho que você está tentando fazer isto no Alfresco share, correto?

    O component forms no alfresco share utiliza um renderizador escrito em FTL para criar os campos e nativamente não há nenhum renderizador nativo para datalist.

    Para ver os renderizadores existentes vá em <TOMCAT_HOME>/webapps/share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/form/controls/, nesta pasta irá encontrar um conjunto de arquivos .ftl que são selecionados automaticamente pelo Alfresco Share ou podem ser setados manualmente na definição de node-type share-config-custom.xml como mostrado abaixo:


<config evaluator="node-type" condition="custom:type">
   <forms>
      <default-controls>
         <type name="text"
               template="Meu_Tipo_Customizado_de_Renderizador.ftl" />
      </default-controls>
      <form>
         <edit-form template="/2-column-edit-form.ftl" />
         <field-visibility>
            <show id="kb:articletype" />
            <show id="kb:status" for-mode="view" />
         </field-visibility>
         <appearance>
            <field id="kb:articletype" label="Article Type"
                   description="Knowledge Base Article Type" />
            <field id="kb:status" label="Status" description="Approval Status" />
         </appearance>
      </form>
   </forms>
</config>

 
O problema é que vc quer usar uma definição de DataList como campo e usar os DataListItems como possíveis constraint. Este tipo de customização é extremamente complexo para se fazer em ftl, e, na verdade nem sei de é possível utilizando somente o arquivo de renderização.

Neste caso eu o aconselho a utilizar o uma constraint de lista customizada (implementação em java) para buscar e listar todos os datalistItems da datalist do datalist em questão.

Para maiores detalhes deste tipo de implementação de uma olhada neste post http://binesh.in/java/alfresco-dynamic-data-for-type-properties/ (em Inglês)


Espero ter ajudado.
marcosjunior
Member II

Re: Utilizar o DataList como metadado no modelo de dados.

Valeu pelo feedback Denys.
Estou seguindo a segunda abordagem mesmo, criando uma classe java
extendendo do ListOfValuesConstraint.. injeto o SearchService para a realizar a pesquisa
Mas esbarrei com diversos problemas rsrsrs..
Já tenho um type no meu modelo com o dataListItem criado sttSmiley TonguerodutoList, conseguir cadastrar itens para essa lista.

<type name="stt:incidencia">
      <title>Incidencia</title>
      <parent>cm:content</parent>
      <properties>
   <property name="stt:produto">
               <title>Produtos</title>
               <type>d:text</type>              
      <constraints>
                 <constraint ref="stt:CtProdutos" />
               </constraints>
            </property>
      <property name="stt:incidencia_estado">
               <title>Estado</title>
               <type>d:text</type>            
            </property>
   </properties>
</type>

Minha List

produtoList > dl:dataListItem
produtoNome  - d:text
produtoDesc  - d:text
produtoSigla - d:text


Estou achando que é minha busca CMIS que está furada.
já tentei de várias formar "SELECT cmisSmiley TonguerodutoNome FROM sttSmiley TonguerodutoList", "SELECT * FROM sttSmiley TonguerodutoList"..
Cheguei a testar até mesmo fora da lista ex: "SELECT * from cmis:document WHERE CONTAINS('cmis:name:\'test*\'')".
O Alfresco não esta lançando nenhuma exception, mas no momento em que vai buscar o getAllowedValues(), reparo no log que
ele fica empacado realizando a busca.
Me parece que ele ainda esta subindo e não consegue realizar a busca, e fica parado eternamente.
Estou pesquisando qualquer outro meio de realizar essa busca.


Atenciosamente.


gsdenys
Member II

Re: Utilizar o DataList como metadado no modelo de dados.

Para verificar se sua query está funcionando perfeitamente utilize o CMIS Workbench. segue o link

http://chemistry.apache.org/java/developing/tools/dev-tools-workbench.html

coloca o sua classe desenvolvida aqui no forum. Pode ser que seja algum detalhe de implementação que está te atrapalhando.

[]s


marcosjunior
Member II

Re: Utilizar o DataList como metadado no modelo de dados.

Ainda não tinha visto esse CMIS Workbench Smiley Very Happy
Bem eu parti para query Lucene pois, consegui testar usando o
http://localhost:8080/alfresco/faces/jsp/admin/node-browser.jsp


Acertei a query Lucene e consegui testar via web.
Na aplicação fiz algumas alterações no code, mas ainda assim fica travado no momento da pesquisa..
Segue abaixo a implementação da classe java.
<java>
public class ListaProdutosConstraint extends ListOfValuesConstraint implements   Serializable {

   private static Log log = LogFactory.getLog(ListOfFamiliasQueryConstraint.class);
   private static final long serialVersionUID = 1;

   private final String CMIS_PRODUTOS_QUERY = "+TYPE:\"sttSmiley TonguerodutoList\" +@stt\\Smiley TonguerodutoNome:\"XPTO\"";
       //Antes usando "SELECT cmisSmiley TonguerodutoNome FROM sttSmiley TonguerodutoList";
   
        @Autowired(required = true)
   private static SearchService searchService;
   @Autowired(required = true)
   private static NodeService nodeService;

   private List<String> allowedLabels;

   @Override
   public void initialize() {   }

   @Override
   public List<String> getAllowedValues() {
      this.loadFamilias();
      return super.getAllowedValues();
   }

   public List<String> getAllowedLabels() {
      return this.allowedLabels;
   }

   public void setAllowedLabels(List<String> allowedLabels) {
      this.allowedLabels = allowedLabels;
   }

   public List<SelectItem> getSelectItemList() {
      List<SelectItem> result = new ArrayList<SelectItem>(this.getAllowedValues().size());
      for (int i = 0; i < this.getAllowedValues().size(); i++) {
         result.add(new SelectItem((Object) this.getAllowedValues().get(i),
         this.allowedLabels.get(i)));
      }
      return result;
   }

   protected void loadFamilias() {
      List<String> valores = new ArrayList<String>();
      List<String> labels = new ArrayList<String>();

      StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE,"SpacesStore");
      log.debug("Store  REF: " + storeRef.getProtocol());
      log.debug("Search REF: " + searchService);

      ResultSet resultSet = null;

      try {
         resultSet = searchService.query(storeRef,SearchService.LANGUAGE_LUCENE, CMIS_PRODUTOS_QUERY);
         for (ResultSetRow row : resultSet) {
            System.out.println("Row :" + row.getQName());
             valores.add((String)nodeService.getProperty(row.getNodeRef(),ContentModel.PROP_NAME));
             labels.add((String)nodeService.getProperty(row.getNodeRef(),ContentModel.PROP_NAME));
         }
      } finally {
         if (resultSet != null) {
            resultSet.close();
         }
      }
      super.setAllowedValues(valores);
      this.setAllowedLabels(labels);
   }

   public SearchService getSearchService() {
      return searchService;
   }

   public void setSearchService(SearchService searchService) {
      ListOfFamiliasQueryConstraint.searchService = searchService;
   }

   public NodeService getNodeService() {
      return nodeService;
   }

   public void setNodeService(NodeService nodeService) {
      ListOfFamiliasQueryConstraint.nodeService = nodeService;
   }
}
</java>

Me parece que o problema é porque o Alfresco ainda esta iniciando no momento da busca..
Desde já agradeço pela atenção.
marcosjunior
Member II

Re: Utilizar o DataList como metadado no modelo de dados.

Alguma dica de como realizar a busca nesse momento?
Ví pessoas usando o ServiceRegistry, e aparti dele recuperar o SearchService e NodeService mas tive problemas para injeta-lo no minha class.
Se eu usar AuthenticationUtils.startSession("user", "pass"), consigo realizar a busca.
Mas creio que não seja necessário fornecer esses detalhes, para realizar essa operação in-box.

gsdenys
Member II

Re: Utilizar o DataList como metadado no modelo de dados.

Eu não cheguei a testar seu codigo, mas aparentemente oproblema é que o nodeService e searchService não estão sendo injetados em seu código.

Tente debugar o codigo para verificar se estou correto quanto a isto.

Não sei se sabes como debugar um codigo remoto no tomcat, mas em via das dúvidas segue um tutorial.

http://dertompson.com/2007/01/25/tomcat-remote-debugging/

——

Bem, não disponho de muito tempo para testar a solução que lhe proponho no nomento, mas segue a ideia.

1) pegar o ApplicationContext.
2) pegar a instancia do bim do searchService

Acho que algo parecido com o que está no bloco abaixo possa resolver.

<strong>
ATENÇÂO PESSOAS DO FORUM : ISTO  NÂO FOI TESTADO E PODE CONTER ERROS DE SINTÁTICOS E SEMANTICOS. É SOMENTE UMA IDEIA PARA GUIAR-LOS A UMA SOLUÇÂO
</strong>


ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
SearchService ss = (SearchService) ctx.getBean("searchService");


assim que testar nos deixe saber seu resultado.

[]s
marcosjunior
Member II

Re: Utilizar o DataList como metadado no modelo de dados.

Consegui Rodar o Alfresco em debug, ai melhorou muito o ritmo Smiley Very Happy
Percebi que minha instancia do SearchService não realizando a busca.
Fiz a seguinte alteração;

-Na declaração do Bean, mudei para MAIÚSCULO o nome da ref.
<bean id="ListOfFamiliasQueryConstraint" class="package.ListOfValuesConstraintCustomizada"> 
   
   <property name="nodeService" ref="NodeService" /> //was before nodeService
        <property name="searchService" ref="SearchService" />

</bean>

-Percebi que no 1º momento que o Alfresco sobe, não estava realizando a pesquisa, aparentemente congelava após realizar a consulta, aparentemente é um bug mesmo esse comportamento como visto nesse ticket
https://issues.alfresco.com/jira/browse/MNT-2847.
Fiz uma solução de contorno para no primeiro momento carregar uma lista fixa qualquer, mas quando terminar de inicializar ele faz a busca corretamente;
  
private void loadFamilias() {       
       if(count > 1){          
          super.setAllowedValues(getSearchResult());        
       }else{
          List<String> valores = new ArrayList<String>();
          valores.add("Inicializando");
          valores.add("Inicializando II");          
          
          super.setAllowedValues(valores);          
          count ++;
       }
    }

Fazendo essas alterações minha lista dinamica esta funcionando corretamente.
Obrigado pelo apoio!