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 "line50":
392                idr = DrawRules.LINE50;
393                break;
394            case "corridor1":
395                idr = DrawRules.CORRIDOR1;
396                break;
397            case "axis1":
398                idr = DrawRules.AXIS1;
399                break;
400            case "axis2":
401                idr = DrawRules.AXIS2;
402                break;
403            case "polyline1":
404                idr = DrawRules.POLYLINE1;
405                break;
406            case "ellipse1":
407                idr = DrawRules.ELLIPSE1;
408                break;
409            case "rectangular1":
410                idr = DrawRules.RECTANGULAR1;
411                break;
412            case "rectangular2":
413                idr = DrawRules.RECTANGULAR2;
414                break;
415            case "rectangular3":
416                idr = DrawRules.RECTANGULAR3;
417                break;
418            case "circular1":
419                idr = DrawRules.CIRCULAR1;
420                break;
421            case "circular2":
422                idr = DrawRules.CIRCULAR2;
423                break;
424            case "arc1":
425                idr = DrawRules.ARC1;
426                break;
427            default:
428                idr = DrawRules.DONOTDRAW;
429        }
430        return idr;
431    }
432
433    public static String parseSymbolSetName(String symbolID)
434    {
435        return parseSymbolSetName(symbolID.substring(4, 6), SymbolID.getVersion(symbolID));
436    }
437    public static String parseSymbolSetName(String ss, int version)
438    {
439        String name = null;
440        switch(ss)
441        {
442            case "01":
443                name = "Air";
444                break;
445            case "02":
446                name = "Air Missile";
447                break;
448            case "05":
449                name = "Space";
450                break;
451            case "06":
452                name = "Space Missile";
453                break;
454            case "10":
455                name = "Land Unit";
456                break;
457            case "11":
458                name = "Land Civilian Unit-Org";
459                break;
460            case "15":
461                name = "Land Equipment";
462                break;
463            case "20":
464                name = "Land Installations";
465                break;
466            case "25":
467                name = "Control Measure";
468                break;
469            case "27":
470                name = "Dismounted Individuals";
471                break;
472            case "30":
473                name = "Sea Surface";
474                break;
475            case "35":
476                name = "Sea Subsurface";
477                break;
478            case "36":
479                name = "Mine Warfare";
480                break;
481            case "40":
482                name = "Activities";
483                break;
484            case "45":
485                name = "Atmospheric";
486                break;
487            case "46":
488                name = "Oceanographic";
489                break;
490            case "47":
491                name = "Meteorological Space";
492                break;
493            case "50":
494                if(version < SymbolID.Version_2525E)
495                    name = "Space SIGINT";
496                else
497                    name = "SIGINT";
498                break;
499            case "51":
500                name = "Air SIGINT";
501                break;
502            case "52":
503                name = "Land SIGINT";
504                break;
505            case "53":
506                name = "Sea Surface SIGINT";
507                break;
508            case "54":
509                name = "Sea Subsurface SIGINT";
510                break;
511            case "60":
512                name = "Cyberspace";
513                break;
514            case "64":
515                name = "Cyberspace Equipment";
516                break;
517            default:
518                name = "UNKNOWN";
519        }
520        return name;
521    }
522
523    /**
524     *
525     * @param drawRule - Like DrawRules.CIRCULAR2
526     * @return int[] where the first index is the minimum required points and
527     * the next index is the maximum allowed points
528     */
529    private static int[] getMinMaxPointsFromDrawRule(int drawRule, int version)
530    {
531        int[] points = {1,1};
532
533        switch(drawRule)
534        {
535            case DrawRules.AREA1:
536            case DrawRules.AREA2:
537            case DrawRules.AREA3:
538            case DrawRules.AREA4:
539            case DrawRules.AREA9:
540            case DrawRules.AREA20:
541            case DrawRules.AREA23:
542                points[0] = 3;
543                points[1] = Integer.MAX_VALUE;
544                break;
545            case DrawRules.AREA5:
546            case DrawRules.AREA7:
547            case DrawRules.AREA11:
548            case DrawRules.AREA12:
549            case DrawRules.AREA17:
550            case DrawRules.AREA21:
551            case DrawRules.AREA24:
552            case DrawRules.AREA25:
553            case DrawRules.AREA27:
554            case DrawRules.POINT12:
555            case DrawRules.LINE3:
556            case DrawRules.LINE6://doesn't seem to be used
557            case DrawRules.LINE10:
558            case DrawRules.LINE12:
559            case DrawRules.LINE17:
560            case DrawRules.LINE22:
561            case DrawRules.LINE23:
562            case DrawRules.LINE24:
563            case DrawRules.LINE29://Ambush
564            case DrawRules.LINE30:
565            case DrawRules.LINE32:
566            case DrawRules.LINE33:
567            case DrawRules.LINE50:
568            case DrawRules.POLYLINE1:
569                points[0] = 3;
570                points[1] = 3;
571                break;
572            case DrawRules.AREA6:
573            case DrawRules.AREA13:
574            case DrawRules.AREA15:
575            case DrawRules.AREA16:
576            case DrawRules.AREA19:
577            case DrawRules.LINE4:
578            case DrawRules.LINE5:
579            case DrawRules.LINE9:
580            case DrawRules.LINE14:
581            case DrawRules.LINE18:
582            case DrawRules.LINE19:
583            case DrawRules.LINE20:
584            case DrawRules.LINE25:
585            case DrawRules.LINE28:
586            case DrawRules.RECTANGULAR1://requires AM
587            case DrawRules.RECTANGULAR3://requires AM
588                points[0] = 2;
589                points[1] = 2;
590                break;
591            case DrawRules.AREA8:
592            case DrawRules.AREA18:
593            case DrawRules.LINE11:
594            case DrawRules.LINE16:
595            case DrawRules.LINE31:
596                points[0] = 4;
597                points[1] = 4;
598                break;
599            case DrawRules.AREA10:
600                points[0] = 3;
601                points[1] = 6;
602                break;
603            case DrawRules.AREA14:
604                points[0] = 3;
605                if (version == SymbolID.Version_2525D)//TODO: remove, only version that supports 4 points
606                    points[1] = 4;
607                else
608                    points[1] = 3;
609                break;
610            case DrawRules.LINE1:
611            case DrawRules.LINE2:
612            case DrawRules.LINE7:
613            case DrawRules.LINE13:
614            case DrawRules.LINE21:
615            case DrawRules.CORRIDOR1://Airspace Control Corridors
616                points[0] = 2;
617                points[1] = Integer.MAX_VALUE;
618                break;
619            case DrawRules.AREA26:
620                //Min 6, no Max but number of points has to be even
621                points[0] = 6;
622                points[1] = Integer.MAX_VALUE;
623                break;
624            case DrawRules.LINE8:
625                points[0] = 2;
626                points[1] = 300;
627                break;
628            case DrawRules.LINE26: //like Screen 25342203
629            case DrawRules.LINE27: //like Seize 25342300
630                if (version >= SymbolID.Version_2525E)//always 4 points
631                    points[0] = 4;
632                else//3 or 4 points total
633                    points[0] = 3;
634                points[1] = 4;
635                break;
636            case DrawRules.AXIS1:
637            case DrawRules.AXIS2:
638                points[0] = 3;
639                points[1] = 50;
640                break;
641            case 0://do not draw
642                points[0] = 0;
643                points[1] = 0;
644                break;
645            //Rest are single points
646            case DrawRules.AREA22://Basic Defense Zone (BDZ) requires AM for radius
647            case DrawRules.POINT17://requires AM & AM1
648            case DrawRules.POINT18://requires AM & AN values
649            case DrawRules.ELLIPSE1://required AM, AM1, AN
650            case DrawRules.RECTANGULAR2://requires AM, AM1, AN
651            default:
652        }
653
654        return points;
655    }
656
657    private static int[] getMinMaxPointsFromMODrawRule(int drawRule)
658    {
659        int[] points = {1,1};
660
661        switch(drawRule)
662        {
663            case MODrawRules.AREA1:
664            case MODrawRules.AREA2:
665            case MODrawRules.LINE5:
666                points[0]=3;
667                points[1]=Integer.MAX_VALUE;
668                break;
669            case MODrawRules.POINT5:
670            case MODrawRules.LINE1:
671            case MODrawRules.LINE2:
672            case MODrawRules.LINE3:
673            case MODrawRules.LINE4:
674            case MODrawRules.LINE6:
675            case MODrawRules.LINE7:
676            case MODrawRules.LINE8:
677                points[0]=2;
678                points[1]=Integer.MAX_VALUE;
679                break;
680            case 0://do not draw
681                points[0] = 0;
682                points[1] = 0;
683                break;
684            //Rest are single points
685            default:
686
687        }
688
689        return points;
690    }
691
692    public int getVersion()
693    {
694        return _Version;
695    }
696    public String getName()
697    {
698        return _Name;
699    }
700
701    public String getPath()
702    {
703        return _Path;
704    }
705
706    public String getGeometry()
707    {
708        return _Geometry;
709    }
710
711    public int getDrawRule()
712    {
713        return _DrawRule;
714    }
715
716    public int getSymbolSet()
717    {
718        return _SymbolSetInt;
719    }
720
721    public int getEntityCode()
722    {
723        return Integer.valueOf(_EntityCode);
724    }
725
726    public String getBasicSymbolID()
727    {
728        if(_SymbolSetInt < 10)
729            return "0" + _SymbolSetInt + _EntityCode;
730        else
731            return _SymbolSetInt + _EntityCode;
732    }
733    public int getMinPointCount()
734    {
735        return _MinPointCount;
736    }
737
738    public int getMaxPointCount()
739    {
740        return _MaxPointCount;
741    }
742
743    public ArrayList<String> getModifiers()
744    {
745        return _Modifiers;
746    }
747
748
749}