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.AL_OPERATIONAL_CONDITION);
550                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
551                    modifiers.add(Modifiers.AS_COUNTRY);
552                    break;
553                case SymbolID.SymbolSet_Air:
554                case SymbolID.SymbolSet_AirMissile:
555                case SymbolID.SymbolSet_SignalsIntelligence_Air:
556                    modifiers.add(Modifiers.A_SYMBOL_ICON);
557                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
558                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
559                    modifiers.add(Modifiers.P_IFF_SIF_AIS);//air only
560                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
561                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
562                    modifiers.add(Modifiers.V_EQUIP_TYPE);
563                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
564                    modifiers.add(Modifiers.Z_SPEED);
565                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
566                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
567                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
568                    modifiers.add(Modifiers.AS_COUNTRY);
569                    break;
570                case SymbolID.SymbolSet_SeaSurface:
571                case SymbolID.SymbolSet_SignalsIntelligence_SeaSurface:
572                    modifiers.add(Modifiers.A_SYMBOL_ICON);
573                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
574                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
575                    modifiers.add(Modifiers.P_IFF_SIF_AIS);
576                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
577                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
578                    modifiers.add(Modifiers.V_EQUIP_TYPE);
579                    modifiers.add(Modifiers.Y_LOCATION);
580                    modifiers.add(Modifiers.Z_SPEED);
581                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
582                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
583                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
584                    modifiers.add(Modifiers.AQ_GUARDED_UNIT);
585                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
586                    modifiers.add(Modifiers.AS_COUNTRY);
587                    break;
588                case SymbolID.SymbolSet_SeaSubsurface:
589                case SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface:
590                    modifiers.add(Modifiers.A_SYMBOL_ICON);
591                    modifiers.add(Modifiers.AG_AUX_EQUIP_INDICATOR);
592                    modifiers.add(Modifiers.AL_OPERATIONAL_CONDITION);
593                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
594                    modifiers.add(Modifiers.AR_SPECIAL_DESIGNATOR);
595                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
596                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
597                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
598                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
599                    modifiers.add(Modifiers.V_EQUIP_TYPE);
600                    modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
601                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
602                    modifiers.add(Modifiers.AS_COUNTRY);
603                    break;
604                case SymbolID.SymbolSet_Activities:
605                    modifiers.add(Modifiers.A_SYMBOL_ICON);
606                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
607                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
608                    modifiers.add(Modifiers.J_EVALUATION_RATING);
609                    modifiers.add(Modifiers.Q_DIRECTION_OF_MOVEMENT);
610                    modifiers.add(Modifiers.W_DTG_1);
611                    modifiers.add(Modifiers.Y_LOCATION);
612                    modifiers.add(Modifiers.AB_FEINT_DUMMY_INDICATOR);
613                    modifiers.add(Modifiers.AS_COUNTRY);
614                    break;
615                case SymbolID.SymbolSet_CyberSpace:
616                    modifiers.add(Modifiers.A_SYMBOL_ICON);
617                    modifiers.add(Modifiers.B_ECHELON);
618                    modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
619                    modifiers.add(Modifiers.F_REINFORCED_REDUCED);
620                    modifiers.add(Modifiers.G_STAFF_COMMENTS);
621                    modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
622                    modifiers.add(Modifiers.K_COMBAT_EFFECTIVENESS);
623                    modifiers.add(Modifiers.L_SIGNATURE_EQUIP);
624                    modifiers.add(Modifiers.M_HIGHER_FORMATION);
625                    modifiers.add(Modifiers.S_HQ_STAFF_INDICATOR);
626                    modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
627                    modifiers.add(Modifiers.V_EQUIP_TYPE);
628                    modifiers.add(Modifiers.W_DTG_1);
629                    modifiers.add(Modifiers.Y_LOCATION);
630                    modifiers.add(Modifiers.AO_ENGAGEMENT_BAR);
631                    modifiers.add(Modifiers.AS_COUNTRY);
632                    break;
633            /*case SymbolID.SymbolSet_SignalsIntelligence_Air:
634            case SymbolID.SymbolSet_SignalsIntelligence_Land:
635            case SymbolID.SymbolSet_SignalsIntelligence_SeaSurface:
636            case SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface:
637            case SymbolID.SymbolSet_SignalsIntelligence_Space:
638                modifiers.add(Modifiers.A_SYMBOL_ICON);
639                modifiers.add(Modifiers.D_TASK_FORCE_INDICATOR);
640                modifiers.add(Modifiers.G_STAFF_COMMENTS);
641                modifiers.add(Modifiers.H_ADDITIONAL_INFO_1);
642                modifiers.add(Modifiers.J_EVALUATION_RATING);
643                modifiers.add(Modifiers.M_HIGHER_FORMATION);
644                modifiers.add(Modifiers.R2_SIGNIT_MOBILITY_INDICATOR);
645                modifiers.add(Modifiers.T_UNIQUE_DESIGNATION_1);
646                modifiers.add(Modifiers.V_EQUIP_TYPE);
647                modifiers.add(Modifiers.W1_DTG_2);
648                modifiers.add(Modifiers.Y_LOCATION);
649                modifiers.add(Modifiers.AD_PLATFORM_TYPE);//like equipment
650                modifiers.add(Modifiers.AE_EQUIPMENT_TEARDOWN_TIME);//like equipment
651                modifiers.add(Modifiers.AF_COMMON_IDENTIFIER);//like equipment
652                break;*/
653
654                case SymbolID.SymbolSet_ControlMeasure:
655                    //values come from files during MSLookup load
656                    break;
657                case SymbolID.SymbolSet_Atmospheric:
658                    //Tropopause low, Tropopause high
659                    if ((ec.equals("110102")) || (ec.equals("110202")) ||
660                            (ec.equals("162200")))
661                        modifiers.add(Modifiers.X_ALTITUDE_DEPTH);
662                    else if (ec.equals("140200"))
663                        modifiers.add(Modifiers.AN_AZIMUTH);
664                    break;
665                case SymbolID.SymbolSet_MineWarfare:
666                case SymbolID.SymbolSet_Oceanographic:
667                case SymbolID.SymbolSet_MeteorologicalSpace:
668                default://no modifiers
669
670            }
671        }
672
673        if(ss == SymbolID.SymbolSet_SignalsIntelligence_Air ||
674                ss == SymbolID.SymbolSet_SignalsIntelligence_Land ||
675                ss == SymbolID.SymbolSet_SignalsIntelligence_SeaSurface ||
676                ss == SymbolID.SymbolSet_SignalsIntelligence_SeaSubsurface ||
677                ss == SymbolID.SymbolSet_SignalsIntelligence_Space)
678            modifiers.add(Modifiers.R2_SIGNIT_MOBILITY_INDICATOR);
679
680        return modifiers;
681    }
682
683    /**
684     *
685     * @param  symbolID Full 20-30 digits from the symbol code
686     * @return
687     */
688    public MSInfo getMSLInfo(String symbolID)
689    {
690        int length = symbolID.length();
691
692        if(length >= 20 && length <= 30)
693        {
694            int version = SymbolID.getVersion(symbolID);
695            return getMSLInfo(SymbolUtilities.getBasicSymbolID(symbolID), version);
696        }
697        else
698            return null;
699    }
700
701    /**
702     *
703     * @param basicID id SymbolSet + Entity code like 50110100
704     * @param version like SymbolID.Version_2525Dch1
705     * @return
706     */
707    public MSInfo getMSLInfo(String basicID, int version)
708    {
709        int length = basicID.length();
710        if(length == 8)
711        {
712            if(version >= SymbolID.Version_2525E)
713            {
714                if(_MSLookupE.containsKey(basicID))
715                    return _MSLookupE.get(basicID);
716                else
717                    return null;
718            }
719            else if (version == SymbolID.Version_2525D && basicID.equals("25272100"))
720            {
721                // MSDZ can have extra point in D
722                return new MSInfo(SymbolID.Version_2525D, "25",
723                        "Protection Areas", "Minimum Safe Distance Zone", "",
724                        "272100", "Area", "Area14", new ArrayList<>());
725            }
726            else
727            {
728                if(_MSLookupD.containsKey(basicID))
729                    return _MSLookupD.get(basicID);
730                else
731                    return null;
732            }
733        }
734        else if(length >= 20 && length <= 30)//probably got a full id instead of a basic ID.
735        {
736            return getMSLInfo(SymbolUtilities.getBasicSymbolID(basicID), version);
737        }
738        else
739            return null;
740    }
741
742    /**
743     * returns a list of all the keys in the order they are listed in the MilStd 2525D document.
744     * @return
745     */
746    public List<String> getIDList(int version)
747    {
748        if(version < SymbolID.Version_2525E)
749            return _IDListD;
750        else if(version >= SymbolID.Version_2525E)
751            return _IDListE;
752        else
753            return _IDListD;
754    }
755
756    /*
757     * For use only by MilStdIconRenderer.addCustomSymbol()
758     * @param msInfo
759     * @return
760     */
761    public boolean addCustomSymbol(MSInfo msInfo)
762    {
763        boolean success = false;
764        try
765        {
766            int version = msInfo.getVersion();
767            if (version < SymbolID.Version_2525E)
768            {
769                if(this._IDListD.indexOf(msInfo.getBasicSymbolID()) == -1)
770                {
771                    this._IDListD.add(msInfo.getBasicSymbolID());
772                    MSLookup._MSLookupD.put(msInfo.getBasicSymbolID(), msInfo);
773                    success = true;
774                }
775                else
776                    ErrorLogger.LogMessage("Symbol Set and Entity Code combination already exist: " + msInfo.getBasicSymbolID(), Level.INFO,false);
777            }
778            else if (version >= SymbolID.Version_2525E)
779            {
780                if(this._IDListE.indexOf(msInfo.getBasicSymbolID()) == -1)
781                {
782                    this._IDListE.add(msInfo.getBasicSymbolID());
783                    MSLookup._MSLookupE.put(msInfo.getBasicSymbolID(), msInfo);
784                    success = true;
785                }
786                else
787                    ErrorLogger.LogMessage("Symbol Set and Entity Code combination already exist: " + msInfo.getBasicSymbolID(), Level.INFO,false);
788            }
789        }
790        catch(Exception e)
791        {
792            ErrorLogger.LogException("MSLookup", "addCustomSymbol",e);
793        }
794        return success;
795    }
796}