123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- /*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ====================================================================
- */
-
- package org.apache.poi.util;
-
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.LinkedHashMap;
- import java.util.Map;
- import java.util.function.Supplier;
- import java.util.stream.Collectors;
-
- @Internal
- public final class GenericRecordUtil {
- private GenericRecordUtil() {}
-
- public static Map<String, Supplier<?>>
- getGenericProperties(String val1, Supplier<?> sup1) {
- return Collections.unmodifiableMap(Collections.singletonMap(val1, sup1));
- }
-
- public static Map<String, Supplier<?>> getGenericProperties(
- String val1, Supplier<?> sup1,
- String val2, Supplier<?> sup2
- ) {
- return getGenericProperties(val1, sup1, val2, sup2, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
- }
-
- public static Map<String, Supplier<?>> getGenericProperties(
- String val1, Supplier<?> sup1,
- String val2, Supplier<?> sup2,
- String val3, Supplier<?> sup3
- ) {
- return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, null, null, null, null, null, null, null, null, null, null, null, null);
- }
-
- public static Map<String, Supplier<?>> getGenericProperties(
- String val1, Supplier<?> sup1,
- String val2, Supplier<?> sup2,
- String val3, Supplier<?> sup3,
- String val4, Supplier<?> sup4
- ) {
- return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, null, null, null, null, null, null, null, null, null, null);
-
- }
-
- public static Map<String, Supplier<?>> getGenericProperties(
- String val1, Supplier<?> sup1,
- String val2, Supplier<?> sup2,
- String val3, Supplier<?> sup3,
- String val4, Supplier<?> sup4,
- String val5, Supplier<?> sup5
- ) {
- return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, val5, sup5, null, null, null, null, null, null, null, null);
- }
-
- public static Map<String, Supplier<?>> getGenericProperties(
- String val1, Supplier<?> sup1,
- String val2, Supplier<?> sup2,
- String val3, Supplier<?> sup3,
- String val4, Supplier<?> sup4,
- String val5, Supplier<?> sup5,
- String val6, Supplier<?> sup6
- ) {
- return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, val5, sup5, val6, sup6, null, null, null, null, null, null);
- }
-
- public static Map<String, Supplier<?>> getGenericProperties(
- String val1, Supplier<?> sup1,
- String val2, Supplier<?> sup2,
- String val3, Supplier<?> sup3,
- String val4, Supplier<?> sup4,
- String val5, Supplier<?> sup5,
- String val6, Supplier<?> sup6,
- String val7, Supplier<?> sup7
- ) {
- return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, val5, sup5, val6, sup6, val7, sup7, null, null, null, null);
- }
-
- public static Map<String, Supplier<?>> getGenericProperties(
- String val1, Supplier<?> sup1,
- String val2, Supplier<?> sup2,
- String val3, Supplier<?> sup3,
- String val4, Supplier<?> sup4,
- String val5, Supplier<?> sup5,
- String val6, Supplier<?> sup6,
- String val7, Supplier<?> sup7,
- String val8, Supplier<?> sup8
- ) {
- return getGenericProperties(val1, sup1, val2, sup2, val3, sup3, val4, sup4, val5, sup5, val6, sup6, val7, sup7, val8, sup8, null, null);
- }
-
- public static Map<String, Supplier<?>> getGenericProperties(
- String val1, Supplier<?> sup1,
- String val2, Supplier<?> sup2,
- String val3, Supplier<?> sup3,
- String val4, Supplier<?> sup4,
- String val5, Supplier<?> sup5,
- String val6, Supplier<?> sup6,
- String val7, Supplier<?> sup7,
- String val8, Supplier<?> sup8,
- String val9, Supplier<?> sup9
- ) {
- final Map<String,Supplier<?>> m = new LinkedHashMap<>();
-
- final String[] vals = { val1, val2, val3, val4, val5, val6, val7, val8, val9 };
- final Supplier<?>[] sups = { sup1, sup2, sup3, sup4, sup5, sup6, sup7, sup8, sup9 };
-
- for (int i=0; i<vals.length && vals[i] != null; i++) {
- assert(sups[i] != null);
- if ("base".equals(vals[i])) {
- Object baseMap = sups[i].get();
- assert(baseMap instanceof Map);
- //noinspection unchecked
- m.putAll((Map<String,Supplier<?>>)baseMap);
- } else {
- m.put(vals[i], sups[i]);
- }
- }
-
- return Collections.unmodifiableMap(m);
- }
-
- public static <T extends Enum<?>> Supplier<T> safeEnum(T[] values, Supplier<Number> ordinal) {
- return safeEnum(values, ordinal, null);
- }
-
- public static <T extends Enum<?>> Supplier<T> safeEnum(T[] values, Supplier<Number> ordinal, T defaultVal) {
- int ord = ordinal.get().intValue();
- return () -> (0 <= ord && ord < values.length) ? values[ord] : defaultVal;
- }
-
- public static Supplier<AnnotatedFlag> getBitsAsString(Supplier<Number> flags, final BitField[] masks, final String[] names) {
- int[] iMasks = Arrays.stream(masks).mapToInt(BitField::getMask).toArray();
- return () -> new AnnotatedFlag(flags, iMasks, names, false);
- }
-
- public static Supplier<AnnotatedFlag> getBitsAsString(Supplier<Number> flags, final int[] masks, final String[] names) {
- return () -> new AnnotatedFlag(flags, masks, names, false);
- }
-
- public static Supplier<AnnotatedFlag> getEnumBitsAsString(Supplier<Number> flags, final int[] masks, final String[] names) {
- return () -> new AnnotatedFlag(flags, masks, names, true);
- }
-
- public static class AnnotatedFlag {
- private final Supplier<Number> value;
- private final Map<Integer,String> masks = new LinkedHashMap<>();
- private final boolean exactMatch;
-
- AnnotatedFlag(Supplier<Number> value, int[] masks, String[] names, boolean exactMatch) {
- assert(masks.length == names.length);
-
- this.value = value;
- this.exactMatch = exactMatch;
- for (int i=0; i<masks.length; i++) {
- this.masks.put(masks[i], names[i]);
- }
- }
-
- public Supplier<Number> getValue() {
- return value;
- }
-
- public String getDescription() {
- final int val = value.get().intValue();
- return masks.entrySet().stream().
- filter(e -> match(val, e.getKey())).
- map(Map.Entry::getValue).
- collect(Collectors.joining(" | "));
- }
-
- private boolean match(final int val, int mask) {
- return exactMatch ? (val == mask) : ((val & mask) == mask);
- }
- }
- }
|