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    }