recherche query (Java Backed Web Script) [résolu]

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

recherche query (Java Backed Web Script) [résolu]

bonjour

j'ai un environnement alfresco 4.2.c, et développe en java sous eclipse juno (j'ai intégré le sd4 4.2.c)

je compile sans erreur le code suivant :

        Reference parentReference = null;
        // Get a reference to the respository web service
        RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();        
        // Create a query object, looking for all items with alfresco in the name of text
        Query query = new Query(Constants.QUERY_LANG_LUCENE, "TEXT:'test'");
        // Execute the query
        QueryResult queryResult = repositoryService.query(
new Store(Constants.WORKSPACE_STORE, "SpacesStore"),
query, false);


mais au restart de Tomcat (celui de l'instance alfresco), le bean ne se construit pas

log dans alfresco :
<blockcode>…Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/alfresco/webservice/types/Store</blockcode>

J'ai cherché les différences dans les jar du sdk et de l'instance d'alfresco :
- dans eclipse, la classe store est ben présente dans alfresco.webservice.types.store (et le code se compile)
- dans alfresco, le seul jar contenant une classe store est alfresco.repo.webservice.types.store

Je parie plutôt sur un code obsolete, mais n'ai suis au bout de mes réponse

merci pour votre aide

Frédéric Marin
10 Replies
fmarin
Member II

Re: recherche query (Java Backed Web Script) [résolu]

Bonjour

j'ai continué quelques tests sur le sujet

je m'aperçois que plusieurs classes des packages de alfresco.webservice ne sont pas connues de mon instance d'alfresco … (ex. la classe de test est générée dans eclipse avec org.alfresco.webservice.util.AuthenticationUtils, mais la classe AuthenticationUtils est inconnue lors de l'exécution dans l'instance d'alfresco ).

Mauvaise pratique ? ou incompatibilité entre une instance d'alfresco et le sdk correspondant ?

Frédéric Marin
cleseach
Active Member II

Re: recherche query (Java Backed Web Script) [résolu]

Bonjour Frédéric,

Pour bien comprendre votre problème, il faudrait une explication de ce que vous voulez faire, votre code complet, ainsi que les fichier de configuration Spring que vous utilisez.

De ce que je peux comprendre en l'état, vous cherchez à faire utiliser à votre instance Alfresco des webservices SOAP Alfresco. J'imagine que c'est pour de la communication inter-serveurs. Est-ce bien cela ?
Pour cela, il vous faudra déployer le jar <em>alfresco-web-service-client-4.2.c.jar</em> sur votre Alfresco (attention aux éventuels conflits, je n'ai pas testé).
Reste que c'est un peu surprenant de vouloir utiliser SOAP pour ce genre de chose. Les WebScripts (REST/JSON) sont tellement efficaces que je vous encourage à les regarder de plus près ;-)

Cordialement,
Charles Le Seac'h
fmarin
Member II

Re: recherche query (Java Backed Web Script) [résolu]

et milles excuses pour le délai de ma réponse

effectivement, j'ai eu un moment de confusion; si je comprends bien les implications de ton message, le choix des jar (.alfresco.webservice.) au lieu de (.alfresco.service.cmr.repository.),par exemple, est loin d'être anodin !

j'ai repris le cours de mes expérimentations, et ai une question connexe. Je cherche à explorer un espace (par un query), et pour chacun des noderefs, extraire un ensemble de métadonnées spécifiques à un "content type" que j'ai créé, et leur affecter différentes propriétés dont un nouvel aspect, des tags, et des catégories.

Si j'ai bien compris, j'ai besoin, pour cela, de faire appel au SearchService, puis au ContentService, puis au TaggingService.

Par exemple, pour le SearchService, je fais un
<java>
ResultSet results = searchService.query(stRef, SearchService.LANGUAGE_LUCENE,
"PATH:\"/app:company_home/app:dictionary\"");
</java>

ma question : l'initialisation du SearchService se fait elle par "setter" à l'instanciation de la classe java ?
<java>    private SearchService searchService;
   
    public void SearchService(SearchService searchService)
    {
        this.searchService = searchService; 
    }
</java>

en te remercianat,

Frédéric Marin
cleseach
Active Member II

Re: recherche query (Java Backed Web Script) [résolu]

Bonsoir Frédéric,

Le <em>ContentService</em> permet de manipuler les contenus des noeuds. D'après la description de ton besoin (modifier aspects et propriétés), c'est le <em>NodeService</em> qui va t"être utile.
Pour disposer des différents services, tu va pouvoir les injecter grâce à la "magie de Spring" (et à la définition d'un setter, comme tu l'as bien identifié).
Dans le l'exemple "Custom Aspect" du SDK, tu trouveras un exemple concret sur la manière de procéder. Le point clé est la rédaction du fichier "xxx-context.xml".

Bon apprentissage,
Charles Le Seac'h
fmarin
Member II

Re: recherche query (Java Backed Web Script) [résolu]

j'ai un petit soucis malgré tout : mon "searchService" est null

mon code : <java>import java.util.HashMap;
import java.util.Map;

import org.alfresco.repo.model.Repository;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest;

public class StockageTestV2 extends DeclarativeWebScript
{
    private SearchService searchService;
    private ResultSet resultSet = null;
    private StoreRef stRef=null;
    private String query=null;
   private Repository repository;
 
    public void setSearchService(SearchService searchService)
    {
        this.searchService = searchService; 
    }
    public SearchService getSearchService()
    {
        return this.searchService; 
    }
   public void setRepository(Repository repository) {
      this.repository = repository;
   }
   public Repository getRepository() {
      return this.repository;
   }
   
    protected Map<String, Object> executeImpl(WebScriptRequest req,
        Status status, Cache cache)
    {
        stRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE,"SpacesStore");
        query = "PATH:\"/app:company_home/app:dictionary\""
              + "@sc\\:isActive:true"
              +"@sto\\:Typo:\"à enrichir\"" ;
        System.out.println("searchservice ="+getSearchService());
        resultSet = getSearchService().query(stRef, SearchService.LANGUAGE_LUCENE, query);
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("mess", "slt");
        System.out.println("************************************");
        return model;
    }
}</java>

Peux tu m'éclairer sur ce point ?

En t'en remerciant par avance,
Frédéric Marin
jayjayecl
Active Member II

Re: recherche query (Java Backed Web Script) [résolu]

Bonjour, 2 remarques pour ma part :
- il manque le fichier de définition de contexte Spring "*-context.xml"
- où en est-on de la discussion sur SOAP WS / REST scripts ?
J'avoue que je penche grandement en faveur des échanges REST pour ce type de besoin …
fmarin
Member II

Re: recherche query (Java Backed Web Script) [résolu]

Pour ma part, la discussion sur soap / rest est close, il y a eu un instant de confusion de mon coté : c'est bien la techno REST / SCRIPT que j'explore (après avoir commencé à explorer les scripts en js, je regarde maintenant les javabacked scripts).

mon context.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
  "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
  <bean id="webscript.com.alfeo.alfresco.stock.analyse.stockage.get"
    class="com.alfeo.alfresco.stock.analyse.StockageTestV2" parent="webscript">
      <property name="repository" ref="repositoryHelper"/>
  </bean>
</beans>


Merci

Frédéric Marin
jayjayecl
Active Member II

Re: recherche query (Java Backed Web Script) [résolu]

Bonjour,
dans votre fichier de contexte, vous injectez bien l'objet "Repository", mais pas le searchService, c'est pour cela qu'il est nul selon moi.
fmarin
Member II

Re: recherche query (Java Backed Web Script) [résolu]

effectivement, avec un
<property name="searchService"><ref bean="SearchService"/>
, je passe à la case supérieure.

Le paramétrage du context.xml m'apparaît plus complexe que je ne le pensais : pourriez vous me suggérer un point de départ sur le wiki ? (j'imagine qu'il est nécessaire d'injecter également le nodeservice dont je vais avoir besoin, etc …)

Je tombe maintenant sur un "No authentication provider for net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken"

le début du stack est :
org.springframework.extensions.webscripts.WebScriptException: 03090001 Wrapped Exception (with status template): No authentication provider for net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken
   at org.springframework.extensions.webscripts.AbstractWebScript.createStatusException(AbstractWebScript.java:1067)
   at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:171)
   at org.alfresco.repo.web.scripts.RepositoryContainer$3.execute(RepositoryContainer.java:433)
   at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:433)
   at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecute(RepositoryContainer.java:495)


j'ai un
<authentication>user</authentication>
dans mon ~desc.xml

En passant par ~alfresco/service/~, je restais sur l'idée que l'on bénéficiais du service d'authentification des web clients (comme avec les webscripts js) … De fait, j'ai cherché une classe d'authentification, … que je n'ai pas trouvée

Merci

Frédéric Marin