001package armyc2.c5isr.renderer.utilities;
002
003import android.content.Context;
004import android.os.Build;
005
006import java.io.BufferedReader;
007import java.io.InputStream;
008import java.io.InputStreamReader;
009import java.util.ArrayList;
010import java.util.HashMap;
011import java.util.List;
012import java.util.Map;
013import java.util.logging.Level;
014
015import armyc2.c5isr.renderer.R;
016
017/**
018 * Class that holds all the {@link MSInfo} objects with symbol information
019 */
020public class MSLookup {
021
022    private static MSLookup _instance = null;
023    private static Boolean _initCalled = false;
024
025    private static Map<String, MSInfo> _MSLookupD = null;
026    private static Map<String, MSInfo> _MSLookupE = null;
027    private String TAG = "MSLookup";
028    private List<String> _IDListD = null;
029    private List<String> _IDListE = null;
030
031
032    /*
033     * Holds SymbolDefs for all symbols. (basicSymbolID, Description, MinPoint, MaxPoints, etc...) Call
034     * getInstance().
035     *
036     */
037    private MSLookup() {
038        // init(null);
039        // _initCalled=true;
040    }
041
042    public static synchronized MSLookup getInstance() {
043        if (_instance == null) {
044            _instance = new MSLookup();
045        }
046
047        return _instance;
048    }
049
050    public final synchronized void init(Context context)
051    {
052        if (_initCalled == false)
053        {
054            _MSLookupD = new HashMap<>();
055            _MSLookupE = new HashMap<>();
056            _IDListD = new ArrayList<>();
057            _IDListE = new ArrayList<>();
058
059            try
060            {
061                InputStream isD = context.getResources().openRawResource(R.raw.msd);
062                InputStream isE = context.getResources().openRawResource(R.raw.mse);
063
064                BufferedReader brD = new BufferedReader(new InputStreamReader(isD));
065                populateLookup(brD, SymbolID.Version_2525Dch1);
066                brD.close();
067
068                BufferedReader brE = new BufferedReader(new InputStreamReader(isE));
069                populateLookup(brE, SymbolID.Version_2525E);
070                brE.close();
071
072                _initCalled = true;
073            }
074            catch (Exception e)
075            {
076                System.out.println(e.getMessage());
077            }
078        }
079    }
080
081    private void populateLookup(BufferedReader br, int version)
082    {
083        Map<String, MSInfo> lookup;
084        List<String> list;
085        String[] temp = null;
086        String delimiter = "\t";
087
088        try
089        {
090            if(version >= SymbolID.Version_2525E) {
091                lookup = _MSLookupE;
092                list = _IDListE;
093            }
094            else//2525Dch1
095            {
096                lookup = _MSLookupD;
097                list = _IDListD;
098            }
099
100            String id = null;
101            String ss = null;
102            int intSS = 0;
103            String e = null;
104            String et = null;
105            String est = null;
106            String ec = null;
107            String g = null;
108            String dr = null;
109            String m = null;
110            String[] modifiers = null;
111
112            String line = br.readLine();
113            while (line != null) {
114                //parse first line
115                temp = line.split(delimiter);
116
117                if(temp.length < 5)
118                    ec = "000000";
119                else
120                    ec = temp[4];
121                if(ec.equals("0"))
122                    ec = "000000";
123
124                if(temp.length < 4)
125                    est = "";
126                else
127                    est = temp[3];
128                if(temp.length < 3)
129                    et = "";
130                else if(est.equals(""))
131                    et = temp[2];
132                if(temp.length < 2)
133                    e = "";
134                else if(et.equals(""))
135                    e = temp[1];
136
137                if(!temp[0].equals(""))
138                    ss = temp[0];
139
140                id = ss + ec;
141
142                intSS = Integer.parseInt(ss);
143                if(!ec.equals("000000"))
144                {
145                    if (temp.length >= 7)
146                    {//Control Measures and METOCS
147                        if(temp.length >= 8)
148                        {
149                            m = temp[7];//modifiers
150                            if(m != null && !m.equals(""))
151                                //m = m.replace("\"","");
152                                modifiers = m.split(",");
153                            else
154                                modifiers = null;
155                        }
156                        g = temp[5];//geometry
157                        dr = temp[6];//draw rule
158                        lookup.put(id, new MSInfo(version, ss, e, et, est, ec, g, dr, populateModifierList(modifiers)));
159                    }
160                    else
161                    {//Everything else
162                        //_MSLookupD.put(id, new MSInfo(ss, e, et, est, ec));
163                        lookup.put(id, new MSInfo(version, ss, e, et, est, ec,populateModifierList(ss,ec, version)));
164                    }
165                    list.add(id);
166                }
167                else if(intSS != SymbolID.SymbolSet_ControlMeasure &&
168                        intSS != SymbolID.SymbolSet_Atmospheric &&
169                        intSS != SymbolID.SymbolSet_Oceanographic &&
170                        intSS != SymbolID.SymbolSet_MeteorologicalSpace)
171                {
172                    lookup.put(id, new MSInfo(version, ss, e, et, est, ec, populateModifierList(ss, ec, version)));
173                    list.add(id);
174                }
175
176                modifiers = null;
177
178                //read next line for next loop
179                line = br.readLine();
180            }
181
182            if(version < SymbolID.Version_2525E)//add handful of SymbolID.Version_2525D codes to lookup
183            {
184                AddVersion10Symbols(lookup);
185            }
186
187        }
188        catch(Exception exc)
189        {
190            System.out.println(exc.getMessage());
191        }
192
193    }
194
195    private void AddVersion10Symbols(Map<String,MSInfo> lookup)
196    {
197        String id = null;
198        String ss = null;
199        int intSS = 0;
200        String e = null;
201        String et = null;
202        String est = null;
203        String ec = null;
204        String g = null;
205        String dr = null;
206        String m = null;
207        String[] modifiers = null;
208
209        String[] units = {"120300", "161900", "162200", "162600", "162700", "163400", "163800", "163900", "164100", "164700"};
210        String[] similar = {"120200", "161800", "161800", "161800", "161800", "161800", "161800", "161800", "161800", "161800"};
211        String[] unitNames = {"Amphibious",
212                "NATO Supply Class II",
213                "NATO Supply Class V",
214                "Pipeline",
215                "Postal",
216                "Supply",
217                "US Supply Class II",
218                "US Supply Class III",
219                "US Supply Class IV",
220                "Water"};
221
222        MSInfo msiTemp = null;
223        ss = "10";
224        for(int i = 0; i < units.length; i++)
225        {
226            msiTemp = lookup.get("10" + similar[i]);
227            String[] path = msiTemp.getPath().split("/");
228
229            ss = path[0];
230            if(path.length>2)
231                e = path[1];
232            if(path.length>3)
233                et = path[2];
234
235            if(e == null || e.equals(""))
236                e = unitNames[i];
237            else if(et == null || et.equals(""))
238                et = unitNames[i];
239            else
240                est = unitNames[i];
241
242            ec = units[i];
243
244            lookup.put(10 + ec, new MSInfo(SymbolID.Version_2525D, "10", e, et, est, ec, populateModifierList("10",ec, SymbolID.Version_2525Dch1)));
245        }
246        est = "";
247
248        lookup.put("25214000", new MSInfo(SymbolID.Version_2525D, "25", "Maritime Control Points", "Forward Observer - Spotter Position", est, "214000", "Point","Point2",populateModifierList("25","214000", SymbolID.Version_2525Dch1)));
249        //3 point Bridge not implemented
250        //lookup.put("25271400", new MSInfo(SymbolID.Version_2525D, "25", "Protection Areas", "Bridge", est, "271400", "Line","Line16",populateModifierList("25","271400", SymbolID.Version_2525Dch1)));
251
252    }
253
254    private ArrayList<String> populateModifierList(String[] modifiers)
255    {
256        ArrayList<String> mods = new ArrayList<String>();
257        if(modifiers != null && modifiers.length > 0)
258        {
259            for (String mod : modifiers)
260            {
261                mods.add(Modifiers.getModifierKey(mod));
262            }
263        }
264        return mods;
265    }
266
267    private ArrayList<String> populateModifierList(String symbolSet, String ec, int version)
268    {
269        int ss = Integer.valueOf(symbolSet);
270        ArrayList<String> modifiers = new ArrayList<String>();
271
272        if(version >= SymbolID.Version_2525E)
273        {
274            switch (ss) {
275                case SymbolID.SymbolSet_LandUnit:
276                case SymbolID.SymbolSet_LandCivilianUnit_Organization:
277                    modifiers.add(Modifiers.A_SYMBOL_ICON);
278                    modifiers.add(Modifiers.B_ECHELON);
279                    modifiers.add(Modifiers.C_QUANTITY);
280                    modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
281                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
282                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
283                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
284                    modifiers.add(Modifiers.J_EVALUATION_RATING);
285                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
286                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
287                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
288                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
289                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
290                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
291                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
292                    modifiers.add(Modifiers.W_DTG_1);
293                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
294                    modifiers.add(Modifiers.Y_LOCATION);
295                    modifiers.add(Modifiers.Z_SPEED);
296                    if(ss==SymbolID.SymbolSet_LandUnit && ec.equals("110000"))
297                        modifiers.add(Modifiers.AA_SPECIAL_C2_HQ);
298                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
299                    modifiers.add(Modifiers.AD_PLATFORM_TYPE);
300                    modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);
301                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
302                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
303                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
304                    modifiers.add(Modifiers.AK_PAIRING_LINE);
305                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
306                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
307                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
308                    modifiers.add(Modifiers.AS_COUNTRY);
309                    break;
310                case SymbolID.SymbolSet_LandEquipment:
311                case SymbolID.SymbolSet_SignalsIntelligence_Land:
312                    modifiers.add(Modifiers.A_SYMBOL_ICON);
313                    modifiers.add(Modifiers.C_QUANTITY);
314                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
315                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
316                    modifiers.add(Modifiers.J_EVALUATION_RATING);
317                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
318                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
319                    modifiers.add(Modifiers.N_HOSTILE);
320                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
321                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
322                    modifiers.add(Modifiers.R_MOBILITY_INDICATOR);
323                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
324                    modifiers.add(Modifiers.V_EQUIP_TYPE);
325                    modifiers.add(Modifiers.W_DTG_1);
326                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
327                    modifiers.add(Modifiers.Y_LOCATION);
328                    modifiers.add(Modifiers.Z_SPEED);
329                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
330                    modifiers.add(Modifiers.AD_PLATFORM_TYPE);
331                    modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);
332                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
333                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
334                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
335                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
336                    modifiers.add(Modifiers.AK_PAIRING_LINE);
337                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
338                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
339                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
340                    modifiers.add(Modifiers.AS_COUNTRY);
341                    break;
342                case SymbolID.SymbolSet_LandInstallation:
343                    modifiers.add(Modifiers.A_SYMBOL_ICON);
344                    modifiers.add(Modifiers.C_QUANTITY);
345                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
346                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
347                    modifiers.add(Modifiers.J_EVALUATION_RATING);
348                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
349                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
350                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
351                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
352                    modifiers.add(Modifiers.W_DTG_1);
353                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
354                    modifiers.add(Modifiers.Y_LOCATION);
355                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
356                    modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);
357                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
358                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
359                    modifiers.add(Modifiers.AK_PAIRING_LINE);
360                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
361                    //modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
362                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
363                    modifiers.add(Modifiers.AS_COUNTRY);
364                    break;
365                case SymbolID.SymbolSet_DismountedIndividuals:
366                    modifiers.add(Modifiers.A_SYMBOL_ICON);
367                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
368                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
369                    modifiers.add(Modifiers.J_EVALUATION_RATING);
370                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
371                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
372                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
373                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
374                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
375                    modifiers.add(Modifiers.V_EQUIP_TYPE);
376                    modifiers.add(Modifiers.W_DTG_1);
377                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
378                    modifiers.add(Modifiers.Y_LOCATION);
379                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
380                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
381                    modifiers.add(Modifiers.AS_COUNTRY);
382                    modifiers.add(Modifiers.AV_LEADERSHIP);
383                    break;
384                case SymbolID.SymbolSet_Space:
385                case SymbolID.SymbolSet_SpaceMissile:
386                case SymbolID.SymbolSet_Air:
387                case SymbolID.SymbolSet_AirMissile:
388                    modifiers.add(Modifiers.A_SYMBOL_ICON);
389                    modifiers.add(Modifiers.B_ECHELON);
390                    modifiers.add(Modifiers.C_QUANTITY);
391                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
392                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
393                    modifiers.add(Modifiers.J_EVALUATION_RATING);
394                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
395                    //modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
396                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
397                    modifiers.add(Modifiers.V_EQUIP_TYPE);
398                    modifiers.add(Modifiers.W_DTG_1);
399                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
400                    modifiers.add(Modifiers.Y_LOCATION);
401                    modifiers.add(Modifiers.Z_SPEED);
402                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
403                    modifiers.add(Modifiers.AD_PLATFORM_TYPE);
404                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
405                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
406                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
407                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
408                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
409                    modifiers.add(Modifiers.AS_COUNTRY);
410                    break;
411                case SymbolID.SymbolSet_SeaSurface:
412                    modifiers.add(Modifiers.A_SYMBOL_ICON);
413                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
414                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
415                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
416                    //modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
417                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
418                    modifiers.add(Modifiers.V_EQUIP_TYPE);
419                    modifiers.add(Modifiers.Y_LOCATION);
420                    modifiers.add(Modifiers.Z_SPEED);
421                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
422                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
423                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
424                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
425                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
426                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
427                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
428                    modifiers.add(Modifiers.AS_COUNTRY);
429                    break;
430                case SymbolID.SymbolSet_SeaSubsurface:
431                    modifiers.add(Modifiers.A_SYMBOL_ICON);
432                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
433                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
434                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
435                    //modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
436                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
437                    modifiers.add(Modifiers.V_EQUIP_TYPE);
438                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
439                    modifiers.add(Modifiers.Y_LOCATION);
440                    modifiers.add(Modifiers.Z_SPEED);
441                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
442                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
443                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
444                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
445                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
446                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
447                    modifiers.add(Modifiers.AS_COUNTRY);
448                    break;
449                case SymbolID.SymbolSet_Activities:
450                    modifiers.add(Modifiers.A_SYMBOL_ICON);
451                    modifiers.add(Modifiers.C_QUANTITY);
452                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
453                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
454                    modifiers.add(Modifiers.J_EVALUATION_RATING);
455                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
456                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
457                    modifiers.add(Modifiers.W_DTG_1);
458                    modifiers.add(Modifiers.Y_LOCATION);
459                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
460                    modifiers.add(Modifiers.AS_COUNTRY);
461                    break;
462                case SymbolID.SymbolSet_CyberSpace:
463                    modifiers.add(Modifiers.A_SYMBOL_ICON);
464                    modifiers.add(Modifiers.B_ECHELON);
465                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
466                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
467                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
468                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
469                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
470                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
471                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
472                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
473                    modifiers.add(Modifiers.V_EQUIP_TYPE);
474                    modifiers.add(Modifiers.W_DTG_1);
475                    modifiers.add(Modifiers.Y_LOCATION);
476                    modifiers.add(Modifiers.AS_COUNTRY);
477                    break;
478            /*case SymbolID.SymbolSet_SignalsIntelligence_Air:
479            case SymbolID.SymbolSet_SignalsIntelligence_Land:
480            case SymbolID.SymbolSet_SignalsIntelligence_SeaSurface:
481            case SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface:
482            case SymbolID.SymbolSet_SignalsIntelligence_Space:
483                modifiers.add(Modifiers.A_SYMBOL_ICON);
484                modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
485                modifiers.add(Modifiers.G_STAFF_COMMENTS);
486                modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
487                modifiers.add(Modifiers.J_EVALUATION_RATING);
488                modifiers.add(Modifiers.M_HIGHER_FORMATION);
489                modifiers.add(Modifiers.R2_SIGNIT_MOBILITY_INDICATOR);
490                modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
491                modifiers.add(Modifiers.V_EQUIP_TYPE);
492                modifiers.add(Modifiers.W1_DTG_2);
493                modifiers.add(Modifiers.Y_LOCATION);
494                modifiers.add(Modifiers.AD_PLATFORM_TYPE);//like equipment
495                modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);//like equipment
496                modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);//like equipment
497                break;*/
498
499                case SymbolID.SymbolSet_ControlMeasure:
500                    //values come from files during MSLookup load
501                    break;
502                case SymbolID.SymbolSet_Atmospheric:
503                    //Tropopause low, Tropopause high
504                    if ((ec.equals("110102")) || (ec.equals("110202")) ||
505                            (ec.equals("162200")))
506                        modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
507                    else if (ec.equals("140200"))
508                        modifiers.add(Modifiers.AN_AZIMUTH);
509                    break;
510                case SymbolID.SymbolSet_MineWarfare:
511                case SymbolID.SymbolSet_Oceanographic:
512                case SymbolID.SymbolSet_MeteorologicalSpace:
513                default://no modifiers
514
515            }
516        }
517        else
518        {
519            switch (ss) {
520                case SymbolID.SymbolSet_LandUnit:
521                case SymbolID.SymbolSet_LandCivilianUnit_Organization:
522                    modifiers.add(Modifiers.A_SYMBOL_ICON);
523                    modifiers.add(Modifiers.B_ECHELON);
524                    modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
525                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
526                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
527                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
528                    modifiers.add(Modifiers.J_EVALUATION_RATING);
529                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
530                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
531                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
532                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
533                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
534                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
535                    modifiers.add(Modifiers.W_DTG_1);
536                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
537                    modifiers.add(Modifiers.Y_LOCATION);
538                    modifiers.add(Modifiers.Z_SPEED);
539                    if(ss==SymbolID.SymbolSet_LandUnit && ec.equals("110000"))
540                        modifiers.add(Modifiers.AA_SPECIAL_C2_HQ);
541                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
542                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
543                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
544                    modifiers.add(Modifiers.AK_PAIRING_LINE);
545                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
546                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
547                    modifiers.add(Modifiers.AS_COUNTRY);
548                    break;
549                case SymbolID.SymbolSet_LandEquipment:
550                case SymbolID.SymbolSet_SignalsIntelligence_Land:
551                    modifiers.add(Modifiers.A_SYMBOL_ICON);
552                    modifiers.add(Modifiers.C_QUANTITY);
553                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
554                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
555                    modifiers.add(Modifiers.J_EVALUATION_RATING);
556                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
557                    modifiers.add(Modifiers.N_HOSTILE);
558                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
559                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
560                    modifiers.add(Modifiers.R_MOBILITY_INDICATOR);
561                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
562                    modifiers.add(Modifiers.V_EQUIP_TYPE);
563                    modifiers.add(Modifiers.W_DTG_1);
564                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
565                    modifiers.add(Modifiers.Y_LOCATION);
566                    modifiers.add(Modifiers.Z_SPEED);
567                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
568                    modifiers.add(Modifiers.AD_PLATFORM_TYPE);
569                    modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);
570                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
571                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
572                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
573                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
574                    modifiers.add(Modifiers.AK_PAIRING_LINE);
575                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
576                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
577                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
578                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
579                    modifiers.add(Modifiers.AS_COUNTRY);
580                    break;
581                case SymbolID.SymbolSet_LandInstallation:
582                    modifiers.add(Modifiers.A_SYMBOL_ICON);
583                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
584                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
585                    modifiers.add(Modifiers.J_EVALUATION_RATING);
586                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
587                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
588                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
589                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
590                    modifiers.add(Modifiers.W_DTG_1);
591                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
592                    modifiers.add(Modifiers.Y_LOCATION);
593                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
594                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
595                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
596                    modifiers.add(Modifiers.AK_PAIRING_LINE);
597                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
598                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
599                    modifiers.add(Modifiers.AS_COUNTRY);
600                    break;
601                case SymbolID.SymbolSet_Space:
602                case SymbolID.SymbolSet_SpaceMissile:
603                case SymbolID.SymbolSet_SignalsIntelligence_Space:
604                    modifiers.add(Modifiers.A_SYMBOL_ICON);
605                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
606                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
607                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
608                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
609                    modifiers.add(Modifiers.V_EQUIP_TYPE);
610                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
611                    modifiers.add(Modifiers.Z_SPEED);
612                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
613                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
614                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
615                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
616                    modifiers.add(Modifiers.AS_COUNTRY);
617                    break;
618                case SymbolID.SymbolSet_Air:
619                case SymbolID.SymbolSet_AirMissile:
620                case SymbolID.SymbolSet_SignalsIntelligence_Air:
621                    modifiers.add(Modifiers.A_SYMBOL_ICON);
622                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
623                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
624                    modifiers.add(Modifiers.P_IFF_SIF_AIS);//air only
625                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
626                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
627                    modifiers.add(Modifiers.V_EQUIP_TYPE);
628                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
629                    modifiers.add(Modifiers.Z_SPEED);
630                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
631                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
632                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
633                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
634                    modifiers.add(Modifiers.AS_COUNTRY);
635                    break;
636                case SymbolID.SymbolSet_SeaSurface:
637                case SymbolID.SymbolSet_SignalsIntelligence_SeaSurface:
638                    modifiers.add(Modifiers.A_SYMBOL_ICON);
639                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
640                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
641                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
642                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
643                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
644                    modifiers.add(Modifiers.V_EQUIP_TYPE);
645                    modifiers.add(Modifiers.Y_LOCATION);
646                    modifiers.add(Modifiers.Z_SPEED);
647                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
648                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
649                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
650                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
651                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
652                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
653                    modifiers.add(Modifiers.AS_COUNTRY);
654                    break;
655                case SymbolID.SymbolSet_SeaSubsurface:
656                case SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface:
657                    modifiers.add(Modifiers.A_SYMBOL_ICON);
658                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
659                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
660                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
661                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
662                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
663                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
664                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
665                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
666                    modifiers.add(Modifiers.V_EQUIP_TYPE);
667                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
668                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
669                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
670                    modifiers.add(Modifiers.AS_COUNTRY);
671                    break;
672                case SymbolID.SymbolSet_Activities:
673                    modifiers.add(Modifiers.A_SYMBOL_ICON);
674                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
675                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
676                    modifiers.add(Modifiers.J_EVALUATION_RATING);
677                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
678                    modifiers.add(Modifiers.W_DTG_1);
679                    modifiers.add(Modifiers.Y_LOCATION);
680                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
681                    modifiers.add(Modifiers.AS_COUNTRY);
682                    break;
683                case SymbolID.SymbolSet_CyberSpace:
684                    modifiers.add(Modifiers.A_SYMBOL_ICON);
685                    modifiers.add(Modifiers.B_ECHELON);
686                    modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
687                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
688                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
689                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
690                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
691                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
692                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
693                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
694                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
695                    modifiers.add(Modifiers.V_EQUIP_TYPE);
696                    modifiers.add(Modifiers.W_DTG_1);
697                    modifiers.add(Modifiers.Y_LOCATION);
698                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
699                    modifiers.add(Modifiers.AS_COUNTRY);
700                    break;
701            /*case SymbolID.SymbolSet_SignalsIntelligence_Air:
702            case SymbolID.SymbolSet_SignalsIntelligence_Land:
703            case SymbolID.SymbolSet_SignalsIntelligence_SeaSurface:
704            case SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface:
705            case SymbolID.SymbolSet_SignalsIntelligence_Space:
706                modifiers.add(Modifiers.A_SYMBOL_ICON);
707                modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
708                modifiers.add(Modifiers.G_STAFF_COMMENTS);
709                modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
710                modifiers.add(Modifiers.J_EVALUATION_RATING);
711                modifiers.add(Modifiers.M_HIGHER_FORMATION);
712                modifiers.add(Modifiers.R2_SIGNIT_MOBILITY_INDICATOR);
713                modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
714                modifiers.add(Modifiers.V_EQUIP_TYPE);
715                modifiers.add(Modifiers.W1_DTG_2);
716                modifiers.add(Modifiers.Y_LOCATION);
717                modifiers.add(Modifiers.AD_PLATFORM_TYPE);//like equipment
718                modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);//like equipment
719                modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);//like equipment
720                break;*/
721
722                case SymbolID.SymbolSet_ControlMeasure:
723                    //values come from files during MSLookup load
724                    break;
725                case SymbolID.SymbolSet_Atmospheric:
726                    //Tropopause low, Tropopause high
727                    if ((ec.equals("110102")) || (ec.equals("110202")) ||
728                            (ec.equals("162200")))
729                        modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
730                    else if (ec.equals("140200"))
731                        modifiers.add(Modifiers.AN_AZIMUTH);
732                    break;
733                case SymbolID.SymbolSet_MineWarfare:
734                case SymbolID.SymbolSet_Oceanographic:
735                case SymbolID.SymbolSet_MeteorologicalSpace:
736                default://no modifiers
737
738            }
739        }
740
741        if(ss == SymbolID.SymbolSet_SignalsIntelligence_Air ||
742                ss == SymbolID.SymbolSet_SignalsIntelligence_Land ||
743                ss == SymbolID.SymbolSet_SignalsIntelligence_SeaSurface ||
744                ss == SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface ||
745                ss == SymbolID.SymbolSet_SignalsIntelligence_Space)
746            modifiers.add(Modifiers.R2_SIGNIT_MOBILITY_INDICATOR);
747
748        return modifiers;
749    }
750
751    /**
752     *
753     * @param  symbolID Full 20-30 digits from the symbol code
754     * @return
755     */
756    public MSInfo getMSLInfo(String symbolID)
757    {
758        int length = symbolID.length();
759
760        if(length >= 20 && length <= 30)
761        {
762            int version = SymbolID.getVersion(symbolID);
763            return getMSLInfo(SymbolUtilities.getBasicSymbolID(symbolID), version);
764        }
765        else
766            return null;
767    }
768
769    /**
770     *
771     * @param basicID id SymbolSet + Entity code like 50110100
772     * @param version like SymbolID.Version_2525Dch1
773     * @return
774     */
775    public MSInfo getMSLInfo(String basicID, int version)
776    {
777        int length = basicID.length();
778        if(length == 8)
779        {
780            if(version >= SymbolID.Version_2525E)
781            {
782                if(_MSLookupE.containsKey(basicID))
783                    return _MSLookupE.get(basicID);
784                else
785                    return null;
786            }
787            else if (version == SymbolID.Version_2525D && basicID.equals("25272100"))
788            {
789                // MSDZ can have extra point in D
790                return new MSInfo(SymbolID.Version_2525D, "25",
791                        "Protection Areas", "Minimum Safe Distance Zone", "",
792                        "272100", "Area", "Area14", new ArrayList<>());
793            }
794            else
795            {
796                if(_MSLookupD.containsKey(basicID))
797                    return _MSLookupD.get(basicID);
798                else
799                    return null;
800            }
801        }
802        else if(length >= 20 && length <= 30)//probably got a full id instead of a basic ID.
803        {
804            return getMSLInfo(SymbolUtilities.getBasicSymbolID(basicID), version);
805        }
806        else
807            return null;
808    }
809
810    /**
811     * returns a list of all the keys in the order they are listed in the MilStd 2525D document.
812     * @return
813     */
814    public List<String> getIDList(int version)
815    {
816        if(version < SymbolID.Version_2525E)
817            return _IDListD;
818        else if(version >= SymbolID.Version_2525E)
819            return _IDListE;
820        else
821            return _IDListD;
822    }
823
824    /*
825     * For use only by MilStdIconRenderer.addCustomSymbol()
826     * @param msInfo
827     * @return
828     */
829    public boolean addCustomSymbol(MSInfo msInfo)
830    {
831        boolean success = false;
832        try
833        {
834            int version = msInfo.getVersion();
835            if (version < SymbolID.Version_2525E)
836            {
837                if(this._IDListD.indexOf(msInfo.getBasicSymbolID()) == -1)
838                {
839                    this._IDListD.add(msInfo.getBasicSymbolID());
840                    MSLookup._MSLookupD.put(msInfo.getBasicSymbolID(), msInfo);
841                    success = true;
842                }
843                else
844                    ErrorLogger.LogMessage("Symbol Set and Entity Code combination already exist: " + msInfo.getBasicSymbolID(), Level.INFO,false);
845            }
846            else if (version >= SymbolID.Version_2525E)
847            {
848                if(this._IDListE.indexOf(msInfo.getBasicSymbolID()) == -1)
849                {
850                    this._IDListE.add(msInfo.getBasicSymbolID());
851                    MSLookup._MSLookupE.put(msInfo.getBasicSymbolID(), msInfo);
852                    success = true;
853                }
854                else
855                    ErrorLogger.LogMessage("Symbol Set and Entity Code combination already exist: " + msInfo.getBasicSymbolID(), Level.INFO,false);
856            }
857        }
858        catch(Exception e)
859        {
860            ErrorLogger.LogException("MSLookup", "addCustomSymbol",e);
861        }
862        return success;
863    }
864}