Guest User

Untitled

a guest
Nov 20th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. package com.hlag.fis.test.persistence;
  2.  
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.Map.Entry;
  7. import java.util.Properties;
  8.  
  9. import javax.persistence.EntityManager;
  10. import javax.persistence.EntityManagerFactory;
  11. import javax.persistence.Persistence;
  12. import javax.persistence.spi.PersistenceUnitInfo;
  13.  
  14. import org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate;
  15. import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;
  16.  
  17. import com.google.common.collect.Maps;
  18.  
  19. /**
  20. * Use this class instead of
  21. *
  22. * <pre>
  23. * <code>
  24. * EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(puName);
  25. * EntityManager em = entityManagerFactory.createEntityManager();
  26. * </code>
  27. * </pre>
  28. *
  29. * because this class allows to override properties using environment variables. Usage in persistence.xml:
  30. *
  31. * <pre>
  32. * <code>
  33. * <property name="javax.persistence.jdbc.url"
  34. * value="jdbc:db2://${DEVE_DB_HOST}/DB:currentSchema=DEVELOP;" />
  35. * <property name="javax.persistence.jdbc.user" value="${DEVE_DB_USER}" />
  36. * <property name="javax.persistence.jdbc.password" value="${DEVE_DB_PASSWORD}" />
  37. * </code>
  38. * </pre>
  39. */
  40. public class EnvironmentalEntityManagerFactory {
  41.  
  42. private static final Map<String, String> ENVIRONMENT = new HashMap<>(System.getenv());
  43.  
  44. public static void setEnvironmentVariables(Map<String, String> environment) {
  45. ENVIRONMENT.putAll(environment);
  46. }
  47.  
  48. public static void resetEnvironmentVariables() {
  49. ENVIRONMENT.clear();
  50. ENVIRONMENT.putAll(System.getenv());
  51. }
  52.  
  53. public static EntityManager createEntityManager(String persistenceUnitName) {
  54. return createEntityManager(persistenceUnitName, Collections.emptyMap());
  55. }
  56.  
  57. public static EntityManager createEntityManager(
  58. String persistenceUnitName,
  59. Map<Object, Object> entityManagerFactoryProperties) {
  60. return createEntityManagerFactory(persistenceUnitName, entityManagerFactoryProperties).createEntityManager();
  61. }
  62.  
  63. public static EntityManagerFactory createEntityManagerFactory(
  64. String persistenceUnitName,
  65. Map<Object, Object> properties) {
  66. EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);
  67. try (ClosableEntityManagerFactoryProperties factoryProps = new ClosableEntityManagerFactoryProperties(factory)) {
  68. Map<Object, Object> overrideProps = replaceWithEnvironmentVariableValues(factoryProps.asMap());
  69. overrideProps.putAll(properties);
  70. return Persistence.createEntityManagerFactory(persistenceUnitName, overrideProps);
  71. }
  72. }
  73.  
  74. private static Map<Object, Object> replaceWithEnvironmentVariableValues(Map<String, String> props) {
  75. Map<Object, Object> overrideProps = new HashMap<>();
  76. for (Entry<String, String> entry : props.entrySet()) {
  77. String key = entry.getKey();
  78. String value = entry.getValue();
  79. boolean overridden = false;
  80. if (containsVariable(key)) {
  81. key = replaceWithVariableValue(key);
  82. overridden = true;
  83. }
  84. if (containsVariable(value)) {
  85. value = replaceWithVariableValue(value);
  86. overridden = true;
  87. }
  88. if (overridden) {
  89. overrideProps.put(key, value);
  90. }
  91. }
  92. return overrideProps;
  93. }
  94.  
  95. private static boolean containsVariable(String s) {
  96. int variableStartIndex = s.indexOf("${");
  97. int variableEndIndex = s.lastIndexOf('}');
  98. return variableStartIndex >= 0 && variableStartIndex < variableEndIndex;
  99. }
  100.  
  101. private static String replaceWithVariableValue(String key) {
  102. for (Entry<String, String> entry : ENVIRONMENT.entrySet()) {
  103. key = key.replace("${" + entry.getKey() + "}", entry.getValue());
  104. }
  105. return key;
  106. }
  107.  
  108. static final class ClosableEntityManagerFactoryProperties implements AutoCloseable {
  109.  
  110. private final EntityManagerFactory factory;
  111.  
  112. ClosableEntityManagerFactoryProperties(EntityManagerFactory factory) {
  113. this.factory = factory;
  114. }
  115.  
  116. @Override
  117. public void close() {
  118. factory.close();
  119. }
  120.  
  121. Map<String, String> asMap() {
  122. EntityManagerFactoryImpl eclipseLinkFactory = factory.unwrap(EntityManagerFactoryImpl.class);
  123. EntityManagerFactoryDelegate delegate = eclipseLinkFactory.unwrap(EntityManagerFactoryDelegate.class);
  124. PersistenceUnitInfo persistenceUnitInfo = delegate.getSetupImpl().getPersistenceUnitInfo();
  125. Properties factoryProps = persistenceUnitInfo.getProperties();
  126. return Maps.fromProperties(factoryProps);
  127. }
  128. }
  129.  
  130. }
Add Comment
Please, Sign In to add comment