Java backend webscript e Spring

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

Java backend webscript e Spring

Ciao a tutti.

Ho creato un nuovo webscript con java ma ho dei problemi sul caricamento delle property definite nel file spring dello script.
Per meglio capire:

nel mio file test-context.xml ho questa definizione:
<beans>
  <bean id="webscript.org.alfresco.xxxx.test.test.get"
        class="org.alfresco.xxxx.test.MyClass" parent="webscript">
    <property name="repository" ref="repositoryHelper"/>
   <property name="serviceRegistry" ref="ServiceRegistry" />
  </bean>
</beans>

e nella classe java ho:
….
    private ServiceRegistry serviceRegistry;

   public void setServiceRegistry (ServiceRegistry serviceRegistry) {
       this.serviceRegistry = serviceRegistry;
    }
…..
do logic etc etc
….

Il problema sorge quando viene eseguita questa linea di codice:

Collection<QName> coll = serviceRegistry.getServices();

Ottengo questa eccezione:
17:00:54,609  ERROR [extensions.webscripts.AbstractRuntime] Exception from executeScript - redirecting to status template error: 04270001 Wrapped Exception (with status template): null
org.springframework.extensions.webscripts.WebScriptException: 04270001 Wrapped Exception (with status template): null
   at org.springframework.extensions.webscripts.AbstractWebScript.createStatusException(AbstractWebScript.java:758)
   at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:171)
   at org.alfresco.repo.web.scripts.RepositoryContainer$2.execute(RepositoryContainer.java:383)
   at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:381)
   at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecute(RepositoryContainer.java:436)
   at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecuteAs(RepositoryContainer.java:466)
   at org.alfresco.repo.web.scripts.RepositoryContainer.executeScript(RepositoryContainer.java:304)
   at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:352)
   at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:189)
   at org.springframework.extensions.webscripts.servlet.WebScriptServlet.service(WebScriptServlet.java:118)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.alfresco.web.app.servlet.GlobalLocalizationFilter.doFilter(GlobalLocalizationFilter.java:58)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
   at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
   at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
   at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
   at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.UnsupportedOperationException
   at org.alfresco.repo.service.ServiceDescriptorRegistry.getServices(ServiceDescriptorRegistry.java:112)
   at org.alfresco.xxxxx.test.MyClass.executeImpl(MyClass.java:44)
   at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:64)
   … 24 more


Dov'è l'errore?
La versione di alfresco che sto utilizzando è la 3.4 Enterprise Edition nella versione TRial

Ciao

Grazie

Marco
3 Replies
mturatti
Member II

Re: Java backend webscript e Spring

Ciao Marco,

L'operazione non è implementata: http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root/projects/repository/source/jav...

Come puoi vedere il metodo non è chiamabile:
 public Collection<QName> getServices()
    {
        // TODO: Implement
        throw new UnsupportedOperationException();
    }
Secondo me dipende dal fatto che in effetti non esiste una interfaccia a fattor comune dei vari servizi, in quanto ciascuno ha delle peculiarità che rende difficile scrivere del codice generico sui servizi. Non resta che fare la "get" del singolo servizio che si intende utilizzare.

Di solito infatti i servizi non vengono caricati utilizzando direttamente e programmaticamente il ServiceRegistry, ma bensi iniettati via Spring.

Per un esempio, il seguente bean riceve un nodeArchiveService da Spring:

[…]
public class Purge extends DeclarativeWebScript {

    final Logger logger = LoggerFactory.getLogger(Purge.class);
    private NodeArchiveService nodeArchiveService;

    public void setNodeArchiveService(NodeArchiveService nodeArchiveService) {
        this.nodeArchiveService = nodeArchiveService;
    }

    @Override
    protected Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache) {
        logger.info("@@@ Purging all archived nodes… ");
        final long start = System.currentTimeMillis();
        try {
            this.nodeArchiveService.purgeAllArchivedNodes(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
        } catch (Throwable t) {
            logger.error("@@@ Error executing purge ", t);
            errorMessage(status, Status.STATUS_INTERNAL_SERVER_ERROR,
                    "Runtime error: " + t.getMessage() + ". Cause: " + t.getCause());
            return null;
        }
        final long elapsed = System.currentTimeMillis() - start;
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("elapsed", elapsed);
        logger.info("@@@ Elapsed time (ms): " + elapsed);
        return model;
    }

    private void errorMessage(Status status, int code, final String message) {
        status.setCode(code);
        status.setMessage(message);
        status.setRedirect(true);
    }
}
E' inizializzato dal seguente context:
<?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.it.alfresco.util.purge.get"
          class="it.alfresco.util.Purge" parent="webscript">
        <property name="nodeArchiveService" ref="nodeArchiveService"/>
    </bean>
</beans>
(Riferimento: http://camelcase.blogspot.com/2011/03/purge-alfresco-archived-nodes.html)
Hope it helps.
mcodeluppi
Member II

Re: Java backend webscript e Spring

Ciao,

grazie, tutto molto chiaro!

Però dove posso trovare una lista aggiornata dei servizi che posso iniettare via spring?

Marco
mturatti
Member II

Re: Java backend webscript e Spring

Puoi partire da http://wiki.alfresco.com/wiki/Specification
e http://wiki.alfresco.com/wiki/Java_Foundation_API
Quindi i Javadoc:
http://wiki.alfresco.com/wiki/Alfresco_JavaDoc

Un elenco di servizi attivi è presente nel context Spring public-services-context.xml che trovi sia in Alfresco che nello SDK.

Consiglio comunque di seguire qualche buon libro, un elenco parziale si trova nella prima pagina del wiki http://wiki.alfresco.com/wiki/Main_Page