this is my code, if somebody needs it:
Code:
import java.util.Arrays;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.isomorphic.criteria.DefaultOperators;
import com.isomorphic.criteria.criterion.SimpleCriterion;
import com.isomorphic.datasource.DSRequest;
import com.isomorphic.datasource.DSResponse;
import com.isomorphic.datasource.DataSource;
import com.isomorphic.datasource.Validator;
import com.isomorphic.log.Logger;
import com.lmscompany.lms.server.I18n;
import com.lmscompany.lms.shared.type.DatasourceFieldEnum;
/**
* Replacement for the framework's hadRelatedRecord validator, as this does not support a operationId attribute and therefore will use a slow
* fetch.<br>
* See <a href=
* "https://forums.smartclient.com/forum/smart-gwt-technical-q-a/258391-enhancement-hasrelatedrecord-validator-support-for-the-operationid-attribute-and-general-type-servercustom-questions">this
* thread</a>.
*
* @author ST
*/
public class ValidatorHasRelatedRecord {
Logger log = new Logger(ValidatorHasRelatedRecord.class.getName());
public boolean condition(Object value, Validator validator, String fieldName, Map<Object, Object> record, DataSource ds,
HttpServletRequest httpServletRequest) throws Exception {
log.info("Validating for field \"" + fieldName + "\", value \"" + (value == null ? "" : value.toString()) + "\"");
if (validator.getProperty("dataSource") == null || validator.getProperty("dataSource").toString().isEmpty()) {
throw new Exception("Validator must define a \"dataSource\" attribute.");
}
String dataSource = validator.getProperty("dataSource").toString();
if (value == null)
return true;
DSRequest pkRequest = new DSRequest(dataSource, DataSource.OP_FETCH);
pkRequest.addToCriteria(new SimpleCriterion(DatasourceFieldEnum.GENERAL__ID.getValue(), DefaultOperators.Equals, value));
// Important to reduce joins and SELECTed fields.
pkRequest.setOutputs(Arrays.asList(DatasourceFieldEnum.GENERAL__ID.getValue()));
DSResponse pkResponse = pkRequest.execute();
if (pkResponse.getTotalRows() == 0) {
validator.addErrorMessageVariable("errorMessage", String.format(I18n.getString("lookupValueNotFound", httpServletRequest), value));
return false;
} else if (pkResponse.getTotalRows() >= 2) {
validator.addErrorMessageVariable("errorMessage",
String.format(I18n.getString("tooManyLookupValuesFound", httpServletRequest), value));
return false;
}
return true;
}
}
Blama
Leave a comment: