Hi Isomorphic,
I'm using latest 5.1p and a .ds.xml file for my BatchUpload that has validators defined like this:
.ds.xml excerpt:
	Please note the $errorMessage with no further text. This is to localize the error message within the validator.
For this I need to know the user's browser language, which I get from the HttpServletRequest:
ValidatorContactDetailsRequiredIf.java
	This should be pretty basic and worked before (DMI with additional parameter "HttpServletRequest httpServletRequest"), but I don't know until when.
Now, if I try to import data I get this message in the server log:
Server log:
	It seems the framework has difficulties to provide the HttpServletRequest, but this has worked before. Could you please check if there are recent (last 2-3 month) changes in this area?
Thank you & Best regards
Blama
					I'm using latest 5.1p and a .ds.xml file for my BatchUpload that has validators defined like this:
.ds.xml excerpt:
Code:
	
	<field name="CUST_SOURCEUID" uploadFieldName="Kunden-ID" length="50" type="text" escapeHTML="true"> <title><fmt:message key="customerIDSource" /></title> <validators> <validator type="serverCustom"> <serverObject lookupStyle="new" className="com.lmscompany.lms.server.worker.validator.ValidatorContactDetailsRequiredIf" /> <errorMessage>$errorMessage</errorMessage> </validator> </validators> </field>
For this I need to know the user's browser language, which I get from the HttpServletRequest:
ValidatorContactDetailsRequiredIf.java
Code:
	
	package com.lmscompany.lms.server.worker.validator;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.isomorphic.datasource.DataSource;
import com.isomorphic.datasource.Validator;
import com.isomorphic.log.Logger;
import com.lmscompany.lms.server.i18n.I18n;
import com.lmscompany.lms.server.worker.T_USER;
import com.lmscompany.lms.shared.type.DatasourceFieldEnum;
public class ValidatorContactDetailsRequiredIf {
    Logger log = new Logger(ValidatorContactDetailsRequiredIf.class.getName());
    public boolean condition(Object value, Validator validator, String fieldName, Map<Object, Object> record, DataSource ds,
            HttpServletRequest httpServletRequest) {
        log.info("Validating for field \"" + fieldName + "\", value \"" + (value == null ? "" : value.toString()) + "\"");
        if (value == null)
            return true;
        else {
            List<String> missingFields = new ArrayList<String>();
            if (record.get(DatasourceFieldEnum.V_LEAD_CURRENT__CUST_NAME.getValue()) == null)
                missingFields.add(I18n.getDSXMLString("companyName", httpServletRequest));
            if (record.get(DatasourceFieldEnum.V_LEAD_CURRENT__CUST_CONTACTPERS_GENDER_SN.getValue()) == null)
                missingFields.add(I18n.getDSXMLString("salutation", httpServletRequest));
            if (record.get(DatasourceFieldEnum.V_LEAD_CURRENT__CUST_CONTACTPERS_SURNAME.getValue()) == null)
                missingFields.add(I18n.getDSXMLString("surname", httpServletRequest));
            if (record.get(DatasourceFieldEnum.V_LEAD_CURRENT__CUST_ADDRESS_STREET.getValue()) == null)
                missingFields.add(I18n.getDSXMLString("street", httpServletRequest));
            if (record.get(DatasourceFieldEnum.V_LEAD_CURRENT__CUST_ADDRESS_ZIPCODE.getValue()) == null)
                missingFields.add(I18n.getDSXMLString("zipCode", httpServletRequest));
            if (record.get(DatasourceFieldEnum.V_LEAD_CURRENT__CUST_ADDRESS_CITY.getValue()) == null)
                missingFields.add(I18n.getDSXMLString("city", httpServletRequest));
            if (record.get(DatasourceFieldEnum.V_LEAD_CURRENT__CUST_ADDRESS_COUNTRY_ID.getValue()) == null)
                missingFields.add(I18n.getDSXMLString("country", httpServletRequest));
            if (missingFields.isEmpty())
                return true;
            else {
                if (missingFields.size() == 1)
                    validator.addErrorMessageVariable("errorMessage",
                            String.format(I18n.getString("alsoEnterOtherField", httpServletRequest), T_USER.join(missingFields, ", ")));
                else
                    validator.addErrorMessageVariable("errorMessage",
                            String.format(I18n.getString("alsoEnterOtherFields", httpServletRequest), T_USER.join(missingFields, ", ")));
                return false;
            }
        }
    }
}
Now, if I try to import data I get this message in the server log:
Server log:
Code:
	
	[B]=== 2016-02-17 23:46:29,818 [ec-5] WARN  DefaultValidators - Validator DMI invocation threw exception: java.lang.Exception: Unable to assign a required or optional argument to slot #6 taking type: javax.servlet.http.HttpServletRequest of method:[/B]
public boolean com.lmscompany.lms.server.worker.validator.ValidatorContactDetailsRequiredIf.condition(java.lang.Object,com.isomorphic.datasource.Validator,java.lang.String,java.util.Map,com.isomorphic.datasource.DataSource,javax.servlet.http.HttpServletRequest)
No remaining optional arguments match this type and all required arguments passed by the client have already been assigned.
    at com.isomorphic.base.Reflection.adaptArgsAndInvoke(Reflection.java:955)
    at com.isomorphic.base.Reflection.adaptArgsAndInvoke(Reflection.java:794)
    at com.isomorphic.util.DefaultValidators$serverCustom.callServerObject(DefaultValidators.java:1472)
    at com.isomorphic.util.DefaultValidators$serverCustom.validate(DefaultValidators.java:1383)
    at com.isomorphic.util.DefaultValidators.processValidator(DefaultValidators.java:292)
    at com.isomorphic.util.DefaultValidators.validateField(DefaultValidators.java:250)
    at com.isomorphic.datasource.SimpleType.validateValue(SimpleType.java:97)
    at com.isomorphic.datasource.SimpleType.create(SimpleType.java:73)
    at com.isomorphic.datasource.BasicDataSource.validateFieldValue(BasicDataSource.java:2088)
    at com.isomorphic.datasource.BasicDataSource.validateFieldValue(BasicDataSource.java:2003)
    at com.isomorphic.datasource.BasicDataSource.toRecord(BasicDataSource.java:1367)
    at com.isomorphic.datasource.BasicDataSource.toRecords(BasicDataSource.java:1279)
    at com.isomorphic.datasource.DataSource.validate(DataSource.java:3521)
    at com.isomorphic.tools.DataImport.importAndValidateDSRows(DataImport.java:410)
    at com.isomorphic.tools.DataImport.importAndValidateDSRows(DataImport.java:343)
    at com.isomorphic.tools.BatchUpload.internalBatchUpload(BatchUpload.java:148)
    at com.isomorphic.tools.BatchUpload.batchUpload(BatchUpload.java:88)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.isomorphic.base.Reflection.adaptArgsAndInvoke(Reflection.java:964)
    at com.isomorphic.datasource.DataSourceDMI.execute(DataSourceDMI.java:416)
    at com.isomorphic.datasource.DataSourceDMI.execute(DataSourceDMI.java:64)
    at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:2690)
    at com.isomorphic.servlet.IDACall.handleDSRequest(IDACall.java:228)
    at com.lmscompany.lms.server.LMSIDACall.handleDSRequest(LMSIDACall.java:87)
    at com.isomorphic.servlet.IDACall.processRPCTransaction(IDACall.java:187)
    at com.lmscompany.lms.server.LMSIDACall.processRequest(LMSIDACall.java:43)
    at com.isomorphic.servlet.IDACall._processRequest(IDACall.java:119)
    at com.isomorphic.servlet.IDACall.doPost(IDACall.java:79)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at com.isomorphic.servlet.BaseServlet.service(BaseServlet.java:162)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.isomorphic.servlet.CompressionFilter._doFilter(CompressionFilter.java:260)
    at com.isomorphic.servlet.BaseFilter.doFilter(BaseFilter.java:88)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
com.isomorphic.util.ValidatorException: Validator DMI invocation threw exception: java.lang.Exception with error: Unable to assign a required or optional argument to slot #6 taking type: javax.servlet.http.HttpServletRequest of method:
public boolean com.lmscompany.lms.server.worker.validator.ValidatorContactDetailsRequiredIf.condition(java.lang.Object,com.isomorphic.datasource.Validator,java.lang.String,java.util.Map,com.isomorphic.datasource.DataSource,javax.servlet.http.HttpServletRequest)
No remaining optional arguments match this type and all required arguments passed by the client have already been assigned.
    at com.isomorphic.util.DefaultValidators$serverCustom.callServerObject(DefaultValidators.java:1481)
    at com.isomorphic.util.DefaultValidators$serverCustom.validate(DefaultValidators.java:1383)
    at com.isomorphic.util.DefaultValidators.processValidator(DefaultValidators.java:292)
    at com.isomorphic.util.DefaultValidators.validateField(DefaultValidators.java:250)
    at com.isomorphic.datasource.SimpleType.validateValue(SimpleType.java:97)
    at com.isomorphic.datasource.SimpleType.create(SimpleType.java:73)
    at com.isomorphic.datasource.BasicDataSource.validateFieldValue(BasicDataSource.java:2088)
    at com.isomorphic.datasource.BasicDataSource.validateFieldValue(BasicDataSource.java:2003)
    at com.isomorphic.datasource.BasicDataSource.toRecord(BasicDataSource.java:1367)
    at com.isomorphic.datasource.BasicDataSource.toRecords(BasicDataSource.java:1279)
    at com.isomorphic.datasource.DataSource.validate(DataSource.java:3521)
    at com.isomorphic.tools.DataImport.importAndValidateDSRows(DataImport.java:410)
    at com.isomorphic.tools.DataImport.importAndValidateDSRows(DataImport.java:343)
    at com.isomorphic.tools.BatchUpload.internalBatchUpload(BatchUpload.java:148)
    at com.isomorphic.tools.BatchUpload.batchUpload(BatchUpload.java:88)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.isomorphic.base.Reflection.adaptArgsAndInvoke(Reflection.java:964)
    at com.isomorphic.datasource.DataSourceDMI.execute(DataSourceDMI.java:416)
    at com.isomorphic.datasource.DataSourceDMI.execute(DataSourceDMI.java:64)
    at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:2690)
    at com.isomorphic.servlet.IDACall.handleDSRequest(IDACall.java:228)
    at com.lmscompany.lms.server.LMSIDACall.handleDSRequest(LMSIDACall.java:87)
    at com.isomorphic.servlet.IDACall.processRPCTransaction(IDACall.java:187)
    at com.lmscompany.lms.server.LMSIDACall.processRequest(LMSIDACall.java:43)
    at com.isomorphic.servlet.IDACall._processRequest(IDACall.java:119)
    at com.isomorphic.servlet.IDACall.doPost(IDACall.java:79)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at com.isomorphic.servlet.BaseServlet.service(BaseServlet.java:162)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.isomorphic.servlet.CompressionFilter._doFilter(CompressionFilter.java:260)
    at com.isomorphic.servlet.BaseFilter.doFilter(BaseFilter.java:88)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
=== 2016-02-17 23:46:29,820 [ec-5] DEBUG BatchUpload - Rows: [
]
=== 2016-02-17 23:46:29,820 [ec-5] DEBUG BatchUpload - Errors: [
]
=== 2016-02-17 23:46:29,821 [ec-5] DEBUG BatchUpload - Errors after conversion: [
    "Validator DMI invocation threw exception: java.lang.Exception with error: Unable to assign a required or optional argument to slot #6 taking type: javax.servlet.http.HttpServletRequest of method:\n\npublic boolean com.lmscompany.lms.server.worker.validator.ValidatorContactDetailsRequiredIf.condition(java.lang.Object,com.isomorphic.datasource.Validator,java.lang.String,java.util.Map,com.isomorphic.datasource.DataSource,javax.servlet.http.HttpServletRequest)\n\nNo remaining optional arguments match this type and all required arguments passed by the client have already been assigned.\n\n\n\nSee the log for more details about this error."
]
=== 2016-02-17 23:46:29,821 [ec-5] INFO  DSResponse - DSResponse: Map with 3 keys
=== 2016-02-17 23:46:29,821 [ec-5] DEBUG RPCManager - Content type for RPC transaction: text/html; charset=UTF-8
=== 2016-02-17 23:46:29,821 [ec-5] DEBUG RPCManager - DMI response, dropExtraFields: false
=== 2016-02-17 23:46:29,822 [ec-5] INFO  Compression - /lms/lms/sc/IDACall: 1360 -> 769 bytes
Thank you & Best regards
Blama
Comment