001 package edu.nrao.sss.model.source; 002 003 import java.util.ArrayList; 004 import java.util.List; 005 006 import edu.nrao.sss.astronomy.EphemerisTable; 007 import edu.nrao.sss.astronomy.PolynomialPositionTable; 008 import edu.nrao.sss.astronomy.SkyPosition; 009 import edu.nrao.sss.astronomy.SolarSystemBodyPosition; 010 import edu.nrao.sss.validation.AbstractValidator; 011 import edu.nrao.sss.validation.FailureSeverity; 012 import edu.nrao.sss.validation.Validation; 013 import edu.nrao.sss.validation.ValidationPurpose; 014 015 /** 016 * A validator of {@link Subsource subsources}. 017 * <p> 018 * <u>Validations Performed for All Purposes</u> 019 * <ol> 020 * <li>Subsource has position information.</li> 021 * </ol></p> 022 * <p> 023 * <b>Version Info:</b> 024 * <table style="margin-left:2em"> 025 * <tr><td>$Revision: 581 $</td></tr> 026 * <tr><td>$Date: 2007-05-03 09:41:40 -0600 (Thu, 03 May 2007) $</td></tr> 027 * <tr><td>$Author: btruitt $</td></tr> 028 * </table></p> 029 * 030 * @author David M. Harland 031 * @since 2007-02-05 032 */ 033 public class SubsourceValidator 034 extends AbstractValidator<Subsource> 035 { 036 /** Creates a new instance. */ 037 public SubsourceValidator() 038 { 039 super(SubsourceValidator.class.getName(), Subsource.class); 040 } 041 042 /* (non-Javadoc) 043 * @see AbstractValidator#makeValidationList(ValidationPurpose) 044 */ 045 @Override 046 protected List<Validation<Subsource>> 047 makeValidationList(ValidationPurpose purpose) 048 { 049 List<Validation<Subsource>> validations = 050 new ArrayList<Validation<Subsource>>(); 051 052 validations.add(new PositionValidation(this, purpose)); 053 054 return validations; 055 } 056 057 //============================================================================ 058 // ENSURES SUBSOURCE HAS AT LEAST ONE PIECE OF POSITION INFORMATION 059 //============================================================================ 060 061 class PositionValidation extends Validation<Subsource> 062 { 063 private String missingPositionPhrase; 064 065 protected PositionValidation( 066 AbstractValidator<Subsource> validationContainer, 067 ValidationPurpose reasonForValidation) 068 { 069 super(validationContainer, reasonForValidation); 070 071 severity = 072 (reasonForValidation == ValidationPurpose.CERTIFY_READY_TO_USE) ? 073 FailureSeverity.ERROR : FailureSeverity.WARNING; 074 } 075 076 /** This test is passed if there is some kind of position information. */ 077 @Override 078 protected boolean passesTest() 079 { 080 boolean passes; 081 082 SkyPosition position = target.getPosition(); 083 084 switch (position.getType()) 085 { 086 case EPHEMERIS_TABLE: 087 passes = (((EphemerisTable)position).size() > 0); 088 if (!passes) 089 missingPositionPhrase = "' has empty ephemeris table."; 090 break; 091 092 case INTERNAL_EPHEMERIS: 093 String name = ((SolarSystemBodyPosition)position).getBodyName(); 094 passes = (name != null && !name.equals("")); 095 if (!passes) 096 missingPositionPhrase = "' solar system body name."; 097 break; 098 099 case ORBITAL_ELEMENTS: 100 passes = true; 101 if (!passes) 102 missingPositionPhrase = "' has no orbital elements."; 103 break; 104 105 case SIMPLE: 106 passes = true; 107 if (!passes) 108 missingPositionPhrase = "' has no position information."; 109 break; 110 111 case POLYNOMIAL: 112 passes = true; 113 if (!passes) 114 missingPositionPhrase = "' has no position information."; 115 break; 116 117 case POLYNOMIAL_TABLE: 118 passes = (((PolynomialPositionTable)position).size() > 0); 119 if (!passes) 120 missingPositionPhrase = "' has no position information."; 121 break; 122 123 default: 124 passes = false; 125 } 126 127 return passes; 128 } 129 130 /* (non-Javadoc) 131 * @see edu.nrao.sss.validation.Validation#displayMessage() 132 */ 133 @Override 134 protected String displayMessage() 135 { 136 StringBuilder buff = new StringBuilder("Subsource '"); 137 138 buff.append(target.getName()).append(missingPositionPhrase); 139 140 if (purpose == ValidationPurpose.CERTIFY_READY_TO_USE) 141 { 142 buff.append(" You may not use this source until after you have "); 143 buff.append("furnished position information."); 144 } 145 else 146 { 147 buff.append(" While you may leave the subsource in this state for "); 148 buff.append("now, you will need to add position information before "); 149 buff.append("being permitted to use this source elsewhere."); 150 } 151 152 return buff.toString(); 153 } 154 155 /* (non-Javadoc) 156 * @see edu.nrao.sss.validation.Validation#debugMessage() 157 */ 158 @Override 159 protected String debugMessage() 160 { 161 StringBuilder buff = 162 new StringBuilder("No position information found for subsource "); 163 164 buff.append(target.getName()).append(" Expected info of type ") 165 .append(target.getPosition().getType().name()).append('.'); 166 167 return buff.toString(); 168 } 169 } 170 }