<?xml version="1.0" encoding="utf-8" ?>
<!-- Spring Manged Objects -->
<objects xmlns="http://www.springframework.net"
			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xmlns:v="http://www.springframework.net/validation"
			xsi:schemaLocation="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd
									  http://www.springframework.net Xsd/spring-validation-1.3.xsd" >


  <description>
	 Spring Validation
	 See this for more info:
	 http://www.springframework.net/doc-latest/reference/html/validation.html
  </description>
  <v:group id="unitProcessValidationRules">
	 <v:ref name="upUnitProcessValidationRules" context="Item" />

	 <v:group id="AgencyCustomFields" when="#this.Item is T(Sleis.Models.AgencyUnitProcess)">
		<v:ref name ="agencyCustomFieldValidator" context="CustomFields" />
	 </v:group>

	 <v:group id="PublicCustomFields" when="#this.Item is T(Sleis.Models.PublicUnitProcess)">
		<v:ref name ="publicCustomFieldValidator" context="CustomFields" />
	 </v:group>
  </v:group>


  <v:group id="upUnitProcessValidationRules">
	 <v:required test="Identifier">
		<v:message id="valid.unit.process.identifier.required" providers="Item.Identifier">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:regex test="Identifier" expression=".{1,20}" when="Identifier != null">
		<v:message id="valid.unit.process.identifier.length" providers="Item.Identifier">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>

	 <v:required test="EmissionUnitId">
		<v:message id="valid.unit.process.euid.required" providers="Item.EmissionUnitId" >
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>

	 <v:required test="UnitProcessClassCode">
		<v:message id="valid.unit.process.scc.code.required" providers="Item.UnitProcessClassCode" >
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>

	 <v:required test="Description" when="#this is T(Sleis.Models.PublicUnitProcess)">
		<v:message id="valid.unit.process.description.required" providers="Item.Description">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:regex test="Description" expression=".{0,200}" when="Description != null">
		<v:message id="valid.unit.process.desc.length" providers="Item.Description">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>

	 <!-- Final Emission Year -->
	 <v:regex test="LastEmissionsYear.ToString()" expression="^(19[0-9]{2}|20[0-4][0-9]|2050)$" when="LastEmissionsYear != null">
		<v:message id="valid.unit.process.final.emission.year" providers="Item.LastEmissionsYear">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>

	 <!--
	 v:required test="Comment">
		<v:message id="valid.unit.process.comment.required" providers="Item.Comment" >
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required
	 -->
	 <v:regex test="Comment" expression="^[\s\S]{0,4000}$" when="Comment != null">
		<v:message id="valid.unit.process.comment.length" providers="Item.Comment">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>


	 <!-- Required field check for Regulatory Program(s) on page -->
	 <!--
	 <v:validator test="EpaRegulationPrograms" type="Sleis.Validation.Spring.ListValidator" when="'${app.enable.regulatory.program.in}' == 'unitProcess' and EpaRegulationPrograms != null">
		<v:property name="ProviderFormat" value="Item.EpaRegulationPrograms[{0}]."/>
		<v:property name="Validator" ref="upRegulatoryProgramValidationRules" />
	 </v:validator>
	-->


	 <!--<v:ref name="upUniqueRegulatoryProgramValidationRules" />-->
	 <v:ref name="upUnitProcessControlApproachValidationRules" />
	 <v:ref name="upUnitProcessReleasePointApportionmentValidationRules" />
  </v:group>


  <v:group id="upRegulatoryProgramValidationRules">
	 <v:required test="Value">
		<v:message id="valid.unit.process.regulatory.program.code.required" providers="Value">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
  </v:group>


  <v:group id="upUniqueRegulatoryProgramValidationRules" when="'${app.enable.regulatory.program.in}' == 'unitProcess' and EpaRegulationPrograms != null">
	 <v:validator test="EpaRegulationPrograms" type="Sleis.Validation.Spring.UniqueListValidator" >
		<v:property name="ProviderFormat" value="Item.EpaRegulationPrograms[{0}]." />
		<v:property name="MessageId" value="valid.unit.process.regulatory.program.code.unique" />
		<v:property name="Keys">
		  <dictionary key-type="string" value-type="string">
			 <!--
			 Key: What has to be uique
			 Value: What is the field name to be appended to the ProviderFormat
			 -->
			 <entry key="Value" value="Value" />
		  </dictionary>
		</v:property>
	 </v:validator>
  </v:group>


  <v:group id="upUnitProcessControlApproachValidationRules" when="('${app.use.emission.unit.control.approach}' == 'false') and (ControlApproach!=null)">
	 <!--
	 <v:required test="ControlApproach.Description" when="ControlApproach!=null">
		<v:message id="valid.unit.process.control.approach.description.required" providers="Item.ControlApproach.Description">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 -->
	 <v:regex test="ControlApproach.Description" expression=".{0,200}" when="ControlApproach.Description != null">
		<v:message id="valid.unit.process.control.approach.description.length" providers="Item.ControlApproach.Description">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>

	 <!--
	 <v:validator test="ControlApproach.Efficency" type="Sleis.Validation.Spring.NullableDecimalValidator" when="ControlApproach.NotControlled == false">
		<v:property name="MessageId" value="valid.unit.process.control.approach.efficency.required"/>
		<v:property name="Provider" value="Item.ControlApproach.Efficency"/>
	 </v:validator>
	 -->
	 <v:validator id="unitProcessApproachDesignCapacityValidator" test="ControlApproach.Efficency.ToString('G29')" type="Sleis.Validation.Spring.DecimalValidator" when="ControlApproach.NotControlled == false and ControlApproach.Efficency != null ">
		<v:property name="PrecisionFormat" value="3,1" />
		<v:message id="valid.unit.process.control.approach.efficency.format" providers="Item.ControlApproach.Efficency">
		  <v:param value="ValidationContxt"/>
		</v:message>
		<v:property name="AllowPartialMatching" value="true"/>
	 </v:validator>
	 <v:condition test ="ControlApproach.Efficency &gt;= 1 and ControlApproach.Efficency &lt;= 100" when="ControlApproach.NotControlled == false and ControlApproach.Efficency != null">
		<v:message id="valid.unit.process.control.approach.efficency.range" providers="Item.ControlApproach.Efficency">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:condition>

	 <!-- Check for existence of control devices, if required by agency, so they get flagged during Validate Report/Submission -->
	 <!--
	 <v:required test="ControlApproach.EntityControlDevices" when="ControlApproach.NotControlled == false">
		<v:message id="valid.unit.process.control.device.identifier.required" providers="ControlApproach.EntityControlDevices">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:condition test ="ControlApproach.EntityControlDevices.Count > 0" when="(ControlApproach.NotControlled == false) and (ControlApproach.EntityControlDevices != null)">
		<v:message id="valid.unit.process.control.device.identifier.required" providers="ControlApproach.EntityControlDevices">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:condition>
	-->
	 <!-- Required field check for Control Device(s) -->
	 <!--
	 <v:validator test="ControlApproach.EntityControlDevices" type="Sleis.Validation.Spring.ListValidator" when="ControlApproach.NotControlled == false ">
		<v:property name="ProviderFormat" value="Item.ControlApproach.EntityControlDevices[{0}]."/>
		<v:property name="Validator" ref="upUnitProcessControlDeviceValidationRules"  />
	 </v:validator>
	 -->

	 <!-- Check to ensure control devices are not duplicated -->
	 <v:validator test="ControlApproach.EntityControlDevices" type="Sleis.Validation.Spring.UniqueListValidator" when="ControlApproach.NotControlled == false">
		<v:property name="ProviderFormat" value="Item.ControlApproach.EntityControlDevices[{0}]." />
		<v:property name="MessageId" value="valid.unit.process.control.device.identifier.unique" />
		<v:property name="Keys">
		  <dictionary key-type="string" value-type="string">
			 <!--
					 Key: What has to be uique
					 Value: What is the field name to be appended to the ProviderFormat
				-->
			 <entry key="ControlDeviceId" value="ControlDevice.Identifier" />
		  </dictionary>
		</v:property>
	 </v:validator>
  </v:group>


  <v:group id="upUnitProcessControlDeviceValidationRules" >
	 <v:required test="ControlDeviceId">
		<v:message id="valid.unit.process.control.device.identifier.required" providers="ControlDevice.Identifier">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
  </v:group>


  <v:group id="upUnitProcessReleasePointApportionmentValidationRules">
	 <!-- Check for existence of release points, if required by agency, so they get flagged during Validate Report/Submission -->
	 <v:required test="UnitProcessReleasePoints" when="#this is T(Sleis.Models.PublicUnitProcess)">
		<v:message id="valid.unit.process.release.point.id.required" providers="UnitProcessReleasePoints">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:condition test ="UnitProcessReleasePoints.Count > 0" when="(#this is T(Sleis.Models.PublicUnitProcess)) and (UnitProcessReleasePoints != null)">
		<v:message id="valid.unit.process.release.point.id.required" providers="UnitProcessReleasePoints">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:condition>
	 <!-- Validate release point apportionment fields -->
	 <v:validator test="UnitProcessReleasePoints" type="Sleis.Validation.Spring.ListValidator" when="UnitProcessReleasePoints!=null">
		<v:property name="ProviderFormat" value="Item.UnitProcessReleasePoints[{0}]."/>
		<v:property name="Validator" ref="upUnitProcessReleasePointValidationRules" />
	 </v:validator>

	 <!-- Check to ensure release points are not duplicated -->
	 <v:validator test="UnitProcessReleasePoints" type="Sleis.Validation.Spring.UniqueListValidator" when="UnitProcessReleasePoints != null">
		<v:property name="ProviderFormat" value="Item.UnitProcessReleasePoints[{0}]." />
		<v:property name="MessageId" value="valid.unit.process.release.point.unique" />
		<v:property name="Keys">
		  <dictionary key-type="string" value-type="string">
			 <!--
					 Key: What has to be uique
					 Value: What is the field name to be appended to the ProviderFormat
				-->
			 <entry key="ReleasePointId" value="ReleasePointId" />
		  </dictionary>
		</v:property>
	 </v:validator>


	 <!-- Check that release point apportionment total % = 100 -->
	 <v:validator test="UnitProcessReleasePoints" type="Sleis.Validation.Spring.HundredPercentValidator" when="UnitProcessReleasePoints != null and UnitProcessReleasePoints.Count > 0 and UnitProcessReleasePoints[0].ReleasePointId != null and UnitProcessReleasePoints[0].AvgPctEmission != null">
		<v:property name="ProviderFormat" value="Item.UnitProcessReleasePoints[{0}]." />
		<v:property name="MessageId" value="valid.unit.process.release.point.emission.percent.total" />
		<v:property name="Select" value="AvgPctEmission" />
	 </v:validator>

  </v:group>


  <v:group id="upUnitProcessReleasePointValidationRules">
	 <v:required test ="ReleasePointId" when="#this is T(Sleis.Models.PublicUnitProcessReleasePoint)">
		<v:message id="valid.unit.process.release.point.id.required" providers="ReleasePointId">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <!-- Release point identifier required if percent emission specified -->
	 <v:required test ="ReleasePointId" when ="AvgPctEmission != null">
		<v:message id="valid.unit.process.release.point.id.required.when" providers="ReleasePointId">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>

	 <v:required test ="AvgPctEmission" when="#this is T(Sleis.Models.PublicUnitProcessReleasePoint)">
		<v:message id="valid.unit.process.release.point.emission.percent.required" providers="AvgPctEmission">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <!-- Percent emission is required if release point identifier specified -->
	 <v:required test ="AvgPctEmission" when="ReleasePointId != null and ReleasePointId > 0">
		<v:message id="valid.unit.process.release.point.emission.percent.required.when" providers="AvgPctEmission">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:validator id="unitProcessReleasePointApportionmentEfficienctValidator" test="AvgPctEmission.ToString()" type="Sleis.Validation.Spring.DecimalValidator" when="AvgPctEmission != null">
		<v:property name="PrecisionFormat" value="3,0" />
		<v:message id="valid.unit.process.release.point.emission.percent.format" providers="AvgPctEmission">
		  <v:param value="ValidationContxt"/>
		</v:message>
		<v:property name="AllowPartialMatching" value="true"/>
	 </v:validator>
	 <v:condition test ="AvgPctEmission &gt;= 0 and AvgPctEmission &lt;= 100" when="AvgPctEmission != null">
		<v:message id="valid.unit.process.release.point.emission.percent.range" providers="AvgPctEmission">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:condition>
  </v:group>
</objects>