package nl.ipo.cds.etl.theme.productioninstallationpart; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.ATTRIBUTE_CODE_CODESPACE_INVALID; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.ATTRIBUTE_CODE_INVALID; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.ATTRIBUTE_EMPTY; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.ATTRIBUTE_GROUP_INCONSISTENT; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.ATTRIBUTE_NULL; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.GEOMETRY_EMPTY_MULTIGEOMETRY; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.GEOMETRY_ONLY_POINT_OR_MULTIPOINT; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.GEOMETRY_SRS_NOT_RD; import static nl.ipo.cds.etl.theme.productioninstallationpart.Message.GEOMETRY_SRS_NULL; import java.util.Map; import nl.ipo.cds.domain.EtlJob; import nl.ipo.cds.etl.AbstractValidator; import nl.ipo.cds.validation.AttributeExpression; import nl.ipo.cds.validation.ValidationReporter; import nl.ipo.cds.validation.Validator; import nl.ipo.cds.validation.constants.Constant; import nl.ipo.cds.validation.execute.CompilerException; import nl.ipo.cds.validation.geometry.GeometryExpression; import nl.ipo.cds.validation.gml.CodeExpression; import nl.ipo.cds.validation.gml.codelists.CodeListFactory; import org.deegree.geometry.Geometry; public class ProductionInstallationPartValidator extends AbstractValidator<ProductionInstallationPart, Message, Context> { private final CodeExpression<Message,Context> inspireIdDatasetCode = code ("inspireIdDatasetCode"); private final AttributeExpression<Message, Context, String> inspireIdLocalId = stringAttr ("inspireIdLocalId"); private final AttributeExpression<Message, Context, String> productionInstallationId = stringAttr ("productionInstallationId"); private final GeometryExpression<Message, Context, Geometry> pointGeometry = geometry ("pointGeometry"); private final AttributeExpression<Message, Context, String> name = stringAttr ("name"); private final CodeExpression<Message,Context> statusType = code ("statusType"); private final AttributeExpression<Message, Context, String> statusDescription = stringAttr ("statusDescription"); private final CodeExpression<Message,Context> type = code ("type"); private final CodeExpression<Message,Context> technique = code ("technique"); private final Constant<Message, Context, String> inspireIdDatasetCodeSpace = constant ("http://www.inspire-provincies.nl/codeList/DatasetTypeCode/ProductionInstallationPart"); private final Constant<Message, Context, String> statusTypeCodeSpace = constant ("http://inspire.ec.europa.eu/codeList/ConditionOfFacilityValue"); private final Constant<Message, Context, String> techniqueCodeSpace = constant ("http://inspire.ec.europa.eu/codeList/PollutionAbatementTechniqueValue"); public ProductionInstallationPartValidator(final Map<Object, Object> validatorMessages) throws CompilerException { super(Context.class, ProductionInstallationPart.class, validatorMessages); compile(); } @Override public Context beforeJob(final EtlJob job, final CodeListFactory codeListFactory, final ValidationReporter<Message, Context> reporter) { return new Context(codeListFactory, reporter); } public Validator<Message, Context> getInspireIdDatasetCodeValidator () { return validate ( and( validate (not (inspireIdDatasetCode.isNull ())).message (ATTRIBUTE_NULL, constant (inspireIdDatasetCode.name)), validate (not (isBlank (inspireIdDatasetCode.code()))).message (ATTRIBUTE_EMPTY, constant (inspireIdDatasetCode.name)), validate (inspireIdDatasetCode.hasCodeSpace (inspireIdDatasetCodeSpace)).message (ATTRIBUTE_CODE_CODESPACE_INVALID, inspireIdDatasetCode.codeSpace(), constant(inspireIdDatasetCode.name), inspireIdDatasetCodeSpace), validate (inspireIdDatasetCode.isValid ()).message (ATTRIBUTE_CODE_INVALID, inspireIdDatasetCode.code(), constant (inspireIdDatasetCode.name), inspireIdDatasetCodeSpace) ).shortCircuit() ); } public Validator<Message, Context> getInspireIdLocalIdValidator () { return validate ( and( validate (not (inspireIdLocalId.isNull ())).message (ATTRIBUTE_NULL, constant(inspireIdLocalId.name)), validate (not (isBlank (inspireIdLocalId))).message (ATTRIBUTE_EMPTY, constant(inspireIdLocalId.name)) ).shortCircuit() ); } public Validator<Message, Context> getProductionInstallationIdValidator () { return validate ( and( validate (not (productionInstallationId.isNull ())).message (ATTRIBUTE_NULL, constant(productionInstallationId.name)), validate (not (isBlank (productionInstallationId))).message (ATTRIBUTE_EMPTY, constant(productionInstallationId.name)) ).shortCircuit() ); } public Validator<Message, Context> getPointGeometryValidator () { return validate ( ifExp( pointGeometry.isNull (), constant(true), and ( // The following validations short-circuit, there must be a non-empty, point-valued geometry validate (not (pointGeometry.isEmptyMultiGeometry())).message (GEOMETRY_EMPTY_MULTIGEOMETRY), validate (pointGeometry.isPointOrMultiPoint()).message (GEOMETRY_ONLY_POINT_OR_MULTIPOINT), // SRS validations: and ( validate (pointGeometry.hasSrs ()).message (GEOMETRY_SRS_NULL), validate (pointGeometry.isSrs (constant ("28992"))).message (GEOMETRY_SRS_NOT_RD, pointGeometry.srsName ()) ).shortCircuit() ).shortCircuit () ) ); } public Validator<Message, Context> getNameValidator () { return validate ( ifExp ( name.isNull (), constant(true), validate (not (isBlank (name))).message (ATTRIBUTE_EMPTY, constant(name.name)) ) ); } public Validator<Message, Context> getStatusValidator () { return validate ( not ( and ( statusType.isNull(), not (statusDescription.isNull()) ) ) ).message (ATTRIBUTE_GROUP_INCONSISTENT, constant(statusType.name), constant(statusDescription.name)); } public Validator<Message, Context> getStatusTypeValidator () { return validate ( ifExp ( statusType.isNull (), constant(true), and( validate (statusType.hasCodeSpace (statusTypeCodeSpace)).message (ATTRIBUTE_CODE_CODESPACE_INVALID, statusType.codeSpace(), constant(statusType.name), statusTypeCodeSpace), validate (not (isBlank (statusType.code()))).message (ATTRIBUTE_EMPTY, constant(statusType.name)), validate (statusType.isValid ()).message (ATTRIBUTE_CODE_INVALID, statusType.code(), constant(statusType.name), statusTypeCodeSpace) ).shortCircuit() ) ); } public Validator<Message, Context> getStatusDescriptionValidator () { return validate ( ifExp ( statusDescription.isNull (), constant(true), validate (not (isBlank (statusDescription))).message (ATTRIBUTE_EMPTY, constant(statusDescription.name)) ) ); } public Validator<Message, Context> getTypeValidator () { return validate ( ifExp ( type.isNull (), constant(true), validate (not (isBlank (type.code()))).message (ATTRIBUTE_EMPTY, constant(type.name)) ) ); } public Validator<Message, Context> getTechniqueValidator () { return validate ( ifExp ( technique.isNull (), constant(true), and( validate (technique.hasCodeSpace (techniqueCodeSpace)).message (ATTRIBUTE_CODE_CODESPACE_INVALID, technique.codeSpace(), constant(technique.name), techniqueCodeSpace), validate (not (isBlank (technique.code()))).message (ATTRIBUTE_EMPTY, constant(technique.name)), validate (technique.isValid ()).message (ATTRIBUTE_CODE_INVALID, technique.code(), constant(technique.name), techniqueCodeSpace) ).shortCircuit() ) ); } }