Hi Isomorphic,
second parameter of DynamicDSGenerator.getDataSource() is "DSRequest dsRequest" (Docs: ...This will be null if the DataSource is not needed in the context of a DSRequest).
Please take a look at this test case (using v12.0p_2019-04-03/PowerEdition Deployment (built 2019-04-03)).
web.xml
	LMSRESTHandler.java
	RegisterDS.java
	animals.ds.xml
	Animals.java
	Call:
	If you set a breakpoint in both places where I wrote in the comments, after execution of
	in Animals.java, "animalsGenerator" is called again but "dsRequest" is null. I don't see a reason why "dsRequest" is null at this point so this could be a bug.
My actual case is a way more complicated but I hope you see the problem.
Best regards
Pavo
					second parameter of DynamicDSGenerator.getDataSource() is "DSRequest dsRequest" (Docs: ...This will be null if the DataSource is not needed in the context of a DSRequest).
Please take a look at this test case (using v12.0p_2019-04-03/PowerEdition Deployment (built 2019-04-03)).
web.xml
Code:
	
	    <!-- Rewrite default definiton with this one -->
    <servlet>
        <servlet-name>RESTHandler</servlet-name>
        <servlet-class>com.smartgwt.sample.server.listener.LMSRESTHandler</servlet-class>
       <init-param>
           <param-name>defaultDataFormat</param-name>
           <param-value>json</param-value>
       </init-param>
   </servlet>
    <servlet>
        <servlet-name>RegisterDS</servlet-name>
        <servlet-class>com.smartgwt.sample.server.listener.RegisterDS</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
Code:
	
	package com.smartgwt.sample.server.listener;
import com.isomorphic.datasource.DSRequest;
import com.isomorphic.datasource.DSResponse;
import com.isomorphic.datasource.DataSource;
import com.isomorphic.rpc.RPCManager;
import com.isomorphic.servlet.RESTHandler;
import com.isomorphic.servlet.RequestContext;
public class LMSRESTHandler extends RESTHandler {
    private static final long serialVersionUID = -1L;
    @Override
    public void processRestTransaction(RPCManager rpcManager, RequestContext requestContext) throws Exception {
        super.processRestTransaction(rpcManager, requestContext);
    }
    @Override
    public DSResponse handleDSRequest(DSRequest dsRequest, RPCManager rpcManager, RequestContext requestContext) throws Exception {
        DSRequest request = new DSRequest("animals", DataSource.OP_FETCH, rpcManager);
        DSResponse returnResponse = request.execute();
        return returnResponse;
    }
}
Code:
	
	package com.smartgwt.sample.server.listener;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import com.isomorphic.datasource.DSRequest;
import com.isomorphic.datasource.DataSource;
import com.isomorphic.datasource.DynamicDSGenerator;
public class RegisterDS extends HttpServlet {
    private static final long serialVersionUID = 7849924835392267735L;
    @Override
    public void init() throws ServletException {
        final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DynamicDSGenerator animalsGenerator = new DynamicDSGenerator() {
            @Override
            public DataSource getDataSource(String id, DSRequest dsRequest) {
                DataSource ds = null;
                try {
                    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
                    // Document doc = documentBuilder
                    // .parse(getServletContext().getResourceAsStream("war\\ds\\animals.ds.xml"));
                    Document doc = documentBuilder
                            .parse("C:\\Users\\Pavo\\eclipse-workspace\\lib\\smartgwtpower-12.0p\\samples\\built-in-ds\\war\\ds\\animals.ds.xml");
                    //Set a breakpoint on the next line of the code
                    ds = DataSource.fromXML(doc);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return ds;
            }
        };
        DataSource.addDynamicDSGenerator(animalsGenerator, "animals");
    }
}
Code:
	
	<DataSource
    ID="animals"
    serverType="sql"
    tableName="animals"
    testFileName="animals.data.xml"
>
    <fields>
        <field name="commonName"      title="Animal"             type="text"/>
        <field name="scientificName"  title="Scientific Name"    type="text"  primaryKey="true"  required="true"/>
        <field name="lifeSpan"        title="Life Span"          type="integer"/>
        <field name="status"          title="Endangered Status"  type="text">
            <valueMap>
                <value>Threatened</value>
                <value>Endangered</value>
                <value>Not Endangered</value>
                <value>Not currently listed</value>
                <value>May become threatened</value>
                <value>Protected</value>
            </valueMap>
        </field>
        <field name="diet"            title="Diet"               type="text"/>
        <field name="information"     title="Interesting Facts"  type="text"  length="1000"/>
        <field name="picture"         title="Picture"            type="image" detail="true"
               imageURLPrefix="/isomorphic/system/reference/inlineExamples/tiles/images/"/>
    </fields>
<serverObject lookupStyle="new" className="com.smartgwt.sample.server.listener.Animals" />
</DataSource>
Code:
	
	package com.smartgwt.sample.server.listener;
import javax.servlet.http.HttpServletRequest;
import com.isomorphic.datasource.DSRequest;
import com.isomorphic.datasource.DSResponse;
import com.isomorphic.datasource.DataSource;
import com.isomorphic.tools.DataImport;
public class Animals {
    public DSResponse fetch(DSRequest dsRequest, HttpServletRequest servletRequest) throws Exception {
        DataImport dataImporter = new DataImport();
        dataImporter.setPopulateDisplayFields(true);
        DSRequest addRequest = new DSRequest("animals", DataSource.OP_ADD, dsRequest.getRPCManager());
        //Set a breakpoint on the next line of the code
        addRequest.setValues(dataImporter.importDataSourceRecord(dsRequest.getValues(), dsRequest.getDataSourceName()));
        DSResponse addResponse = addRequest.execute();
        return addResponse;
    }
}
Code:
	
	http://127.0.0.1:8888/builtinds/sc/RESTHandler/employees
Code:
	
	addRequest.setValues (dataImporter.importDataSourceRecord (dsRequest.getValues (), dsRequest.getDataSourceName ()));
My actual case is a way more complicated but I hope you see the problem.
Best regards
Pavo
Comment