]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/pcd/entity/Token.java
Fix a bug to judege max value of UINT32, 0xFFFFFFFF is invalid UINT32 in JAVA.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / entity / Token.java
CommitLineData
878ddf1f 1/** @file\r
2 Token class.\r
3\r
4 This module contains all classes releted to PCD token.\r
5 \r
6Copyright (c) 2006, Intel Corporation\r
7All rights reserved. This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11 \r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/ \r
16package org.tianocore.build.pcd.entity;\r
17\r
6f7e61a0 18import java.math.BigInteger;\r
878ddf1f 19import java.util.ArrayList;\r
6f7e61a0 20import java.util.HashMap;\r
878ddf1f 21import java.util.List;\r
8840ad58 22import java.util.Map;\r
6f7e61a0 23import java.util.UUID;\r
878ddf1f 24\r
25import org.tianocore.build.pcd.action.ActionMessage;\r
8840ad58 26import org.tianocore.build.pcd.exception.EntityException;\r
878ddf1f 27\r
28/** This class is to descript a PCD token object. The information of a token mainly \r
29 comes from MSA, SPD and setting produced by platform developer. \r
30**/\r
31public class Token {\r
32 ///\r
33 /// Enumeration macro defintion for PCD type.\r
34 /// BUGBUG: Not use upcase charater is to facility for reading. It may be changed\r
35 /// in coding review.\r
36 public enum PCD_TYPE {FEATURE_FLAG, FIXED_AT_BUILD, PATCHABLE_IN_MODULE, DYNAMIC, \r
37 DYNAMIC_EX, UNKNOWN}\r
38\r
39 ///\r
40 /// Enumeration macro definition for datum type. All type mainly comes from ProcessBind.h.\r
41 /// Wizard maybe expand this type as "int, unsigned int, short, unsigned short etc" in \r
42 /// prompt dialog.\r
43 ///\r
44 public enum DATUM_TYPE {UINT8, UINT16, UINT32, UINT64, BOOLEAN, POINTER, UNKNOWN}\r
45\r
46 ///\r
47 /// Enumeration macor defintion for usage of PCD\r
48 ///\r
49 public enum PCD_USAGE {ALWAYS_PRODUCED, ALWAYS_CONSUMED, SOMETIMES_PRODUCED,\r
50 SOMETIMES_CONSUMED, UNKNOWN}\r
51\r
52 ///\r
53 /// cName is to identify a PCD entry and will be used for generating autogen.h/autogen.c.\r
54 /// cName will be defined in MSA, SPD and FPD, can be regarded as primary key with token space guid.\r
55 ///\r
56 public String cName;\r
57\r
58 ///\r
59 /// Token space name is the guid defined by token itself in package or module level. This\r
60 /// name mainly for DynamicEx type. For other PCD type token, his token space name is the \r
61 /// assignedtokenSpaceName as follows.\r
62 /// tokenSpaceName is defined in MSA, SPD, FPD, can be regarded as primary key with cName.\r
63 ///\r
64 public UUID tokenSpaceName;\r
65\r
66 ///\r
67 /// tokenNumber is allocated by platform. tokenNumber indicate an index for this token in\r
38ee8d9e 68 /// platform token space. For Dynamic, dynamicEx type, this number will be re-adjust by\r
69 /// PCD run-time database autogen tools.\r
878ddf1f 70 ///\r
71 public int tokenNumber;\r
72\r
38ee8d9e 73 ///\r
74 /// This token number is retrieved from FPD file for DynamicEx type. \r
75 /// \r
76 public int dynamicExTokenNumber;\r
77\r
878ddf1f 78 ///\r
6ff7a41c 79 /// All supported PCD type, this value can be retrieved from SPD\r
80 /// Currently, only record all PCD type for this token in FPD file.\r
81 /// \r
82 public List<PCD_TYPE> supportedPcdType;\r
83\r
878ddf1f 84 ///\r
6ff7a41c 85 /// If the token's item type is Dynamic or DynamicEx type, isDynamicPCD\r
86 /// is true.\r
87 /// \r
88 public boolean isDynamicPCD;\r
878ddf1f 89\r
878ddf1f 90 ///\r
91 /// datumSize is to descript the fix size or max size for this token. \r
92 /// datumSize is defined in SPD.\r
93 ///\r
94 public int datumSize;\r
95\r
96 ///\r
97 /// datum type is to descript what type can be expressed by a PCD token.\r
6ff7a41c 98 /// For same PCD used in different module, the datum type should be unique.\r
99 /// So it belong memeber to Token class.\r
878ddf1f 100 ///\r
101 public DATUM_TYPE datumType;\r
102\r
878ddf1f 103 ///\r
104 /// skuData contains all value for SkuNumber of token.\r
6ff7a41c 105 /// This field is for Dynamic or DynamicEx type PCD, \r
878ddf1f 106 ///\r
107 public List<SkuInstance> skuData;\r
108\r
878ddf1f 109 ///\r
110 /// consumers array record all module private information who consume this PCD token.\r
111 ///\r
8840ad58 112 public Map<String, UsageInstance> consumers;\r
878ddf1f 113\r
8840ad58 114 public Token(String cName, UUID tokenSpaceName) {\r
878ddf1f 115 UUID nullUUID = new UUID(0, 0);\r
116\r
117 this.cName = cName;\r
8840ad58 118 this.tokenSpaceName = (tokenSpaceName == null) ? nullUUID : tokenSpaceName;\r
878ddf1f 119 this.tokenNumber = 0;\r
878ddf1f 120 this.datumType = DATUM_TYPE.UNKNOWN;\r
121 this.datumSize = -1;\r
878ddf1f 122 this.skuData = new ArrayList<SkuInstance>();\r
878ddf1f 123\r
8840ad58 124 this.consumers = new HashMap<String, UsageInstance>();\r
6ff7a41c 125 this.supportedPcdType = new ArrayList<PCD_TYPE>();\r
126 }\r
127\r
128 /**\r
129 updateSupportPcdType\r
130 \r
131 SupportPcdType should be gotten from SPD file actually, but now it just\r
132 record all PCD type for this token in FPD file.\r
133 \r
134 @param pcdType new PCD type found in FPD file for this token.\r
135 **/\r
136 public void updateSupportPcdType(PCD_TYPE pcdType) {\r
137 int index = 0;\r
138 boolean found = false;\r
139 for (index = 0; index < this.supportedPcdType.size(); index ++) {\r
140 if (this.supportedPcdType.get(index) == pcdType) {\r
141 found = true;\r
142 break;\r
143 }\r
144 }\r
145 if (!found) {\r
146 this.supportedPcdType.add(pcdType);\r
147 }\r
148 }\r
149\r
150 /**\r
151 Judge whether pcdType is belong to dynamic type. Dynamic type includes\r
152 DYNAMIC and DYNAMIC_EX.\r
153 \r
154 @param pcdType\r
155 \r
156 @return boolean\r
157 */\r
158 public static boolean isDynamic(PCD_TYPE pcdType) {\r
159 if ((pcdType == PCD_TYPE.DYNAMIC ) ||\r
160 (pcdType == PCD_TYPE.DYNAMIC_EX)) {\r
161 return true;\r
162 }\r
163\r
164 return false;\r
878ddf1f 165 }\r
166\r
167 /**\r
168 Use "TokencName + "-" + SpaceTokenName" as primary key when adding token into database\r
169 \r
170 @param cName Token name.\r
171 @param tokenSpaceName The token space guid defined in MSA or SPD\r
172 @param platformtokenSpaceName The token space guid for current platform token space,\r
173 \r
174 @return primary key for this token in token database.\r
175 **/\r
8840ad58 176 public static String getPrimaryKeyString(String cName, UUID tokenSpaceName) {\r
878ddf1f 177 UUID nullUUID = new UUID(0, 0);\r
178\r
8840ad58 179 if (tokenSpaceName == null) {\r
180 return cName + "_" + nullUUID.toString().replace('-', '_');\r
878ddf1f 181 } else {\r
8840ad58 182 return cName + "_" + tokenSpaceName.toString().replace('-', '_');\r
878ddf1f 183 }\r
184 }\r
185\r
6ff7a41c 186 /**\r
187 If skudata list contains more than one data, then Sku mechanism is enable.\r
188 \r
189 @return boolean\r
190 */\r
191 public boolean isSkuEnable() {\r
192 if (this.skuData.size() > 1) {\r
193 return true;\r
194 }\r
195 return false;\r
196 }\r
197\r
8840ad58 198 /**\r
199 Get the token primary key in token database.\r
200 \r
201 @return String\r
202 */\r
32648c62 203 public String getPrimaryKeyString () {\r
8840ad58 204 return Token.getPrimaryKeyString(cName, tokenSpaceName);\r
32648c62 205 }\r
99d2c3c4 206\r
878ddf1f 207 /**\r
208 Judge datumType is valid\r
209 \r
210 @param type The datumType want to be judged.\r
211 \r
212 @retval TRUE - The type is valid.\r
213 @retval FALSE - The type is invalid.\r
214 **/\r
215 public static boolean isValiddatumType(DATUM_TYPE type) {\r
216 if ((type.ordinal() < DATUM_TYPE.UINT8.ordinal() ) || \r
217 (type.ordinal() > DATUM_TYPE.POINTER.ordinal())) {\r
218 return false;\r
219 }\r
220 return true;\r
221 }\r
222\r
223 /**\r
224 Judge pcdType is valid\r
225 \r
226 @param type The PCdType want to be judged.\r
227 \r
228 @retval TRUE - The type is valid.\r
229 @retval FALSE - The type is invalid.\r
230 **/\r
231 public static boolean isValidpcdType(PCD_TYPE type) {\r
232 if ((type.ordinal() < PCD_TYPE.FEATURE_FLAG.ordinal() ) || \r
233 (type.ordinal() > PCD_TYPE.DYNAMIC_EX.ordinal())) {\r
234 return false;\r
235 }\r
236 return true;\r
237 }\r
238\r
239 /**\r
240 Add an usage instance for token\r
241 \r
242 @param usageInstance The usage instance\r
243 \r
244 @retval TRUE - Success to add usage instance.\r
245 @retval FALSE - Fail to add usage instance\r
246 **/\r
8840ad58 247 public boolean addUsageInstance(UsageInstance usageInstance) \r
248 throws EntityException {\r
249 String exceptionStr;\r
250\r
251 if (isUsageInstanceExist(usageInstance.moduleName,\r
252 usageInstance.moduleGUID,\r
253 usageInstance.packageName,\r
254 usageInstance.packageGUID,\r
255 usageInstance.arch,\r
256 usageInstance.version)) {\r
257 exceptionStr = String.format("PCD %s for module %s has already exist in database, Please check all PCD build entries "+\r
258 "in modules PcdPeim in <ModuleSA> to make sure no duplicated definitions!",\r
259 usageInstance.parentToken.cName,\r
260 usageInstance.moduleName);\r
261 throw new EntityException(exceptionStr);\r
878ddf1f 262 }\r
263\r
8840ad58 264 consumers.put(usageInstance.getPrimaryKey(), usageInstance);\r
878ddf1f 265 return true;\r
266 }\r
267\r
268 /**\r
8840ad58 269 Judge whether exist an usage instance for this token\r
270 \r
271 @param moduleName the name of module\r
272 @param moduleGuid the GUID name of modules\r
273 @param packageName the name of package contains this module\r
274 @param packageGuid the GUID name of package contains this module\r
275 @param arch the architecture string\r
276 @param version the version string\r
277 \r
278 @return boolean whether exist an usage instance for this token.\r
279 */\r
280 public boolean isUsageInstanceExist(String moduleName,\r
281 UUID moduleGuid,\r
282 String packageName,\r
283 UUID packageGuid,\r
284 String arch,\r
285 String version) {\r
286 String keyStr = UsageInstance.getPrimaryKey(moduleName, \r
287 moduleGuid, \r
288 packageName, \r
289 packageGuid, \r
290 arch, \r
291 version);\r
292 return (consumers.get(keyStr) != null);\r
878ddf1f 293 }\r
294\r
295 /**\r
296 Get the PCD_TYPE according to the string of PCD_TYPE\r
297 \r
298 @param pcdTypeStr The string of PCD_TYPE\r
299 \r
300 @return PCD_TYPE\r
301 **/\r
302 public static PCD_TYPE getpcdTypeFromString(String pcdTypeStr) {\r
303 if (pcdTypeStr == null) {\r
304 return PCD_TYPE.UNKNOWN;\r
305 }\r
306\r
307 if (pcdTypeStr.equalsIgnoreCase("FEATURE_FLAG")) {\r
308 return PCD_TYPE.FEATURE_FLAG;\r
309 } else if (pcdTypeStr.equalsIgnoreCase("FIXED_AT_BUILD")) {\r
310 return PCD_TYPE.FIXED_AT_BUILD;\r
311 } else if (pcdTypeStr.equalsIgnoreCase("PATCHABLE_IN_MODULE")) {\r
312 return PCD_TYPE.PATCHABLE_IN_MODULE;\r
313 } else if (pcdTypeStr.equalsIgnoreCase("DYNAMIC")) {\r
314 return PCD_TYPE.DYNAMIC;\r
315 } else if (pcdTypeStr.equalsIgnoreCase("DYNAMIC_EX")) {\r
316 return PCD_TYPE.DYNAMIC_EX;\r
317 } else {\r
318 return PCD_TYPE.UNKNOWN;\r
319 }\r
320 }\r
321\r
322 /**\r
323 Get the string of given datumType. This string will be used for generating autogen files\r
324 \r
325 @param datumType Given datumType\r
326 \r
327 @return The string of datum type.\r
328 **/\r
329 public static String getStringOfdatumType(DATUM_TYPE datumType) {\r
330 switch (datumType) {\r
331 case UINT8:\r
332 return "UINT8";\r
333 case UINT16:\r
334 return "UINT16";\r
335 case UINT32:\r
336 return "UINT32";\r
337 case UINT64:\r
338 return "UINT64";\r
339 case POINTER:\r
340 return "POINTER";\r
341 case BOOLEAN:\r
342 return "BOOLEAN";\r
343 }\r
344 return "UNKNOWN";\r
345 }\r
346\r
347 /**\r
348 Get the datumType according to a string.\r
349 \r
350 @param datumTypeStr The string of datumType\r
351 \r
352 @return DATUM_TYPE\r
353 **/\r
354 public static DATUM_TYPE getdatumTypeFromString(String datumTypeStr) {\r
355 if (datumTypeStr.equalsIgnoreCase("UINT8")) {\r
356 return DATUM_TYPE.UINT8;\r
357 } else if (datumTypeStr.equalsIgnoreCase("UINT16")) {\r
358 return DATUM_TYPE.UINT16;\r
359 } else if (datumTypeStr.equalsIgnoreCase("UINT32")) {\r
360 return DATUM_TYPE.UINT32;\r
361 } else if (datumTypeStr.equalsIgnoreCase("UINT64")) {\r
362 return DATUM_TYPE.UINT64;\r
363 } else if (datumTypeStr.equalsIgnoreCase("VOID*")) {\r
364 return DATUM_TYPE.POINTER;\r
365 } else if (datumTypeStr.equalsIgnoreCase("BOOLEAN")) {\r
366 return DATUM_TYPE.BOOLEAN;\r
367 }\r
368 return DATUM_TYPE.UNKNOWN;\r
369 }\r
370\r
371 /**\r
372 Get string of given pcdType\r
373 \r
374 @param pcdType The given PcdType\r
375 \r
376 @return The string of PCD_TYPE.\r
377 **/\r
378 public static String getStringOfpcdType(PCD_TYPE pcdType) {\r
379 switch (pcdType) {\r
380 case FEATURE_FLAG:\r
381 return "FEATURE_FLAG";\r
382 case FIXED_AT_BUILD:\r
383 return "FIXED_AT_BUILD";\r
384 case PATCHABLE_IN_MODULE:\r
385 return "PATCHABLE_IN_MODULE";\r
386 case DYNAMIC:\r
387 return "DYNAMIC";\r
388 case DYNAMIC_EX:\r
389 return "DYNAMIC_EX";\r
390 }\r
391 return "UNKNOWN";\r
392 }\r
393\r
394 /**\r
395 Get the PCD_USAGE according to a string\r
396 \r
397 @param usageStr The string of PCD_USAGE\r
398 \r
399 @return The PCD_USAGE\r
400 **/\r
401 public static PCD_USAGE getUsageFromString(String usageStr) {\r
402 if (usageStr == null) {\r
403 return PCD_USAGE.UNKNOWN;\r
404 }\r
405\r
406 if (usageStr.equalsIgnoreCase("ALWAYS_PRODUCED")) {\r
407 return PCD_USAGE.ALWAYS_PRODUCED;\r
408 } else if (usageStr.equalsIgnoreCase("SOMETIMES_PRODUCED")) {\r
409 return PCD_USAGE.SOMETIMES_PRODUCED;\r
410 } else if (usageStr.equalsIgnoreCase("ALWAYS_CONSUMED")) {\r
411 return PCD_USAGE.ALWAYS_CONSUMED;\r
412 } else if (usageStr.equalsIgnoreCase("SOMETIMES_CONSUMED")) {\r
413 return PCD_USAGE.SOMETIMES_CONSUMED;\r
414 }\r
415\r
416 return PCD_USAGE.UNKNOWN;\r
417 }\r
418\r
419 /**\r
420 Get the string of given PCD_USAGE\r
421 \r
422 @param usage The given PCD_USAGE\r
423 \r
424 @return The string of PDC_USAGE.\r
425 **/\r
426 public static String getStringOfUsage(PCD_USAGE usage) {\r
427 switch (usage) {\r
428 case ALWAYS_PRODUCED:\r
429 return "ALWAYS_PRODUCED";\r
430 case ALWAYS_CONSUMED:\r
431 return "ALWAYS_CONSUMED";\r
432 case SOMETIMES_PRODUCED:\r
433 return "SOMETIMES_PRODUCED";\r
434 case SOMETIMES_CONSUMED:\r
435 return "SOMETIMES_CONSUMED";\r
436 }\r
437 return "UNKNOWN";\r
438 }\r
439\r
440 /**\r
441 Get the Defined datumType string for autogen. The string is for generating some MACROs in Autogen.h\r
442 \r
443 @param datumType The given datumType\r
444\r
445 @return string of datum type for autogen.\r
446 **/\r
447 public static String GetAutogenDefinedatumTypeString(DATUM_TYPE datumType) {\r
448 switch (datumType) {\r
449 \r
450 case UINT8:\r
451 return "8";\r
452 case UINT16:\r
453 return "16";\r
454 case BOOLEAN:\r
455 return "BOOL";\r
456 case POINTER:\r
457 return "PTR";\r
458 case UINT32:\r
459 return "32";\r
460 case UINT64:\r
461 return "64";\r
462 default:\r
463 return null;\r
464 }\r
465 }\r
466\r
467 /**\r
468 Get the datumType String for Autogen. This string will be used for generating defintions of PCD token in autogen\r
469 \r
470 @param datumType The given datumType\r
471\r
472 @return string of datum type.\r
473 **/\r
474 public static String getAutogendatumTypeString(DATUM_TYPE datumType) {\r
475 switch (datumType) {\r
476 case UINT8:\r
477 return "UINT8";\r
478 case UINT16:\r
479 return "UINT16";\r
480 case UINT32:\r
481 return "UINT32";\r
482 case UINT64:\r
483 return "UINT64";\r
484 case POINTER:\r
485 return "VOID*";\r
486 case BOOLEAN:\r
487 return "BOOLEAN";\r
488 }\r
489 return null;\r
490 }\r
491\r
492 /**\r
493 Get the datumType string for generating some MACROs in autogen file of Library\r
494 \r
495 @param datumType The given datumType\r
496\r
497 @return String of datum for genrating bit charater.\r
498 **/\r
499 public static String getAutogenLibrarydatumTypeString(DATUM_TYPE datumType) {\r
500 switch (datumType) {\r
501 case UINT8:\r
502 return "8";\r
503 case UINT16:\r
504 return "16";\r
505 case BOOLEAN:\r
506 return "Bool";\r
507 case POINTER:\r
508 return "Ptr";\r
509 case UINT32:\r
510 return "32";\r
511 case UINT64:\r
512 return "64";\r
513 default:\r
514 return null;\r
515 }\r
516 }\r
517\r
518 /**\r
519 UUID defined in Schems is object, this function is to tranlate this object \r
520 to UUID data.\r
521 \r
522 @param uuidObj The object comes from schema.\r
523 \r
524 @return The traslated UUID instance.\r
525 **/\r
526 public static UUID getGUIDFromSchemaObject(Object uuidObj) {\r
527 UUID uuid;\r
528 if (uuidObj.toString().equalsIgnoreCase("0")) {\r
529 uuid = new UUID(0,0);\r
530 } else {\r
531 uuid = UUID.fromString(uuidObj.toString());\r
532 }\r
533\r
534 return uuid;\r
535 }\r
99d2c3c4 536\r
6ff7a41c 537 public DynamicTokenValue getDefaultSku() {\r
538 DynamicTokenValue dynamicData;\r
539 int index;\r
540 for (index = 0; index < this.skuData.size(); index ++) {\r
541 if (skuData.get(index).id == 0) {\r
542 return skuData.get(index).value;\r
543 }\r
544 }\r
545\r
546 return null;\r
547 }\r
f63ef4b2 548\r
549 /**\r
550 Get default value for a token, For HII type, HiiDefaultValue of default\r
551 SKU 0 will be returned; For Default type, the defaultvalue of default SKU\r
552 0 will be returned.\r
553 \r
554 @return String\r
555 */\r
556 public String getDynamicDefaultValue() {\r
557 DynamicTokenValue dynamicData = getDefaultSku();\r
558 if (hasDefaultValue()) {\r
559 switch (dynamicData.type) {\r
560 case HII_TYPE:\r
561 return dynamicData.hiiDefaultValue;\r
562 case DEFAULT_TYPE:\r
563 return dynamicData.value;\r
564 }\r
565 }\r
566\r
567 return null;\r
568 }\r
569\r
99d2c3c4 570 //\r
571 // BugBug: We need change this algorithm accordingly when schema is updated\r
572 // to support no default value.\r
573 //\r
574 public boolean hasDefaultValue () {\r
6ff7a41c 575 int value = 0;\r
576 boolean isInteger = true;\r
577 DynamicTokenValue dynamicValue = null;\r
578\r
579 if (this.isDynamicPCD) {\r
580 dynamicValue = getDefaultSku();\r
581 switch (dynamicValue.type) {\r
582 case HII_TYPE:\r
6f7e61a0 583 return !isValidNullValue(dynamicValue.hiiDefaultValue);\r
6ff7a41c 584 case VPD_TYPE:\r
585 return false;\r
6ff7a41c 586 case DEFAULT_TYPE:\r
6f7e61a0 587 return !isValidNullValue(dynamicValue.value);\r
588 }\r
589 }\r
590\r
591 return false;\r
592 }\r
6ff7a41c 593\r
6f7e61a0 594 public boolean isValidNullValue(String judgedValue) {\r
595 int intValue;\r
e59cdca8 596 String subStr;\r
6f7e61a0 597 BigInteger bigIntValue;\r
598\r
599 switch (datumType) {\r
600 case UINT8:\r
601 case UINT16:\r
602 case UINT32:\r
e59cdca8 603 if (judgedValue.length() > 2) {\r
604 if ((judgedValue.charAt(0) == '0') && \r
605 ((judgedValue.charAt(1) == 'x') || (judgedValue.charAt(1) == 'X'))){\r
606 subStr = judgedValue.substring(2, judgedValue.length());\r
607 bigIntValue = new BigInteger(subStr, 16);\r
608 } else {\r
609 bigIntValue = new BigInteger(judgedValue);\r
610 }\r
611 } else {\r
612 bigIntValue = new BigInteger(judgedValue);\r
613 }\r
614 if (bigIntValue.bitCount() == 0) {\r
6f7e61a0 615 return true;\r
616 }\r
617 break;\r
618 case UINT64:\r
619 if (judgedValue.length() > 2){\r
620 if ((judgedValue.charAt(0) == '0') && \r
621 ((judgedValue.charAt(1) == 'x') ||\r
622 (judgedValue.charAt(1) == 'X'))) {\r
623 bigIntValue = new BigInteger(judgedValue.substring(2, judgedValue.length()), 16);\r
624 if (bigIntValue.bitCount() == 0) {\r
625 return true;\r
626 }\r
6ff7a41c 627 } else {\r
6f7e61a0 628 bigIntValue = new BigInteger(judgedValue);\r
629 if (bigIntValue.bitCount() == 0) {\r
630 return true;\r
631 }\r
632 }\r
633 } else {\r
634 bigIntValue = new BigInteger(judgedValue);\r
635 if (bigIntValue.bitCount() == 0) {\r
6ff7a41c 636 return true;\r
637 }\r
6f7e61a0 638 }\r
639 break;\r
640 case BOOLEAN:\r
641 if (judgedValue.equalsIgnoreCase("false")) {\r
642 return true;\r
643 }\r
644 break;\r
645 case POINTER:\r
646 if (judgedValue.equalsIgnoreCase("") ||\r
647 judgedValue.equalsIgnoreCase("\"\"") ||\r
648 judgedValue.equalsIgnoreCase("L\"\"") ||\r
649 (judgedValue.length() == 0) ||\r
650 judgedValue.equalsIgnoreCase("{}")) {\r
651 return true;\r
6ff7a41c 652 }\r
32648c62 653 }\r
6ff7a41c 654 return false;\r
99d2c3c4 655 }\r
656\r
f63ef4b2 657 /**\r
658 Judege whether current value is UNICODE string type.\r
659 @return boolean\r
660 */\r
661 public boolean isUnicodeStringType () {\r
662 String str = getDynamicDefaultValue();\r
663\r
664 if (str == null) {\r
665 return false;\r
666 }\r
99d2c3c4 667\r
f63ef4b2 668 if (datumType == Token.DATUM_TYPE.POINTER &&\r
669 str.startsWith("L\"") && \r
670 str.endsWith("\"")) {\r
32648c62 671 return true;\r
672 }\r
99d2c3c4 673\r
32648c62 674 return false;\r
675 }\r
99d2c3c4 676\r
32648c62 677 public String getStringTypeString () { \r
6ff7a41c 678 return getDefaultSku().value.substring(2, getDefaultSku().value.length() - 1);\r
32648c62 679 }\r
878ddf1f 680}\r
681\r
682\r
683\r
684\r