1 package org.openecomp.config;
3 import static org.openecomp.config.api.Hint.EXTERNAL_LOOKUP;
4 import static org.openecomp.config.api.Hint.LATEST_LOOKUP;
5 import static org.openecomp.config.api.Hint.NODE_SPECIFIC;
7 import com.virtlink.commons.configuration2.jackson.JsonConfiguration;
8 import net.sf.corn.cps.CPScanner;
9 import net.sf.corn.cps.ResourceFilter;
10 import org.apache.commons.configuration2.CompositeConfiguration;
11 import org.apache.commons.configuration2.Configuration;
12 import org.apache.commons.configuration2.FileBasedConfiguration;
13 import org.apache.commons.configuration2.PropertiesConfiguration;
14 import org.apache.commons.configuration2.XMLConfiguration;
15 import org.apache.commons.configuration2.builder.BasicConfigurationBuilder;
16 import org.apache.commons.configuration2.builder.ReloadingFileBasedConfigurationBuilder;
17 import org.apache.commons.configuration2.builder.fluent.Configurations;
18 import org.apache.commons.configuration2.builder.fluent.Parameters;
19 import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
20 import org.apache.commons.configuration2.ex.ConfigurationException;
21 import org.apache.commons.io.IOUtils;
22 import org.openecomp.config.api.ConfigurationManager;
23 import org.openecomp.config.impl.AgglomerateConfiguration;
24 import org.openecomp.config.impl.ConfigurationDataSource;
25 import org.openecomp.config.impl.ConfigurationRepository;
26 import org.openecomp.config.impl.YamlConfiguration;
27 import org.openecomp.config.type.ConfigurationMode;
28 import org.openecomp.config.type.ConfigurationType;
31 import java.lang.reflect.Field;
32 import java.lang.reflect.ParameterizedType;
33 import java.lang.reflect.Type;
35 import java.nio.file.Files;
36 import java.nio.file.Path;
37 import java.sql.Connection;
38 import java.sql.PreparedStatement;
39 import java.sql.ResultSet;
40 import java.sql.Statement;
41 import java.util.ArrayDeque;
42 import java.util.ArrayList;
43 import java.util.Arrays;
44 import java.util.Collection;
45 import java.util.Deque;
46 import java.util.HashMap;
47 import java.util.HashSet;
48 import java.util.Iterator;
49 import java.util.LinkedHashMap;
50 import java.util.List;
52 import java.util.Queue;
54 import java.util.SortedSet;
55 import java.util.Stack;
56 import java.util.TreeSet;
57 import java.util.concurrent.BlockingQueue;
58 import java.util.concurrent.ConcurrentLinkedQueue;
59 import java.util.concurrent.Executors;
60 import java.util.concurrent.LinkedBlockingQueue;
61 import java.util.concurrent.LinkedTransferQueue;
62 import java.util.concurrent.ScheduledExecutorService;
63 import java.util.concurrent.ThreadFactory;
64 import java.util.concurrent.TransferQueue;
65 import java.util.regex.Matcher;
66 import java.util.regex.Pattern;
67 import javax.sql.DataSource;
70 * The type Configuration utils.
72 public class ConfigurationUtils {
75 * Gets scheduled executor service.
77 * @return the scheduled executor service
79 public static ScheduledExecutorService getScheduledExecutorService() {
80 return Executors.newScheduledThreadPool(1, (r1) -> {
81 Thread thread = Executors.privilegedThreadFactory().newThread(r1);
82 thread.setDaemon(true);
88 * Gets thread factory.
90 * @return the thread factory
92 public static ThreadFactory getThreadFactory() {
94 Thread thread = Executors.privilegedThreadFactory().newThread(r1);
95 thread.setDaemon(true);
103 * @param file the file
104 * @param recursive the recursive
105 * @param onlyDirectory the only directory
106 * @return the all files
108 public static Collection<File> getAllFiles(File file, boolean recursive, boolean onlyDirectory) {
109 ArrayList<File> collection = new ArrayList<>();
110 if (file.isDirectory() && file.exists()) {
111 File[] files = file.listFiles();
112 for (File innerFile : files) {
113 if (innerFile.isFile() && !onlyDirectory) {
114 collection.add(innerFile);
115 } else if (innerFile.isDirectory()) {
116 collection.add(innerFile);
118 collection.addAll(getAllFiles(innerFile, recursive, onlyDirectory));
127 * Gets comma saperated list.
129 * @param list the list
130 * @return the comma saperated list
132 public static String getCommaSaperatedList(List list) {
133 String toReturn = "";
135 for (Object obj : list) {
136 if (!toReturn.trim().isEmpty()) {
146 * Gets comma saperated list.
148 * @param list the list
149 * @return the comma saperated list
151 public static String getCommaSaperatedList(String[] list) {
152 return getCommaSaperatedList(list == null ? Arrays.asList() : Arrays.asList(list));
159 * @return the config type
161 public static ConfigurationType getConfigType(URL url) {
162 return Enum.valueOf(ConfigurationType.class,
163 url.getFile().substring(url.getFile().lastIndexOf('.') + 1).toUpperCase());
169 * @param file the file
170 * @return the config type
172 public static ConfigurationType getConfigType(File file) {
173 return Enum.valueOf(ConfigurationType.class,
174 file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf('.') + 1)
182 * @return the boolean
184 public static boolean isConfig(URL url) {
185 return isConfig(url.getFile());
191 * @param file the file
192 * @return the boolean
194 public static boolean isConfig(File file) {
195 return file != null && file.exists() && isConfig(file.getName());
201 * @param file the file
202 * @return the boolean
204 public static boolean isConfig(String file) {
205 file = file.toUpperCase().substring(file.lastIndexOf('!') + 1);
206 file = file.substring(file.lastIndexOf('/') + 1);
208 "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE
209 + "|" + ConfigurationMode.UNION + ")){0,1}" + "\\.("
210 + ConfigurationType.PROPERTIES.name() + "|" + ConfigurationType.XML.name() + "|"
211 + ConfigurationType.JSON.name() + "|" + ConfigurationType.YAML.name() + ")$")
212 || file.matches("CONFIG(.)*\\.(" + ConfigurationType.PROPERTIES.name() + "|"
213 + ConfigurationType.XML.name() + "|" + ConfigurationType.JSON.name() + "|"
214 + ConfigurationType.YAML.name() + ")$");
221 * @return the namespace
223 public static String getNamespace(URL url) {
224 String namespace = getNamespace(getConfiguration(url));
225 if (namespace != null) {
226 return namespace.toUpperCase();
228 return getNamespace(url.getFile().toUpperCase());
234 * @param file the file
235 * @return the namespace
237 public static String getNamespace(File file) {
238 String namespace = getNamespace(getConfiguration(file));
239 if (namespace != null) {
240 return namespace.toUpperCase();
242 return getNamespace(file.getName().toUpperCase());
245 private static String getNamespace(Configuration config) {
246 return config.getString(Constants.NAMESPACE_KEY) == null ? null
247 : config.getString(Constants.NAMESPACE_KEY).toUpperCase();
253 * @param file the file
254 * @return the namespace
256 public static String getNamespace(String file) {
257 file = file.toUpperCase().substring(file.lastIndexOf('!') + 1);
258 file = file.substring(file.lastIndexOf('/') + 1);
259 Pattern pattern = Pattern.compile(
260 "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE
261 + "|" + ConfigurationMode.UNION + ")){0,1}" + "\\.("
262 + ConfigurationType.PROPERTIES.name() + "|" + ConfigurationType.XML.name() + "|"
263 + ConfigurationType.JSON.name() + "|" + ConfigurationType.YAML.name() + ")$");
264 Matcher matcher = pattern.matcher(file);
265 boolean b1 = matcher.matches();
267 if (matcher.group(1) != null) {
268 String moduleName = matcher.group(1).substring(1);
269 return moduleName.equalsIgnoreCase(ConfigurationMode.OVERRIDE.name())
270 || moduleName.equalsIgnoreCase(ConfigurationMode.UNION.name())
271 || moduleName.equalsIgnoreCase(ConfigurationMode.MERGE.name())
272 ? Constants.DEFAULT_NAMESPACE : moduleName;
274 return Constants.DEFAULT_NAMESPACE;
276 } else if (isConfig(file)) {
277 return Constants.DEFAULT_NAMESPACE;
284 * Gets merge strategy.
287 * @return the merge strategy
289 public static ConfigurationMode getMergeStrategy(URL url) {
290 String configMode = getMergeStrategy(getConfiguration(url));
291 if (configMode != null) {
293 return Enum.valueOf(ConfigurationMode.class, configMode);
294 } catch (Exception exception) {
298 return getMergeStrategy(url.getFile().toUpperCase());
301 private static String getMergeStrategy(Configuration config) {
302 return config.getString(Constants.MODE_KEY) == null ? null
303 : config.getString(Constants.MODE_KEY).toUpperCase();
307 * Gets merge strategy.
309 * @param file the file
310 * @return the merge strategy
312 public static ConfigurationMode getMergeStrategy(File file) {
313 String configMode = getMergeStrategy(getConfiguration(file));
314 if (configMode != null) {
316 return Enum.valueOf(ConfigurationMode.class, configMode);
317 } catch (Exception exception) {
321 return getMergeStrategy(file.getName().toUpperCase());
325 * Gets merge strategy.
327 * @param file the file
328 * @return the merge strategy
330 public static ConfigurationMode getMergeStrategy(String file) {
331 file = file.toUpperCase().substring(file.lastIndexOf('!') + 1);
332 file = file.substring(file.lastIndexOf('/') + 1);
333 Pattern pattern = Pattern.compile(
334 "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE
335 + "|" + ConfigurationMode.UNION + ")){0,1}" + "\\.("
336 + ConfigurationType.PROPERTIES.name() + "|" + ConfigurationType.XML.name() + "|"
337 + ConfigurationType.JSON.name() + "|" + ConfigurationType.YAML.name() + ")$");
338 Matcher matcher = pattern.matcher(file);
339 boolean b1 = matcher.matches();
341 for (int i = 1; i <= matcher.groupCount(); i++) {
342 String modeName = matcher.group(i);
343 if (modeName != null) {
344 modeName = modeName.substring(1);
347 return Enum.valueOf(ConfigurationMode.class, modeName);
348 } catch (Exception exception) {
358 * Gets configuration.
361 * @return the configuration
363 public static FileBasedConfiguration getConfiguration(URL url) {
364 FileBasedConfiguration builder = null;
366 switch (ConfigurationUtils.getConfigType(url)) {
368 builder = new Configurations().fileBased(PropertiesConfiguration.class, url);
371 builder = new Configurations().fileBased(XMLConfiguration.class, url);
374 builder = new Configurations().fileBased(JsonConfiguration.class, url);
377 builder = new Configurations().fileBased(YamlConfiguration.class, url);
381 } catch (ConfigurationException exception) {
382 exception.printStackTrace();
388 * Gets configuration.
391 * @return the configuration
393 public static FileBasedConfiguration getConfiguration(File url) {
394 FileBasedConfiguration builder = null;
396 switch (ConfigurationUtils.getConfigType(url)) {
398 builder = new Configurations().fileBased(PropertiesConfiguration.class, url);
401 builder = new Configurations().fileBased(XMLConfiguration.class, url);
404 builder = new Configurations().fileBased(JsonConfiguration.class, url);
407 builder = new Configurations().fileBased(YamlConfiguration.class, url);
411 } catch (ConfigurationException exception) {
412 exception.printStackTrace();
418 * Gets collection generic type.
420 * @param field the field
421 * @return the collection generic type
423 public static Class getCollectionGenericType(Field field) {
424 Type type = field.getGenericType();
426 if (type instanceof ParameterizedType) {
428 ParameterizedType paramType = (ParameterizedType) type;
429 Type[] arr = paramType.getActualTypeArguments();
431 for (Type tp : arr) {
432 Class<?> clzz = (Class<?>) tp;
433 if (isWrapperClass(clzz)) {
436 throw new RuntimeException("Collection of type " + clzz.getName() + " not supported.");
440 return String[].class;
446 * @param clazz the clazz
447 * @return the array class
449 public static Class getArrayClass(Class clazz) {
450 switch (clazz.getName()) {
451 case "java.lang.Byte":
453 case "java.lang.Short":
454 return Short[].class;
455 case "java.lang.Integer":
456 return Integer[].class;
457 case "java.lang.Long":
459 case "java.lang.Float":
460 return Float[].class;
461 case "java.lang.Double":
462 return Double[].class;
463 case "java.lang.Boolean":
464 return Boolean[].class;
465 case "java.lang.Character":
466 return Character[].class;
467 case "java.lang.String":
468 return String[].class;
475 * Gets all class path resources.
477 * @return the all class path resources
479 public static List<URL> getAllClassPathResources() {
480 return CPScanner.scanResources(new ResourceFilter());
484 * Execute ddlsql boolean.
487 * @return the boolean
488 * @throws Exception the exception
490 public static boolean executeDdlSql(String sql) throws Exception {
491 DataSource datasource = ConfigurationDataSource.lookup();
492 if (datasource == null) {
493 System.err.println("DB configuration not found. Configuration management will be using "
494 + "in-memory persistence.");
497 try (Connection con = datasource.getConnection(); Statement stmt = con.createStatement()) {
498 stmt.executeQuery(sql);
499 } catch (Exception exception) {
500 System.err.println("Datasource initialization error. Configuration management will be using in-memory persistence.");
507 * Gets configuration builder.
510 * @return the configuration builder
512 public static BasicConfigurationBuilder<FileBasedConfiguration> getConfigurationBuilder(URL url) {
513 ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> builder = null;
514 switch (ConfigurationUtils.getConfigType(url)) {
516 builder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
517 PropertiesConfiguration.class);
520 builder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
521 XMLConfiguration.class);
524 builder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
525 JsonConfiguration.class);
528 builder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
529 YamlConfiguration.class);
533 builder.configure(new Parameters().fileBased().setURL(url)
534 .setListDelimiterHandler(new DefaultListDelimiterHandler(',')));
539 * Gets configuration builder.
541 * @param file the file
542 * @param autoSave the auto save
543 * @return the configuration builder
545 public static BasicConfigurationBuilder<FileBasedConfiguration> getConfigurationBuilder(File file,
547 ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> builder = null;
548 switch (ConfigurationUtils.getConfigType(file)) {
550 builder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
551 PropertiesConfiguration.class);
554 builder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
555 XMLConfiguration.class);
558 builder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
559 JsonConfiguration.class);
562 builder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
563 YamlConfiguration.class);
567 builder.configure(new Parameters().fileBased().setFile(file)
568 .setListDelimiterHandler(new DefaultListDelimiterHandler(',')));
569 builder.setAutoSave(autoSave);
575 * Execute select sql collection.
578 * @param params the params
579 * @return the collection
580 * @throws Exception the exception
582 public static Collection<String> executeSelectSql(String sql, String[] params) throws Exception {
583 Collection<String> coll = new ArrayList<>();
584 DataSource datasource = ConfigurationDataSource.lookup();
585 try (Connection con = datasource.getConnection();
586 PreparedStatement stmt = con.prepareStatement(sql)) {
587 if (params != null) {
588 for (int i = 0; i < params.length; i++) {
589 stmt.setString(i + 1, params[i]);
593 try (ResultSet rs = stmt.executeQuery()) {
596 coll.add(rs.getString(1));
600 } catch (Exception exception) {
601 //exception.printStackTrace();
609 * Execute insert sql boolean.
612 * @param params the params
613 * @return the boolean
614 * @throws Exception the exception
616 public static boolean executeInsertSql(String sql, Object[] params) throws Exception {
617 Collection<String> coll = new ArrayList<>();
618 DataSource datasource = ConfigurationDataSource.lookup();
619 try (Connection con = datasource.getConnection();
620 PreparedStatement stmt = con.prepareStatement(sql)) {
621 if (params != null) {
623 for (Object obj : params) {
627 switch (obj.getClass().getName()) {
628 case "java.lang.String":
629 stmt.setString(++counter, obj.toString());
631 case "java.lang.Integer":
632 stmt.setInt(++counter, ((Integer) obj).intValue());
634 case "java.lang.Long":
635 stmt.setLong(++counter, ((Long) obj).longValue());
638 stmt.setString(++counter, obj.toString());
643 stmt.executeUpdate();
645 } catch (Exception exception) {
646 exception.printStackTrace();
654 * @param <T> the type parameter
655 * @param config the config
656 * @param clazz the clazz
657 * @param keyPrefix the key prefix
659 * @throws Exception the exception
661 public static <T> T read(Configuration config, Class<T> clazz, String keyPrefix)
663 org.openecomp.config.api.Config confAnnot =
664 clazz.getAnnotation(org.openecomp.config.api.Config.class);
665 if (confAnnot != null) {
666 keyPrefix += (confAnnot.key() + ".");
668 T objToReturn = clazz.newInstance();
669 for (Field field : clazz.getDeclaredFields()) {
670 org.openecomp.config.api.Config fieldConfAnnot =
671 field.getAnnotation(org.openecomp.config.api.Config.class);
672 if (fieldConfAnnot != null) {
673 field.setAccessible(true);
674 field.set(objToReturn, config.getProperty(keyPrefix + fieldConfAnnot.key()));
675 } else if (field.getType().getAnnotation(org.openecomp.config.api.Config.class) != null) {
676 field.set(objToReturn, read(config, field.getType(), keyPrefix));
683 * Gets db configuration builder.
685 * @param configName the config name
686 * @return the db configuration builder
687 * @throws Exception the exception
689 public static BasicConfigurationBuilder<AgglomerateConfiguration> getDbConfigurationBuilder(
690 String configName) throws Exception {
691 Configuration dbConfig = ConfigurationRepository.lookup()
692 .getConfigurationFor(Constants.DEFAULT_TENANT, Constants.DB_NAMESPACE);
693 BasicConfigurationBuilder<AgglomerateConfiguration> builder =
694 new BasicConfigurationBuilder<AgglomerateConfiguration>(AgglomerateConfiguration.class);
696 new Parameters().database()
697 .setDataSource(ConfigurationDataSource.lookup())
698 .setTable(dbConfig.getString("config.Table"))
699 .setKeyColumn(dbConfig.getString("configKey"))
700 .setValueColumn(dbConfig.getString("configValue"))
701 .setConfigurationNameColumn(dbConfig.getString("configNameColumn"))
702 .setConfigurationName(configName)
711 * @param config the config
713 * @param processingHints the processing hints
714 * @return the property
716 public static Object getProperty(Configuration config, String key, int processingHints) {
717 if (!isDirectLookup(processingHints)) {
718 if (config instanceof AgglomerateConfiguration) {
719 return ((AgglomerateConfiguration) config).getPropertyValue(key);
720 } else if (config instanceof CompositeConfiguration) {
721 CompositeConfiguration conf = (CompositeConfiguration) config;
722 for (int i = 0; i < conf.getNumberOfConfigurations(); i++) {
723 if (conf.getConfiguration(i) instanceof AgglomerateConfiguration) {
724 return ((AgglomerateConfiguration) conf.getConfiguration(i)).getPropertyValue(key);
725 } else if (isNodeSpecific(processingHints)) {
726 Object obj = conf.getConfiguration(i).getProperty(key);
734 return config.getProperty(key);
738 * Gets primitive array.
740 * @param collection the collection
741 * @param clazz the clazz
742 * @return the primitive array
744 public static Object getPrimitiveArray(Collection collection, Class clazz) {
746 if (clazz == int.class) {
747 int[] array = new int[collection.size()];
748 Object[] objArray = collection.toArray();
749 for (int i = 0; i < collection.size(); i++) {
750 array[i] = (int) objArray[i];
754 if (clazz == byte.class) {
755 byte[] array = new byte[collection.size()];
756 Object[] objArray = collection.toArray();
757 for (int i = 0; i < collection.size(); i++) {
758 array[i] = (byte) objArray[i];
762 if (clazz == short.class) {
763 short[] array = new short[collection.size()];
764 Object[] objArray = collection.toArray();
765 for (int i = 0; i < collection.size(); i++) {
766 array[i] = (short) objArray[i];
770 if (clazz == long.class) {
771 long[] array = new long[collection.size()];
772 Object[] objArray = collection.toArray();
773 for (int i = 0; i < collection.size(); i++) {
774 array[i] = (long) objArray[i];
778 if (clazz == float.class) {
779 float[] array = new float[collection.size()];
780 Object[] objArray = collection.toArray();
781 for (int i = 0; i < collection.size(); i++) {
782 array[i] = (float) objArray[i];
786 if (clazz == double.class) {
787 double[] array = new double[collection.size()];
788 Object[] objArray = collection.toArray();
789 for (int i = 0; i < collection.size(); i++) {
790 array[i] = (double) objArray[i];
794 if (clazz == boolean.class) {
795 boolean[] array = new boolean[collection.size()];
796 Object[] objArray = collection.toArray();
797 for (int i = 0; i < collection.size(); i++) {
798 array[i] = (boolean) objArray[i];
807 * Is wrapper class boolean.
809 * @param clazz the clazz
810 * @return the boolean
812 public static boolean isWrapperClass(Class clazz) {
813 return clazz == String.class || clazz == Boolean.class || clazz == Character.class
814 || Number.class.isAssignableFrom(clazz);
818 * Gets collection string.
820 * @param input the input
821 * @return the collection string
823 public static String getCollectionString(String input) {
824 Pattern pattern = Pattern.compile("^\\[(.*)\\]$");
825 Matcher matcher = pattern.matcher(input);
826 if (matcher.matches()) {
827 input = matcher.group(1);
833 * Is collection boolean.
835 * @param input the input
836 * @return the boolean
838 public static boolean isCollection(String input) {
839 Pattern pattern = Pattern.compile("^\\[(.*)\\]$");
840 Matcher matcher = pattern.matcher(input);
841 return matcher.matches();
845 * Process variables if present string.
847 * @param tenant the tenant
848 * @param namespace the namespace
849 * @param data the data
852 public static String processVariablesIfPresent(String tenant, String namespace, String data) {
853 Pattern pattern = Pattern.compile("^.*\\$\\{(.*)\\}.*");
854 Matcher matcher = pattern.matcher(data);
855 if (matcher.matches()) {
856 String key = matcher.group(1);
857 if (key.toUpperCase().startsWith("ENV:")) {
858 String envValue = System.getenv(key.substring(4));
859 return processVariablesIfPresent(tenant, namespace, data.replaceAll("\\$\\{" + key + "\\}",
860 envValue == null ? "" : envValue.replace("\\", "\\\\")));
861 } else if (key.toUpperCase().startsWith("SYS:")) {
862 String sysValue = System.getProperty(key.substring(4));
863 return processVariablesIfPresent(tenant, namespace, data.replaceAll("\\$\\{" + key + "\\}",
864 sysValue == null ? "" : sysValue.replace("\\", "\\\\")));
866 String propertyValue = ConfigurationUtils.getCollectionString(
867 ConfigurationManager.lookup().getAsStringValues(tenant, namespace, key).toString());
868 return processVariablesIfPresent(tenant, namespace, data.replaceAll("\\$\\{" + key + "\\}",
869 propertyValue == null ? "" : propertyValue.replace("\\", "\\\\")));
877 * Gets file contents.
879 * @param path the path
880 * @return the file contents
882 public static String getFileContents(String path) {
885 return IOUtils.toString(new URL(path));
887 } catch (Exception exception) {
888 exception.printStackTrace();
894 * Gets file contents.
896 * @param path the path
897 * @return the file contents
899 public static String getFileContents(Path path) {
902 return new String(Files.readAllBytes(path));
904 } catch (Exception exception) {
905 exception.printStackTrace();
911 * Gets concrete collection.
913 * @param clazz the clazz
914 * @return the concrete collection
916 public static Collection getConcreteCollection(Class clazz) {
917 Collection collection = null;
919 switch (clazz.getName()) {
920 case "java.util.Collection":
921 case "java.util.List":
922 return new ArrayList<>();
923 case "java.util.Set":
924 return new HashSet<>();
925 case "java.util.SortedSet":
926 return new TreeSet<>();
927 case "java.util.Queue":
928 return new ConcurrentLinkedQueue<>();
929 case "java.util.Deque":
930 return new ArrayDeque<>();
931 case "java.util.concurrent.TransferQueue":
932 return new LinkedTransferQueue<>();
933 case "java.util.concurrent.BlockingQueue":
934 return new LinkedBlockingQueue<>();
944 * @param clazz the clazz
945 * @return the default for
947 public static Object getDefaultFor(Class clazz) {
948 if (byte.class == clazz) {
949 return new Byte("0");
950 } else if (short.class == clazz) {
951 return new Short("0");
952 } else if (int.class == clazz) {
953 return new Integer("0");
954 } else if (float.class == clazz) {
955 return new Float("0");
956 } else if (long.class == clazz) {
957 return new Long("0");
958 } else if (double.class == clazz) {
959 return new Double("0");
960 } else if (boolean.class == clazz) {
961 return Boolean.FALSE;
963 return new Character((char) 0);
967 * Gets compatible collection for abstract def.
969 * @param clazz the clazz
970 * @return the compatible collection for abstract def
972 public static Collection getCompatibleCollectionForAbstractDef(Class clazz) {
973 if (BlockingQueue.class.isAssignableFrom(clazz)) {
974 return getConcreteCollection(BlockingQueue.class);
976 if (TransferQueue.class.isAssignableFrom(clazz)) {
977 return getConcreteCollection(TransferQueue.class);
979 if (Deque.class.isAssignableFrom(clazz)) {
980 return getConcreteCollection(Deque.class);
982 if (Queue.class.isAssignableFrom(clazz)) {
983 return getConcreteCollection(Queue.class);
985 if (SortedSet.class.isAssignableFrom(clazz)) {
986 return getConcreteCollection(SortedSet.class);
988 if (Set.class.isAssignableFrom(clazz)) {
989 return getConcreteCollection(Set.class);
991 if (List.class.isAssignableFrom(clazz)) {
992 return getConcreteCollection(List.class);
998 * Gets configuration repository key.
1000 * @param array the array
1001 * @return the configuration repository key
1003 public static String getConfigurationRepositoryKey(String[] array) {
1004 Stack<String> stack = new Stack<>();
1005 stack.push(Constants.DEFAULT_TENANT);
1006 for (String element : array) {
1007 stack.push(element);
1009 String toReturn = stack.pop();
1010 return stack.pop() + Constants.KEY_ELEMENTS_DELEMETER + toReturn;
1014 * Gets configuration repository key.
1016 * @param file the file
1017 * @return the configuration repository key
1019 public static String getConfigurationRepositoryKey(File file) {
1020 return getConfigurationRepositoryKey(
1021 ConfigurationUtils.getNamespace(file).split(Constants.TENANT_NAMESPACE_SAPERATOR));
1025 * Gets configuration repository key.
1027 * @param url the url
1028 * @return the configuration repository key
1030 public static String getConfigurationRepositoryKey(URL url) {
1031 return getConfigurationRepositoryKey(
1032 ConfigurationUtils.getNamespace(url).split(Constants.TENANT_NAMESPACE_SAPERATOR));
1036 * To map linked hash map.
1038 * @param config the config
1039 * @return the linked hash map
1041 public static LinkedHashMap toMap(Configuration config) {
1042 Iterator<String> iterator = config.getKeys();
1043 LinkedHashMap<String, String> map = new LinkedHashMap<>();
1044 while (iterator.hasNext()) {
1045 String key = iterator.next();
1046 if (!(key.equals(Constants.MODE_KEY) || key.equals(Constants.NAMESPACE_KEY)
1047 || key.equals(Constants.LOAD_ORDER_KEY))) {
1048 map.put(key, config.getProperty(key).toString());
1058 * @param orig the orig
1059 * @param latest the latest
1062 public static Map diff(LinkedHashMap orig, LinkedHashMap latest) {
1063 orig = new LinkedHashMap<>(orig);
1064 latest = new LinkedHashMap<>(latest);
1065 List<String> set = new ArrayList(orig.keySet());
1066 for (String key : set) {
1067 if (latest.remove(key, orig.get(key))) {
1071 Set<String> keys = latest.keySet();
1072 for (String key : keys) {
1075 set = new ArrayList(orig.keySet());
1076 for (String key : set) {
1077 latest.put(key, "");
1079 return new HashMap<>(latest);
1085 * @param tenant the tenant
1086 * @param namespace the namespace
1087 * @param key the key
1088 * @param processingHints the processing hints
1089 * @return the boolean
1090 * @throws Exception the exception
1092 public static boolean isArray(String tenant, String namespace, String key, int processingHints)
1094 Object obj = ConfigurationUtils
1095 .getProperty(ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace), key,
1097 return (obj == null) ? false : ConfigurationUtils.isCollection(obj.toString());
1101 * Is direct lookup boolean.
1103 * @param hints the hints
1104 * @return the boolean
1106 public static boolean isDirectLookup(int hints) {
1107 return (hints & LATEST_LOOKUP.value()) == LATEST_LOOKUP.value();
1111 * Is external lookup boolean.
1113 * @param hints the hints
1114 * @return the boolean
1116 public static boolean isExternalLookup(int hints) {
1117 return (hints & EXTERNAL_LOOKUP.value()) == EXTERNAL_LOOKUP.value();
1121 * Is node specific boolean.
1123 * @param hints the hints
1124 * @return the boolean
1126 public static boolean isNodeSpecific(int hints) {
1127 return (hints & NODE_SPECIFIC.value()) == NODE_SPECIFIC.value();
1130 public static boolean isZeroLengthArray(Class clazz, Object obj){
1131 if (clazz.isArray() && clazz.getComponentType().isPrimitive()){
1132 if (clazz.getComponentType()==int.class){
1133 return ((int[])obj).length==0;
1134 }else if (clazz.getComponentType()==byte.class){
1135 return ((byte[])obj).length==0;
1136 }else if (clazz.getComponentType()==short.class){
1137 return ((short[])obj).length==0;
1138 }else if (clazz.getComponentType()==float.class){
1139 return ((float[])obj).length==0;
1140 }else if (clazz.getComponentType()==boolean.class){
1141 return ((boolean[])obj).length==0;
1142 }else if (clazz.getComponentType()==double.class){
1143 return ((double[])obj).length==0;
1144 }else if (clazz.getComponentType()==long.class){
1145 return ((long[])obj).length==0;
1147 return ((Object[])obj).length==0;
1155 * Checks if value is blank
1159 public static boolean isBlank(String value){
1160 return value==null || value.trim().length()==0;