http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java b/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java deleted file mode 100644 index 304ddba..0000000 --- a/src/main/java/org/apache/tamaya/events/FrozenConfiguration.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * 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.tamaya.events; - -import org.apache.tamaya.ConfigException; -import org.apache.tamaya.ConfigOperator; -import org.apache.tamaya.ConfigQuery; -import org.apache.tamaya.Configuration; -import org.apache.tamaya.ConfigurationProvider; -import org.apache.tamaya.TypeLiteral; -import org.apache.tamaya.functions.ConfigurationFunctions; -import org.apache.tamaya.spi.ConfigurationContext; -import org.apache.tamaya.spi.ConversionContext; -import org.apache.tamaya.spi.PropertyConverter; - -import java.io.Serializable; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * /** - * Configuration implementation that stores all current values of a given (possibly dynamic, contextual and non server - * capable instance) and is fully serializable. Note that hereby only the scannable key/value pairs are considered. - */ -public final class FrozenConfiguration implements Configuration, Serializable { - private static final long serialVersionUID = -6373137316556444171L; - /** - * The properties frozen. - */ - private Map<String, String> properties = new HashMap<>(); - - /** - * Constructor. - * - * @param config The base configuration. - */ - private FrozenConfiguration(Configuration config) { - this.properties.putAll(config.getProperties()); - this.properties.put("[meta]frozenAt", String.valueOf(System.currentTimeMillis())); - this.properties = Collections.unmodifiableMap(this.properties); - } - - /** - * Creates a new FrozenConfiguration instance based on a Configuration given. - * - * @param config the configuration to be frozen, not null. - * @return the frozen Configuration. - */ - public static FrozenConfiguration of(Configuration config) { - if (config instanceof FrozenConfiguration) { - return (FrozenConfiguration) config; - } - return new FrozenConfiguration(config); - } - - @Override - public String get(String key) { - return this.properties.get(key); - } - - @Override - public String getOrDefault(String key, String defaultValue) { - String val = get(key); - if(val==null){ - return defaultValue; - } - return val; - } - - @Override - public <T> T getOrDefault(String key, Class<T> type, T defaultValue) { - T val = get(key, type); - if(val==null){ - return defaultValue; - } - return val; - } - - @Override - public <T> T get(String key, Class<T> type) { - return (T) get(key, TypeLiteral.of(type)); - } - - /** - * Accesses the current String value for the given key and tries to convert it - * using the {@link org.apache.tamaya.spi.PropertyConverter} instances provided by the current - * {@link org.apache.tamaya.spi.ConfigurationContext}. - * - * @param key the property's absolute, or relative path, e.g. @code - * a/b/c/d.myProperty}. - * @param type The target type required, not null. - * @param <T> the value type - * @return the converted value, never null. - */ - @Override - public <T> T get(String key, TypeLiteral<T> type) { - String value = get(key); - if (value != null) { - List<PropertyConverter<T>> converters = ConfigurationProvider.getConfigurationContext() - .getPropertyConverters(type); - ConversionContext context = new ConversionContext.Builder(this, - ConfigurationProvider.getConfigurationContext(), key,type).build(); - for (PropertyConverter<T> converter : converters) { - try { - T t = converter.convert(value, context); - if (t != null) { - return t; - } - } catch (Exception e) { - Logger.getLogger(getClass().getName()) - .log(Level.FINEST, "PropertyConverter: " + converter + " failed to convert value: " + value, - e); - } - } - throw new ConfigException("Unparseable config value for type: " + type.getRawType().getName() + ": " + key - + ", supported formats: " + context.getSupportedFormats()); - } - - return null; - } - - @Override - public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) { - T val = get(key, type); - if(val==null){ - return defaultValue; - } - return val; - } - - @Override - public Map<String, String> getProperties() { - return properties; - } - - @Override - public Configuration with(ConfigOperator operator) { - return operator.operate(this); - } - - @Override - public <T> T query(ConfigQuery<T> query) { - return query.query(this); - } - - @Override - public ConfigurationContext getContext() { - return ConfigurationFunctions.emptyConfigurationContext(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - FrozenConfiguration that = (FrozenConfiguration) o; - return properties.equals(that.properties); - } - - @Override - public int hashCode() { - return properties.hashCode(); - } - - @Override - public String toString() { - return "FrozenConfiguration{" + - "properties=" + properties + - '}'; - } -}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java b/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java deleted file mode 100644 index 81e6dca..0000000 --- a/src/main/java/org/apache/tamaya/events/FrozenPropertySource.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * 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.tamaya.events; - -import org.apache.tamaya.spi.PropertySource; -import org.apache.tamaya.spi.PropertyValue; - -import java.io.Serializable; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -/** - * PropertySource implementation that stores all current values of a given (possibly dynamic, contextual and non server - * capable instance) and is fully serializable. Note that hereby only the scannable key/value pairs are considered. - */ -public final class FrozenPropertySource implements PropertySource, Serializable { - private static final long serialVersionUID = -6373137316556444171L; - /** - * The ordinal. - */ - private final int ordinal; - /** - * The properties read. - */ - private Map<String, String> properties = new HashMap<>(); - /** - * The PropertySource's name. - */ - private final String name; - - /** - * Constructor. - * - * @param propertySource The base PropertySource. - */ - private FrozenPropertySource(PropertySource propertySource) { - this.properties.putAll(propertySource.getProperties()); - this.properties.put("[meta]frozenAt", String.valueOf(System.currentTimeMillis())); - this.properties = Collections.unmodifiableMap(this.properties); - this.ordinal = propertySource.getOrdinal(); - this.name = propertySource.getName(); - } - - /** - * Creates a new FrozenPropertySource instance based on a PropertySource given. - * - * @param propertySource the property source to be frozen, not null. - * @return the frozen property source. - */ - public static FrozenPropertySource of(PropertySource propertySource) { - if (propertySource instanceof FrozenPropertySource) { - return (FrozenPropertySource) propertySource; - } - return new FrozenPropertySource(propertySource); - } - - @Override - public String getName() { - return this.name; - } - - @Override - public int getOrdinal() { - return this.ordinal; - } - - @Override - public PropertyValue get(String key) { - return PropertyValue.of(key, this.properties.get(key), getName()); - } - - @Override - public Map<String, String> getProperties() { - return properties; - } - - @Override - public boolean isScannable() { - return true; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof FrozenPropertySource)) { - return false; - } - FrozenPropertySource that = (FrozenPropertySource) o; - return ordinal == that.ordinal && properties.equals(that.properties); - } - - @Override - public int hashCode() { - int result = ordinal; - result = 31 * result + properties.hashCode(); - return result; - } - - @Override - public String toString() { - return "FrozenPropertySource{" + - "name=" + name + - ", ordinal=" + ordinal + - ", properties=" + properties + - '}'; - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/PropertySourceChange.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/PropertySourceChange.java b/src/main/java/org/apache/tamaya/events/PropertySourceChange.java deleted file mode 100644 index 063612c..0000000 --- a/src/main/java/org/apache/tamaya/events/PropertySourceChange.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * 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.tamaya.events; - -import org.apache.tamaya.spi.PropertySource; - -import java.beans.PropertyChangeEvent; -import java.io.Serializable; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -/** - * Event that contains a set current changes that were applied or could be applied. - * This class is immutable and thread-safe. To create instances use - * {@link PropertySourceChangeBuilder}. - * - * Created by Anatole on 22.10.2014. - */ -public final class PropertySourceChange implements ConfigEvent<PropertySource>, Serializable{ - - private static final long serialVersionUID = 1L; - /** The base property provider/configuration. */ - private final FrozenPropertySource propertySource; - /** The base version, usable for optimistic locking. */ - private String version = UUID.randomUUID().toString(); - /** The timestamp of the change set in millis from the epoch. */ - private long timestamp = System.currentTimeMillis(); - /** The recorded changes. */ - private final Map<String,PropertyChangeEvent> changes = new HashMap<>(); - /** The overall type of change. */ - private final ChangeType changeType; - - /** - * Constructor used by {@link PropertySourceChangeBuilder}. - * @param builder The builder used, not null. - */ - PropertySourceChange(PropertySourceChangeBuilder builder) { - this.propertySource = FrozenPropertySource.of(builder.source); - for (PropertyChangeEvent c : builder.delta.values()) { - this.changes.put(c.getPropertyName(), c); - } - if(builder.version!=null){ - this.version = builder.version; - } - if(builder.timestamp!=null){ - this.timestamp = builder.timestamp; - } - this.changeType = builder.changeType; - } - - /** - * Gets the type of change for this PropertySource. - * @return the type of change for this PropertySource, never null. - */ - public ChangeType getChangeType(){ - return this.changeType; - } - - @Override - public Class<PropertySource> getResourceType() { - return PropertySource.class; - } - - /** - * Get the underlying property provider/configuration. - * @return the underlying property provider/configuration, or null, if the change instance was deserialized. - */ - @Override - public PropertySource getResource(){ - return this.propertySource; - } - - /** - * Get the base version, usable for optimistic locking. - * @return the base version. - */ - @Override - public String getVersion(){ - return version; - } - - /** - * Get the timestamp in millis from the current epoch. it is expected that the timestamp and the version are unique to - * identify a changeset. - * @return the timestamp, when this changeset was created. - */ - @Override - public long getTimestamp(){ - return timestamp; - } - - /** - * Get the changes recorded. - * @return the recorded changes, never null. - */ - public Collection<PropertyChangeEvent> getChanges(){ - return Collections.unmodifiableCollection(this.changes.values()); - } - - /** - * Access the number current removed entries. - * @return the number current removed entries. - */ - public int getRemovedSize() { - int removedCount = 0; - for (PropertyChangeEvent ev : this.changes.values()) { - if (ev.getNewValue() == null) { - removedCount++; - } - } - return removedCount; -// return (int) this.changes.values().stream().filter((e) -> e.getNewValue() == null).count(); - } - - /** - * Access the number current added entries. - * @return the number current added entries. - */ - public int getAddedSize() { - int addedCount = 0; - for (PropertyChangeEvent ev : this.changes.values()) { - if (ev.getOldValue() == null && - ev.getNewValue() != null) { - addedCount++; - } - } - return addedCount; -// return (int) this.changes.values().stream().filter((e) -> e.getOldValue() == null).count(); - } - - /** - * Access the number current updated entries. - * @return the number current updated entries. - */ - public int getUpdatedSize() { - int updatedCount = 0; - for (PropertyChangeEvent ev : this.changes.values()) { - if (ev.getOldValue() != null && ev.getNewValue() != null) { - updatedCount++; - } - } - return updatedCount; -// return (int) this.changes.values().stream().filter((e) -> e.getOldValue()!=null && e.getNewValue()!=null).count(); - } - - - /** - * Checks if the given key was removed. - * @param key the target key, not null. - * @return true, if the given key was removed. - */ - public boolean isRemoved(String key) { - PropertyChangeEvent change = this.changes.get(key); - return change != null && change.getNewValue() == null; - } - - /** - * Checks if the given key was added. - * @param key the target key, not null. - * @return true, if the given key was added. - */ - public boolean isAdded(String key) { - PropertyChangeEvent change = this.changes.get(key); - return change != null && change.getOldValue() == null; - } - - /** - * Checks if the given key was updated. - * @param key the target key, not null. - * @return true, if the given key was updated. - */ - public boolean isUpdated(String key) { - PropertyChangeEvent change = this.changes.get(key); - return change != null && change.getOldValue() != null && change.getNewValue() != null; - } - - /** - * Checks if the given key is added, or updated AND NOT removed. - * @param key the target key, not null. - * @return true, if the given key was added, or updated BUT NOT removed. - */ - public boolean isKeyAffected(String key) { - PropertyChangeEvent change = this.changes.get(key); - return change != null && change.getNewValue() != null; - } - - /** - * CHecks if the current change set does not contain any changes. - * @return tru, if the change set is empty. - */ - public boolean isEmpty(){ - return this.changes.isEmpty(); - } - - - /** - * Create a change event for a new PropertySource that was added. - * @param propertySource the new property source, not null. - * @return a new PropertySourceChange, representing a PropertySource that was added. - */ - public static PropertySourceChange ofAdded(PropertySource propertySource) { - return PropertySourceChangeBuilder.of(propertySource, ChangeType.NEW).build(); - } - - /** - * Create a change event for a deleted PropertySource. - * @param propertySource the deleted property source, not null. - * @return a new PropertySourceChange, representing a PropertySource that was deleted. - */ - public static PropertySourceChange ofDeleted(PropertySource propertySource) { - return PropertySourceChangeBuilder.of(propertySource, ChangeType.DELETED).build(); - } - - @Override - public String toString() { - return "PropertySourceChange{" + - "changeType=" + changeType + - ", propertySource=" + propertySource + - ", version='" + version + '\'' + - ", timestamp=" + timestamp + - '}'; - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/PropertySourceChangeBuilder.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/PropertySourceChangeBuilder.java b/src/main/java/org/apache/tamaya/events/PropertySourceChangeBuilder.java deleted file mode 100644 index b7a4483..0000000 --- a/src/main/java/org/apache/tamaya/events/PropertySourceChangeBuilder.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * 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.tamaya.events; - -import org.apache.tamaya.spi.PropertySource; -import org.apache.tamaya.spi.PropertyValue; - -import java.beans.PropertyChangeEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * Models a set current changes applied to a {@link org.apache.tamaya.spi.PropertySource}. Consumers of these events - * can observing changes to property sources and - * <ol> - * <li>Check if their current configuration instance ({@link org.apache.tamaya.spi.ConfigurationContext} - * contains the changed {@link org.apache.tamaya.spi.PropertySource} (Note: the reference tova property source is never affected by a - * change, its only the data of the property source).</li> - * <li>If so corresponding action may be taken, such as reevaluating the configuration values (depending on - * the update policy) or reevaluating the complete {@link org.apache.tamaya.Configuration} to create a change - * event on configuration level. - * </ol> - */ -public final class PropertySourceChangeBuilder { - /** - * The recorded changes. - */ - final SortedMap<String, PropertyChangeEvent> delta = new TreeMap<>(); - /** - * The underlying configuration/provider. - */ - final PropertySource source; - /** - * The version configured, or null, for generating a default. - */ - String version; - /** - * The optional timestamp in millis of this epoch. - */ - Long timestamp; - - /** The type of change. */ - ChangeType changeType; - - /** - * Constructor. - * - * @param source the underlying configuration/provider, not null. - * @param changeType kind of change. - */ - private PropertySourceChangeBuilder(PropertySource source, ChangeType changeType) { - this.source = Objects.requireNonNull(source); - this.changeType = Objects.requireNonNull(changeType); - } - - /** - * Creates a new instance of this builder. - * - * @param source the underlying property provider/configuration, not null. - * @param changeType kind of change. - * @return the builder for chaining. - */ - public static PropertySourceChangeBuilder of(PropertySource source, ChangeType changeType) { - return new PropertySourceChangeBuilder(source, changeType); - } - - /** - * Compares the two property config/configurations and creates a collection current all changes - * that must be applied to render {@code map1} into {@code map2}. - * - * @param map1 the source map, not null. - * @param map2 the target map, not null. - * @return a collection current change events, never null. - */ - public static Collection<PropertyChangeEvent> compare(PropertySource map1, PropertySource map2) { - List<PropertyChangeEvent> changes = new ArrayList<>(); - for (Map.Entry<String, String> en : map1.getProperties().entrySet()) { - PropertyValue val = map2.get(en.getKey()); - if (val == null) { - changes.add(new PropertyChangeEvent(map1, en.getKey(), null, en.getValue())); - } else if (!val.getValue().equals(en.getValue())) { - changes.add(new PropertyChangeEvent(map1, en.getKey(), val.getValue(), en.getValue())); - } - } - for (Map.Entry<String, String> en : map2.getProperties().entrySet()) { - PropertyValue val = map1.get(en.getKey()); - if (val == null) { - changes.add(new PropertyChangeEvent(map1, en.getKey(), en.getValue(), null)); - } else if (!val.equals(en.getValue())) { - changes.add(new PropertyChangeEvent(map1, en.getKey(), en.getValue(), val.getValue())); - } - } - return changes; - } - - /* - * Apply a version/UUID to the set being built. - * @param version the version to apply, or null, to let the system generate a version for you. - * @return the builder for chaining. - */ - public PropertySourceChangeBuilder setVersion(String version) { - this.version = version; - return this; - } - - /* - * Apply given timestamp to the set being built. - * @param version the version to apply, or null, to let the system generate a version for you. - * @return the builder for chaining. - */ - public PropertySourceChangeBuilder setTimestamp(long timestamp) { - this.timestamp = timestamp; - return this; - } - - /** - * This method records all changes to be applied to the base property provider/configuration to - * achieve the given target state. - * - * @param newState the new target state, not null. - * @return the builder for chaining. - */ - public PropertySourceChangeBuilder addChanges(PropertySource newState) { - Collection<PropertyChangeEvent> events = PropertySourceChangeBuilder.compare(newState, this.source); - for (PropertyChangeEvent c : events) { - this.delta.put(c.getPropertyName(), c); - } - return this; - } - - /** - * Get the current values, also considering any changes recorded within this change set. - * - * @param key the key current the entry, not null. - * @return the keys, or null. - */ - public String get(String key) { - PropertyChangeEvent change = this.delta.get(key); - if (change != null && !(change.getNewValue() == null)) { - return (String) change.getNewValue(); - } - return null; - } - - /** - * Marks the given key(s) fromMap the configuration/properties to be removed. - * - * @param key the key current the entry, not null. - * @param otherKeys additional keys to be removed (convenience), not null. - * @return the builder for chaining. - */ - public PropertySourceChangeBuilder remove(String key, String... otherKeys) { - PropertyValue oldValue = this.source.get(key); - if (oldValue == null) { - this.delta.remove(key); - } - this.delta.put(key, new PropertyChangeEvent(this.source, key, oldValue, null)); - for (String addKey : otherKeys) { - oldValue = this.source.get(addKey); - if (oldValue == null) { - this.delta.remove(addKey); - } - this.delta.put(addKey, new PropertyChangeEvent(this.source, addKey, oldValue, null)); - } - return this; - } - - /** - * Apply all the given values to the base configuration/properties. - * Note that all values passed must be convertible to String, either - * <ul> - * <li>the registered codecs provider provides codecs for the corresponding keys, or </li> - * <li>default codecs are present for the given type, or</li> - * <li>the value is an instanceof String</li> - * </ul> - * - * @param changes the changes to be applied, not null. - * @return the builder for chaining. - */ - public PropertySourceChangeBuilder putAll(Map<String, String> changes) { - for (Map.Entry<String, String> en : this.source.getProperties().entrySet()) { - this.delta.put(en.getKey(), new PropertyChangeEvent(this.source, en.getKey(), null, en.getValue())); - } - return this; - } - - /** - * This method will create a change set that clears all entries fromMap the given base configuration/properties. - * - * @return the builder for chaining. - */ - public PropertySourceChangeBuilder deleteAll() { - this.delta.clear(); - for (Map.Entry<String, String> en : this.source.getProperties().entrySet()) { - this.delta.put(en.getKey(), new PropertyChangeEvent(this.source, en.getKey(), en.getValue(), null)); - } - return this; - } - - /** - * Checks if the change set is empty, i.e. does not contain any changes. - * - * @return true, if the set is empty. - */ - public boolean isEmpty() { - return this.delta.isEmpty(); - } - - /** - * Resets this change set instance. This will clear all changes done to this builder, so the - * set will be empty. - */ - public void reset() { - this.delta.clear(); - } - - public PropertySourceChangeBuilder setChangeType(ChangeType changeType) { - this.changeType = changeType; - return this; - } - - /** - * Builds the corresponding change set. - * - * @return the new change set, never null. - */ - public PropertySourceChange build() { - return new PropertySourceChange(this); - } - - /* - * (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "PropertiesChangeBuilder [source=" + source + ", " + - ", delta=" + delta + "]"; - } - - -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/delta/package-info.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/delta/package-info.java b/src/main/java/org/apache/tamaya/events/delta/package-info.java deleted file mode 100644 index 2006717..0000000 --- a/src/main/java/org/apache/tamaya/events/delta/package-info.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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. - */ -/** - * This package contains artifacts to describe the changes (delta) of a - * Configuration or a PropertySource. - */ -package org.apache.tamaya.events.delta; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/folderobserver/FileChangeListener.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/folderobserver/FileChangeListener.java b/src/main/java/org/apache/tamaya/events/folderobserver/FileChangeListener.java deleted file mode 100644 index 283719e..0000000 --- a/src/main/java/org/apache/tamaya/events/folderobserver/FileChangeListener.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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.tamaya.events.folderobserver; - -import org.apache.tamaya.ConfigException; - -import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardWatchEventKinds; -import java.nio.file.WatchEvent; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * Class that has the responsibility to watch the folder and then publish the changes to a - * {@link org.apache.tamaya.events.PropertySourceChange}. - * @see ObservingPropertySourceProvider - * This listener will wait to events and wait to one second to watch again. - * <p>If new file was created or modified will commit from this file.</p> - * <p>If a file was removed then the listener will load using all files left.</p> - * @author otaviojava - */ -class FileChangeListener implements Runnable { - - private static final Logger LOGGER = Logger.getLogger(FileChangeListener.class.getName()); - - private final WatchService watchService; - - private final FileChangeObserver observer; - - private final Path directory; - - private volatile boolean running = true; - - public FileChangeListener(Path directory, FileChangeObserver observer) { - this.observer = observer; - this.directory = directory; - this.watchService = getWatchService(); - - if (watchService!=null && directory!=null) { - try { - directory.register(watchService, - StandardWatchEventKinds.ENTRY_DELETE, - StandardWatchEventKinds.ENTRY_MODIFY, - StandardWatchEventKinds.ENTRY_CREATE); - } catch (IOException e) { - throw new FileChangeListenerException("An error happened when does try to registry to watch the folder", e); - } - } - } - - /** - * Stops the listener service from observing the target directory. - */ - public void stopListener(){ - running = false; - } - - @Override - public void run() { - if (watchService!=null || directory!=null) { - return; - } - while (running) { - watchFolder(); - } - } - - /** - * Start watching the current folder. - */ - private void watchFolder() { - try { - WatchKey watckKey = watchService.take(); - for (WatchEvent<?> event : watckKey.pollEvents()) { - Path filePath = (Path) watckKey.watchable(); - if(event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE)|| - event.kind().equals(StandardWatchEventKinds.ENTRY_MODIFY) || - event.kind().equals(StandardWatchEventKinds.ENTRY_DELETE)){ - LOGGER.info("File change detected in: " + filePath.getFileName()); - observer.directoryChanged(filePath); - } - } - watckKey.reset(); - Thread.sleep(1_000L); - } catch (Exception e) { - throw new FileChangeListenerException("An error happened when does try to watch the folder", e); - } - } - - /** - * Get the watch service. - * @return the watch service, or null, if the watch service is not supported. - */ - private WatchService getWatchService() { - try { - FileSystem fileSystem = Paths.get(".").getFileSystem(); - return fileSystem.newWatchService(); - } catch (IOException e) { - LOGGER.log(Level.WARNING, "The file System does not supports WatchService", e); - return null; - } - - } - - /** - * Exception if file listening fails. - */ - static class FileChangeListenerException extends ConfigException { - /** Serialversion UID. */ - private static final long serialVersionUID = -8965486770881001513L; - - /** - * Constructor. - * @param message a message - * @param cause an (optional) root cause. - */ - public FileChangeListenerException(String message, Throwable cause) { - super(message, cause); - } - - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/folderobserver/FileChangeObserver.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/folderobserver/FileChangeObserver.java b/src/main/java/org/apache/tamaya/events/folderobserver/FileChangeObserver.java deleted file mode 100644 index 63d25cd..0000000 --- a/src/main/java/org/apache/tamaya/events/folderobserver/FileChangeObserver.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.tamaya.events.folderobserver; - -import java.nio.file.Path; - -/** - * Observer to be used in {@link FileChangeListener} to commit all configurations and provider. - */ -interface FileChangeObserver { - /** - * Called when a file has been modified. - * @param path the file path, not null. - */ - void directoryChanged(Path path); - -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java b/src/main/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java deleted file mode 100644 index feddd70..0000000 --- a/src/main/java/org/apache/tamaya/events/folderobserver/ObservingPropertySourceProvider.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * 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.tamaya.events.folderobserver; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tamaya.ConfigException; -import org.apache.tamaya.events.ConfigEventManager; -import org.apache.tamaya.events.ConfigurationContextChange; -import org.apache.tamaya.events.ConfigurationContextChangeBuilder; -import org.apache.tamaya.spi.PropertySource; -import org.apache.tamaya.spi.PropertySourceProvider; -import org.apache.tamaya.spisupport.BasePropertySource; - -/** - * This implementation runs in a folder taking up all files compatible with the given - * ConfigurationFormats. When a file is added, deleted or modified the PropertySourceProvider - * will adapt the changes automatically and trigger according - * {@link org.apache.tamaya.events.PropertySourceChange} events. - * The default folder is META-INF/config, but you can change it via an absolute path in the - * "-Dtamaya.configdir" parameter. - */ -public class ObservingPropertySourceProvider implements PropertySourceProvider, FileChangeObserver { - /** - * The logger. - */ - private static final Logger LOG = Logger.getLogger(ObservingPropertySourceProvider.class.getName()); - /** - * The current active property sources of this provider. - */ - private final List<PropertySource> propertySources = Collections.synchronizedList(new LinkedList<PropertySource>()); - /** - * The thread pool used. - */ - private final ExecutorService executor = Executors.newSingleThreadExecutor(); - - /** - * Constructorm using an explicit directory, ignoring all kind of configuration, if set. - * - * @param directory the target directory. If null, the default configuration and system property are used. - */ - public ObservingPropertySourceProvider(Path directory) { - if (directory == null) { - directory = getDirectory(); - } - if (directory!=null){ - synchronized (this.propertySources) { - this.propertySources.addAll(readConfiguration(directory)); - } - final Runnable runnable = new FileChangeListener(directory, this); - executor.execute(runnable); - } else { - executor.shutdown(); - } - } - - /** - * Read the initial configuration. - * - * @param directory the target directory, not null. - */ - private List<PropertySource> readConfiguration(Path directory) { - final List<PropertySource> result = new ArrayList<>(); - try { - synchronized (propertySources) { - for (final Path path : Files.newDirectoryStream(directory, "*")) { - result.addAll(getPropertySources(path)); - } - return result; - } - } catch (final IOException e) { - LOG.log(Level.WARNING, "Failed to read configuration from dir: " + directory, e); - } - return result; - } - - /** - * Read property sources from the given file. - * - * @param file source of the property sources. - * @return property sources from the given file. - */ - protected Collection<PropertySource> getPropertySources(final Path file) { - return Arrays.asList(new PropertySource[]{new BasePropertySource() { - private final Map<String,String> props = readProperties(file); - - @Override - public Map<String, String> getProperties() { - return props; - } - }}); - } - - /** - * Load a single file. - * - * @param file the file, not null. - * @return properties as read from the given file. - */ - protected static Map<String,String> readProperties(Path file) { - try (InputStream is = file.toUri().toURL().openStream()){ - final Properties props = new Properties(); - props.load(is); - final Map<String,String> result = new HashMap<>(); - for(final Map.Entry<Object,Object> en:props.entrySet()){ - result.put(String.valueOf(en.getKey()), String.valueOf(en.getValue())); - } - return result; - } catch (final Exception e) { - LOG.log(Level.INFO, "Error reading file: " + file.toString() + - ", using format: properties", e); - } - return Collections.emptyMap(); - } - - - /** - * Evaluates the target directory from system property (tamaya.configdir) or classpath. - * - * @return the directory to be read, or null. - */ - private Path getDirectory() { - final String absolutePath = System.getProperty("tamaya.configdir"); - if (null!=absolutePath) { - final Path path = Paths.get(absolutePath); - if (Files.isDirectory(path)) { - return path; - } - } - final URL resource = ObservingPropertySourceProvider.class.getResource("/META-INF/config/"); - if (null!=resource) { - try { - return Paths.get(resource.toURI()); - } catch (final URISyntaxException e) { - throw new ConfigException("An error to find the directory to watch", e); - } - } - return null; - } - - - @Override - public void directoryChanged(Path directory) { - synchronized (this.propertySources) { - final List<PropertySource> existingPropertySources = new ArrayList<>(propertySources); - propertySources.clear(); - final Collection<PropertySource> sourcesRead = readConfiguration(directory); - this.propertySources.addAll(sourcesRead); - triggerConfigChange(existingPropertySources, propertySources); - } - } - - - private void triggerConfigChange(List<PropertySource> originalPropertySources, - List<PropertySource> newPropertySources) { - final ConfigurationContextChangeBuilder b = ConfigurationContextChangeBuilder.of(); - for (final PropertySource ps : originalPropertySources) { - b.removedPropertySource(ps); - } - for (final PropertySource ps : newPropertySources) { - b.newPropertySource(ps); - } - final ConfigurationContextChange changeEvent = b.build(); - LOG.fine("Trigger Config Context Change: " + changeEvent); - ConfigEventManager.fireEvent(changeEvent); - } - - @Override - public Collection<PropertySource> getPropertySources() { - synchronized (propertySources) { - return new ArrayList<>(this.propertySources); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/folderobserver/package-info.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/folderobserver/package-info.java b/src/main/java/org/apache/tamaya/events/folderobserver/package-info.java deleted file mode 100644 index 347f2d8..0000000 --- a/src/main/java/org/apache/tamaya/events/folderobserver/package-info.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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. - */ -/** - * This package contains code to observe a folder for file changes and to trigger - * corresponding events, that are handled by an according {@link org.apache.tamaya.events.folderobserver.ObservingPropertySourceProvider} - * instance. - */ -package org.apache.tamaya.events.folderobserver; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java b/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java deleted file mode 100644 index f4457b2..0000000 --- a/src/main/java/org/apache/tamaya/events/internal/DefaultConfigChangeObserver.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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.tamaya.events.internal; - -import org.apache.tamaya.ConfigurationProvider; -import org.apache.tamaya.events.ConfigEventManager; -import org.apache.tamaya.events.ConfigurationChange; -import org.apache.tamaya.events.ConfigurationChangeBuilder; -import org.apache.tamaya.events.FrozenConfiguration; - -import java.util.*; -import java.util.logging.Logger; - -/** - * Timer task that regularly checks the configuration for changes. - */ -public class DefaultConfigChangeObserver { - - private static final long START_DELAY = 5000L; - - private static final Logger LOG = Logger.getLogger(DefaultConfigChangeObserver.class.getName()); - - private Timer timer = new Timer("DefaultConfigChangeObserver", true); - - private long checkPeriod = 2000L; - - private volatile FrozenConfiguration lastConfig; - - private volatile boolean running; - - /** - * Constructor. Also loads all registered listeners. - */ - public DefaultConfigChangeObserver() { - LOG.info("Registering config change observer, rechecking config changes every " + checkPeriod + " ms."); - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if(running) { - checkConfigurationUpdate(); - } - } - }, START_DELAY, checkPeriod); - } - - - public void checkConfigurationUpdate() { - LOG.finest("Checking configuration for changes..."); - FrozenConfiguration newConfig = FrozenConfiguration.of(ConfigurationProvider.getConfiguration()); - ConfigurationChange changes; - if(lastConfig==null){ - changes = ConfigurationChangeBuilder.of(newConfig).putAll(newConfig.getProperties()) - .build(); - }else{ - changes = ConfigurationChangeBuilder.of(lastConfig).addChanges(newConfig) - .build(); - } - if(!changes.isEmpty()) { - LOG.info("Identified configuration changes, publishing change event..."); - ConfigEventManager.fireEvent(changes); - } - } - - public long getCheckPeriod() { - return checkPeriod; - } - - public boolean isMonitoring(){ - return running; - } - - public void enableMonitoring(boolean enable){ - this.running = true; - } - - /** - * Sets the new check period, cancels the currently running timer and schedules a new task with the new checkperiod - * and a startup delay of 500ms. - * @param checkPeriod the period in ms, for checking on changes. - */ - public void setCheckPeriod(long checkPeriod) { - LOG.finest("Resetting check period to " + checkPeriod + " ms, reregistering timer."); - this.checkPeriod = checkPeriod; - timer.cancel(); - timer = new Timer("DefaultConfigChangeObserver", true); - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if(running) { - checkConfigurationUpdate(); - } - } - }, 500L, checkPeriod); - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/internal/DefaultConfigEventManagerSpi.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/internal/DefaultConfigEventManagerSpi.java b/src/main/java/org/apache/tamaya/events/internal/DefaultConfigEventManagerSpi.java deleted file mode 100644 index 586df5c..0000000 --- a/src/main/java/org/apache/tamaya/events/internal/DefaultConfigEventManagerSpi.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * 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.tamaya.events.internal; - -import org.apache.tamaya.events.ConfigEvent; -import org.apache.tamaya.events.ConfigEventListener; -import org.apache.tamaya.events.spi.ConfigEventManagerSpi; -import org.apache.tamaya.spi.ServiceContextManager; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default implementation of {@link DefaultConfigEventManagerSpi} just forwarding all - * events synchronously to the listeners. - */ -public class DefaultConfigEventManagerSpi implements ConfigEventManagerSpi { - - private static final Logger LOG = Logger.getLogger(DefaultConfigEventManagerSpi.class.getName()); - - private final Map<Class,List<ConfigEventListener>> listeners = new ConcurrentHashMap<>(); - - private final ExecutorService publisher = Executors.newCachedThreadPool(); - - private final DefaultConfigChangeObserver changeObserver = new DefaultConfigChangeObserver(); - - /** - * Constructor. Also loads all registered listeners. - */ - public DefaultConfigEventManagerSpi() { - try { - for (ConfigEventListener l : ServiceContextManager.getServiceContext().getServices(ConfigEventListener.class)) { - try { - addListener(l); - } catch (Exception e) { - LOG.log(Level.WARNING, "Failed to load configured listener: " + l.getClass().getName(), e); - } - } - } catch (Exception e) { - LOG.log(Level.WARNING, "Failed to load configured listeners.", e); - } - } - - @Override - public void addListener(ConfigEventListener l){ - addListener(l, ConfigEvent.class); - } - - @Override - public <T extends ConfigEvent> void addListener(ConfigEventListener l, Class<T> eventType){ - List<ConfigEventListener> ls = listeners.get(eventType); - if(ls==null){ - ls = Collections.synchronizedList(new ArrayList<ConfigEventListener>()); - listeners.put(eventType, ls); - } - synchronized (ls){ - if(!ls.contains(l)){ - ls.add(l); - } - } - } - - @Override - public void removeListener(ConfigEventListener l){ - removeListener(l, ConfigEvent.class); - } - - @Override - public <T extends ConfigEvent> void removeListener(ConfigEventListener l, Class<T> eventType) { - List<ConfigEventListener> targets = this.listeners.get(eventType); - if(targets!=null) { - // forward to explicit listeners - synchronized (targets) { - targets.remove(l); - } - } - } - - @Override - public Collection<? extends ConfigEventListener> getListeners(Class<? extends ConfigEvent> eventType) { - List<ConfigEventListener> targets = this.listeners.get(eventType); - if(targets!=null){ - synchronized(targets){ - return new ArrayList<>(targets); - } - } - return Collections.emptyList(); - } - - @Override - public Collection<? extends ConfigEventListener> getListeners() { - Set<ConfigEventListener> targets = new HashSet<>(); - for(List<ConfigEventListener> l:this.listeners.values()){ - targets.addAll(l); - } - return targets; - } - - @Override - public void fireEvent(ConfigEvent<?> event) { - List<ConfigEventListener> targets = this.listeners.get(event.getClass()); - if(targets!=null) { - // forward to explicit listeners - synchronized (targets) { - for (ConfigEventListener l : targets) { - l.onConfigEvent(event); - } - } - } - // forward to global listeners - targets = this.listeners.get(ConfigEvent.class); - if(targets!=null) { - synchronized (targets) { - for (ConfigEventListener l : targets) { - l.onConfigEvent(event); - } - } - } - } - - @Override - public void fireEventAsynch(ConfigEvent<?> event) { - List<ConfigEventListener> targets = this.listeners.get(event.getClass()); - if(targets!=null) { - // forward to explicit listeners - synchronized (targets) { - for (ConfigEventListener l : targets) { - publisher.execute(new PublishConfigChangeTask(l, event)); - } - } - } - // forward to global listeners - targets = this.listeners.get(ConfigEvent.class); - if(targets!=null) { - synchronized (targets) { - for (ConfigEventListener l : targets) { - publisher.execute(new PublishConfigChangeTask(l, event)); - } - } - } - } - - @Override - public long getChangeMonitoringPeriod() { - return changeObserver.getCheckPeriod(); - } - - @Override - public void setChangeMonitoringPeriod(long millis){ - changeObserver.setCheckPeriod(millis); - } - - @Override - public boolean isChangeMonitorActive() { - return changeObserver.isMonitoring(); - } - - @Override - public void enableChangeMonitor(boolean enable) { - changeObserver.enableMonitoring(enable); - } - - - /** - * Tasks to inform observers on detected configuration changes. - */ - private static final class PublishConfigChangeTask implements Runnable{ - - private final ConfigEventListener l; - private final ConfigEvent<?> changes; - - public PublishConfigChangeTask(ConfigEventListener l, ConfigEvent<?> changes) { - this.l = Objects.requireNonNull(l); - this.changes = Objects.requireNonNull(changes); - } - - @Override - public void run() { - l.onConfigEvent(changes); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/internal/DefaultConfigurationContextChangeListener.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/internal/DefaultConfigurationContextChangeListener.java b/src/main/java/org/apache/tamaya/events/internal/DefaultConfigurationContextChangeListener.java deleted file mode 100644 index e49856d..0000000 --- a/src/main/java/org/apache/tamaya/events/internal/DefaultConfigurationContextChangeListener.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.tamaya.events.internal; - -import org.apache.tamaya.ConfigurationProvider; -import org.apache.tamaya.events.ConfigEvent; -import org.apache.tamaya.events.ConfigEventListener; -import org.apache.tamaya.events.ConfigurationContextChange; -import org.apache.tamaya.spi.ConfigurationContext; -import org.apache.tamaya.spi.ConfigurationContextBuilder; -import org.apache.tamaya.spi.PropertySource; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Default ConfigEventListener for ConfigurationContextChange events that updates the current context, if resources were - * affected. - */ -public class DefaultConfigurationContextChangeListener implements ConfigEventListener { - - private static final Logger LOG = Logger.getLogger(DefaultConfigurationContextChangeListener.class.getName()); - - @Override - public void onConfigEvent(ConfigEvent<?> event) { - if(event.getClass() == ConfigurationContextChange.class) { - ConfigurationContextChange contextChange = (ConfigurationContextChange) event; - ConfigurationContext context = ConfigurationProvider.getConfigurationContext(); - List<PropertySource> affectedPropertySources = new ArrayList<>(); - for (PropertySource ps : context.getPropertySources()) { - if (contextChange.isAffected(ps)) { - affectedPropertySources.add(ps); - } - } - ConfigurationContextBuilder newContextBuilder = ConfigurationProvider.getConfigurationContextBuilder() - .setContext(context); - if (!affectedPropertySources.isEmpty()) { - Set<String> propertySourceNames = new HashSet<>(); - for (PropertySource removed : contextChange.getRemovedPropertySources()) { - propertySourceNames.add(removed.getName()); - } - newContextBuilder.removePropertySources(propertySourceNames); - } - newContextBuilder.addPropertySources(contextChange.getAddedPropertySources()); - newContextBuilder.addPropertySources(contextChange.getUpdatedPropertySources()); - ConfigurationContext newContext = newContextBuilder.build(); - try { - ConfigurationProvider.setConfigurationContext(newContext); - } catch (Exception e) { - LOG.log(Level.INFO, "Failed to update the current ConfigurationContext due to config model changes", e); - } - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java b/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java deleted file mode 100644 index be8c404..0000000 --- a/src/main/java/org/apache/tamaya/events/internal/LoggingConfigListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.tamaya.events.internal; - -import org.apache.tamaya.Configuration; -import org.apache.tamaya.events.ConfigEvent; -import org.apache.tamaya.events.ConfigEventListener; - -import java.util.logging.Logger; - -/** - * Simple ConfigListener that simply logs any detected config changes to INFO level. - */ -public class LoggingConfigListener implements ConfigEventListener { - - private static final Logger LOG = Logger.getLogger(LoggingConfigListener.class.getName()); - - @Override - public void onConfigEvent(ConfigEvent<?> event) { - if(event.getResourceType()== Configuration.class) { - LOG.info("Configuration changed: " + event); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/internal/package-info.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/internal/package-info.java b/src/main/java/org/apache/tamaya/events/internal/package-info.java deleted file mode 100644 index 9df5ac3..0000000 --- a/src/main/java/org/apache/tamaya/events/internal/package-info.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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. - */ -/** - * This package contains internal default implementations for the config events module. - */ -package org.apache.tamaya.events.internal; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/package-info.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/package-info.java b/src/main/java/org/apache/tamaya/events/package-info.java deleted file mode 100644 index e175ceb..0000000 --- a/src/main/java/org/apache/tamaya/events/package-info.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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. - */ -/** - * This package provides the main building blocks for handling configuration changes, such as - * {@link org.apache.tamaya.events.ConfigEventManager}, {@link org.apache.tamaya.events.ConfigEventListener} and - * artifacts to describe the changes (delta) of a Configuration or a PropertySource. - */ -package org.apache.tamaya.events; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/spi/BaseConfigEvent.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/spi/BaseConfigEvent.java b/src/main/java/org/apache/tamaya/events/spi/BaseConfigEvent.java deleted file mode 100644 index f6856d9..0000000 --- a/src/main/java/org/apache/tamaya/events/spi/BaseConfigEvent.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.tamaya.events.spi; - -import org.apache.tamaya.events.ConfigEvent; - -import java.util.Objects; -import java.util.UUID; - -/** - * Abstract base class for implementing your own configuration events. - * @param <T> the vent type - */ -public abstract class BaseConfigEvent<T> implements ConfigEvent<T> { - protected long timestamp = System.currentTimeMillis(); - protected String version = UUID.randomUUID().toString(); - protected final T paylod; - private final Class<T> type; - - public BaseConfigEvent(T paylod, Class<T> type){ - this.paylod = Objects.requireNonNull(paylod); - this.type = Objects.requireNonNull(type); - } - - @Override - public Class<T> getResourceType() { - return type; - } - - @Override - public T getResource() { - return paylod; - } - - @Override - public String getVersion() { - return version; - } - - @Override - public long getTimestamp() { - return timestamp; - } - - @Override - public String toString() { - return getClass().getSimpleName() + '{' + - "timestamp=" + timestamp + - ", version='" + version + '\'' + - ", paylod='" + paylod + '\'' + - '}'; - } - } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/spi/ConfigEventManagerSpi.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/spi/ConfigEventManagerSpi.java b/src/main/java/org/apache/tamaya/events/spi/ConfigEventManagerSpi.java deleted file mode 100644 index 66a8f73..0000000 --- a/src/main/java/org/apache/tamaya/events/spi/ConfigEventManagerSpi.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * 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.tamaya.events.spi; - -import org.apache.tamaya.events.ConfigEvent; -import org.apache.tamaya.events.ConfigEventListener; - -import java.util.Collection; - -/** - * SPI interface to implement the {@link org.apache.tamaya.events.ConfigEventManager} singleton. - * Implementations of this interface must be registered with the current {@link org.apache.tamaya.spi.ServiceContext}, - * by default this equals to registering it with {@link java.util.ServiceLoader}. Add {@link javax.annotation.Priority} - * annotations for overriding (higher values override lower values). - */ -public interface ConfigEventManagerSpi { - /** - * Adds a listener for observing events. References of this - * component to the listeners must be managed as weak references. - * - * @param <T> the type of the events listened to. - * @param l the listener not null. - */ - <T> void addListener(ConfigEventListener l); - - /** - * Adds a listener for observing events of a given type. - * - * @param <T> the type of the events listened to. - * @param l the listener not null. - * @param eventType the type of concrete configuration event this listeners should be informed about. All other - * event types will never be delivered to this listener instance. - */ - <T extends ConfigEvent> void addListener(ConfigEventListener l, Class<T> eventType); - - /** - * Removes a listener for observing events. - * - * @param l the listener not null. - */ - void removeListener(ConfigEventListener l); - - /** - * Removes a listener for observing events of a certain type. - * - * @param <T> the type of the events listened to. - * @param l the listener not null. - * @param eventType the type of concrete configuration event this listeners should be informed about. All other - * event types will never be delivered toe this listener instance. - */ - <T extends ConfigEvent> void removeListener(ConfigEventListener l, Class<T> eventType); - - /** - * Access all globally registered listeners. - * - * @return the listeners found, never null. - */ - Collection<? extends ConfigEventListener> getListeners(); - - /** - * Access all listeners listening for a certain event type, including any global listeners. - * @param eventType the type of concrete configuration event this listeners should be informed about. All other - * event types will never be delivered toe this listener instance. - * @return the listeners found, never null. - */ - Collection<? extends ConfigEventListener> getListeners(Class<? extends ConfigEvent> eventType); - - /** - * Publishes an event to all interested listeners, hereby executing all registered listeners sequentually and - * synchronously., - * - * @param event the event, not null. - */ - void fireEvent(ConfigEvent<?> event); - - /** - * Publishes an event to all interested listeners, hereby publishing the change events asynchrously and in - * parallel (multithreaded). - * - * @param event the event, not null. - */ - void fireEventAsynch(ConfigEvent<?> event); - - /** - * Get the current check period to check for configuration changes. - * - * @return the check period in ms. - */ - long getChangeMonitoringPeriod(); - - void setChangeMonitoringPeriod(long millis); - - /** - * Check if the observer is running currently. - * - * @return true, if the change monitoring service is currently running. - */ - boolean isChangeMonitorActive(); - - /** - * Start/stop the change monitoring service, which will observe/reevaluate the current configuration regularly - * and trigger ConfigurationChange events if something is changed. This is quite handy for publishing - * configuration changes to whatever systems are interested in. Hereby the origin of a configuration change - * can be on this machine, or also remotedly. For handling corresponding {@link ConfigEventListener} have - * to be registered, e.g. listening on {@link org.apache.tamaya.events.ConfigurationChange} events. - * - * @param enable whether to enable or disable the change monitoring. - */ - void enableChangeMonitor(boolean enable); - - -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/java/org/apache/tamaya/events/spi/package-info.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tamaya/events/spi/package-info.java b/src/main/java/org/apache/tamaya/events/spi/package-info.java deleted file mode 100644 index 63d2b3b..0000000 --- a/src/main/java/org/apache/tamaya/events/spi/package-info.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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. - */ -/** - * This package contains the SPI to implement the - * {@link org.apache.tamaya.events.ConfigEventManager} singleton. - */ -package org.apache.tamaya.events.spi; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/resources/META-INF/services/org.apache.tamaya.events.ConfigEventListener ---------------------------------------------------------------------- diff --git a/src/main/resources/META-INF/services/org.apache.tamaya.events.ConfigEventListener b/src/main/resources/META-INF/services/org.apache.tamaya.events.ConfigEventListener deleted file mode 100644 index f9942c1..0000000 --- a/src/main/resources/META-INF/services/org.apache.tamaya.events.ConfigEventListener +++ /dev/null @@ -1,19 +0,0 @@ -# -# 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 current 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. -# -org.apache.tamaya.events.internal.DefaultConfigurationContextChangeListener http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/main/resources/META-INF/services/org.apache.tamaya.events.spi.ConfigEventManagerSpi ---------------------------------------------------------------------- diff --git a/src/main/resources/META-INF/services/org.apache.tamaya.events.spi.ConfigEventManagerSpi b/src/main/resources/META-INF/services/org.apache.tamaya.events.spi.ConfigEventManagerSpi deleted file mode 100644 index d45dc43..0000000 --- a/src/main/resources/META-INF/services/org.apache.tamaya.events.spi.ConfigEventManagerSpi +++ /dev/null @@ -1,19 +0,0 @@ -# -# 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 current 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. -# -org.apache.tamaya.events.internal.DefaultConfigEventManagerSpi \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/test/java/org/apache/tamaya/events/ChangeableGlobalPropertySource.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/tamaya/events/ChangeableGlobalPropertySource.java b/src/test/java/org/apache/tamaya/events/ChangeableGlobalPropertySource.java deleted file mode 100644 index 0384064..0000000 --- a/src/test/java/org/apache/tamaya/events/ChangeableGlobalPropertySource.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.tamaya.events; - -import org.apache.tamaya.core.propertysource.BasePropertySource; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * PropertySource implementation that accesses properties that are statically stored. - */ -public class ChangeableGlobalPropertySource extends BasePropertySource{ - - private static final Map<String,String> STORED_ENTRIES = new ConcurrentHashMap<>(); - - @Override - public String getName() { - return getClass().getSimpleName(); - } - - @Override - public Map<String, String> getProperties() { - return null; - } - - /** - * Put a value (globally) into this property source. - * @param key the key, not null - * @param value the value, not null - * @return the entry replaced, or null. - */ - public static String put(String key, String value){ - return STORED_ENTRIES.put(key,value); - } - - /** - * Put all the properties, overriding any existing ones with the same key. - * @param properties the properties, not null. - */ - public static void putAll(Map<String,String> properties){ - STORED_ENTRIES.putAll(properties); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/89223dcd/src/test/java/org/apache/tamaya/events/ChangeableThreadLocalPropertySource.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/tamaya/events/ChangeableThreadLocalPropertySource.java b/src/test/java/org/apache/tamaya/events/ChangeableThreadLocalPropertySource.java deleted file mode 100644 index cc6c812..0000000 --- a/src/test/java/org/apache/tamaya/events/ChangeableThreadLocalPropertySource.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.tamaya.events; - -import org.apache.tamaya.core.propertysource.BasePropertySource; - -import java.util.HashMap; -import java.util.Map; - - -/** - * PropertySource implementation that accesses properties that are stored on ThreadLocal level, e.g. good to use for - * testing.. - */ -public class ChangeableThreadLocalPropertySource extends BasePropertySource{ - - private static final ThreadLocal<Map<String,String>> STORED_ENTRIES = new ThreadLocal<Map<String,String>>(){ - protected Map<String,String> initialValue(){ - return new HashMap<>(); - } - }; - - @Override - public String getName() { - return getClass().getSimpleName(); - } - - @Override - public Map<String, String> getProperties() { - return null; - } - - public static String put(String key, String value){ - return STORED_ENTRIES.get().put(key,value); - } - - public static void putAll(Map<String,String> properties){ - STORED_ENTRIES.get().putAll(properties); - } - -}