diff --git a/Jenkinsfile b/Jenkinsfile index d6aca0f..5383ecd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,7 +8,7 @@ pipeline { steps { sh "./gradlew clean build" junit testResults: "build/test-results/test/*.xml" - javadoc javadocDir: "build/docs/javadoc" + javadoc javadocDir: "build/docs/javadoc", keepAll: true archiveArtifacts artifacts: 'build/libs/*.jar,benchmark/build/libs/*.jar', allowEmptyArchive: true, fingerprint: true, diff --git a/build.gradle b/build.gradle index 735aa48..f22e406 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'maven-publish' - id 'net.woggioni.plugins.multi-release-jar' + id 'net.woggioni.gradle.multi-release-jar' id 'net.woggioni.gradle.lombok' apply false } @@ -27,6 +27,10 @@ allprojects { } } +ext { + setProperty('jpms.module.name', 'net.woggioni.jwo') +} + configurations { pathClassloaderTest diff --git a/gradle.properties b/gradle.properties index e4d7fa3..9cab269 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -gradle.version = 7.1.1 +gradle.version = 7.2 jwo.version=1.0 junitJupiter.version=5.7.0 lombok.version=1.18.16 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 05679dc..ffed3a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index 3209b19..607c2ca 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,7 +8,7 @@ pluginManagement { plugins { id "net.woggioni.gradle.lombok" version "0.1" - id "net.woggioni.plugins.multi-release-jar" version "0.1" + id "net.woggioni.gradle.multi-release-jar" version "0.1" } } diff --git a/src/main/java/net/woggioni/jwo/DelegatingMap.java b/src/main/java/net/woggioni/jwo/DelegatingMap.java new file mode 100644 index 0000000..d0203f4 --- /dev/null +++ b/src/main/java/net/woggioni/jwo/DelegatingMap.java @@ -0,0 +1,127 @@ +package net.woggioni.jwo; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; + +public class DelegatingMap implements Map { + private final Supplier> mapFactory; + private final List> delegates; + private final Map thisMap; + + public DelegatingMap(Supplier> mapFactory, List> delegates) { + this.mapFactory = mapFactory; + this.delegates = delegates; + thisMap = mapFactory.get(); + } + + @Override + public int size() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isEmpty() { + if(!thisMap.isEmpty()) return false; + for(Map delegate : delegates) { + if(!delegate.isEmpty()) { + return false; + } + } + return true; + } + + @Override + public boolean containsKey(Object key) { + if(thisMap.containsKey(key)) return true; + for(Map delegate : delegates) { + if(!delegate.containsKey(key)) { + return true; + } + } + return false; + } + + @Override + public boolean containsValue(Object value) { + if(thisMap.containsValue(value)) return true; + for(Map delegate : delegates) { + if(!delegate.containsValue(value)) { + return true; + } + } + return false; + } + + @Override + public V get(Object key) { + V result = thisMap.get(key); + if(result != null) return result; + for(Map delegate : delegates) { + result = delegate.get(key); + if(result != null) break; + } + return result; + } + + @Override + public V put(K key, V value) { + V result = thisMap.put(key, value); + if(result != null) return result; + for(Map delegate : delegates) { + result = delegate.put(key, value); + if(result != null) break; + } + return result; + } + + @Override + public V remove(Object key) { + V result = thisMap.remove(key); + if(result != null) return result; + for(Map delegate : delegates) { + result = delegate.remove(key); + if(result != null) break; + } + return result; + } + + @Override + public void putAll(Map m) { + this.thisMap.putAll(m); + } + + @Override + public void clear() { + thisMap.clear(); + } + + @Override + public Set keySet() { + return flatten().keySet(); + } + + private Map flatten() { + Map result = mapFactory.get(); + int i = delegates.size(); + while(i-->0) { + Map delegate = delegates.get(i); + result.putAll(delegate); + } + result.putAll(thisMap); + return Collections.unmodifiableMap(result); + } + + @Override + public Collection values() { + return flatten().values(); + } + + @Override + public Set> entrySet() { + return flatten().entrySet(); + } +} diff --git a/src/main/java9/module-info.java b/src/main/java9/module-info.java index fdec487..43be8b9 100644 --- a/src/main/java9/module-info.java +++ b/src/main/java9/module-info.java @@ -1,3 +1,4 @@ module net.woggioni.jwo { + requires org.slf4j; exports net.woggioni.jwo; } \ No newline at end of file