Skip to content

Nuxeo quick reference

Jeremie Guillemotte edited this page May 13, 2014 · 28 revisions

Nuxeo quick reference

NB. see also Developing on the service registry for debugging, testing & more development reference, and Using Nuxeo IDE for using Nuxeo IDE (not mandatory).

Code & configuration

  • source root and how to get it
  • javadoc
  • [Nuxeo Explorer] (http://explorer.nuxeo.org/nuxeo/site/distribution/current) for bundles, components (and services), extension points & contributions (configuration), automation operations
  • to override configuration (extension definitions) : create a new component ("component" XML file) and register it in OSGI-INF/MANIFEST.MF (in "Nuxeo-Component:"), copy in it all extension definitions you wish to override and patch them, and "require" each of their original components at the beginning of this one (so that this one will come after).
  • TODO for assembly and (marketplace) packaging

Nuxeo Document Model

Nuxeo JSF (Document) Layout

In the end, the best reference is Nuxeo's own source code. So get it (see above) and search in it to find useful examples, using for instance "find" command lines such as:

  • *find . -name "xml" -exec grep "id="newDocument" {} ; -print for configuration (XML contributions).
  • *find . -name "java" -exec grep "selectionActions"" {} ; -print for java class.
  • *find . -name "xhtml" -exec grep "f:param" {} ; -print for xhtml templates.

Overriding

Available JSF functions and tags

Nuxeo WebEngine Freemarker templates quick reference :

(from https://github.com/easysoa/EasySOA-Incubation/blob/master/easysoa-registry-v1/easysoa-registry-rest-server/src/main/resources/skin/views/EasySOA/macros.ftl)

Available context variables are :

(as seen in AbstractWebContext and at http://doc.nuxeo.com/pages/viewpage.action?pageId=11044493 )

  • Context : the View extending AbstractWebContext, which provides : i18n (module's messages) & locale, logging, cookies, principal (user), properties (context variables shared among scripts), user session, running scripts, loginPath, headers, request, form and everything below (path /url...)
  • Root : the controller. So you can put there (or in the ModuleRoot class it extends) code available here that requires the request.
  • Module : NOT your own module Class. Provides class loading, adapters & resources, validators.
  • Runtime : Framework.getRuntime()
  • Engine : WebEngine
  • basePath : /nuxeo/site
  • skinPath : /nuxeo/site/skin/easysoa
  • contextPath : /nuxeo
  • This : the Web Object if any
  • Document : its (adapted) DocumentModel if any
  • Adapter : the adapter of the first WebEngine resource having one, starting from the controller
  • Session : CoreSession
  • & what's put by controller

Nuxeo Freemarker good practices :

  • Freemarker doesn't support null. So use instead something different from your normal variable type, like "" (empty string) if it is an object, and test which one it is using builtins like ?string and ?is_hash (for objects). Don't use ?is_string on Java objects, because the may return ?is_string == true ! Also, calls to Java methods returning null actually return an empty string.
  • macro don't support optional parameters, so pass instead something you can test not to be your normal variable type, like an empty string if it should be an object (see above).

FAQ

See also Developing on the service registry.

General FAQ

How can I reset all Nuxeo data?

Simply remove the nxserver/data folder from Nuxeo (in the EasySOA package, Nuxeo is filed under the serviceregistry folder).

Enabling remote debugging

Open bin/nuxeo.conf and uncomment the "DEBUGGING" options line:

        # Sample JPDA settings for remote socket debugging
        JAVA_OPTS=$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

You can switch suspend=n to suspend=y if you want to monitor Nuxeo right from the start (Java will wait for you to connect with Eclipse before to start Nuxeo).

Connecting to Nuxeo CMIS

You can use a special software like (CMIS Workbench)[http://chemistry.apache.org/java/developing/tools/dev-tools-workbench.html]. The address where the Nuxeo CMIS is published is : [http://localhost:8080/nuxeo/atom/cmis]

Junit test FAQ

Guice provision errors (CoreSession)

Error :

      com.google.inject.ProvisionException: Guice provision errors: 

      1) null returned by binding at org.nuxeo.runtime.test.runner.RuntimeFeature.bind0(RuntimeFeature.java:196)
       but org.nuxeo.snapshot.AbstractTestSnapshot.session is not @Nullable
        at org.nuxeo.runtime.test.runner.RuntimeFeature.bind0(RuntimeFeature.java:196)
        while locating org.nuxeo.ecm.core.api.CoreSession 

Solution :

In your test annotations, change cleanup to Granularity.CLASS in

    @RepositoryConfig(type = BackendType.H2, init = PublishRepositoryInit.class, user = "Administrator", cleanup = Granularity.METHOD)

JSF FAQ

Iteration

In iteration, "c:" tags (ex. "c:if") and those derived from them (ex. "nxu:set") can't be used. Rather, replace "c:if" by "h:panelGroup rendered=test" and set cache="false" on "nxu:set".

String concatenation in EL (Expression Language)

It is not done by "+" but by either by putting them along each other in an EL expression, [using <c:set var="s" value="${s1} ${s2}"/> beforehand] (http://stackoverflow.com/questions/296398/concatenate-strings-in-jsp-el), or defining a [custom concat() function] (http://stackoverflow.com/questions/2192759/concatenate-strings-in-jsf-jsp-el-and-javascript).

JAX RS

REST HOWTO

@GET
@Path("/getExchangeRecordStorelist")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public StoreCollection getExchangeRecordStorelist() { ...

@Produces to tell that the returned type can be a json string. The returned java object, here StoreCollection must have some annotations :

@XmlRootElement
public class StoreCollection {

    private Collection<ExchangeRecordStore> stores;
    ...
    @XmlElement(name="ExchangeRecordStore")
    @XmlElementWrapper(name="stores")
    public Collection<ExchangeRecordStore> getStores() {
        return stores;
    }
}

How to build a mock server with Nuxeo Web Engine ?

Simply create a class that extends ModuleRoot class. Then add JAX-RS annotations to publish the service and at least one method to generate the response. You have to create a contrib file in OSGI-INF folder to start the mock in Nuxeo.

For a complete example see the MockServer class and the contrib file.

Source code for the mock class. in this sample, we create a mock server exposed on path "/mock" with one operation "wsdl". This operation needs a String parameter "wsdlResource" and produces a text/xml result.

@Path("/mock")
@Produces("text/xml;charset=UTF-8")
@WebObject(type = "MockServer")
public class MockServer extends ModuleRoot {

    @GET
    @Path("wsdl/{wsdlResource}")
    public Object doGet(@PathParam("wsdlResource") String wsdlResource) throws Exception {
        ...
        // Get the wsdl file list
        ....
        for(File file : fileList){
            // If the requested file is in the list return it
            if(file.getName().toLowerCase().contains(wsdlResource.toLowerCase())){
                return FileUtils.readFileToString(file);
            }
        }
        throw new Exception("Resource '" + wsdlResource + "' not found");
     }
    
}

Source code for the contrib file

<?xml version="1.0" encoding="UTF-8"?>
<component name="org.easysoa.registry.doctypes.core.mock.wsdlMockServer" version="1.0">
    <implementation class="org.easysoa.registry.mock.MockServer" />
</component>
Clone this wiki locally