Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

GenericRecordUtil.java 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * ====================================================================
  3. * Licensed to the Apache Software Foundation (ASF) under one or more
  4. * contributor license agreements. See the NOTICE file distributed with
  5. * this work for additional information regarding copyright ownership.
  6. * The ASF licenses this file to You under the Apache License, Version 2.0
  7. * (the "License"); you may not use this file except in compliance with
  8. * the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. * ====================================================================
  18. */
  19. package org.apache.poi.util;
  20. import java.util.Arrays;
  21. import java.util.Collections;
  22. import java.util.LinkedHashMap;
  23. import java.util.Map;
  24. import java.util.function.Supplier;
  25. import java.util.stream.Collectors;
  26. @SuppressWarnings("java:S1452")
  27. @Internal
  28. public final class GenericRecordUtil {
  29. private GenericRecordUtil() {}
  30. public static Map<String, Supplier<?>>
  31. getGenericProperties(String val1, Supplier<?> sup1) {
  32. return Collections.singletonMap(val1, sup1);
  33. }
  34. public static Map<String, Supplier<?>> getGenericProperties(
  35. String val1, Supplier<?> sup1,
  36. String val2, Supplier<?> sup2
  37. ) {
  38. return getGenericProperties(val1, sup1, val2, sup2, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
  39. }
  40. public static Map<String, Supplier<?>> getGenericProperties(
  41. String val1, Supplier<?> sup1,
  42. String val2, Supplier<?> sup2,
  43. String val3, Supplier<?> sup3
  44. ) {
  45. return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, null, null, null, null, null, null, null, null, null, null, null, null);
  46. }
  47. public static Map<String, Supplier<?>> getGenericProperties(
  48. String val1, Supplier<?> sup1,
  49. String val2, Supplier<?> sup2,
  50. String val3, Supplier<?> sup3,
  51. String val4, Supplier<?> sup4
  52. ) {
  53. return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, null, null, null, null, null, null, null, null, null, null);
  54. }
  55. public static Map<String, Supplier<?>> getGenericProperties(
  56. String val1, Supplier<?> sup1,
  57. String val2, Supplier<?> sup2,
  58. String val3, Supplier<?> sup3,
  59. String val4, Supplier<?> sup4,
  60. String val5, Supplier<?> sup5
  61. ) {
  62. return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, val5, sup5, null, null, null, null, null, null, null, null);
  63. }
  64. public static Map<String, Supplier<?>> getGenericProperties(
  65. String val1, Supplier<?> sup1,
  66. String val2, Supplier<?> sup2,
  67. String val3, Supplier<?> sup3,
  68. String val4, Supplier<?> sup4,
  69. String val5, Supplier<?> sup5,
  70. String val6, Supplier<?> sup6
  71. ) {
  72. return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, val5, sup5, val6, sup6, null, null, null, null, null, null);
  73. }
  74. public static Map<String, Supplier<?>> getGenericProperties(
  75. String val1, Supplier<?> sup1,
  76. String val2, Supplier<?> sup2,
  77. String val3, Supplier<?> sup3,
  78. String val4, Supplier<?> sup4,
  79. String val5, Supplier<?> sup5,
  80. String val6, Supplier<?> sup6,
  81. String val7, Supplier<?> sup7
  82. ) {
  83. return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, val5, sup5, val6, sup6, val7, sup7, null, null, null, null);
  84. }
  85. public static Map<String, Supplier<?>> getGenericProperties(
  86. String val1, Supplier<?> sup1,
  87. String val2, Supplier<?> sup2,
  88. String val3, Supplier<?> sup3,
  89. String val4, Supplier<?> sup4,
  90. String val5, Supplier<?> sup5,
  91. String val6, Supplier<?> sup6,
  92. String val7, Supplier<?> sup7,
  93. String val8, Supplier<?> sup8
  94. ) {
  95. return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, val5, sup5, val6, sup6, val7, sup7, val8, sup8, null, null);
  96. }
  97. public static Map<String, Supplier<?>> getGenericProperties(
  98. String val1, Supplier<?> sup1,
  99. String val2, Supplier<?> sup2,
  100. String val3, Supplier<?> sup3,
  101. String val4, Supplier<?> sup4,
  102. String val5, Supplier<?> sup5,
  103. String val6, Supplier<?> sup6,
  104. String val7, Supplier<?> sup7,
  105. String val8, Supplier<?> sup8,
  106. String val9, Supplier<?> sup9
  107. ) {
  108. final Map<String,Supplier<?>> m = new LinkedHashMap<>();
  109. final String[] vals = { val1, val2, val3, val4, val5, val6, val7, val8, val9 };
  110. final Supplier<?>[] sups = { sup1, sup2, sup3, sup4, sup5, sup6, sup7, sup8, sup9 };
  111. for (int i=0; i<vals.length && vals[i] != null; i++) {
  112. assert(sups[i] != null);
  113. if ("base".equals(vals[i])) {
  114. Object baseMap = sups[i].get();
  115. assert(baseMap instanceof Map);
  116. //noinspection unchecked
  117. m.putAll((Map<String,Supplier<?>>)baseMap);
  118. } else {
  119. m.put(vals[i], sups[i]);
  120. }
  121. }
  122. return Collections.unmodifiableMap(m);
  123. }
  124. public static <T extends Enum<?>> Supplier<T> safeEnum(T[] values, Supplier<Number> ordinal) {
  125. return safeEnum(values, ordinal, null);
  126. }
  127. public static <T extends Enum<?>> Supplier<T> safeEnum(T[] values, Supplier<Number> ordinal, T defaultVal) {
  128. int ord = ordinal.get().intValue();
  129. return () -> (0 <= ord && ord < values.length) ? values[ord] : defaultVal;
  130. }
  131. public static Supplier<AnnotatedFlag> getBitsAsString(Supplier<Number> flags, final BitField[] masks, final String[] names) {
  132. int[] iMasks = Arrays.stream(masks).mapToInt(BitField::getMask).toArray();
  133. return () -> new AnnotatedFlag(flags, iMasks, names, false);
  134. }
  135. public static Supplier<AnnotatedFlag> getBitsAsString(Supplier<Number> flags, final int[] masks, final String[] names) {
  136. return () -> new AnnotatedFlag(flags, masks, names, false);
  137. }
  138. public static Supplier<AnnotatedFlag> getEnumBitsAsString(Supplier<Number> flags, final int[] masks, final String[] names) {
  139. return () -> new AnnotatedFlag(flags, masks, names, true);
  140. }
  141. public static class AnnotatedFlag {
  142. private final Supplier<Number> value;
  143. private final Map<Integer,String> masks = new LinkedHashMap<>();
  144. private final boolean exactMatch;
  145. AnnotatedFlag(Supplier<Number> value, int[] masks, String[] names, boolean exactMatch) {
  146. assert(masks.length == names.length);
  147. this.value = value;
  148. this.exactMatch = exactMatch;
  149. for (int i=0; i<masks.length; i++) {
  150. this.masks.put(masks[i], names[i]);
  151. }
  152. }
  153. public Supplier<Number> getValue() {
  154. return value;
  155. }
  156. public String getDescription() {
  157. final int val = value.get().intValue();
  158. return masks.entrySet().stream().
  159. filter(e -> match(val, e.getKey())).
  160. map(Map.Entry::getValue).
  161. collect(Collectors.joining(" | "));
  162. }
  163. private boolean match(final int val, int mask) {
  164. return exactMatch ? (val == mask) : ((val & mask) == mask);
  165. }
  166. }
  167. }