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        }
183        catch(Exception exc)
184        {
185            System.out.println(exc.getMessage());
186        }
187
188    }
189
190    private ArrayList<String> populateModifierList(String[] modifiers)
191    {
192        ArrayList<String> mods = new ArrayList<String>();
193        if(modifiers != null && modifiers.length > 0)
194        {
195            for (String mod : modifiers)
196            {
197                mods.add(Modifiers.getModifierKey(mod));
198            }
199        }
200        return mods;
201    }
202
203    private ArrayList<String> populateModifierList(String symbolSet, String ec, int version)
204    {
205        int ss = Integer.valueOf(symbolSet);
206        ArrayList<String> modifiers = new ArrayList<String>();
207
208        if(version >= SymbolID.Version_2525E)
209        {
210            switch (ss) {
211                case SymbolID.SymbolSet_LandUnit:
212                case SymbolID.SymbolSet_LandCivilianUnit_Organization:
213                    modifiers.add(Modifiers.A_SYMBOL_ICON);
214                    modifiers.add(Modifiers.B_ECHELON);
215                    modifiers.add(Modifiers.C_QUANTITY);
216                    modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
217                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
218                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
219                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
220                    modifiers.add(Modifiers.J_EVALUATION_RATING);
221                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
222                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
223                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
224                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
225                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
226                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
227                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
228                    modifiers.add(Modifiers.W_DTG_1);
229                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
230                    modifiers.add(Modifiers.Y_LOCATION);
231                    modifiers.add(Modifiers.Z_SPEED);
232                    if(ss==SymbolID.SymbolSet_LandUnit && ec.equals("110000"))
233                        modifiers.add(Modifiers.AA_SPECIAL_C2_HQ);
234                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
235                    modifiers.add(Modifiers.AD_PLATFORM_TYPE);
236                    modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);
237                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
238                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
239                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
240                    modifiers.add(Modifiers.AK_PAIRING_LINE);
241                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
242                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
243                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
244                    modifiers.add(Modifiers.AS_COUNTRY);
245                    break;
246                case SymbolID.SymbolSet_LandEquipment:
247                case SymbolID.SymbolSet_SignalsIntelligence_Land:
248                    modifiers.add(Modifiers.A_SYMBOL_ICON);
249                    modifiers.add(Modifiers.C_QUANTITY);
250                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
251                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
252                    modifiers.add(Modifiers.J_EVALUATION_RATING);
253                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
254                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
255                    modifiers.add(Modifiers.N_HOSTILE);
256                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
257                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
258                    modifiers.add(Modifiers.R_MOBILITY_INDICATOR);
259                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
260                    modifiers.add(Modifiers.V_EQUIP_TYPE);
261                    modifiers.add(Modifiers.W_DTG_1);
262                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
263                    modifiers.add(Modifiers.Y_LOCATION);
264                    modifiers.add(Modifiers.Z_SPEED);
265                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
266                    modifiers.add(Modifiers.AD_PLATFORM_TYPE);
267                    modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);
268                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
269                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
270                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
271                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
272                    modifiers.add(Modifiers.AK_PAIRING_LINE);
273                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
274                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
275                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
276                    modifiers.add(Modifiers.AS_COUNTRY);
277                    break;
278                case SymbolID.SymbolSet_LandInstallation:
279                    modifiers.add(Modifiers.A_SYMBOL_ICON);
280                    modifiers.add(Modifiers.C_QUANTITY);
281                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
282                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
283                    modifiers.add(Modifiers.J_EVALUATION_RATING);
284                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
285                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
286                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
287                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
288                    modifiers.add(Modifiers.W_DTG_1);
289                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
290                    modifiers.add(Modifiers.Y_LOCATION);
291                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
292                    modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);
293                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
294                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
295                    modifiers.add(Modifiers.AK_PAIRING_LINE);
296                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
297                    //modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
298                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
299                    modifiers.add(Modifiers.AS_COUNTRY);
300                    break;
301                case SymbolID.SymbolSet_DismountedIndividuals:
302                    modifiers.add(Modifiers.A_SYMBOL_ICON);
303                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
304                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
305                    modifiers.add(Modifiers.J_EVALUATION_RATING);
306                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
307                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
308                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
309                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
310                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
311                    modifiers.add(Modifiers.V_EQUIP_TYPE);
312                    modifiers.add(Modifiers.W_DTG_1);
313                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
314                    modifiers.add(Modifiers.Y_LOCATION);
315                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
316                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
317                    modifiers.add(Modifiers.AS_COUNTRY);
318                    modifiers.add(Modifiers.AV_LEADERSHIP);
319                    break;
320                case SymbolID.SymbolSet_Space:
321                case SymbolID.SymbolSet_SpaceMissile:
322                case SymbolID.SymbolSet_Air:
323                case SymbolID.SymbolSet_AirMissile:
324                    modifiers.add(Modifiers.A_SYMBOL_ICON);
325                    modifiers.add(Modifiers.B_ECHELON);
326                    modifiers.add(Modifiers.C_QUANTITY);
327                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
328                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
329                    modifiers.add(Modifiers.J_EVALUATION_RATING);
330                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
331                    //modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
332                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
333                    modifiers.add(Modifiers.V_EQUIP_TYPE);
334                    modifiers.add(Modifiers.W_DTG_1);
335                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
336                    modifiers.add(Modifiers.Y_LOCATION);
337                    modifiers.add(Modifiers.Z_SPEED);
338                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
339                    modifiers.add(Modifiers.AD_PLATFORM_TYPE);
340                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
341                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
342                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
343                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
344                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
345                    modifiers.add(Modifiers.AS_COUNTRY);
346                    break;
347                case SymbolID.SymbolSet_SeaSurface:
348                    modifiers.add(Modifiers.A_SYMBOL_ICON);
349                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
350                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
351                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
352                    //modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
353                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
354                    modifiers.add(Modifiers.V_EQUIP_TYPE);
355                    modifiers.add(Modifiers.Y_LOCATION);
356                    modifiers.add(Modifiers.Z_SPEED);
357                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
358                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
359                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
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.AR_SPECIAL_DESIGNATOR);
364                    modifiers.add(Modifiers.AS_COUNTRY);
365                    break;
366                case SymbolID.SymbolSet_SeaSubsurface:
367                    modifiers.add(Modifiers.A_SYMBOL_ICON);
368                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
369                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
370                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
371                    //modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
372                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
373                    modifiers.add(Modifiers.V_EQUIP_TYPE);
374                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
375                    modifiers.add(Modifiers.Y_LOCATION);
376                    modifiers.add(Modifiers.Z_SPEED);
377                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
378                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
379                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
380                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
381                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
382                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
383                    modifiers.add(Modifiers.AS_COUNTRY);
384                    break;
385                case SymbolID.SymbolSet_Activities:
386                    modifiers.add(Modifiers.A_SYMBOL_ICON);
387                    modifiers.add(Modifiers.C_QUANTITY);
388                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
389                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
390                    modifiers.add(Modifiers.J_EVALUATION_RATING);
391                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
392                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
393                    modifiers.add(Modifiers.W_DTG_1);
394                    modifiers.add(Modifiers.Y_LOCATION);
395                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
396                    modifiers.add(Modifiers.AS_COUNTRY);
397                    break;
398                case SymbolID.SymbolSet_CyberSpace:
399                    modifiers.add(Modifiers.A_SYMBOL_ICON);
400                    modifiers.add(Modifiers.B_ECHELON);
401                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
402                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
403                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
404                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
405                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
406                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
407                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
408                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
409                    modifiers.add(Modifiers.V_EQUIP_TYPE);
410                    modifiers.add(Modifiers.W_DTG_1);
411                    modifiers.add(Modifiers.Y_LOCATION);
412                    modifiers.add(Modifiers.AS_COUNTRY);
413                    break;
414            /*case SymbolID.SymbolSet_SignalsIntelligence_Air:
415            case SymbolID.SymbolSet_SignalsIntelligence_Land:
416            case SymbolID.SymbolSet_SignalsIntelligence_SeaSurface:
417            case SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface:
418            case SymbolID.SymbolSet_SignalsIntelligence_Space:
419                modifiers.add(Modifiers.A_SYMBOL_ICON);
420                modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
421                modifiers.add(Modifiers.G_STAFF_COMMENTS);
422                modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
423                modifiers.add(Modifiers.J_EVALUATION_RATING);
424                modifiers.add(Modifiers.M_HIGHER_FORMATION);
425                modifiers.add(Modifiers.R2_SIGNIT_MOBILITY_INDICATOR);
426                modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
427                modifiers.add(Modifiers.V_EQUIP_TYPE);
428                modifiers.add(Modifiers.W1_DTG_2);
429                modifiers.add(Modifiers.Y_LOCATION);
430                modifiers.add(Modifiers.AD_PLATFORM_TYPE);//like equipment
431                modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);//like equipment
432                modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);//like equipment
433                break;*/
434
435                case SymbolID.SymbolSet_ControlMeasure:
436                    //values come from files during MSLookup load
437                    break;
438                case SymbolID.SymbolSet_Atmospheric:
439                    //Tropopause low, Tropopause high
440                    if ((ec.equals("110102")) || (ec.equals("110202")) ||
441                            (ec.equals("162200")))
442                        modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
443                    else if (ec.equals("140200"))
444                        modifiers.add(Modifiers.AN_AZIMUTH);
445                    break;
446                case SymbolID.SymbolSet_MineWarfare:
447                case SymbolID.SymbolSet_Oceanographic:
448                case SymbolID.SymbolSet_MeteorologicalSpace:
449                default://no modifiers
450
451            }
452        }
453        else
454        {
455            switch (ss) {
456                case SymbolID.SymbolSet_LandUnit:
457                case SymbolID.SymbolSet_LandCivilianUnit_Organization:
458                    modifiers.add(Modifiers.A_SYMBOL_ICON);
459                    modifiers.add(Modifiers.B_ECHELON);
460                    modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
461                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
462                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
463                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
464                    modifiers.add(Modifiers.J_EVALUATION_RATING);
465                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
466                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
467                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
468                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
469                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
470                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
471                    modifiers.add(Modifiers.W_DTG_1);
472                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
473                    modifiers.add(Modifiers.Y_LOCATION);
474                    modifiers.add(Modifiers.Z_SPEED);
475                    if(ss==SymbolID.SymbolSet_LandUnit && ec.equals("110000"))
476                        modifiers.add(Modifiers.AA_SPECIAL_C2_HQ);
477                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
478                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
479                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
480                    modifiers.add(Modifiers.AK_PAIRING_LINE);
481                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
482                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
483                    modifiers.add(Modifiers.AS_COUNTRY);
484                    break;
485                case SymbolID.SymbolSet_LandEquipment:
486                case SymbolID.SymbolSet_SignalsIntelligence_Land:
487                    modifiers.add(Modifiers.A_SYMBOL_ICON);
488                    modifiers.add(Modifiers.C_QUANTITY);
489                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
490                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
491                    modifiers.add(Modifiers.J_EVALUATION_RATING);
492                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
493                    modifiers.add(Modifiers.N_HOSTILE);
494                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
495                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
496                    modifiers.add(Modifiers.R_MOBILITY_INDICATOR);
497                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
498                    modifiers.add(Modifiers.V_EQUIP_TYPE);
499                    modifiers.add(Modifiers.W_DTG_1);
500                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
501                    modifiers.add(Modifiers.Y_LOCATION);
502                    modifiers.add(Modifiers.Z_SPEED);
503                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
504                    modifiers.add(Modifiers.AD_PLATFORM_TYPE);
505                    modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);
506                    modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);
507                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
508                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
509                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
510                    modifiers.add(Modifiers.AK_PAIRING_LINE);
511                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
512                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
513                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
514                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
515                    modifiers.add(Modifiers.AS_COUNTRY);
516                    break;
517                case SymbolID.SymbolSet_LandInstallation:
518                    modifiers.add(Modifiers.A_SYMBOL_ICON);
519                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
520                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
521                    modifiers.add(Modifiers.J_EVALUATION_RATING);
522                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
523                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
524                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
525                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
526                    modifiers.add(Modifiers.W_DTG_1);
527                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
528                    modifiers.add(Modifiers.Y_LOCATION);
529                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
530                    modifiers.add(Modifiers.AH_AREA_OF_UNCERTAINTY);
531                    modifiers.add(Modifiers.AI_DEAD_RECKONING_TRAILER);
532                    modifiers.add(Modifiers.AK_PAIRING_LINE);
533                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
534                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
535                    modifiers.add(Modifiers.AS_COUNTRY);
536                    break;
537                case SymbolID.SymbolSet_Space:
538                case SymbolID.SymbolSet_SpaceMissile:
539                case SymbolID.SymbolSet_SignalsIntelligence_Space:
540                    modifiers.add(Modifiers.A_SYMBOL_ICON);
541                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
542                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
543                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
544                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
545                    modifiers.add(Modifiers.V_EQUIP_TYPE);
546                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
547                    modifiers.add(Modifiers.Z_SPEED);
548                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
549                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
550                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
551                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
552                    modifiers.add(Modifiers.AS_COUNTRY);
553                    break;
554                case SymbolID.SymbolSet_Air:
555                case SymbolID.SymbolSet_AirMissile:
556                case SymbolID.SymbolSet_SignalsIntelligence_Air:
557                    modifiers.add(Modifiers.A_SYMBOL_ICON);
558                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
559                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
560                    modifiers.add(Modifiers.P_IFF_SIF_AIS);//air only
561                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
562                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
563                    modifiers.add(Modifiers.V_EQUIP_TYPE);
564                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
565                    modifiers.add(Modifiers.Z_SPEED);
566                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
567                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
568                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
569                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
570                    modifiers.add(Modifiers.AS_COUNTRY);
571                    break;
572                case SymbolID.SymbolSet_SeaSurface:
573                case SymbolID.SymbolSet_SignalsIntelligence_SeaSurface:
574                    modifiers.add(Modifiers.A_SYMBOL_ICON);
575                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
576                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
577                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
578                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
579                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
580                    modifiers.add(Modifiers.V_EQUIP_TYPE);
581                    modifiers.add(Modifiers.Y_LOCATION);
582                    modifiers.add(Modifiers.Z_SPEED);
583                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
584                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
585                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
586                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
587                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
588                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
589                    modifiers.add(Modifiers.AS_COUNTRY);
590                    break;
591                case SymbolID.SymbolSet_SeaSubsurface:
592                case SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface:
593                    modifiers.add(Modifiers.A_SYMBOL_ICON);
594                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
595                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
596                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
597                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
598                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
599                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
600                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
601                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
602                    modifiers.add(Modifiers.V_EQUIP_TYPE);
603                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
604                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
605                    modifiers.add(Modifiers.AJ_SPEED_LEADER);
606                    modifiers.add(Modifiers.AS_COUNTRY);
607                    break;
608                case SymbolID.SymbolSet_Activities:
609                    modifiers.add(Modifiers.A_SYMBOL_ICON);
610                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
611                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
612                    modifiers.add(Modifiers.J_EVALUATION_RATING);
613                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
614                    modifiers.add(Modifiers.W_DTG_1);
615                    modifiers.add(Modifiers.Y_LOCATION);
616                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
617                    modifiers.add(Modifiers.AS_COUNTRY);
618                    break;
619                case SymbolID.SymbolSet_CyberSpace:
620                    modifiers.add(Modifiers.A_SYMBOL_ICON);
621                    modifiers.add(Modifiers.B_ECHELON);
622                    modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
623                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
624                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
625                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
626                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
627                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
628                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
629                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
630                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
631                    modifiers.add(Modifiers.V_EQUIP_TYPE);
632                    modifiers.add(Modifiers.W_DTG_1);
633                    modifiers.add(Modifiers.Y_LOCATION);
634                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
635                    modifiers.add(Modifiers.AS_COUNTRY);
636                    break;
637            /*case SymbolID.SymbolSet_SignalsIntelligence_Air:
638            case SymbolID.SymbolSet_SignalsIntelligence_Land:
639            case SymbolID.SymbolSet_SignalsIntelligence_SeaSurface:
640            case SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface:
641            case SymbolID.SymbolSet_SignalsIntelligence_Space:
642                modifiers.add(Modifiers.A_SYMBOL_ICON);
643                modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
644                modifiers.add(Modifiers.G_STAFF_COMMENTS);
645                modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
646                modifiers.add(Modifiers.J_EVALUATION_RATING);
647                modifiers.add(Modifiers.M_HIGHER_FORMATION);
648                modifiers.add(Modifiers.R2_SIGNIT_MOBILITY_INDICATOR);
649                modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
650                modifiers.add(Modifiers.V_EQUIP_TYPE);
651                modifiers.add(Modifiers.W1_DTG_2);
652                modifiers.add(Modifiers.Y_LOCATION);
653                modifiers.add(Modifiers.AD_PLATFORM_TYPE);//like equipment
654                modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);//like equipment
655                modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);//like equipment
656                break;*/
657
658                case SymbolID.SymbolSet_ControlMeasure:
659                    //values come from files during MSLookup load
660                    break;
661                case SymbolID.SymbolSet_Atmospheric:
662                    //Tropopause low, Tropopause high
663                    if ((ec.equals("110102")) || (ec.equals("110202")) ||
664                            (ec.equals("162200")))
665                        modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
666                    else if (ec.equals("140200"))
667                        modifiers.add(Modifiers.AN_AZIMUTH);
668                    break;
669                case SymbolID.SymbolSet_MineWarfare:
670                case SymbolID.SymbolSet_Oceanographic:
671                case SymbolID.SymbolSet_MeteorologicalSpace:
672                default://no modifiers
673
674            }
675        }
676
677        if(ss == SymbolID.SymbolSet_SignalsIntelligence_Air ||
678                ss == SymbolID.SymbolSet_SignalsIntelligence_Land ||
679                ss == SymbolID.SymbolSet_SignalsIntelligence_SeaSurface ||
680                ss == SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface ||
681                ss == SymbolID.SymbolSet_SignalsIntelligence_Space)
682            modifiers.add(Modifiers.R2_SIGNIT_MOBILITY_INDICATOR);
683
684        return modifiers;
685    }
686
687    /**
688     *
689     * @param  symbolID Full 20-30 digits from the symbol code
690     * @return
691     */
692    public MSInfo getMSLInfo(String symbolID)
693    {
694        int length = symbolID.length();
695
696        if(length >= 20 && length <= 30)
697        {
698            int version = SymbolID.getVersion(symbolID);
699            return getMSLInfo(SymbolUtilities.getBasicSymbolID(symbolID), version);
700        }
701        else
702            return null;
703    }
704
705    /**
706     *
707     * @param basicID id SymbolSet + Entity code like 50110100
708     * @param version like SymbolID.Version_2525Dch1
709     * @return
710     */
711    public MSInfo getMSLInfo(String basicID, int version)
712    {
713        int length = basicID.length();
714        if(length == 8)
715        {
716            if(version >= SymbolID.Version_2525E)
717            {
718                if(_MSLookupE.containsKey(basicID))
719                    return _MSLookupE.get(basicID);
720                else
721                    return null;
722            }
723            else if (version == SymbolID.Version_2525D && basicID.equals("25272100"))
724            {
725                // MSDZ can have extra point in D
726                return new MSInfo(SymbolID.Version_2525D, "25",
727                        "Protection Areas", "Minimum Safe Distance Zone", "",
728                        "272100", "Area", "Area14", new ArrayList<>());
729            }
730            else
731            {
732                if(_MSLookupD.containsKey(basicID))
733                    return _MSLookupD.get(basicID);
734                else
735                    return null;
736            }
737        }
738        else if(length >= 20 && length <= 30)//probably got a full id instead of a basic ID.
739        {
740            return getMSLInfo(SymbolUtilities.getBasicSymbolID(basicID), version);
741        }
742        else
743            return null;
744    }
745
746    /**
747     * returns a list of all the keys in the order they are listed in the MilStd 2525D document.
748     * @return
749     */
750    public List<String> getIDList(int version)
751    {
752        if(version < SymbolID.Version_2525E)
753            return _IDListD;
754        else if(version >= SymbolID.Version_2525E)
755            return _IDListE;
756        else
757            return _IDListD;
758    }
759
760    /*
761     * For use only by MilStdIconRenderer.addCustomSymbol()
762     * @param msInfo
763     * @return
764     */
765    public boolean addCustomSymbol(MSInfo msInfo)
766    {
767        boolean success = false;
768        try
769        {
770            int version = msInfo.getVersion();
771            if (version < SymbolID.Version_2525E)
772            {
773                if(this._IDListD.indexOf(msInfo.getBasicSymbolID()) == -1)
774                {
775                    this._IDListD.add(msInfo.getBasicSymbolID());
776                    MSLookup._MSLookupD.put(msInfo.getBasicSymbolID(), msInfo);
777                    success = true;
778                }
779                else
780                    ErrorLogger.LogMessage("Symbol Set and Entity Code combination already exist: " + msInfo.getBasicSymbolID(), Level.INFO,false);
781            }
782            else if (version >= SymbolID.Version_2525E)
783            {
784                if(this._IDListE.indexOf(msInfo.getBasicSymbolID()) == -1)
785                {
786                    this._IDListE.add(msInfo.getBasicSymbolID());
787                    MSLookup._MSLookupE.put(msInfo.getBasicSymbolID(), msInfo);
788                    success = true;
789                }
790                else
791                    ErrorLogger.LogMessage("Symbol Set and Entity Code combination already exist: " + msInfo.getBasicSymbolID(), Level.INFO,false);
792            }
793        }
794        catch(Exception e)
795        {
796            ErrorLogger.LogException("MSLookup", "addCustomSymbol",e);
797        }
798        return success;
799    }
800}