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            default:
515                name = "UNKNOWN";
516        }
517        return name;
518    }
519
520    /**
521     *
522     * @param drawRule - Like DrawRules.CIRCULAR2
523     * @return int[] where the first index is the minimum required points and
524     * the next index is the maximum allowed points
525     */
526    private static int[] getMinMaxPointsFromDrawRule(int drawRule, int version)
527    {
528        int[] points = {1,1};
529
530        switch(drawRule)
531        {
532            case DrawRules.AREA1:
533            case DrawRules.AREA2:
534            case DrawRules.AREA3:
535            case DrawRules.AREA4:
536            case DrawRules.AREA9:
537            case DrawRules.AREA20:
538            case DrawRules.AREA23:
539                points[0] = 3;
540                points[1] = Integer.MAX_VALUE;
541                break;
542            case DrawRules.AREA5:
543            case DrawRules.AREA7:
544            case DrawRules.AREA11:
545            case DrawRules.AREA12:
546            case DrawRules.AREA17:
547            case DrawRules.AREA21:
548            case DrawRules.AREA24:
549            case DrawRules.AREA25:
550            case DrawRules.AREA27:
551            case DrawRules.POINT12:
552            case DrawRules.LINE3:
553            case DrawRules.LINE6://doesn't seem to be used
554            case DrawRules.LINE10:
555            case DrawRules.LINE12:
556            case DrawRules.LINE17:
557            case DrawRules.LINE22:
558            case DrawRules.LINE23:
559            case DrawRules.LINE24:
560            case DrawRules.LINE29://Ambush
561            case DrawRules.LINE30:
562            case DrawRules.LINE32:
563            case DrawRules.LINE33:
564            case DrawRules.LINE50:
565            case DrawRules.POLYLINE1:
566                points[0] = 3;
567                points[1] = 3;
568                break;
569            case DrawRules.AREA6:
570            case DrawRules.AREA13:
571            case DrawRules.AREA15:
572            case DrawRules.AREA16:
573            case DrawRules.AREA19:
574            case DrawRules.LINE4:
575            case DrawRules.LINE5:
576            case DrawRules.LINE9:
577            case DrawRules.LINE14:
578            case DrawRules.LINE18:
579            case DrawRules.LINE19:
580            case DrawRules.LINE20:
581            case DrawRules.LINE25:
582            case DrawRules.LINE28:
583            case DrawRules.RECTANGULAR1://requires AM
584            case DrawRules.RECTANGULAR3://requires AM
585                points[0] = 2;
586                points[1] = 2;
587                break;
588            case DrawRules.AREA8:
589            case DrawRules.AREA18:
590            case DrawRules.LINE11:
591            case DrawRules.LINE16:
592            case DrawRules.LINE31:
593                points[0] = 4;
594                points[1] = 4;
595                break;
596            case DrawRules.AREA10:
597                points[0] = 3;
598                points[1] = 6;
599                break;
600            case DrawRules.AREA14:
601                points[0] = 3;
602                if (version == SymbolID.Version_2525D)//TODO: remove, only version that supports 4 points
603                    points[1] = 4;
604                else
605                    points[1] = 3;
606                break;
607            case DrawRules.LINE1:
608            case DrawRules.LINE2:
609            case DrawRules.LINE7:
610            case DrawRules.LINE13:
611            case DrawRules.LINE21:
612            case DrawRules.CORRIDOR1://Airspace Control Corridors
613                points[0] = 2;
614                points[1] = Integer.MAX_VALUE;
615                break;
616            case DrawRules.AREA26:
617                //Min 6, no Max but number of points has to be even
618                points[0] = 6;
619                points[1] = Integer.MAX_VALUE;
620                break;
621            case DrawRules.LINE8:
622                points[0] = 2;
623                points[1] = 300;
624                break;
625            case DrawRules.LINE26:
626            case DrawRules.LINE27:
627                points[0] = 3;
628                if (version >= SymbolID.Version_2525E)
629                    points[1] = 4;
630                else
631                    points[1] = 3;
632                break;
633            case DrawRules.AXIS1:
634            case DrawRules.AXIS2:
635                points[0] = 3;
636                points[1] = 50;
637                break;
638            case 0://do not draw
639                points[0] = 0;
640                points[1] = 0;
641                break;
642            //Rest are single points
643            case DrawRules.AREA22://Basic Defense Zone (BDZ) requires AM for radius
644            case DrawRules.POINT17://requires AM & AM1
645            case DrawRules.POINT18://requires AM & AN values
646            case DrawRules.ELLIPSE1://required AM, AM1, AN
647            case DrawRules.RECTANGULAR2://requires AM, AM1, AN
648            default:
649        }
650
651        return points;
652    }
653
654    private static int[] getMinMaxPointsFromMODrawRule(int drawRule)
655    {
656        int[] points = {1,1};
657
658        switch(drawRule)
659        {
660            case MODrawRules.AREA1:
661            case MODrawRules.AREA2:
662            case MODrawRules.LINE5:
663                points[0]=3;
664                points[1]=Integer.MAX_VALUE;
665                break;
666            case MODrawRules.POINT5:
667            case MODrawRules.LINE1:
668            case MODrawRules.LINE2:
669            case MODrawRules.LINE3:
670            case MODrawRules.LINE4:
671            case MODrawRules.LINE6:
672            case MODrawRules.LINE7:
673            case MODrawRules.LINE8:
674                points[0]=2;
675                points[1]=Integer.MAX_VALUE;
676                break;
677            case 0://do not draw
678                points[0] = 0;
679                points[1] = 0;
680                break;
681            //Rest are single points
682            default:
683
684        }
685
686        return points;
687    }
688
689    public int getVersion()
690    {
691        return _Version;
692    }
693    public String getName()
694    {
695        return _Name;
696    }
697
698    public String getPath()
699    {
700        return _Path;
701    }
702
703    public String getGeometry()
704    {
705        return _Geometry;
706    }
707
708    public int getDrawRule()
709    {
710        return _DrawRule;
711    }
712
713    public int getSymbolSet()
714    {
715        return _SymbolSetInt;
716    }
717
718    public int getEntityCode()
719    {
720        return Integer.valueOf(_EntityCode);
721    }
722
723    public String getBasicSymbolID()
724    {
725        if(_SymbolSetInt < 10)
726            return "0" + _SymbolSetInt + _EntityCode;
727        else
728            return _SymbolSetInt + _EntityCode;
729    }
730    public int getMinPointCount()
731    {
732        return _MinPointCount;
733    }
734
735    public int getMaxPointCount()
736    {
737        return _MaxPointCount;
738    }
739
740    public ArrayList<String> getModifiers()
741    {
742        return _Modifiers;
743    }
744
745
746}