cancel
Showing results for 
Search instead for 
Did you mean: 

Utilizar o DataList como metadado no modelo de dados.

marcosjunior
Champ in-the-making
Champ in-the-making
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 7

gsdenys
Champ in-the-making
Champ in-the-making
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
Champ in-the-making
Champ in-the-making
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
Champ in-the-making
Champ in-the-making
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
Champ in-the-making
Champ in-the-making
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.

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
Champ in-the-making
Champ in-the-making
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
Champ in-the-making
Champ in-the-making
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!
Getting started

Tags


Find what you came for

We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.