001package armyc2.c5isr.renderer.utilities;
002
003import java.util.ArrayList;
004
005/**
006 * This class holds information about the MilStd Symbol.
007 * Name, geometry, point count, Draw Rule, etc...
008 * Can be retrived from {@link MSLookup}.
009 */
010public class MSInfo {
011
012    private String _ID = null;
013    private String _Name = null;
014    private String _Path = null;
015    private String _SymbolSet = null;
016
017    private int _Version = 0;
018    private int _SymbolSetInt = 0;
019    private String _Entity = null;
020    private String _EntityType = null;
021    private String _EntitySubType = null;
022    private String _EntityCode = null;
023    private String _Geometry = "point";
024    private ArrayList<String> _Modifiers = null;
025    private int _MinPointCount = 0;
026    private int _MaxPointCount = 0;
027    private int _DrawRule = 0;
028
029
030    /**
031     * @param version SymbolID.Version_2525Dhc1 (11), SymbolID.Version_2525E (13)
032     * @param symbolSet the 5th &amp; 6th character in the symbol Code, represents Battle Dimension
033     * @param entity descriptor
034     * @param entityType descriptor
035     * @param entitySubType  descriptor
036     * @param entityCode characters 11 - 16 in the symbol code
037     * @param modifiers String[] of modifier codes
038     */
039    public MSInfo(int version, String symbolSet, String entity, String entityType, String entitySubType, String entityCode, ArrayList<String> modifiers)
040    {
041        _Version = version;
042        _ID = symbolSet + entityCode;
043        _SymbolSetInt = Integer.parseInt(symbolSet);
044        _SymbolSet = parseSymbolSetName(symbolSet,_Version);
045        if(entitySubType != null && !entitySubType.equals(""))
046        {
047            _Name = entitySubType;
048            _EntitySubType = entitySubType;
049            _Path = _SymbolSet + " / " + entity + " / " + entityType + " / ";
050        }
051        if(entityType != null && !entityType.equals(""))
052        {
053            _EntityType = entityType;
054            if(_Name == null)
055                _Name = entityType;
056            if(_Path == null)
057                _Path = _SymbolSet + " / " + entity + " / ";
058        }
059        if(entity != null && !entity.equals(""))
060        {
061            _Entity = entity;
062            if(_Name == null)
063                _Name = entity;
064            if(_Path == null)
065                _Path = _SymbolSet + " / ";
066        }
067        if(entityCode != null & entityCode.length()==6)
068            _EntityCode = entityCode;
069
070        _Geometry = "point";
071
072        //Only Control Measures and METOC categories have draw rules so everything else shows up in here if we
073        //here if we don't check for them.
074        if(/*!entityCode.equals("000000") && */ //commented out to allow top-level unspecified
075                !(_SymbolSetInt == SymbolID.SymbolSet_ControlMeasure ||
076                        _SymbolSetInt == SymbolID.SymbolSet_Atmospheric ||
077                        _SymbolSetInt == SymbolID.SymbolSet_Oceanographic ||
078                        _SymbolSetInt == SymbolID.SymbolSet_MeteorologicalSpace))
079        {
080            _DrawRule = DrawRules.POINT2;
081            _MinPointCount = 1;
082            _MaxPointCount = 1;
083        }
084
085
086        _Modifiers = modifiers;
087        /*if(getSymbolSetInt() != SymbolID.SymbolSet_ControlMeasure)
088        {//values come from files during MSLookup load for Control Measures
089            _Modifiers = populateModifierListD();
090        }*/
091    }
092
093    /**
094     *
095     * @param symbolSet the 5th &amp; 6th character in the symbol Code, represents Battle Dimension
096     * @param entity descriptor
097     * @param entityType descriptor
098     * @param entitySubType  descriptor
099     * @param entityCode characters 11 - 16 in the symbol code
100     * @param geometry "point", "line", "area"
101     * @param drawRule as defined in 2525D for Control Measures and METOC (i.e. "Point1")
102     */
103    public MSInfo(int version, String symbolSet, String entity, String entityType, String entitySubType, String entityCode, String geometry, String drawRule, ArrayList<String> modifiers)
104    {
105        _Version = version;
106        _ID = symbolSet + entityCode;
107        _SymbolSetInt = Integer.parseInt(symbolSet);
108        _SymbolSet = parseSymbolSetName(symbolSet,_Version);
109        if(entitySubType != null && !entitySubType.equals(""))
110        {
111            _Name = entitySubType;
112            _EntitySubType = entitySubType;
113            _Path = _SymbolSet + " / " + entity + " / " + entityType + " / ";
114        }
115        if(entityType != null && !entityType.equals(""))
116        {
117            _EntityType = entityType;
118            if(_Name == null)
119                _Name = entityType;
120            if(_Path == null)
121                _Path = _SymbolSet + " / " + entity + " / ";
122        }
123        if(entity != null && !entity.equals(""))
124        {
125            _Entity = entity;
126            if(_Name == null)
127                _Name = entity;
128            if(_Path == null)
129                _Path = _SymbolSet + " / ";
130        }
131        if(entityCode != null & entityCode.length()==6)
132            _EntityCode = entityCode;
133
134        _Geometry = geometry;
135
136        _DrawRule = parseDrawRule(drawRule);
137
138        int[] pointCounts = null;
139        if(symbolSet.equals("25"))
140        {
141            pointCounts = getMinMaxPointsFromDrawRule(_DrawRule, version);
142        }
143        else if(symbolSet.equals("45") || symbolSet.equals("46"))
144        {//Atmospheric, Oceanographic, Meteorological Space (last one has no symbols so not included)
145            pointCounts = getMinMaxPointsFromMODrawRule(_DrawRule);
146        }
147        _MinPointCount = pointCounts[0];
148        _MaxPointCount = pointCounts[1];
149
150        _Modifiers = modifiers;
151
152    }
153
154    private int parseDrawRule(String drawRule)
155    {
156        String dr = drawRule.toLowerCase();
157        int idr = 0;
158        switch(dr)
159        {
160            case "area1":
161                idr = DrawRules.AREA1;
162                break;
163            case "area2":
164                idr = DrawRules.AREA2;
165                break;
166            case "area3":
167                idr = DrawRules.AREA3;
168                break;
169            case "area4":
170                idr = DrawRules.AREA4;
171                break;
172            case "area5":
173                idr = DrawRules.AREA5;
174                break;
175            case "area6":
176                idr = DrawRules.AREA6;
177                break;
178            case "area7":
179                idr = DrawRules.AREA7;
180                break;
181            case "area8":
182                idr = DrawRules.AREA8;
183                break;
184            case "area9":
185                idr = DrawRules.AREA9;
186                break;
187            case "area10":
188                idr = DrawRules.AREA10;
189                break;
190            case "area11":
191                idr = DrawRules.AREA11;
192                break;
193            case "area12":
194                idr = DrawRules.AREA12;
195                break;
196            case "area13":
197                idr = DrawRules.AREA13;
198                break;
199            case "area14":
200                idr = DrawRules.AREA14;
201                break;
202            case "area15":
203                idr = DrawRules.AREA15;
204                break;
205            case "area16":
206                idr = DrawRules.AREA16;
207                break;
208            case "area17":
209                idr = DrawRules.AREA17;
210                break;
211            case "area18":
212                idr = DrawRules.AREA18;
213                break;
214            case "area19":
215                idr = DrawRules.AREA19;
216                break;
217            case "area20":
218                idr = DrawRules.AREA20;
219                break;
220            case "area21":
221                idr = DrawRules.AREA21;
222                break;
223            case "area22":
224                idr = DrawRules.AREA22;
225                break;
226            case "area23":
227                idr = DrawRules.AREA23;
228                break;
229            case "area24":
230                idr = DrawRules.AREA24;
231                break;
232            case "area25":
233                idr = DrawRules.AREA25;
234                break;
235            case "area26":
236                idr = DrawRules.AREA26;
237                break;
238            case "area27":
239                idr = DrawRules.AREA27;
240                break;
241            case "point1":
242                idr = DrawRules.POINT1;
243                break;
244            case "point2":
245                idr = DrawRules.POINT2;
246                break;
247            case "point3":
248                idr = DrawRules.POINT3;
249                break;
250            case "point4":
251                idr = DrawRules.POINT4;
252                break;
253            case "point5":
254                idr = DrawRules.POINT5;
255                break;
256            case "point6":
257                idr = DrawRules.POINT6;
258                break;
259            case "point7":
260                idr = DrawRules.POINT7;
261                break;
262            case "point8":
263                idr = DrawRules.POINT8;
264                break;
265            case "point9":
266                idr = DrawRules.POINT9;
267                break;
268            case "point10":
269                idr = DrawRules.POINT10;
270                break;
271            case "point11":
272                idr = DrawRules.POINT11;
273                break;
274            case "point12":
275                idr = DrawRules.POINT12;
276                break;
277            case "point13":
278                idr = DrawRules.POINT13;
279                break;
280            case "point14":
281                idr = DrawRules.POINT14;
282                break;
283            case "point15":
284                idr = DrawRules.POINT15;
285                break;
286            case "point16":
287                idr = DrawRules.POINT16;
288                break;
289            case "point17":
290                idr = DrawRules.POINT17;
291                break;
292            case "point18":
293                idr = DrawRules.POINT18;
294                break;
295            case "line1":
296                idr = DrawRules.LINE1;
297                break;
298            case "line2":
299                idr = DrawRules.LINE2;
300                break;
301            case "line3":
302                idr = DrawRules.LINE3;
303                break;
304            case "line4":
305                idr = DrawRules.LINE4;
306                break;
307            case "line5":
308                idr = DrawRules.LINE5;
309                break;
310            case "line6":
311                idr = DrawRules.LINE6;
312                break;
313            case "line7":
314                idr = DrawRules.LINE7;
315                break;
316            case "line8":
317                idr = DrawRules.LINE8;
318                break;
319            case "line9":
320                idr = DrawRules.LINE9;
321                break;
322            case "line10":
323                idr = DrawRules.LINE10;
324                break;
325            case "line11":
326                idr = DrawRules.LINE11;
327                break;
328            case "line12":
329                idr = DrawRules.LINE12;
330                break;
331            case "line13":
332                idr = DrawRules.LINE13;
333                break;
334            case "line14":
335                idr = DrawRules.LINE14;
336                break;
337            case "line16":
338                idr = DrawRules.LINE16;
339                break;
340            case "line17":
341                idr = DrawRules.LINE17;
342                break;
343            case "line18":
344                idr = DrawRules.LINE18;
345                break;
346            case "line19":
347                idr = DrawRules.LINE19;
348                break;
349            case "line20":
350                idr = DrawRules.LINE20;
351                break;
352            case "line21":
353                idr = DrawRules.LINE21;
354                break;
355            case "line22":
356                idr = DrawRules.LINE22;
357                break;
358            case "line23":
359                idr = DrawRules.LINE23;
360                break;
361            case "line24":
362                idr = DrawRules.LINE24;
363                break;
364            case "line25":
365                idr = DrawRules.LINE25;
366                break;
367            case "line26":
368                idr = DrawRules.LINE26;
369                break;
370            case "line27":
371                idr = DrawRules.LINE27;
372                break;
373            case "line28":
374                idr = DrawRules.LINE28;
375                break;
376            case "line29":
377                idr = DrawRules.LINE29;
378                break;
379            case "line30":
380                idr = DrawRules.LINE30;
381                break;
382            case "line31":
383                idr = DrawRules.LINE31;
384                break;
385            case "line32":
386                idr = DrawRules.LINE32;
387                break;
388            case "line33":
389                idr = DrawRules.LINE33;
390                break;
391            case "corridor1":
392                idr = DrawRules.CORRIDOR1;
393                break;
394            case "axis1":
395                idr = DrawRules.AXIS1;
396                break;
397            case "axis2":
398                idr = DrawRules.AXIS2;
399                break;
400            case "polyline1":
401                idr = DrawRules.POLYLINE1;
402                break;
403            case "ellipse1":
404                idr = DrawRules.ELLIPSE1;
405                break;
406            case "rectangular1":
407                idr = DrawRules.RECTANGULAR1;
408                break;
409            case "rectangular2":
410                idr = DrawRules.RECTANGULAR2;
411                break;
412            case "rectangular3":
413                idr = DrawRules.RECTANGULAR3;
414                break;
415            case "circular1":
416                idr = DrawRules.CIRCULAR1;
417                break;
418            case "circular2":
419                idr = DrawRules.CIRCULAR2;
420                break;
421            case "arc1":
422                idr = DrawRules.ARC1;
423                break;
424            default:
425                idr = DrawRules.DONOTDRAW;
426        }
427        return idr;
428    }
429
430    public static String parseSymbolSetName(String symbolID)
431    {
432        return parseSymbolSetName(symbolID.substring(4, 6), SymbolID.getVersion(symbolID));
433    }
434    public static String parseSymbolSetName(String ss, int version)
435    {
436        String name = null;
437        switch(ss)
438        {
439            case "01":
440                name = "Air";
441                break;
442            case "02":
443                name = "Air Missile";
444                break;
445            case "05":
446                name = "Space";
447                break;
448            case "06":
449                name = "Space Missile";
450                break;
451            case "10":
452                name = "Land Unit";
453                break;
454            case "11":
455                name = "Land Civilian Unit-Org";
456                break;
457            case "15":
458                name = "Land Equipment";
459                break;
460            case "20":
461                name = "Land Installations";
462                break;
463            case "25":
464                name = "Control Measure";
465                break;
466            case "27":
467                name = "Dismounted Individuals";
468                break;
469            case "30":
470                name = "Sea Surface";
471                break;
472            case "35":
473                name = "Sea Subsurface";
474                break;
475            case "36":
476                name = "Mine Warfare";
477                break;
478            case "40":
479                name = "Activities";
480                break;
481            case "45":
482                name = "Atmospheric";
483                break;
484            case "46":
485                name = "Oceanographic";
486                break;
487            case "47":
488                name = "Meteorological Space";
489                break;
490            case "50":
491                if(version < SymbolID.Version_2525E)
492                    name = "Space SIGINT";
493                else
494                    name = "SIGINT";
495                break;
496            case "51":
497                name = "Air SIGINT";
498                break;
499            case "52":
500                name = "Land SIGINT";
501                break;
502            case "53":
503                name = "Sea Surface SIGINT";
504                break;
505            case "54":
506                name = "Sea Subsurface SIGINT";
507                break;
508            case "60":
509                name = "Cyberspace";
510                break;
511            default:
512                name = "UNKNOWN";
513        }
514        return name;
515    }
516
517    /**
518     *
519     * @param drawRule - Like DrawRules.CIRCULAR2
520     * @return int[] where the first index is the minimum required points and
521     * the next index is the maximum allowed points
522     */
523    private static int[] getMinMaxPointsFromDrawRule(int drawRule, int version)
524    {
525        int[] points = {1,1};
526
527        switch(drawRule)
528        {
529            case DrawRules.AREA1:
530            case DrawRules.AREA2:
531            case DrawRules.AREA3:
532            case DrawRules.AREA4:
533            case DrawRules.AREA9:
534            case DrawRules.AREA20:
535            case DrawRules.AREA23:
536                points[0] = 3;
537                points[1] = Integer.MAX_VALUE;
538                break;
539            case DrawRules.AREA5:
540            case DrawRules.AREA7:
541            case DrawRules.AREA11:
542            case DrawRules.AREA12:
543            case DrawRules.AREA17:
544            case DrawRules.AREA21:
545            case DrawRules.AREA24:
546            case DrawRules.AREA25:
547            case DrawRules.AREA27:
548            case DrawRules.POINT12:
549            case DrawRules.LINE3:
550            case DrawRules.LINE6://doesn't seem to be used
551            case DrawRules.LINE10:
552            case DrawRules.LINE12:
553            case DrawRules.LINE17:
554            case DrawRules.LINE22:
555            case DrawRules.LINE23:
556            case DrawRules.LINE24:
557            case DrawRules.LINE29://Ambush
558            case DrawRules.LINE30:
559            case DrawRules.LINE32:
560            case DrawRules.LINE33:
561            case DrawRules.POLYLINE1:
562                points[0] = 3;
563                points[1] = 3;
564                break;
565            case DrawRules.AREA6:
566            case DrawRules.AREA13:
567            case DrawRules.AREA15:
568            case DrawRules.AREA16:
569            case DrawRules.AREA19:
570            case DrawRules.LINE4:
571            case DrawRules.LINE5:
572            case DrawRules.LINE9:
573            case DrawRules.LINE14:
574            case DrawRules.LINE18:
575            case DrawRules.LINE19:
576            case DrawRules.LINE20:
577            case DrawRules.LINE25:
578            case DrawRules.LINE28:
579            case DrawRules.RECTANGULAR1://requires AM
580            case DrawRules.RECTANGULAR3://requires AM
581                points[0] = 2;
582                points[1] = 2;
583                break;
584            case DrawRules.AREA8:
585            case DrawRules.AREA18:
586            case DrawRules.LINE11:
587            case DrawRules.LINE16:
588            case DrawRules.LINE31:
589                points[0] = 4;
590                points[1] = 4;
591                break;
592            case DrawRules.AREA10:
593                points[0] = 3;
594                points[1] = 6;
595                break;
596            case DrawRules.AREA14:
597                points[0] = 3;
598                if (version == SymbolID.Version_2525D)
599                    points[1] = 4;
600                else
601                    points[1] = 3;
602                break;
603            case DrawRules.LINE1:
604            case DrawRules.LINE2:
605            case DrawRules.LINE7:
606            case DrawRules.LINE13:
607            case DrawRules.LINE21:
608            case DrawRules.CORRIDOR1://Airspace Control Corridors
609                points[0] = 2;
610                points[1] = Integer.MAX_VALUE;
611                break;
612            case DrawRules.AREA26:
613                //Min 6, no Max but number of points has to be even
614                points[0] = 6;
615                points[1] = Integer.MAX_VALUE;
616                break;
617            case DrawRules.LINE8:
618                points[0] = 2;
619                points[1] = 300;
620                break;
621            case DrawRules.LINE26:
622            case DrawRules.LINE27:
623                if (version >= SymbolID.Version_2525E)
624                    points[0] = 4;
625                else
626                    points[0] = 3;
627                points[1] = 4;
628                break;
629            case DrawRules.AXIS1:
630            case DrawRules.AXIS2:
631                points[0] = 3;
632                points[1] = 50;
633                break;
634            case 0://do not draw
635                points[0] = 0;
636                points[1] = 0;
637                break;
638            //Rest are single points
639            case DrawRules.AREA22://Basic Defense Zone (BDZ) requires AM for radius
640            case DrawRules.POINT17://requires AM & AM1
641            case DrawRules.POINT18://requires AM & AN values
642            case DrawRules.ELLIPSE1://required AM, AM1, AN
643            case DrawRules.RECTANGULAR2://requires AM, AM1, AN
644            default:
645        }
646
647        return points;
648    }
649
650    private static int[] getMinMaxPointsFromMODrawRule(int drawRule)
651    {
652        int[] points = {1,1};
653
654        switch(drawRule)
655        {
656            case MODrawRules.AREA1:
657            case MODrawRules.AREA2:
658            case MODrawRules.LINE5:
659                points[0]=3;
660                points[1]=Integer.MAX_VALUE;
661                break;
662            case MODrawRules.POINT5:
663            case MODrawRules.LINE1:
664            case MODrawRules.LINE2:
665            case MODrawRules.LINE3:
666            case MODrawRules.LINE4:
667            case MODrawRules.LINE6:
668            case MODrawRules.LINE7:
669            case MODrawRules.LINE8:
670                points[0]=2;
671                points[1]=Integer.MAX_VALUE;
672                break;
673            case 0://do not draw
674                points[0] = 0;
675                points[1] = 0;
676                break;
677            //Rest are single points
678            default:
679
680        }
681
682        return points;
683    }
684
685    public int getVersion()
686    {
687        return _Version;
688    }
689    public String getName()
690    {
691        return _Name;
692    }
693
694    public String getPath()
695    {
696        return _Path;
697    }
698
699    public String getGeometry()
700    {
701        return _Geometry;
702    }
703
704    public int getDrawRule()
705    {
706        return _DrawRule;
707    }
708
709    public int getSymbolSet()
710    {
711        return _SymbolSetInt;
712    }
713
714    public int getEntityCode()
715    {
716        return Integer.valueOf(_EntityCode);
717    }
718
719    public String getBasicSymbolID()
720    {
721        if(_SymbolSetInt < 10)
722            return "0" + _SymbolSetInt + _EntityCode;
723        else
724            return _SymbolSetInt + _EntityCode;
725    }
726    public int getMinPointCount()
727    {
728        return _MinPointCount;
729    }
730
731    public int getMaxPointCount()
732    {
733        return _MaxPointCount;
734    }
735
736    public ArrayList<String> getModifiers()
737    {
738        return _Modifiers;
739    }
740
741
742}