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") &&
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 "point1":
239                idr = DrawRules.POINT1;
240                break;
241            case "point2":
242                idr = DrawRules.POINT2;
243                break;
244            case "point3":
245                idr = DrawRules.POINT3;
246                break;
247            case "point4":
248                idr = DrawRules.POINT4;
249                break;
250            case "point5":
251                idr = DrawRules.POINT5;
252                break;
253            case "point6":
254                idr = DrawRules.POINT6;
255                break;
256            case "point7":
257                idr = DrawRules.POINT7;
258                break;
259            case "point8":
260                idr = DrawRules.POINT8;
261                break;
262            case "point9":
263                idr = DrawRules.POINT9;
264                break;
265            case "point10":
266                idr = DrawRules.POINT10;
267                break;
268            case "point11":
269                idr = DrawRules.POINT11;
270                break;
271            case "point12":
272                idr = DrawRules.POINT12;
273                break;
274            case "point13":
275                idr = DrawRules.POINT13;
276                break;
277            case "point14":
278                idr = DrawRules.POINT14;
279                break;
280            case "point15":
281                idr = DrawRules.POINT15;
282                break;
283            case "point16":
284                idr = DrawRules.POINT16;
285                break;
286            case "point17":
287                idr = DrawRules.POINT17;
288                break;
289            case "point18":
290                idr = DrawRules.POINT18;
291                break;
292            case "line1":
293                idr = DrawRules.LINE1;
294                break;
295            case "line2":
296                idr = DrawRules.LINE2;
297                break;
298            case "line3":
299                idr = DrawRules.LINE3;
300                break;
301            case "line4":
302                idr = DrawRules.LINE4;
303                break;
304            case "line5":
305                idr = DrawRules.LINE5;
306                break;
307            case "line6":
308                idr = DrawRules.LINE6;
309                break;
310            case "line7":
311                idr = DrawRules.LINE7;
312                break;
313            case "line8":
314                idr = DrawRules.LINE8;
315                break;
316            case "line9":
317                idr = DrawRules.LINE9;
318                break;
319            case "line10":
320                idr = DrawRules.LINE10;
321                break;
322            case "line11":
323                idr = DrawRules.LINE11;
324                break;
325            case "line12":
326                idr = DrawRules.LINE12;
327                break;
328            case "line13":
329                idr = DrawRules.LINE13;
330                break;
331            case "line14":
332                idr = DrawRules.LINE14;
333                break;
334            case "line15":
335                idr = DrawRules.LINE15;
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 "corridor1":
380                idr = DrawRules.CORRIDOR1;
381                break;
382            case "axis1":
383                idr = DrawRules.AXIS1;
384                break;
385            case "axis2":
386                idr = DrawRules.AXIS2;
387                break;
388            case "polyline1":
389                idr = DrawRules.POLYLINE1;
390                break;
391            case "ellipse1":
392                idr = DrawRules.ELLIPSE1;
393                break;
394            case "rectangular1":
395                idr = DrawRules.RECTANGULAR1;
396                break;
397            case "rectangular2":
398                idr = DrawRules.RECTANGULAR2;
399                break;
400            case "rectangular3":
401                idr = DrawRules.RECTANGULAR3;
402                break;
403            case "circular1":
404                idr = DrawRules.CIRCULAR1;
405                break;
406            case "circular2":
407                idr = DrawRules.CIRCULAR2;
408                break;
409            case "arc1":
410                idr = DrawRules.ARC1;
411                break;
412            default:
413                idr = DrawRules.DONOTDRAW;
414        }
415        return idr;
416    }
417
418    public static String parseSymbolSetName(String symbolID)
419    {
420        return parseSymbolSetName(symbolID.substring(4, 6), SymbolID.getVersion(symbolID));
421    }
422    public static String parseSymbolSetName(String ss, int version)
423    {
424        String name = null;
425        switch(ss)
426        {
427            case "01":
428                name = "Air";
429                break;
430            case "02":
431                name = "Air Missile";
432                break;
433            case "05":
434                name = "Space";
435                break;
436            case "06":
437                name = "Space Missile";
438                break;
439            case "10":
440                name = "Land Unit";
441                break;
442            case "11":
443                name = "Land Civilian Unit-Org";
444                break;
445            case "15":
446                name = "Land Equipment";
447                break;
448            case "20":
449                name = "Land Installations";
450                break;
451            case "25":
452                name = "Control Measure";
453                break;
454            case "27":
455                name = "Dismounted Individuals";
456                break;
457            case "30":
458                name = "Sea Surface";
459                break;
460            case "35":
461                name = "Sea Subsurface";
462                break;
463            case "36":
464                name = "Mine Warfare";
465                break;
466            case "40":
467                name = "Activities";
468                break;
469            case "45":
470                name = "Atmospheric";
471                break;
472            case "46":
473                name = "Oceanographic";
474                break;
475            case "47":
476                name = "Meteorological Space";
477                break;
478            case "50":
479                if(version < SymbolID.Version_2525E)
480                    name = "Space SIGINT";
481                else
482                    name = "SIGINT";
483                break;
484            case "51":
485                name = "Air SIGINT";
486                break;
487            case "52":
488                name = "Land SIGINT";
489                break;
490            case "53":
491                name = "Sea Surface SIGINT";
492                break;
493            case "54":
494                name = "Sea Subsurface SIGINT";
495                break;
496            case "60":
497                name = "Cyberspace";
498                break;
499            default:
500                name = "UNKNOWN";
501        }
502        return name;
503    }
504
505    /**
506     *
507     * @param drawRule - Like DrawRules.CIRCULAR2
508     * @return int[] where the first index is the minimum required points and
509     * the next index is the maximum allowed points
510     */
511    private static int[] getMinMaxPointsFromDrawRule(int drawRule, int version)
512    {
513        int[] points = {1,1};
514
515        switch(drawRule)
516        {
517            case DrawRules.AREA1:
518            case DrawRules.AREA2:
519            case DrawRules.AREA3:
520            case DrawRules.AREA4:
521            case DrawRules.AREA9:
522            case DrawRules.AREA20:
523            case DrawRules.AREA23:
524                points[0] = 3;
525                points[1] = Integer.MAX_VALUE;
526                break;
527            case DrawRules.AREA5:
528            case DrawRules.AREA7:
529            case DrawRules.AREA11:
530            case DrawRules.AREA12:
531            case DrawRules.AREA17:
532            case DrawRules.AREA21:
533            case DrawRules.AREA24:
534            case DrawRules.AREA25:
535            case DrawRules.POINT12:
536            case DrawRules.LINE3:
537            case DrawRules.LINE6://doesn't seem to be used
538            case DrawRules.LINE10:
539            case DrawRules.LINE12:
540            case DrawRules.LINE15:
541            case DrawRules.LINE17:
542            case DrawRules.LINE22:
543            case DrawRules.LINE23:
544            case DrawRules.LINE24:
545            case DrawRules.LINE29://Ambush
546            case DrawRules.POLYLINE1:
547                points[0] = 3;
548                points[1] = 3;
549                break;
550            case DrawRules.AREA6:
551            case DrawRules.AREA13:
552            case DrawRules.AREA15:
553            case DrawRules.AREA16:
554            case DrawRules.AREA19:
555            case DrawRules.LINE4:
556            case DrawRules.LINE5:
557            case DrawRules.LINE9:
558            case DrawRules.LINE14:
559            case DrawRules.LINE18:
560            case DrawRules.LINE19:
561            case DrawRules.LINE20:
562            case DrawRules.LINE25:
563            case DrawRules.LINE28:
564            case DrawRules.RECTANGULAR1://requires AM
565            case DrawRules.RECTANGULAR3://requires AM
566                points[0] = 2;
567                points[1] = 2;
568                break;
569            case DrawRules.AREA8:
570            case DrawRules.AREA18:
571            case DrawRules.LINE11:
572            case DrawRules.LINE16:
573                points[0] = 4;
574                points[1] = 4;
575                break;
576            case DrawRules.AREA10:
577                points[0] = 3;
578                points[1] = 6;
579                break;
580            case DrawRules.AREA14:
581                points[0] = 3;
582                if (version == SymbolID.Version_2525D)
583                    points[1] = 4;
584                else
585                    points[1] = 3;
586                break;
587            case DrawRules.LINE1:
588            case DrawRules.LINE2:
589            case DrawRules.LINE7:
590            case DrawRules.LINE13:
591            case DrawRules.LINE21:
592            case DrawRules.CORRIDOR1://Airspace Control Corridors
593                points[0] = 2;
594                points[1] = Integer.MAX_VALUE;
595                break;
596            case DrawRules.AREA26:
597                //Min 6, no Max but number of points has to be even
598                points[0] = 6;
599                points[1] = Integer.MAX_VALUE;
600                break;
601            case DrawRules.LINE8:
602                points[0] = 2;
603                points[1] = 300;
604                break;
605            case DrawRules.LINE26:
606            case DrawRules.LINE27:
607                if (version >= SymbolID.Version_2525E)
608                    points[0] = 4;
609                else
610                    points[0] = 3;
611                points[1] = 4;
612                break;
613            case DrawRules.AXIS1:
614            case DrawRules.AXIS2:
615                points[0] = 3;
616                points[1] = 50;
617                break;
618            case 0://do not draw
619                points[0] = 0;
620                points[1] = 0;
621                break;
622            //Rest are single points
623            case DrawRules.AREA22://Basic Defense Zone (BDZ) requires AM for radius
624            case DrawRules.POINT17://requires AM & AM1
625            case DrawRules.POINT18://requires AM & AN values
626            case DrawRules.ELLIPSE1://required AM, AM1, AN
627            case DrawRules.RECTANGULAR2://requires AM, AM1, AN
628            default:
629        }
630
631        return points;
632    }
633
634    private static int[] getMinMaxPointsFromMODrawRule(int drawRule)
635    {
636        int[] points = {1,1};
637
638        switch(drawRule)
639        {
640            case MODrawRules.AREA1:
641            case MODrawRules.AREA2:
642            case MODrawRules.LINE5:
643                points[0]=3;
644                points[1]=Integer.MAX_VALUE;
645                break;
646            case MODrawRules.POINT5:
647            case MODrawRules.LINE1:
648            case MODrawRules.LINE2:
649            case MODrawRules.LINE3:
650            case MODrawRules.LINE4:
651            case MODrawRules.LINE6:
652            case MODrawRules.LINE7:
653            case MODrawRules.LINE8:
654                points[0]=2;
655                points[1]=Integer.MAX_VALUE;
656                break;
657            case 0://do not draw
658                points[0] = 0;
659                points[1] = 0;
660                break;
661            //Rest are single points
662            default:
663
664        }
665
666        return points;
667    }
668
669    public int getVersion()
670    {
671        return _Version;
672    }
673    public String getName()
674    {
675        return _Name;
676    }
677
678    public String getPath()
679    {
680        return _Path;
681    }
682
683    public String getGeometry()
684    {
685        return _Geometry;
686    }
687
688    public int getDrawRule()
689    {
690        return _DrawRule;
691    }
692
693    public int getSymbolSet()
694    {
695        return _SymbolSetInt;
696    }
697
698    public int getEntityCode()
699    {
700        return Integer.valueOf(_EntityCode);
701    }
702
703    public String getBasicSymbolID()
704    {
705        if(_SymbolSetInt < 10)
706            return "0" + _SymbolSetInt + _EntityCode;
707        else
708            return _SymbolSetInt + _EntityCode;
709    }
710    public int getMinPointCount()
711    {
712        return _MinPointCount;
713    }
714
715    public int getMaxPointCount()
716    {
717        return _MaxPointCount;
718    }
719
720    public ArrayList<String> getModifiers()
721    {
722        return _Modifiers;
723    }
724
725
726}