From 54e4e2c4e3eb40acf77eb2e9a9bac7ee7f16c127 Mon Sep 17 00:00:00 2001 From: Claudio Atzori Date: Thu, 30 May 2019 15:35:18 +0200 Subject: [PATCH] first project structure, imported old cnr-misc-utils --- dnet-core-components/pom.xml | 75 ++ .../eu/dnetlib/miscutils/cache/Cache.java | 39 + .../dnetlib/miscutils/cache/CacheElement.java | 73 ++ .../eu/dnetlib/miscutils/cache/EhCache.java | 178 ++++ .../collections/AffixCollection.java | 58 ++ .../miscutils/collections/BloomFilter.java | 443 ++++++++++ .../collections/EnsureCollection.java | 48 ++ .../dnetlib/miscutils/collections/Filter.java | 6 + .../collections/FilteredCollection.java | 119 +++ .../collections/MappedCollection.java | 109 +++ .../dnetlib/miscutils/collections/Pair.java | 30 + .../collections/PositionalMapGenerator.java | 73 ++ .../PositionalStringMapGenerator.java | 78 ++ .../miscutils/collections/TypeFilter.java | 14 + .../collections/TypeFilteredCollection.java | 21 + .../miscutils/coupling/ExternalCondition.java | 18 + .../miscutils/coupling/StaticCondition.java | 33 + .../dnetlib/miscutils/datetime/DateUtils.java | 109 +++ .../dnetlib/miscutils/datetime/HumanTime.java | 804 ++++++++++++++++++ .../dnetlib/miscutils/dom4j/XPathHelper.java | 50 ++ .../eu/dnetlib/miscutils/factory/Factory.java | 17 + .../functional/CompositeUnaryFunction.java | 38 + .../miscutils/functional/Functional.java | 34 + .../functional/IdentityFunction.java | 22 + .../functional/ThreadSafeUnaryFunction.java | 52 ++ .../miscutils/functional/UnaryFunction.java | 12 + .../miscutils/functional/hash/Hashing.java | 20 + .../functional/string/EscapeHtml.java | 12 + .../functional/string/EscapeXml.java | 10 + .../functional/string/FastEscapeXml.java | 12 + .../functional/string/Sanitizer.java | 23 + .../functional/string/UnescapeHtml.java | 12 + .../functional/xml/AbstractApplyXslt.java | 197 +++++ .../miscutils/functional/xml/ApplyXslt.java | 60 ++ .../functional/xml/ApplyXsltDom.java | 80 ++ .../functional/xml/ApplyXsltDom4j.java | 61 ++ .../functional/xml/DnetXsltFunctions.java | 123 +++ .../functional/xml/IndentXmlString.java | 133 +++ .../functional/xml/SerializeXml.java | 45 + .../functional/xml/TryIndentXmlString.java | 22 + .../dnetlib/miscutils/hstree/NilTreeNode.java | 16 + .../eu/dnetlib/miscutils/hstree/TreeNode.java | 252 ++++++ .../miscutils/iterators/IterableIterator.java | 24 + .../miscutils/iterators/IterablePair.java | 21 + .../miscutils/iterators/ParallelIterator.java | 29 + .../iterators/xml/IterableXmlParser.java | 29 + .../miscutils/iterators/xml/XMLIterator.java | 170 ++++ .../dnetlib/miscutils/jaxb/JaxbFactory.java | 216 +++++ .../miscutils/maps/ConcurrentSizedMap.java | 53 ++ .../javax.xml.transform.TransformerFactory | 1 + .../collections/AffixCollectionTest.java | 22 + .../collections/BloomFilterTest.java | 491 +++++++++++ .../collections/FilteredCollectionTest.java | 47 + .../collections/MappedCollectionTest.java | 29 + .../TypeFilteredCollectionTest.java | 69 ++ .../miscutils/datetime/DateUtilsTest.java | 40 + .../miscutils/dom4j/XPathHelperTest.java | 38 + .../CompositeUnaryFunctionTest.java | 86 ++ .../ThreadSafeUnaryFunctionTest.java | 58 ++ .../functional/UnsafeUnaryFunction.java | 10 + .../functional/string/EscapeUnescapeTest.java | 34 + .../functional/string/SanitizerTest.java | 43 + .../functional/xml/ApplyXsltTest.java | 41 + .../functional/xml/IndentXmlStringTest.java | 19 + .../functional/xml/dnetFunctionsTest.java | 107 +++ .../miscutils/hstree/TreeNodeTest.java | 63 ++ .../dnetlib/miscutils/hstree/VisitorTest.java | 90 ++ .../miscutils/hstree/WrongTreeNodeTest.java | 44 + .../sample/resources/ChildResource.java | 5 + .../hstree/sample/resources/Resource.java | 5 + .../sample/resources/SampleResource.java | 5 + .../hstree/sample/resources/SubResource.java | 5 + .../hstree/sample/tree/FirstChild.java | 12 + .../sample/tree/MyComputingVisitor.java | 41 + .../hstree/sample/tree/MyLoggingVisitor.java | 49 ++ .../hstree/sample/tree/MyTreeNode.java | 14 + .../hstree/sample/tree/MyTreeVisitor.java | 15 + .../hstree/sample/tree/RootTree.java | 16 + .../hstree/sample/tree/SecondChild.java | 12 + .../sample/wrongtree/WrongFirstChild.java | 10 + .../sample/wrongtree/WrongRootTree.java | 14 + .../sample/wrongtree/WrongSecondChild.java | 10 + .../iterators/xml/IterableXmlParserTest.java | 113 +++ .../maps/ConcurrentSizedMapTest.java | 44 + .../dnetlib/miscutils/encoding/testSource.xml | 1 + .../miscutils/functional/string/invalid.txt | 2 + .../miscutils/functional/string/record.xml | 46 + .../xml/layoutToRecordStylesheet.xsl | 131 +++ .../functional/xml/recordStylesheet.xsl | 109 +++ .../functional/xml/sampleIndexLayout.xml | 42 + .../miscutils/functional/xml/sampleRecord.xml | 87 ++ .../miscutils/iterators/xml/oaiRecord.xml | 36 + .../miscutils/iterators/xml/opendoar.xml.gz | Bin 0 -> 372557 bytes .../miscutils/iterators/xml/singleRepo.xml | 36 + .../miscutils/iterators/xml/weirdRecords.xml | 129 +++ .../iterators/xml/weirdRecords.xml.gz | Bin 0 -> 3211 bytes pom.xml | 270 ++++++ 97 files changed, 6764 insertions(+) create mode 100644 dnet-core-components/pom.xml create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/Cache.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/CacheElement.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/EhCache.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/AffixCollection.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/BloomFilter.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/EnsureCollection.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/Filter.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/FilteredCollection.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/MappedCollection.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/Pair.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/PositionalMapGenerator.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/PositionalStringMapGenerator.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/TypeFilter.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/TypeFilteredCollection.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/coupling/ExternalCondition.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/coupling/StaticCondition.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/datetime/DateUtils.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/datetime/HumanTime.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/dom4j/XPathHelper.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/factory/Factory.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/CompositeUnaryFunction.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/Functional.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/IdentityFunction.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/ThreadSafeUnaryFunction.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/UnaryFunction.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/hash/Hashing.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/EscapeHtml.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/EscapeXml.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/FastEscapeXml.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/Sanitizer.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/UnescapeHtml.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/AbstractApplyXslt.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXslt.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltDom.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltDom4j.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/DnetXsltFunctions.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/IndentXmlString.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/SerializeXml.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/TryIndentXmlString.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/hstree/NilTreeNode.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/hstree/TreeNode.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/IterableIterator.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/IterablePair.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/ParallelIterator.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/xml/IterableXmlParser.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/xml/XMLIterator.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/jaxb/JaxbFactory.java create mode 100644 dnet-core-components/src/main/java/eu/dnetlib/miscutils/maps/ConcurrentSizedMap.java create mode 100644 dnet-core-components/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/AffixCollectionTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/BloomFilterTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/FilteredCollectionTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/MappedCollectionTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/TypeFilteredCollectionTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/datetime/DateUtilsTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/dom4j/XPathHelperTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/CompositeUnaryFunctionTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/ThreadSafeUnaryFunctionTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/UnsafeUnaryFunction.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/string/EscapeUnescapeTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/string/SanitizerTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/IndentXmlStringTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/dnetFunctionsTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/TreeNodeTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/VisitorTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/WrongTreeNodeTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/ChildResource.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/Resource.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/SampleResource.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/SubResource.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/FirstChild.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyComputingVisitor.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyLoggingVisitor.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyTreeNode.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyTreeVisitor.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/RootTree.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/SecondChild.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongFirstChild.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongRootTree.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongSecondChild.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/iterators/xml/IterableXmlParserTest.java create mode 100644 dnet-core-components/src/test/java/eu/dnetlib/miscutils/maps/ConcurrentSizedMapTest.java create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/encoding/testSource.xml create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/string/invalid.txt create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/string/record.xml create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/layoutToRecordStylesheet.xsl create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/recordStylesheet.xsl create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/sampleIndexLayout.xml create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/sampleRecord.xml create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/oaiRecord.xml create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/opendoar.xml.gz create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/singleRepo.xml create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml create mode 100644 dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml.gz create mode 100644 pom.xml diff --git a/dnet-core-components/pom.xml b/dnet-core-components/pom.xml new file mode 100644 index 0000000..c147c77 --- /dev/null +++ b/dnet-core-components/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + eu.dnetlib + dnet-core + 1.0.0-SNAPSHOT + + dnet-core-components + eu.dnetlib + jar + 1.0.0-SNAPSHOT + + + + org.apache.commons + commons-lang3 + + + commons-codec + commons-codec + + + dom4j + dom4j + + + jaxen + jaxen + + + saxonica + saxon + + + saxonica + saxon-dom + + + jgrapht + jgrapht + + + net.sf.ehcache + ehcache + + + com.google.guava + guava + + + + + org.mockito + mockito-core + test + + + junit + junit + test + + + org.springframework + spring-test + false + + + commons-io + commons-io + test + + + + diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/Cache.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/Cache.java new file mode 100644 index 0000000..5648a3f --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/Cache.java @@ -0,0 +1,39 @@ +package eu.dnetlib.miscutils.cache; + +import java.util.Map; +import java.util.Set; + +/** + * Generic strongly typed cache. + * + * @author marko + * + * @param + * key type + * @param + * value type + */ +@Deprecated +public interface Cache extends Map { + V put(K key, CacheElement element); + + CacheElement getElement(K key); + + /** + * Short verision of put(K key, CacheElement element) using default values for expiry time and other caching + * options. + * + * @param key + * key + * @param value + * value + */ + @Override + V put(K key, V value); + + @Override + V get(Object key); + + @Override + Set keySet(); +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/CacheElement.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/CacheElement.java new file mode 100644 index 0000000..86b75db --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/CacheElement.java @@ -0,0 +1,73 @@ +package eu.dnetlib.miscutils.cache; + +/** + * A cache element encapsulates a value and a number of cache specific parameters like the expiration time. + * + * @author marko + * + * @param + * type of payload + */ +@Deprecated +public class CacheElement { + private T value; + private int timeToLive; + private int timeToIdle; + private long creationTime; + + /** + * reference to the underlying implementation specific element instance, for all other properties not exposed here. + */ + Object specificElement; + + CacheElement(final T value) { + this.value = value; + } + + CacheElement(final T value, final int timeToLive, final int timeToIdle) { + this.value = value; + this.timeToLive = timeToLive; + this.timeToIdle = timeToIdle; + } + + public T getValue() { + return value; + } + + public void setValue(final T value) { + this.value = value; + } + + public Integer getTimeToLive() { + return timeToLive; + } + + public void setTimeToLive(final Integer timeToLive) { + this.timeToLive = timeToLive; + } + + public Integer getTimeToIdle() { + return timeToIdle; + } + + public void setTimeToIdle(final Integer timeToIdle) { + this.timeToIdle = timeToIdle; + } + + public Object getSpecificElement() { + return specificElement; + } + + public void setSpecificElement(final Object specificElement) { + this.specificElement = specificElement; + } + + public long getCreationTime() { + return creationTime; + } + + public void setCreationTime(long creationTime) { + this.creationTime = creationTime; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/EhCache.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/EhCache.java new file mode 100644 index 0000000..dadf271 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/cache/EhCache.java @@ -0,0 +1,178 @@ +package eu.dnetlib.miscutils.cache; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import net.sf.ehcache.Element; + +/** + * This is a wrapper to a EhCache instance exposed as a miscutils Cache object offering statically typed java Map-like + * behavior. + * + * @author marko + * + * @param + * @param + */ +@Deprecated +public class EhCache implements Cache { // NOPMD + public class MapEntry implements java.util.Map.Entry { + + transient K key; + + MapEntry(final K key) { + this.key = key; + } + + @Override + public K getKey() { + return key; + } + + @Override + public V getValue() { + return get(key); + } + + @Override + public V setValue(final V value) { + return put(key, value); + } + + } + + /** + * underlying cache implementation. + */ + private net.sf.ehcache.Cache cache; + + public EhCache() { + // no operation + } + + public EhCache(final net.sf.ehcache.Cache ehCache) { + basicSetCache(ehCache); + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.miscutils.cache.Cache#get(java.lang.Object) Java is really strange. Map defines V + * get(Object), so we have to implement this method using Object otherwise the compiler signals a name clash. + */ + @Override + @SuppressWarnings("unchecked") + public V get(final Object key) { + final CacheElement element = getElement((K) key); + if (element == null) + return null; + return element.getValue(); + } + + @Override + @SuppressWarnings("unchecked") + public CacheElement getElement(final K key) { + final Element element = cache.get(key); + if (element == null) + return null; + + final CacheElement res = new CacheElement((V) element.getObjectValue()); + res.setTimeToLive(element.getTimeToLive()); + res.setTimeToLive(element.getTimeToIdle()); + res.setCreationTime(element.getCreationTime()); + res.setSpecificElement(element); + return res; + } + + @Override + public V put(final K key, final CacheElement element) { + final boolean eternal = element.getTimeToLive() == 0; + if (eternal) + cache.put(new Element(key, element.getValue(),eternal)); + else + cache.put(new Element(key, element.getValue(), element.getTimeToLive(), element.getTimeToIdle())); + return element.getValue(); + } + + @Override + public V put(final K key, final V value) { + return put(key, new CacheElement(value)); + } + + @Override + public void clear() { + cache.removeAll(); + } + + @Override + public boolean containsKey(final Object arg0) { + return cache.isKeyInCache(arg0); + } + + @Override + public boolean containsValue(final Object arg0) { + return cache.isValueInCache(arg0); + } + + @Override + public Set> entrySet() { + final Set> res = new HashSet>(); + for (K key : keySet()) + res.add(new MapEntry(key)); // NOPMD + return res; + } + + @Override + public boolean isEmpty() { + return size() == 0; + } + + @Override + @SuppressWarnings("unchecked") + public Set keySet() { + return new HashSet(cache.getKeys()); + } + + @Override + public void putAll(final Map arg0) { + for (java.util.Map.Entry entry : arg0.entrySet()) + put(entry.getKey(), entry.getValue()); + } + + @Override + public V remove(final Object arg0) { + final V val = get(arg0); + cache.remove(arg0); + return val; + } + + @Override + public int size() { + return cache.getSize(); + } + + @Override + public Collection values() { + final List res = new ArrayList(); + for (K key : keySet()) + res.add(get(key)); + return res; + } + + public net.sf.ehcache.Cache getCache() { + return cache; + } + + public void setCache(final net.sf.ehcache.Cache cache) { + basicSetCache(cache); + } + + private void basicSetCache(final net.sf.ehcache.Cache cache) { + this.cache = cache; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/AffixCollection.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/AffixCollection.java new file mode 100644 index 0000000..09529be --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/AffixCollection.java @@ -0,0 +1,58 @@ +package eu.dnetlib.miscutils.collections; + +import java.util.Collection; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +/** + * This is a utility class which helps you append suffixes or prefixes to a collection of strings. + * + * @author marko + * + */ +public class AffixCollection extends MappedCollection { + + /** + * Position of the affix. + * + * @author marko + * + */ + enum Position { + /** + * prefix. + */ + PREFIX, + /** + * suffix. + */ + SUFFIX + } + + /** + * append a given suffix to every element of the input collection. + * + * @param coll + * @param suffix + */ + public AffixCollection(final Collection coll, final String suffix) { + this(coll, suffix, Position.SUFFIX); + } + + /** + * add a given affix to every element of the input collection, either as prefix or suffix. + * + * @param coll + * @param affix + * @param position + */ + public AffixCollection(final Collection coll, final String affix, final Position position) { + super(coll, new UnaryFunction() { + @Override + public String evaluate(String arg) { + return arg + affix; + } + }); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/BloomFilter.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/BloomFilter.java new file mode 100644 index 0000000..538582f --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/BloomFilter.java @@ -0,0 +1,443 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package eu.dnetlib.miscutils.collections; + +import java.io.Serializable; +import java.nio.charset.Charset; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.BitSet; +import java.util.Collection; + +/** + * Implementation of a Bloom-filter, as described here: + * http://en.wikipedia.org/wiki/Bloom_filter + * + * For updates and bugfixes, see http://github.com/magnuss/java-bloomfilter + * + * Inspired by the SimpleBloomFilter-class written by Ian Clarke. This + * implementation provides a more evenly distributed Hash-function by + * using a proper digest instead of the Java RNG. Many of the changes + * were proposed in comments in his blog: + * http://blog.locut.us/2008/01/12/a-decent-stand-alone-java-bloom-filter-implementation/ + * + * @param Object type that is to be inserted into the Bloom filter, e.g. String or Integer. + * @author Magnus Skjegstad + */ +public class BloomFilter implements Serializable { + private static final long serialVersionUID = 1L; + private BitSet bitset; + private int bitSetSize; + private double bitsPerElement; + private int expectedNumberOfFilterElements; // expected (maximum) number of elements to be added + private int numberOfAddedElements; // number of elements actually added to the Bloom filter + private int k; // number of hash functions + + static final Charset charset = Charset.forName("UTF-8"); // encoding used for storing hash values as strings + + static final String hashName = "MD5"; // MD5 gives good enough accuracy in most circumstances. Change to SHA1 if it's needed + static final MessageDigest digestFunction; + static { // The digest method is reused between instances + MessageDigest tmp; + try { + tmp = java.security.MessageDigest.getInstance(hashName); + } catch (NoSuchAlgorithmException e) { + tmp = null; + } + digestFunction = tmp; + } + + /** + * Constructs an empty Bloom filter. The total length of the Bloom filter will be + * c*n. + * + * @param c is the number of bits used per element. + * @param n is the expected number of elements the filter will contain. + * @param k is the number of hash functions used. + */ + public BloomFilter(double c, int n, int k) { + this.expectedNumberOfFilterElements = n; + this.k = k; + this.bitsPerElement = c; + this.bitSetSize = (int) Math.ceil(c * n); + numberOfAddedElements = 0; + this.bitset = new BitSet(bitSetSize); + } + + /** + * Constructs an empty Bloom filter. The optimal number of hash functions (k) is estimated from the total size of the Bloom + * and the number of expected elements. + * + * @param bitSetSize defines how many bits should be used in total for the filter. + * @param expectedNumberOElements defines the maximum number of elements the filter is expected to contain. + */ + public BloomFilter(int bitSetSize, int expectedNumberOElements) { + this(bitSetSize / (double)expectedNumberOElements, + expectedNumberOElements, + (int) Math.round((bitSetSize / (double)expectedNumberOElements) * Math.log(2.0))); + } + + /** + * Constructs an empty Bloom filter with a given false positive probability. The number of bits per + * element and the number of hash functions is estimated + * to match the false positive probability. + * + * @param falsePositiveProbability is the desired false positive probability. + * @param expectedNumberOfElements is the expected number of elements in the Bloom filter. + */ + public BloomFilter(double falsePositiveProbability, int expectedNumberOfElements) { + this(Math.ceil(-(Math.log(falsePositiveProbability) / Math.log(2))) / Math.log(2), // c = k / ln(2) + expectedNumberOfElements, + (int)Math.ceil(-(Math.log(falsePositiveProbability) / Math.log(2)))); // k = ceil(-log_2(false prob.)) + } + + /** + * Construct a new Bloom filter based on existing Bloom filter data. + * + * @param bitSetSize defines how many bits should be used for the filter. + * @param expectedNumberOfFilterElements defines the maximum number of elements the filter is expected to contain. + * @param actualNumberOfFilterElements specifies how many elements have been inserted into the filterData BitSet. + * @param filterData a BitSet representing an existing Bloom filter. + */ + public BloomFilter(int bitSetSize, int expectedNumberOfFilterElements, int actualNumberOfFilterElements, BitSet filterData) { + this(bitSetSize, expectedNumberOfFilterElements); + this.bitset = filterData; + this.numberOfAddedElements = actualNumberOfFilterElements; + } + + /** + * Generates a digest based on the contents of a String. + * + * @param val specifies the input data. + * @param charset specifies the encoding of the input data. + * @return digest as long. + */ + public static int createHash(String val, Charset charset) { + return createHash(val.getBytes(charset)); + } + + /** + * Generates a digest based on the contents of a String. + * + * @param val specifies the input data. The encoding is expected to be UTF-8. + * @return digest as long. + */ + public static int createHash(String val) { + return createHash(val, charset); + } + + /** + * Generates a digest based on the contents of an array of bytes. + * + * @param data specifies input data. + * @return digest as long. + */ + public static int createHash(byte[] data) { + return createHashes(data, 1)[0]; + } + + /** + * Generates digests based on the contents of an array of bytes and splits the result into 4-byte int's and store them in an array. The + * digest function is called until the required number of int's are produced. For each call to digest a salt + * is prepended to the data. The salt is increased by 1 for each call. + * + * @param data specifies input data. + * @param hashes number of hashes/int's to produce. + * @return array of int-sized hashes + */ + public static int[] createHashes(byte[] data, int hashes) { + int[] result = new int[hashes]; + + int k = 0; + byte salt = 0; + while (k < hashes) { + byte[] digest; + synchronized (digestFunction) { + digestFunction.update(salt); + salt++; + digest = digestFunction.digest(data); + } + + for (int i = 0; i < digest.length/4 && k < hashes; i++) { + int h = 0; + for (int j = (i*4); j < (i*4)+4; j++) { + h <<= 8; + h |= ((int) digest[j]) & 0xFF; + } + result[k] = h; + k++; + } + } + return result; + } + + /** + * Compares the contents of two instances to see if they are equal. + * + * @param obj is the object to compare to. + * @return True if the contents of the objects are equal. + */ + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + @SuppressWarnings("unchecked") + final BloomFilter other = (BloomFilter) obj; + if (this.expectedNumberOfFilterElements != other.expectedNumberOfFilterElements) { + return false; + } + if (this.k != other.k) { + return false; + } + if (this.bitSetSize != other.bitSetSize) { + return false; + } + if (this.bitset != other.bitset && (this.bitset == null || !this.bitset.equals(other.bitset))) { + return false; + } + return true; + } + + /** + * Calculates a hash code for this class. + * @return hash code representing the contents of an instance of this class. + */ + @Override + public int hashCode() { + int hash = 7; + hash = 61 * hash + (this.bitset != null ? this.bitset.hashCode() : 0); + hash = 61 * hash + this.expectedNumberOfFilterElements; + hash = 61 * hash + this.bitSetSize; + hash = 61 * hash + this.k; + return hash; + } + + + /** + * Calculates the expected probability of false positives based on + * the number of expected filter elements and the size of the Bloom filter. + *

+ * The value returned by this method is the expected rate of false + * positives, assuming the number of inserted elements equals the number of + * expected elements. If the number of elements in the Bloom filter is less + * than the expected value, the true probability of false positives will be lower. + * + * @return expected probability of false positives. + */ + public double expectedFalsePositiveProbability() { + return getFalsePositiveProbability(expectedNumberOfFilterElements); + } + + /** + * Calculate the probability of a false positive given the specified + * number of inserted elements. + * + * @param numberOfElements number of inserted elements. + * @return probability of a false positive. + */ + public double getFalsePositiveProbability(double numberOfElements) { + // (1 - e^(-k * n / m)) ^ k + return Math.pow((1 - Math.exp(-k * (double) numberOfElements + / (double) bitSetSize)), k); + + } + + /** + * Get the current probability of a false positive. The probability is calculated from + * the size of the Bloom filter and the current number of elements added to it. + * + * @return probability of false positives. + */ + public double getFalsePositiveProbability() { + return getFalsePositiveProbability(numberOfAddedElements); + } + + + /** + * Returns the value chosen for K.
+ *
+ * K is the optimal number of hash functions based on the size + * of the Bloom filter and the expected number of inserted elements. + * + * @return optimal k. + */ + public int getK() { + return k; + } + + /** + * Sets all bits to false in the Bloom filter. + */ + public void clear() { + bitset.clear(); + numberOfAddedElements = 0; + } + + /** + * Adds an object to the Bloom filter. The output from the object's + * toString() method is used as input to the hash functions. + * + * @param element is an element to register in the Bloom filter. + */ + public void add(E element) { + add(element.toString().getBytes(charset)); + } + + /** + * Adds an array of bytes to the Bloom filter. + * + * @param bytes array of bytes to add to the Bloom filter. + */ + public void add(byte[] bytes) { + int[] hashes = createHashes(bytes, k); + for (int hash : hashes) + bitset.set(Math.abs(hash % bitSetSize), true); + numberOfAddedElements ++; + } + + /** + * Adds all elements from a Collection to the Bloom filter. + * @param c Collection of elements. + */ + public void addAll(Collection c) { + for (E element : c) + add(element); + } + + /** + * Returns true if the element could have been inserted into the Bloom filter. + * Use getFalsePositiveProbability() to calculate the probability of this + * being correct. + * + * @param element element to check. + * @return true if the element could have been inserted into the Bloom filter. + */ + public boolean contains(E element) { + return contains(element.toString().getBytes(charset)); + } + + /** + * Returns true if the array of bytes could have been inserted into the Bloom filter. + * Use getFalsePositiveProbability() to calculate the probability of this + * being correct. + * + * @param bytes array of bytes to check. + * @return true if the array could have been inserted into the Bloom filter. + */ + public boolean contains(byte[] bytes) { + int[] hashes = createHashes(bytes, k); + for (int hash : hashes) { + if (!bitset.get(Math.abs(hash % bitSetSize))) { + return false; + } + } + return true; + } + + /** + * Returns true if all the elements of a Collection could have been inserted + * into the Bloom filter. Use getFalsePositiveProbability() to calculate the + * probability of this being correct. + * @param c elements to check. + * @return true if all the elements in c could have been inserted into the Bloom filter. + */ + public boolean containsAll(Collection c) { + for (E element : c) + if (!contains(element)) + return false; + return true; + } + + /** + * Read a single bit from the Bloom filter. + * @param bit the bit to read. + * @return true if the bit is set, false if it is not. + */ + public boolean getBit(int bit) { + return bitset.get(bit); + } + + /** + * Set a single bit in the Bloom filter. + * @param bit is the bit to set. + * @param value If true, the bit is set. If false, the bit is cleared. + */ + public void setBit(int bit, boolean value) { + bitset.set(bit, value); + } + + /** + * Return the bit set used to store the Bloom filter. + * @return bit set representing the Bloom filter. + */ + public BitSet getBitSet() { + return bitset; + } + + /** + * Returns the number of bits in the Bloom filter. Use count() to retrieve + * the number of inserted elements. + * + * @return the size of the bitset used by the Bloom filter. + */ + public int size() { + return this.bitSetSize; + } + + /** + * Returns the number of elements added to the Bloom filter after it + * was constructed or after clear() was called. + * + * @return number of elements added to the Bloom filter. + */ + public int count() { + return this.numberOfAddedElements; + } + + /** + * Returns the expected number of elements to be inserted into the filter. + * This value is the same value as the one passed to the constructor. + * + * @return expected number of elements. + */ + public int getExpectedNumberOfElements() { + return expectedNumberOfFilterElements; + } + + /** + * Get expected number of bits per element when the Bloom filter is full. This value is set by the constructor + * when the Bloom filter is created. See also getBitsPerElement(). + * + * @return expected number of bits per element. + */ + public double getExpectedBitsPerElement() { + return this.bitsPerElement; + } + + /** + * Get actual number of bits per element based on the number of elements that have currently been inserted and the length + * of the Bloom filter. See also getExpectedBitsPerElement(). + * + * @return number of bits per element. + */ + public double getBitsPerElement() { + return this.bitSetSize / (double)numberOfAddedElements; + } +} \ No newline at end of file diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/EnsureCollection.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/EnsureCollection.java new file mode 100644 index 0000000..748a0da --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/EnsureCollection.java @@ -0,0 +1,48 @@ +package eu.dnetlib.miscutils.collections; + +import java.util.List; + +import com.google.common.collect.Lists; + +/** + * Utility class which checks ensures that a given collection is not null. + * + *

+ * CXF for example cannot distinguish from nulls. This helper allows you write: + *

+ * + *
+ * for(String bla : EnsureCollection.list(somecode())) {....}
+ * 
+ * + * @author marko + * + */ +public class EnsureCollection { + + /** + * returns the argument or a new list if the argument is null. + * + * @param a type + * @param aList a list + * @return passthrough or empty list + */ + public static List list(final List aList) { + if (aList == null) + return Lists.newArrayList(); + return aList; + } + + + /** + * Alias for static imports. + * + * @param a type + * @param aList a list + * @return passthrough or empty list + */ + public static List notNullList(final List aList) { + return list(aList); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/Filter.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/Filter.java new file mode 100644 index 0000000..f0e6cf9 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/Filter.java @@ -0,0 +1,6 @@ +package eu.dnetlib.miscutils.collections; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +public interface Filter extends UnaryFunction { +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/FilteredCollection.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/FilteredCollection.java new file mode 100644 index 0000000..967aa98 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/FilteredCollection.java @@ -0,0 +1,119 @@ +package eu.dnetlib.miscutils.collections; + +import java.util.*; + +import com.google.common.collect.Lists; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +public class FilteredCollection implements Iterable { + final transient private Iterable coll; + transient UnaryFunction filter; + + class FilterIterator implements Iterator { + final transient private Iterator iter; + + transient T nextElement; + + public FilterIterator() { + this.iter = coll.iterator(); + scanNext(); + } + + private void scanNext() { + while (iter.hasNext()) { + final T element = iter.next(); + if (filter.evaluate(element)) { + nextElement = element; + return; + } + } + nextElement = null; // NOPMD + } + + @Override + public boolean hasNext() { + return nextElement != null; + } + + @Override + public T next() { + final T res = nextElement; + scanNext(); + return res; + } + + @Override + public void remove() { + // no operation + } + } + + /** + * Static helper function, makes usage shorter. + * + * @param + * @param coll + * @param filter + * @return + */ + public static Iterable filter(final Iterable coll, final UnaryFunction filter) { + return new FilteredCollection(coll, filter); + } + + public static Iterable filter(final X[] coll, final UnaryFunction filter) { + return new FilteredCollection(coll, filter); + } + + /** + * Static helper function, makes common usage shorter. + * + * @param + * @param + * @param coll + * @param mapper + * @return + */ + public static List listFilter(final Iterable coll, final UnaryFunction filter) { + return Lists.newArrayList(filter(coll, filter)); + } + + public static List listFilter(final X[] coll, final UnaryFunction filter) { + return Lists.newArrayList(filter(coll, filter)); + } + + public FilteredCollection(final Collection coll, final UnaryFunction filter) { + this.coll = coll; + this.filter = filter; + } + + public FilteredCollection(final Iterable coll, final UnaryFunction filter) { + this.coll = coll; + this.filter = filter; + } + + public FilteredCollection(final T[] coll, final UnaryFunction filter) { + this.coll = Lists.newArrayList(coll); + this.filter = filter; + } + + + @Override + public Iterator iterator() { + return new FilterIterator(); + } + + public static void main(final String[] args) { + final List list = new ArrayList(); + list.add("ciao"); + list.add(2); + list.add("bubu"); + + final TypeFilteredCollection filtered = new TypeFilteredCollection(list, String.class); + + for (final String el : filtered) + System.out.println("element: " + el); // NOPMD + + System.out.println("ok"); // NOPMD + } +} \ No newline at end of file diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/MappedCollection.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/MappedCollection.java new file mode 100644 index 0000000..6049bb9 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/MappedCollection.java @@ -0,0 +1,109 @@ +/** + * + */ +package eu.dnetlib.miscutils.collections; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import com.google.common.collect.Lists; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +/** + * @author marko + * + */ +public class MappedCollection implements Iterable { + private transient final Iterable coll; + private transient final UnaryFunction mapper; + + /** + * Static helper function, makes usage shorter. + * + * @param + * @param coll + * @param filter + * @return + */ + public static Iterable map(final Iterable coll, final UnaryFunction mapper) { + return new MappedCollection(coll, mapper); + } + + public static Iterable map(final Y[] coll, final UnaryFunction mapper) { + return new MappedCollection(coll, mapper); + } + + /** + * Static helper function, makes common usage shorter. + * + * @param + * @param + * @param coll + * @param mapper + * @return + */ + public static List listMap(final Iterable coll, final UnaryFunction mapper) { + return Lists.newArrayList(map(coll, mapper)); + } + + public static List listMap(final Y[] coll, final UnaryFunction mapper) { + return Lists.newArrayList(map(coll, mapper)); + } + + /** + * Compatibility with pre 0.0.3 cnr-misc-utils. + * + * @param coll + * @param mapper + */ + public MappedCollection(final Collection coll, final UnaryFunction mapper) { + this.coll = coll; + this.mapper = mapper; + } + + public MappedCollection(final Iterable coll, final UnaryFunction mapper) { + this.coll = coll; + this.mapper = mapper; + } + + public MappedCollection(final K[] coll, final UnaryFunction mapper) { + this.coll = Lists.newArrayList(coll); + this.mapper = mapper; + } + + class MappedIterator implements Iterator { + private transient final Iterator iter; + + public MappedIterator() { + this.iter = coll.iterator(); + } + + @Override + public T next() { + return mapper.evaluate(iter.next()); + } + + @Override + public boolean hasNext() { + return iter.hasNext(); + } + + @Override + public void remove() { + iter.remove(); + } + } + + /* + * (non-Javadoc) + * + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + return new MappedIterator(); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/Pair.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/Pair.java new file mode 100644 index 0000000..03c98b6 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/Pair.java @@ -0,0 +1,30 @@ +package eu.dnetlib.miscutils.collections; + +public class Pair { + + private K k; + + private V v; + + public Pair(K k, V v) { + this.k = k; + this.v = v; + } + + public K getKey() { + return k; + } + + public V getValue() { + return v; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Pair) { + Pair tmp = (Pair) obj; + return k.equals(tmp.getKey()) && v.equals(tmp.getValue()); + } else return false; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/PositionalMapGenerator.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/PositionalMapGenerator.java new file mode 100644 index 0000000..2537eb2 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/PositionalMapGenerator.java @@ -0,0 +1,73 @@ +package eu.dnetlib.miscutils.collections; + +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + + + +/** + * Helper for creating a named key/value pairs out of a String.split output. + * + * @author luca.santocono + * + * @param + * key type + * @param + * value type + */ +public class PositionalMapGenerator { + + /** + * keys in positional order. + */ + private final K[] keys; + + /** + * positional keys declaration + * + * @param keys + * keys + */ + public PositionalMapGenerator( final K... keys) { + this.keys = keys; + } + + /** + * Positionally map the input array with the configured keys. + * + * @param values + * value array + * @return map containing value array mapped with keys + */ + public Map asMap(final V[] values) { + final Map stringMap = new HashMap(); + for (int i = 0; i < values.length; i++) + stringMap.put(keys[i], values[i]); + return stringMap; + } + + @SuppressWarnings("unchecked") + public X construct(final Class clazz, final Class clavv, final V[] values) { + Class[] params = new Class[values.length]; + Arrays.fill(params, clavv); + + try { + return clazz.getDeclaredConstructor(params).newInstance(values); + } catch (IllegalArgumentException e) { + throw new IllegalStateException(e); + } catch (InstantiationException e) { + throw new IllegalStateException(e); + } catch (IllegalAccessException e) { + throw new IllegalStateException(e); + } catch (InvocationTargetException e) { + throw new IllegalStateException(e); + } catch (SecurityException e) { + throw new IllegalStateException(e); + } catch (NoSuchMethodException e) { + throw new IllegalStateException(e); + } + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/PositionalStringMapGenerator.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/PositionalStringMapGenerator.java new file mode 100644 index 0000000..71bb729 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/PositionalStringMapGenerator.java @@ -0,0 +1,78 @@ +package eu.dnetlib.miscutils.collections; + +import java.util.Map; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +/** + * A special case of a PositionalMapGenerator, bound for String values. It provides automatic split which returns an + * iterable of maps. + * + * @author marko + * + * @param + * key + */ +public class PositionalStringMapGenerator extends PositionalMapGenerator { + + /** + * Creates a new positional string map generator + * + * @param keys + */ + public PositionalStringMapGenerator(final K... keys) { + super(keys); + } + + /** + * Pass a list of strings and return a list of maps where each key has a value according to the position in the + * splitted array relative to the position of the key in the constructor. + * + * @param elements + * list of strings which will be splitted + * @param separator + * separator + * @return iterable of maps contained splitted values + */ + public Iterable> split(Iterable elements, final String separator) { + + return new MappedCollection, String>(elements, new UnaryFunction, String>() { + + @Override + public Map evaluate(String value) { + return asMap(value.split(separator)); + } + }); + + } + + /** + * Pass a list of strings and return a list of objects constructed by passing the splitted string values to the + * constructor of the new object. + * + *

+ * This method doesn't need to setup a list of key names in the constructor + *

+ * + * @param + * some class + * @param clazz + * some class + * @param elements + * list of strings to split + * @param separator + * separator + * @return iterable of instances of some class constructed with splitted values + */ + public Iterable split(final Class clazz, Iterable elements, final String separator) { + + return new MappedCollection(elements, new UnaryFunction() { + + @Override + public X evaluate(String value) { + return construct(clazz, String.class, value.split(separator)); + } + }); + + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/TypeFilter.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/TypeFilter.java new file mode 100644 index 0000000..984e926 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/TypeFilter.java @@ -0,0 +1,14 @@ +package eu.dnetlib.miscutils.collections; + +public class TypeFilter implements Filter { + transient final Class cls; + + public TypeFilter(final Class cls) { + this.cls = cls; + } + + @Override + public Boolean evaluate(final T element) { + return (cls.isInstance(element)); + } +} \ No newline at end of file diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/TypeFilteredCollection.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/TypeFilteredCollection.java new file mode 100644 index 0000000..b35f122 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/collections/TypeFilteredCollection.java @@ -0,0 +1,21 @@ +package eu.dnetlib.miscutils.collections; + +import java.util.Collection; +import java.util.Iterator; + +public class TypeFilteredCollection implements Iterable { + private transient final Collection coll; + private transient final Class cls; + + public TypeFilteredCollection(final Collection coll, final Class cls) { + this.coll = coll; + this.cls = cls; + } + + @Override + @SuppressWarnings("unchecked") + public Iterator iterator() { + final Filter filter = new TypeFilter(cls); + return (Iterator) (new FilteredCollection(coll, filter)).iterator(); + } +} \ No newline at end of file diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/coupling/ExternalCondition.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/coupling/ExternalCondition.java new file mode 100644 index 0000000..0e41f48 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/coupling/ExternalCondition.java @@ -0,0 +1,18 @@ +package eu.dnetlib.miscutils.coupling; + +/** + * In many occasions one component wants to disable some other component or some functionalty of another component + * but it's not advisable to couple these components too tightly. This class offers an abstraction to the concept of "Condition", + * where a component can parameterize it's behavior according to some external condition, which can be driven by another component. + * + * @author marko + * + */ +public interface ExternalCondition { + /** + * true if true. + * + * @return true if true + */ + boolean isTrue(); +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/coupling/StaticCondition.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/coupling/StaticCondition.java new file mode 100644 index 0000000..ad669a5 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/coupling/StaticCondition.java @@ -0,0 +1,33 @@ +package eu.dnetlib.miscutils.coupling; + +/** + * Simple implementation of an ExternalCondition object, where a condition provider has directly control to the global condition. + * + * @author marko + * + */ +public class StaticCondition implements ExternalCondition { + + /** + * condition provider can set this field. + */ + boolean condition; + + /** + * {@inheritDoc} + * @see eu.dnetlib.miscutils.coupling.ExternalCondition#isTrue() + */ + @Override + public synchronized boolean isTrue() { + return isCondition(); + } + + public synchronized boolean isCondition() { + return condition; + } + + public synchronized void setCondition(boolean condition) { + this.condition = condition; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/datetime/DateUtils.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/datetime/DateUtils.java new file mode 100644 index 0000000..25f502a --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/datetime/DateUtils.java @@ -0,0 +1,109 @@ +package eu.dnetlib.miscutils.datetime; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * various date utilities. + * + * @author michele + * + */ +public class DateUtils { + + private static final SimpleDateFormat ISO8601FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US); + + private transient final Date date; + + public DateUtils() { + this.date = new Date(); + } + + public DateUtils(final Date date) { + this.date = (Date) date.clone(); + } + + public String getDateAsISO8601String() { + String result; + synchronized (ISO8601FORMAT) { + result = ISO8601FORMAT.format(this.date); + } + + //convert YYYYMMDDTHH:mm:ss+HH00 into YYYYMMDDTHH:mm:ss+HH:00 + //- note the added colon for the Timezone + return result.substring(0, result.length() - 2) + ":" + result.substring(result.length() - 2); + } + + public Long getPrecisionTime() { + return this.date.getTime(); + } + + public static long now() { + return new Date().getTime(); + } + + public static String now_ISO8601() { // NOPMD + String result; + synchronized (ISO8601FORMAT) { + result = ISO8601FORMAT.format(new Date()); + } + //convert YYYYMMDDTHH:mm:ss+HH00 into YYYYMMDDTHH:mm:ss+HH:00 + //- note the added colon for the Timezone + return result.substring(0, result.length() - 2) + ":" + result.substring(result.length() - 2); + } + + /** + * parses a iso8601 date into a date. + * + * @param date + * string iso8601 date + * @return date object + */ + public Date parse(final String dateArg) { + String date = dateArg; + + if ("".equals(date)) + return null; + + try { + if (date.endsWith("Z")) { + date = date.replace("Z", "+0000"); + } else if (date.length() < 20) { + date += "+0000"; // NOPMD + } else { + final String end = date.substring(date.length() - 3); + date = date.substring(0, date.length() - 3) + end.replace(":", ""); + } + + synchronized (ISO8601FORMAT) { + return ISO8601FORMAT.parse(date); + } + } catch (ParseException e) { + throw new IllegalStateException("invalid iso8601 date '" + dateArg + "' (even after normalizing it to '" + date + "')"); + } + } + + public static String calculate_ISO8601(long l) { + String result = ISO8601FORMAT.format(new Date(l)); + // convert YYYYMMDDTHH:mm:ss+HH00 into YYYYMMDDTHH:mm:ss+HH:00 + //- note the added colon for the Timezone + result = result.substring(0, result.length() - 2) + ":" + result.substring(result.length() - 2); + return result; + } + + /** + * Extracts the duration part of a ISO8601 formatted date. Duration part is the part after the 'T'. + * + * @param dateArg + * @return + */ + public String getDuration(final String dateArg) { + String[] splitted = dateArg.split("T"); + if (splitted.length == 1) + return "0"; + else + return splitted[1]; + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/datetime/HumanTime.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/datetime/HumanTime.java new file mode 100644 index 0000000..70a11dc --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/datetime/HumanTime.java @@ -0,0 +1,804 @@ +package eu.dnetlib.miscutils.datetime; + +/* + * HumanTime.java + * + * Created on 06.10.2008 + * + * Copyright (c) 2008 Johann Burkard () + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.util.Iterator; + +/** + * HumanTime parses and formats time deltas for easier reading by humans. It can format time information without losing + * information but its main purpose is to generate more easily understood approximations.

Using HumanTime

+ *

+ * Use HumanTime by creating an instance that contains the time delta ({@link HumanTime#HumanTime(long)}), create an + * empty instance through ({@link HumanTime#HumanTime()}) and set the delta using the {@link #y()}, {@link #d()}, + * {@link #h()}, {@link #s()} and {@link #ms()} methods or parse a {@link CharSequence} representation ( + * {@link #eval(CharSequence)}). Parsing ignores whitespace and is case insensitive. + *

+ *

HumanTime format

+ *

+ * HumanTime will format time deltas in years ("y"), days ("d"), hours ("h"), minutes ("m"), seconds ("s") and + * milliseconds ("ms"), separated by a blank character. For approximate representations, the time delta will be round up + * or down if necessary. + *

+ *

HumanTime examples

+ *
    + *
  • HumanTime.eval("1 d 1d 2m 3m").getExactly() = "2 d 5 m"
  • + *
  • HumanTime.eval("2m8d2h4m").getExactly() = "8 d 2 h 6 m"
  • + *
  • HumanTime.approximately("2 d 8 h 20 m 50 s") = "2 d 8 h"
  • + *
  • HumanTime.approximately("55m") = "1 h"
  • + *
+ *

Implementation details

+ *
    + *
  • The time delta can only be increased.
  • + *
  • Instances of this class are thread safe.
  • + *
  • Getters using the Java Beans naming conventions are provided for use in environments like JSP or with expression + * languages like OGNL. See {@link #getApproximately()} and {@link #getExactly()}.
  • + *
  • To keep things simple, a year consists of 365 days.
  • + *
+ * + * @author Johann Burkard + * @version $Id: HumanTime.java 323 2008-10-08 19:06:22Z Johann $ + * @see #eval(CharSequence) + * @see #approximately(CharSequence) + * @see Date + * Formatting and Parsing for Humans in Java with HumanTime + */ +public class HumanTime implements Externalizable, Comparable, Cloneable { + + /** + * The serial version UID. + */ + private static final long serialVersionUID = 5179328390732826722L; + + /** + * One second. + */ + private static final long SECOND = 1000; + + /** + * One minute. + */ + private static final long MINUTE = SECOND * 60; + + /** + * One hour. + */ + private static final long HOUR = MINUTE * 60; + + /** + * One day. + */ + private static final long DAY = HOUR * 24; + + /** + * One year. + */ + private static final long YEAR = DAY * 365; + + /** + * Percentage of what is round up or down. + */ + private static final int CEILING_PERCENTAGE = 15; + + /** + * Parsing state. + */ + static enum State { + + NUMBER, IGNORED, UNIT + + } + + static State getState(char c) { + State out; + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + out = State.NUMBER; + break; + case 's': + case 'm': + case 'h': + case 'd': + case 'y': + case 'S': + case 'M': + case 'H': + case 'D': + case 'Y': + out = State.UNIT; + break; + default: + out = State.IGNORED; + } + return out; + } + + /** + * Parses a {@link CharSequence} argument and returns a {@link HumanTime} instance. + * + * @param s + * the char sequence, may not be null + * @return an instance, never null + */ + public static HumanTime eval(final CharSequence s) { + HumanTime out = new HumanTime(0L); + + int num = 0; + + int start = 0; + int end = 0; + + State oldState = State.IGNORED; + + for (char c : new Iterable() { + + /** + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + return new Iterator() { + + private int p = 0; + + /** + * @see java.util.Iterator#hasNext() + */ + @Override + public boolean hasNext() { + return p < s.length(); + } + + /** + * @see java.util.Iterator#next() + */ + @Override + public Character next() { + return s.charAt(p++); + } + + /** + * @see java.util.Iterator#remove() + */ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + }; + } + + }) { + State newState = getState(c); + if (oldState != newState) { + if (oldState == State.NUMBER && (newState == State.IGNORED || newState == State.UNIT)) { + num = Integer.parseInt(s.subSequence(start, end).toString()); + } else if (oldState == State.UNIT && (newState == State.IGNORED || newState == State.NUMBER)) { + out.nTimes(s.subSequence(start, end).toString(), num); + num = 0; + } + start = end; + } + ++end; + oldState = newState; + } + if (oldState == State.UNIT) { + out.nTimes(s.subSequence(start, end).toString(), num); + } + + return out; + } + + /** + * Parses and formats the given char sequence, preserving all data. + *

+ * Equivalent to eval(in).getExactly() + * + * @param in + * the char sequence, may not be null + * @return a formatted String, never null + */ + public static String exactly(CharSequence in) { + return eval(in).getExactly(); + } + + /** + * Formats the given time delta, preserving all data. + *

+ * Equivalent to new HumanTime(in).getExactly() + * + * @param l + * the time delta + * @return a formatted String, never null + */ + public static String exactly(long l) { + return new HumanTime(l).getExactly(); + } + + /** + * Parses and formats the given char sequence, potentially removing some data to make the output easier to + * understand. + *

+ * Equivalent to eval(in).getApproximately() + * + * @param in + * the char sequence, may not be null + * @return a formatted String, never null + */ + public static String approximately(CharSequence in) { + return eval(in).getApproximately(); + } + + /** + * Formats the given time delta, preserving all data. + *

+ * Equivalent to new HumanTime(l).getApproximately() + * + * @param l + * the time delta + * @return a formatted String, never null + */ + public static String approximately(long l) { + return new HumanTime(l).getApproximately(); + } + + /** + * The time delta. + */ + private long delta; + + /** + * No-argument Constructor for HumanTime. + *

+ * Equivalent to calling new HumanTime(0L). + */ + public HumanTime() { + this(0L); + } + + /** + * Constructor for HumanTime. + * + * @param delta + * the initial time delta, interpreted as a positive number + */ + public HumanTime(long delta) { + super(); + this.delta = Math.abs(delta); + } + + private void nTimes(String unit, int n) { + if ("ms".equalsIgnoreCase(unit)) { + ms(n); + } else if ("s".equalsIgnoreCase(unit)) { + s(n); + } else if ("m".equalsIgnoreCase(unit)) { + m(n); + } else if ("h".equalsIgnoreCase(unit)) { + h(n); + } else if ("d".equalsIgnoreCase(unit)) { + d(n); + } else if ("y".equalsIgnoreCase(unit)) { + y(n); + } + } + + private long upperCeiling(long x) { + return (x / 100) * (100 - CEILING_PERCENTAGE); + } + + private long lowerCeiling(long x) { + return (x / 100) * CEILING_PERCENTAGE; + } + + private String ceil(long d, long n) { + return Integer.toString((int) Math.ceil((double) d / n)); + } + + private String floor(long d, long n) { + return Integer.toString((int) Math.floor((double) d / n)); + } + + /** + * Adds one year to the time delta. + * + * @return this HumanTime object + */ + public HumanTime y() { + return y(1); + } + + /** + * Adds n years to the time delta. + * + * @param n + * n + * @return this HumanTime object + */ + public HumanTime y(int n) { + delta += YEAR * Math.abs(n); + return this; + } + + /** + * Adds one day to the time delta. + * + * @return this HumanTime object + */ + public HumanTime d() { + return d(1); + } + + /** + * Adds n days to the time delta. + * + * @param n + * n + * @return this HumanTime object + */ + public HumanTime d(int n) { + delta += DAY * Math.abs(n); + return this; + } + + /** + * Adds one hour to the time delta. + * + * @return this HumanTime object + */ + public HumanTime h() { + return h(1); + } + + /** + * Adds n hours to the time delta. + * + * @param n + * n + * @return this HumanTime object + */ + public HumanTime h(int n) { + delta += HOUR * Math.abs(n); + return this; + } + + /** + * Adds one month to the time delta. + * + * @return this HumanTime object + */ + public HumanTime m() { + return m(1); + } + + /** + * Adds n months to the time delta. + * + * @param n + * n + * @return this HumanTime object + */ + public HumanTime m(int n) { + delta += MINUTE * Math.abs(n); + return this; + } + + /** + * Adds one second to the time delta. + * + * @return this HumanTime object + */ + public HumanTime s() { + return s(1); + } + + /** + * Adds n seconds to the time delta. + * + * @param n + * seconds + * @return this HumanTime object + */ + public HumanTime s(int n) { + delta += SECOND * Math.abs(n); + return this; + } + + /** + * Adds one millisecond to the time delta. + * + * @return this HumanTime object + */ + public HumanTime ms() { + return ms(1); + } + + /** + * Adds n milliseconds to the time delta. + * + * @param n + * n + * @return this HumanTime object + */ + public HumanTime ms(int n) { + delta += Math.abs(n); + return this; + } + + /** + * Returns a human-formatted representation of the time delta. + * + * @return a formatted representation of the time delta, never null + */ + public String getExactly() { + return getExactly(new StringBuilder()).toString(); + } + + /** + * Appends a human-formatted representation of the time delta to the given {@link Appendable} object. + * + * @param + * the return type + * @param a + * the Appendable object, may not be null + * @return the given Appendable object, never null + */ + public T getExactly(T a) { + try { + boolean prependBlank = false; + long d = delta; + if (d >= YEAR) { + a.append(floor(d, YEAR)); + a.append(' '); + a.append('y'); + prependBlank = true; + } + d %= YEAR; + if (d >= DAY) { + if (prependBlank) { + a.append(' '); + } + a.append(floor(d, DAY)); + a.append(' '); + a.append('d'); + prependBlank = true; + } + d %= DAY; + if (d >= HOUR) { + if (prependBlank) { + a.append(' '); + } + a.append(floor(d, HOUR)); + a.append(' '); + a.append('h'); + prependBlank = true; + } + d %= HOUR; + if (d >= MINUTE) { + if (prependBlank) { + a.append(' '); + } + a.append(floor(d, MINUTE)); + a.append(' '); + a.append('m'); + prependBlank = true; + } + d %= MINUTE; + if (d >= SECOND) { + if (prependBlank) { + a.append(' '); + } + a.append(floor(d, SECOND)); + a.append(' '); + a.append('s'); + prependBlank = true; + } + d %= SECOND; + if (d > 0) { + if (prependBlank) { + a.append(' '); + } + a.append(Integer.toString((int) d)); + a.append(' '); + a.append('m'); + a.append('s'); + } + } catch (IOException ex) { + // What were they thinking... + } + return a; + } + + /** + * Returns an approximate, human-formatted representation of the time delta. + * + * @return a formatted representation of the time delta, never null + */ + public String getApproximately() { + return getApproximately(new StringBuilder()).toString(); + } + + /** + * Appends an approximate, human-formatted representation of the time delta to the given {@link Appendable} object. + * + * @param + * the return type + * @param a + * the Appendable object, may not be null + * @return the given Appendable object, never null + */ + public T getApproximately(T a) { + + try { + int parts = 0; + boolean rounded = false; + boolean prependBlank = false; + long d = delta; + long mod = d % YEAR; + + if (mod >= upperCeiling(YEAR)) { + a.append(ceil(d, YEAR)); + a.append(' '); + a.append('y'); + ++parts; + rounded = true; + prependBlank = true; + } else if (d >= YEAR) { + a.append(floor(d, YEAR)); + a.append(' '); + a.append('y'); + ++parts; + rounded = mod <= lowerCeiling(YEAR); + prependBlank = true; + } + + if (!rounded) { + d %= YEAR; + mod = d % DAY; + + if (mod >= upperCeiling(DAY)) { + if (prependBlank) { + a.append(' '); + } + a.append(ceil(d, DAY)); + a.append(' '); + a.append('d'); + ++parts; + rounded = true; + prependBlank = true; + } else if (d >= DAY) { + if (prependBlank) { + a.append(' '); + } + a.append(floor(d, DAY)); + a.append(' '); + a.append('d'); + ++parts; + rounded = mod <= lowerCeiling(DAY); + prependBlank = true; + } + + if (parts < 2) { + d %= DAY; + mod = d % HOUR; + + if (mod >= upperCeiling(HOUR)) { + if (prependBlank) { + a.append(' '); + } + a.append(ceil(d, HOUR)); + a.append(' '); + a.append('h'); + ++parts; + rounded = true; + prependBlank = true; + } else if (d >= HOUR && !rounded) { + if (prependBlank) { + a.append(' '); + } + a.append(floor(d, HOUR)); + a.append(' '); + a.append('h'); + ++parts; + rounded = mod <= lowerCeiling(HOUR); + prependBlank = true; + } + + if (parts < 2) { + d %= HOUR; + mod = d % MINUTE; + + if (mod >= upperCeiling(MINUTE)) { + if (prependBlank) { + a.append(' '); + } + a.append(ceil(d, MINUTE)); + a.append(' '); + a.append('m'); + ++parts; + rounded = true; + prependBlank = true; + } else if (d >= MINUTE && !rounded) { + if (prependBlank) { + a.append(' '); + } + a.append(floor(d, MINUTE)); + a.append(' '); + a.append('m'); + ++parts; + rounded = mod <= lowerCeiling(MINUTE); + prependBlank = true; + } + + if (parts < 2) { + d %= MINUTE; + mod = d % SECOND; + + if (mod >= upperCeiling(SECOND)) { + if (prependBlank) { + a.append(' '); + } + a.append(ceil(d, SECOND)); + a.append(' '); + a.append('s'); + ++parts; + rounded = true; + prependBlank = true; + } else if (d >= SECOND && !rounded) { + if (prependBlank) { + a.append(' '); + } + a.append(floor(d, SECOND)); + a.append(' '); + a.append('s'); + ++parts; + rounded = mod <= lowerCeiling(SECOND); + prependBlank = true; + } + + if (parts < 2) { + d %= SECOND; + + if (d > 0 && !rounded) { + if (prependBlank) { + a.append(' '); + } + a.append(Integer.toString((int) d)); + a.append(' '); + a.append('m'); + a.append('s'); + } + } + + } + + } + + } + } + } catch (IOException ex) { + // What were they thinking... + } + + return a; + } + + /** + * Returns the time delta. + * + * @return the time delta + */ + public long getDelta() { + return delta; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof HumanTime)) { + return false; + } + return delta == ((HumanTime) obj).delta; + } + + /** + * Returns a 32-bit representation of the time delta. + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + return (int) (delta ^ (delta >> 32)); + } + + /** + * Returns a String representation of this. + *

+ * The output is identical to {@link #getExactly()}. + * + * @see java.lang.Object#toString() + * @see #getExactly() + * @return a String, never null + */ + @Override + public String toString() { + return getExactly(); + } + + /** + * Compares this HumanTime to another HumanTime. + * + * @param t + * the other instance, may not be null + * @return which one is greater + */ + @Override + public int compareTo(HumanTime t) { + return delta == t.delta ? 0 : (delta < t.delta ? -1 : 1); + } + + /** + * Deep-clones this object. + * + * @see java.lang.Object#clone() + * @throws CloneNotSupportedException + */ + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + /** + * @see java.io.Externalizable#readExternal(java.io.ObjectInput) + */ + @Override + public void readExternal(ObjectInput in) throws IOException { + delta = in.readLong(); + } + + /** + * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput) + */ + @Override + public void writeExternal(ObjectOutput out) throws IOException { + out.writeLong(delta); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/dom4j/XPathHelper.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/dom4j/XPathHelper.java new file mode 100644 index 0000000..107f166 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/dom4j/XPathHelper.java @@ -0,0 +1,50 @@ +package eu.dnetlib.miscutils.dom4j; // NOPMD + +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; + +import eu.dnetlib.miscutils.collections.TypeFilteredCollection; + +/** + * This class allows to avoid casts and unnecessary suppress warnings statements which would be necessary when using the dom4j API. + * + * @author marko + * + */ +public class XPathHelper { + public static Iterable selectElements(final Node base, final String xpath) { + @SuppressWarnings("unchecked") + final List children = base.selectNodes(xpath); + return new TypeFilteredCollection(children, Element.class); + } + + public static Iterable selectElements(final String base, final String xpath) { + Document document; + try { + document = new SAXReader().read(new StringReader(base)); + return selectElements(document, xpath); + } catch (DocumentException e) { + return new ArrayList(); + } + } + + public static Element selectElement(final Node base, final String xpath) { + for (Element el : selectElements(base, xpath)) + return el; + return null; + } + + public static Element selectElement(final String base, final String xpath) { + for (Element el : selectElements(base, xpath)) + return el; + return null; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/factory/Factory.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/factory/Factory.java new file mode 100644 index 0000000..f2be086 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/factory/Factory.java @@ -0,0 +1,17 @@ +package eu.dnetlib.miscutils.factory; + +/** + * Provides a common interface for factory objects. + * + * @author marko + * + * @param + */ +public interface Factory { + /** + * returns a new instance. + * + * @return + */ + T newInstance(); +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/CompositeUnaryFunction.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/CompositeUnaryFunction.java new file mode 100644 index 0000000..45461cb --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/CompositeUnaryFunction.java @@ -0,0 +1,38 @@ +package eu.dnetlib.miscutils.functional; + +public class CompositeUnaryFunction implements UnaryFunction { + + protected transient UnaryFunction function; + + public CompositeUnaryFunction(final UnaryFunction function) { + this.function = function; + } + + class UnaryHelper extends CompositeUnaryFunction { + + private transient final UnaryFunction comp; + private transient final UnaryFunction base; + + public UnaryHelper(final UnaryFunction base, final UnaryFunction comp) { + super(null); + + this.comp = comp; + this.base = base; + } + + @Override + public T evaluate(final X arg) { + return base.evaluate(comp.evaluate(arg)); + } + } + + public CompositeUnaryFunction of(UnaryFunction comp) { // NOPMD + return new UnaryHelper(this, comp); + } + + @Override + public T evaluate(final K arg) { + return function.evaluate(arg); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/Functional.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/Functional.java new file mode 100644 index 0000000..f09d574 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/Functional.java @@ -0,0 +1,34 @@ +package eu.dnetlib.miscutils.functional; + +import java.lang.reflect.Constructor; + +/** + * Functional helpers. + * + * @author marko + * + */ +public class Functional { + /** + * Given a class and a constructor type, return a unary function which invokes the constructor of that class. + * + * @param + * @param + * @param clazz + * @param argumentType + * @return + */ + static public UnaryFunction construct(final Class clazz, final Class argumentType) { + return new UnaryFunction() { + @Override + public A evaluate(final B arg) { + try { + final Constructor constructor = clazz.getConstructor(new Class[] { argumentType }); + return constructor.newInstance(arg); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + } + }; + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/IdentityFunction.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/IdentityFunction.java new file mode 100644 index 0000000..350393b --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/IdentityFunction.java @@ -0,0 +1,22 @@ +package eu.dnetlib.miscutils.functional; + +/** + * Identity function + * + * @author marko + * + * @param + */ +public class IdentityFunction implements UnaryFunction { + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.miscutils.functional.UnaryFunction#evaluate(java.lang.Object) + */ + @Override + public T evaluate(final T arg) { + return arg; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/ThreadSafeUnaryFunction.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/ThreadSafeUnaryFunction.java new file mode 100644 index 0000000..073eab2 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/ThreadSafeUnaryFunction.java @@ -0,0 +1,52 @@ +package eu.dnetlib.miscutils.functional; + +import eu.dnetlib.miscutils.factory.Factory; + + +/** + * ThreadSafeUnaryFunction maintains a ThreadLocal of a UnaryFunction and + * delegates the application to the thread local function. + * + * @author claudio + * + * @param + * @param + */ +public class ThreadSafeUnaryFunction implements UnaryFunction { + + /** + * ThreadLocal UnaryFunction + */ + private ThreadLocal> localFunction; + + /** + * Builds a new ThreadSafeUnaryFunction. + * @param localFunction + */ + public ThreadSafeUnaryFunction(ThreadLocal> localFunction) { + super(); + this.localFunction = localFunction; + } + + /** + * Builds a new ThreadSafeUnaryFunction. + * @param localFunction + */ + public ThreadSafeUnaryFunction(final Factory> functionFactory) { + super(); + this.localFunction = new ThreadLocal>() { + @Override + protected synchronized UnaryFunction initialValue() { + return functionFactory.newInstance(); + } + }; + } + + /** + * method applies the evaluation by invoking the ThreadLocal function. + */ + @Override + public T evaluate(K arg) { + return localFunction.get().evaluate(arg); + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/UnaryFunction.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/UnaryFunction.java new file mode 100644 index 0000000..63587f3 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/UnaryFunction.java @@ -0,0 +1,12 @@ +/** + * + */ +package eu.dnetlib.miscutils.functional; + +/** + * @author marko + * + */ +public interface UnaryFunction { + T evaluate(K arg); +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/hash/Hashing.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/hash/Hashing.java new file mode 100644 index 0000000..2ac2b1a --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/hash/Hashing.java @@ -0,0 +1,20 @@ +package eu.dnetlib.miscutils.functional.hash; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.digest.DigestUtils; + +public class Hashing { + + public static String md5(String s) { + return DigestUtils.md5Hex(s); + } + + public static String decodeBase64(String s) { + return new String(Base64.decodeBase64(s.getBytes())); + } + + public static String encodeBase64(String s) { + return new String(Base64.encodeBase64(s.getBytes())); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/EscapeHtml.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/EscapeHtml.java new file mode 100644 index 0000000..3c9ca1a --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/EscapeHtml.java @@ -0,0 +1,12 @@ +package eu.dnetlib.miscutils.functional.string; + + +import eu.dnetlib.miscutils.functional.UnaryFunction; +import org.apache.commons.lang3.StringEscapeUtils; + +public class EscapeHtml implements UnaryFunction { + @Override + public String evaluate(String arg) { + return StringEscapeUtils.escapeHtml4(arg); + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/EscapeXml.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/EscapeXml.java new file mode 100644 index 0000000..d509cbc --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/EscapeXml.java @@ -0,0 +1,10 @@ +package eu.dnetlib.miscutils.functional.string; +import eu.dnetlib.miscutils.functional.UnaryFunction; +import org.apache.commons.lang3.StringEscapeUtils; + +public class EscapeXml implements UnaryFunction { + @Override + public String evaluate(String arg) { + return StringEscapeUtils.escapeXml11(arg); + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/FastEscapeXml.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/FastEscapeXml.java new file mode 100644 index 0000000..9319cb8 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/FastEscapeXml.java @@ -0,0 +1,12 @@ +package eu.dnetlib.miscutils.functional.string; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +public class FastEscapeXml implements UnaryFunction { + + @Override + public String evaluate(String arg) { + return "", "]]]]>") + "]]>"; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/Sanitizer.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/Sanitizer.java new file mode 100644 index 0000000..4fa03f2 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/Sanitizer.java @@ -0,0 +1,23 @@ +package eu.dnetlib.miscutils.functional.string; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +/** + * Removes control characters from a string + * + * @author claudio + * + */ +public class Sanitizer implements UnaryFunction { + + @Override + public String evaluate(String s) { + return sanitize(s); + } + + + public static String sanitize(String s) { + return s.replaceAll("\\p{Cntrl}", ""); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/UnescapeHtml.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/UnescapeHtml.java new file mode 100644 index 0000000..07d9be4 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/string/UnescapeHtml.java @@ -0,0 +1,12 @@ +package eu.dnetlib.miscutils.functional.string; + +import eu.dnetlib.miscutils.functional.UnaryFunction; +import org.apache.commons.lang3.StringEscapeUtils; + +public class UnescapeHtml implements UnaryFunction { + + @Override + public String evaluate(final String arg) { + return StringEscapeUtils.unescapeHtml4(arg); + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/AbstractApplyXslt.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/AbstractApplyXslt.java new file mode 100644 index 0000000..6243d4b --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/AbstractApplyXslt.java @@ -0,0 +1,197 @@ +package eu.dnetlib.miscutils.functional.xml; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.Map; + +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.URIResolver; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +/** + * This function applies a stylesheet to something which can be transformed to a javax.xml.Source. + * + *

Subclasses are specialized and know how to transform K into a Source

+ * + * @author marko + * + * @param + */ +public abstract class AbstractApplyXslt implements UnaryFunction { + private static final String UNKNOWN_XSLT_NAME = "unknown xslt name"; + + private static final Log log = LogFactory.getLog(AbstractApplyXslt.class); // NOPMD by marko on 11/24/08 5:02 PM + + private Transformer transformer; + + /** + * optional, useful to keep track of xslt name for debugging purposes. + */ + private String xsltName; + + public AbstractApplyXslt(final Resource xslt) { + this(xslt, null); + } + + public AbstractApplyXslt(final Resource xslt, Map parameters) { + this(new StreamSource(getInputStream(xslt)), getFileName((ClassPathResource) xslt), parameters); + } + + public AbstractApplyXslt(final String xslt) { + this(xslt, UNKNOWN_XSLT_NAME); + } + + public AbstractApplyXslt(final String xslt, String name) { + this(xslt, name, null); + } + + public AbstractApplyXslt(final String xslt, String name, Map parameters) { + this(new StreamSource(new StringReader(xslt)), name, parameters); + } + + public AbstractApplyXslt(final Source xslt) { + this(xslt, UNKNOWN_XSLT_NAME); + } + + public AbstractApplyXslt(final Source xslt, String name) { + this(xslt, name, null); + } + + /** + * Base method for all the others. + * @param xslt + * @param name + * @param parameters + */ + public AbstractApplyXslt(final Source xslt, String name, Map parameters) { + try { + this.xsltName = name; + TransformerFactory factory = TransformerFactory.newInstance(); + if (! UNKNOWN_XSLT_NAME.equals(name)) + factory.setURIResolver(new ExternalResourceURIResolver(name.replaceFirst("[^/]+$", ""))); + transformer = factory.newTransformer(xslt); + if(parameters != null) + for(Map.Entry parameter : parameters.entrySet()) + transformer.setParameter(parameter.getKey(), parameter.getValue()); + + } catch (final Throwable e) { + log.error("Problems with transformer!\n" + xslt + "--" + name, e); + log.error(xsltDump(xslt)); + throw new IllegalStateException(e); + } + } + + /** + * This class contains the login enabling imports of peer external resources for the current xslt () + * The method resolve() first looks for the resource within the file system; if this fails, it looks in the classpath. + * @author Andrea Mannocci + * + */ + private class ExternalResourceURIResolver implements URIResolver { + private final String xsltBasePath; + + public ExternalResourceURIResolver(String xsltBasePath) { + this.xsltBasePath = xsltBasePath; + } + @Override + public Source resolve(String href, String base) throws TransformerException { + String externalResource = this.xsltBasePath + href; + try{ + log.debug("trying to load external resource from file system: " + externalResource); + return new StreamSource(new File(externalResource)); + } catch (final Throwable e) { + log.debug("trying to load external resource from file system: " + externalResource); + return new StreamSource(getInputStream(new ClassPathResource(externalResource))); + } + } + } + + private String xsltDump(Source xslt) { + Transformer transformer; + try { + transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + StringWriter outWriter = new StringWriter(); + Result result = new StreamResult(outWriter); + transformer.transform(xslt, result); + StringBuffer sb = outWriter.getBuffer(); + return sb.toString(); + } catch (TransformerConfigurationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (TransformerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return "error dumping the xslt"; + } + + @Override + public String evaluate(final K input) { + try { + final StringWriter output = new StringWriter(); + transformer.transform(toStream(input), new StreamResult(output)); + return output.toString(); + } catch (final TransformerException e) { + log.error("cannot transform record", e); + log.debug(input.toString()); + return ""; + } + } + + public abstract Source toStream(K input); + + public abstract String toString(K input); + + /** + * Used only to convert checked to unchecked exception. + * + * @param xslt + * @return + */ + private static InputStream getInputStream(final Resource xslt) { + try { + return xslt.getInputStream(); + } catch (final IOException e) { + throw new IllegalArgumentException(e); + } + } + + private static String getFileName(ClassPathResource xslt) { + return xslt.getPath(); + } + + public Transformer getTransformer() { + return transformer; + } + + public void setTransformer(final Transformer transformer) { + this.transformer = transformer; + } + + public String getXsltName() { + return xsltName; + } + + public void setXsltName(String xsltName) { + this.xsltName = xsltName; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXslt.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXslt.java new file mode 100644 index 0000000..6325eb6 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXslt.java @@ -0,0 +1,60 @@ +package eu.dnetlib.miscutils.functional.xml; + +import java.io.StringReader; +import java.util.Map; + +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; + +import org.springframework.core.io.Resource; + +/** + * Applies a stylesheet to a XML string and returns an XML string. + * + * @author marko + * + */ +public class ApplyXslt extends AbstractApplyXslt { + + public ApplyXslt(Resource xslt) { + super(xslt); + } + + public ApplyXslt(Source xslt, String name) { + super(xslt, name); + } + + public ApplyXslt(Source xslt) { + super(xslt); + } + + public ApplyXslt(String xslt, String name) { + super(xslt, name); + } + + public ApplyXslt(String xslt) { + super(xslt); + } + + public ApplyXslt(Resource xslt, Map parameters) { + super(xslt, parameters); + } + + public ApplyXslt(Source xslt, String name, Map parameters) { + super(xslt, name, parameters); + } + + public ApplyXslt(String xslt, String name, Map parameters) { + super(xslt, name, parameters); + } + + @Override + public Source toStream(String input) { + return new StreamSource(new StringReader(input)); + } + + @Override + public String toString(String input) { + return input; + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltDom.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltDom.java new file mode 100644 index 0000000..91fd8b5 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltDom.java @@ -0,0 +1,80 @@ +package eu.dnetlib.miscutils.functional.xml; + +import java.io.StringWriter; +import java.util.Map; + +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.springframework.core.io.Resource; +import org.w3c.dom.Node; + +/** + * Applies a stylesheet to a XML DOM and returns an XML string. + * + * @author marko + * + */ +public class ApplyXsltDom extends AbstractApplyXslt { + + public ApplyXsltDom(Resource xslt) { + super(xslt); + } + + public ApplyXsltDom(Source xslt, String name) { + super(xslt, name); + } + + public ApplyXsltDom(Source xslt) { + super(xslt); + } + + public ApplyXsltDom(String xslt, String name) { + super(xslt, name); + } + + public ApplyXsltDom(String xslt) { + super(xslt); + } + + public ApplyXsltDom(Resource xslt, Map parameters) { + super(xslt, parameters); + } + + public ApplyXsltDom(Source xslt, String name, Map parameters) { + super(xslt, name, parameters); + } + + public ApplyXsltDom(String xslt, String name, Map parameters) { + super(xslt, name, parameters); + } + + @Override + public Source toStream(Node input) { + return new DOMSource(input); + } + + @Override + public String toString(Node input) { + return nodeToString(input); + } + + private String nodeToString(Node node) { + StringWriter sw = new StringWriter(); + try { + Transformer t = TransformerFactory.newInstance().newTransformer(); + t.setOutputProperty(OutputKeys.INDENT, "yes"); + t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + t.transform(new DOMSource(node), new StreamResult(sw)); + } catch (TransformerException te) { + System.out.println("nodeToString Transformer Exception"); + } + return sw.toString(); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltDom4j.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltDom4j.java new file mode 100644 index 0000000..fdbb050 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltDom4j.java @@ -0,0 +1,61 @@ +package eu.dnetlib.miscutils.functional.xml; + +import java.util.Map; + +import javax.xml.transform.Source; + +import org.dom4j.Document; +import org.dom4j.io.DocumentSource; +import org.springframework.core.io.Resource; + +/** + * Applies a stylesheet to a XML DOM4j and returns an XML string. + * + * @author marko + * + */ +public class ApplyXsltDom4j extends AbstractApplyXslt { + + public ApplyXsltDom4j(Resource xslt) { + super(xslt); + } + + public ApplyXsltDom4j(Source xslt, String name) { + super(xslt, name); + } + + public ApplyXsltDom4j(Source xslt) { + super(xslt); + } + + public ApplyXsltDom4j(String xslt, String name) { + super(xslt, name); + } + + public ApplyXsltDom4j(String xslt) { + super(xslt); + } + + public ApplyXsltDom4j(Resource xslt, Map parameters) { + super(xslt, parameters); + } + + public ApplyXsltDom4j(Source xslt, String name, Map parameters) { + super(xslt, name, parameters); + } + + public ApplyXsltDom4j(String xslt, String name, Map parameters) { + super(xslt, name, parameters); + } + + @Override + public Source toStream(Document input) { + return new DocumentSource(input); + } + + @Override + public String toString(Document input) { + return input.asXML(); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/DnetXsltFunctions.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/DnetXsltFunctions.java new file mode 100644 index 0000000..0e99f10 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/DnetXsltFunctions.java @@ -0,0 +1,123 @@ +package eu.dnetlib.miscutils.functional.xml; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.google.common.base.Joiner; +import eu.dnetlib.miscutils.functional.hash.Hashing; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * This class provides some XSLT functions. + * + * ... + * + * @author michele + * + */ +public class DnetXsltFunctions { + + private static final Log log = LogFactory.getLog(DnetXsltFunctions.class); // NOPMD by marko on 11/24/08 5:02 PM + + private static volatile long seedUniquifier = 8682522807148012L; + + private static String[] dateFormats = { "yyyy-MM-dd", "yyyy/MM/dd" }; + + private static final String[] normalizeDateFormats = { "yyyy-MM-dd'T'hh:mm:ss", "yyyy-MM-dd", "yyyy/MM/dd", "yyyy" }; + + private static final String normalizeOutFormat = new String("yyyy-MM-dd'T'hh:mm:ss'Z'"); + + public static String extractYear(String s) throws ParseException { + Calendar c = new GregorianCalendar(); + for (String format : dateFormats) { + try { + c.setTime(new SimpleDateFormat(format).parse(s)); + String year = String.valueOf(c.get(Calendar.YEAR)); + return year; + } catch (ParseException e) {} + } + return ""; + } + + public static String normalizeDate(final String s, final boolean strict) { + + final String date = s != null ? s.trim() : ""; + + for (String format : normalizeDateFormats) { + try { + Date parse = new SimpleDateFormat(format).parse(date); + String res = new SimpleDateFormat(normalizeOutFormat).format(parse); + return res; + } catch (ParseException e) {} + } + if (strict) { + throw new IllegalArgumentException("unable to normalize date: " + date); + } else { + //log.warn("unable to normalize date: " + s); + return ""; + } + } + + public static String randomInt(int max) { + return String.valueOf(new Random(++seedUniquifier + System.nanoTime()).nextInt(max)); + } + + public static String md5(String s) { + return Hashing.md5(s); + } + + public static String decodeBase64(String s) { + return Hashing.decodeBase64(s); + } + + public static String encodeBase64(String s) { + return Hashing.encodeBase64(s); + } + + public static String lc(String s) { + return s.toLowerCase(); + } + + public static String uc(String s) { + return s.toUpperCase(); + } + + public static String decade(String s) { + String res = _decade(s.trim()); + log.debug(s + "--> " + res); + return res; + } + + private static String _decade(String s) { + Matcher m1 = Pattern.compile("(\\d\\d\\d)\\d").matcher(s); + if (m1.find()) { + String part = m1.group(1); + return part + "0-" + part + "9"; + } + Matcher m2 = Pattern.compile("(\\d)\\d").matcher(s); + if (m2.find()) { + String part = m2.group(1); + return "19" + part + "0-19" + part + "9"; + } + return "n/a"; + } + + public static String join(final String s1, final String separator, final String s2) { + if(StringUtils.isBlank(s1) || StringUtils.isBlank(s2)){ + return ""; + } + return Joiner.on(separator).join(s1, s2); + } + + public static String pickFirst(final String s1, final String s2) { + return StringUtils.isNotBlank(s1) ? s1 : StringUtils.isNotBlank(s2) ? s2 : ""; + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/IndentXmlString.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/IndentXmlString.java new file mode 100644 index 0000000..df62c36 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/IndentXmlString.java @@ -0,0 +1,133 @@ +package eu.dnetlib.miscutils.functional.xml; + +import java.io.*; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.*; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import com.sun.org.apache.xml.internal.serialize.OutputFormat; +import com.sun.org.apache.xml.internal.serialize.XMLSerializer; +import eu.dnetlib.miscutils.functional.UnaryFunction; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +/** + * The Class IndentXmlString. + */ +public class IndentXmlString implements UnaryFunction { + + /* + * (non-Javadoc) + * + * @see eu.dnetlib.miscutils.functional.UnaryFunction#evaluate(java.lang.Object) + */ + @Override + public String evaluate(final String unformattedXml) { + try { + return doIndent(unformattedXml); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Do indent. + * + * @param unformattedXml + * the unformatted xml + * @return the string + * @throws IOException + * Signals that an I/O exception has occurred. + */ + protected String doIndent(final String unformattedXml) throws IOException { + final Document document = parseXmlString(unformattedXml); + + OutputFormat format = new OutputFormat(document); + format.setIndenting(true); + format.setIndent(2); + Writer out = new StringWriter(); + XMLSerializer serializer = new XMLSerializer(out, format); + serializer.serialize(document); + + return out.toString(); + } + + /** + * Parses the xml string. + * + * @param in + * the in + * @return the document + */ + protected Document parseXmlString(final String in) { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setErrorHandler(null); + InputSource is = new InputSource(new StringReader(in)); + return db.parse(is); + } catch (ParserConfigurationException e) { + throw new RuntimeException(e); + } catch (SAXException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String doIndent(final Document document) throws TransformerException, UnsupportedEncodingException { + + final Transformer transformer = getTransformer(); + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + transformer.transform(new DOMSource(document), new StreamResult(out)); + + return out.toString("utf-8"); + } + + private Transformer getTransformer() throws TransformerConfigurationException { + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + return transformer; + } + + private Document doIndentDocument(final Document document) throws TransformerException, UnsupportedEncodingException { + + final Transformer transformer = getTransformer(); + + final DOMResult out = new DOMResult(); + transformer.transform(new DOMSource(document), out); + + return (Document) out.getNode(); + } + + /** + * Static helper Apply. + * + * @param xml + * the xml + * @return the indented xml string + */ + public static String apply(final String xml) { + return new IndentXmlString().evaluate(xml); + } + + /** + * Static helper Apply. + * + * @param xml + * the xml + * @return the indented xml string + */ + public static Document apply(final Document xml) throws TransformerException, UnsupportedEncodingException { + return new IndentXmlString().doIndentDocument(xml); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/SerializeXml.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/SerializeXml.java new file mode 100644 index 0000000..efa00bb --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/SerializeXml.java @@ -0,0 +1,45 @@ +package eu.dnetlib.miscutils.functional.xml; + +import java.io.StringWriter; + +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Node; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +public class SerializeXml implements UnaryFunction { + + Transformer transformer; + + public SerializeXml() { + try { + this.transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + } catch (TransformerConfigurationException e) { + throw new IllegalStateException(e); + } catch (TransformerFactoryConfigurationError e) { + throw new IllegalStateException(e); + } + } + + @Override + public String evaluate(Node arg) { + StreamResult result = new StreamResult(new StringWriter()); + DOMSource source = new DOMSource(arg); + try { + transformer.transform(source, result); + return result.getWriter().toString(); + } catch (TransformerException e) { + throw new IllegalStateException(e); + } + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/TryIndentXmlString.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/TryIndentXmlString.java new file mode 100644 index 0000000..86351c1 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/functional/xml/TryIndentXmlString.java @@ -0,0 +1,22 @@ +package eu.dnetlib.miscutils.functional.xml; + +/** + * The Class TryIndentXmlString. Tries to indent an xml string. If an error occurs (e.g. broken xml) it returns the original xml. + */ +public class TryIndentXmlString extends IndentXmlString { + + /* + * (non-Javadoc) + * + * @see eu.dnetlib.miscutils.functional.xml.IndentXmlString#evaluate(java.lang.String) + */ + @Override + public String evaluate(final String unformattedXml) { + try { + return doIndent(unformattedXml); + } catch (Exception e) { + return unformattedXml; + } + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/hstree/NilTreeNode.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/hstree/NilTreeNode.java new file mode 100644 index 0000000..3b6eb51 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/hstree/NilTreeNode.java @@ -0,0 +1,16 @@ +package eu.dnetlib.miscutils.hstree; + +/** + * This is the terminator node in a tree definition chain: + * + * TreeNode>> + * + * Note the use of "Void" as the next-resource-parameter value in the last level. + * + * + * @author marko + * + */ +abstract public class NilTreeNode extends TreeNode> { // NOPMD + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/hstree/TreeNode.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/hstree/TreeNode.java new file mode 100644 index 0000000..123ede0 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/hstree/TreeNode.java @@ -0,0 +1,252 @@ +package eu.dnetlib.miscutils.hstree; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * This class implement statically typed complete tree of finite depth. The type signature of each tree node determines + * fully the depth and the types of all the children. + * + *
+ * class MyTree extends TreeNode<RootPayload, L1Payload, TreeNode<L1Payload, L2Payload, TreeNode<L2Payload, Void, NilTreeNode>>> {
+ * 
+ * }
+ * 
+ * + * However since java doesn't have type inferencing we'll have to write often the full type of intermediate nodes, + * especially during tree construction. Thus it's recommended that you split the chain into a number of dummy classes, + * serving only to the purpuse of declaring the type chain: + * + *
+ * class MyTree extends TreeNode<RootPayload, L1Payload, L1Tree> {
+ * }
+ * 
+ * class L1Tree extends TreeNode<L1Payload, L2Payload, L2Tree> {
+ * }
+ * 
+ * class L2Tree extends TreeNode<L2Payload, Void, NilTreeNode> {
+ * }
+ * 
+ * + * NOTE: you could keep the whole definition inside a single file using inner classes. + * + * @author marko + * + * @param + * Type of the payload (or resource) + * @param + * Type of the next level payload + * @param + * Type of the next level node (another TreeNode) + */ +public class TreeNode> { + + public static final String CHILDR_UNDER_LEAF = "cannot create children under leaf nodes"; + + private static final Log log = LogFactory.getLog(TreeNode.class); // NOPMD by marko on 11/24/08 5:02 PM + + T resource; + List children = new ArrayList(); + transient Class childNodeType = autoChildNodeType(getClass()); + + /** + * Default constructor doesn't set the payload. This is used internally to construct a node. We cannot use the + * TreeNode(T resource) constructor only because it would force any implementor of "alias" subclasses + * of TreeNode to provide a dummy implementation of the constructor calling super(resource) + * + * However the constructor is protected because users should only create objects through addChild or in + * alternative they should provide they own constructor ovverrides. + */ + protected TreeNode() { + // no action + } + + /** + * However the constructor is protected because users should only create objects through addChild or in + * alternative they should provide they own constructor ovverrides. + * + * @param resource + * payload + */ + protected TreeNode(final T resource) { + this.resource = resource; + } + + /** + * Call this method to add a child node. + * + * Only the payload is needed, the tree node will be constructed automatically and it will be returned. + * + *
+	 * L1Child c1 = root.addChild(new L1Resource());
+	 * c1.addChild(new L2Resource());
+	 * c1.addChild(new L2Resource()).addChild(new L3Resource());
+	 * 
+ * + * @param resource + * payload + * @return the new node + */ + @SuppressWarnings("unchecked") + public C addChild(final N resource) { + try { + if (childNodeType.equals(NilTreeNode.class)) + throw new IllegalStateException(CHILDR_UNDER_LEAF); + + C test; + try { + test = childNodeType.newInstance(); + test.setResource(resource); + } catch (InstantiationException e) { + /* + * handle the situation when someone wants to create a one argument constructor hiding the default + * constructor provided by the base class. Nodes should normally be constructed using addChild but we + * don't want to force users to do it, and if they do it they shouldn't be punished with obscure + * InstantiationException caused by our evil usage of reflection. Of course we should do much more here + * in order to be more robust in the general case. + */ + try { + test = (C) childNodeType.getConstructors()[0].newInstance(resource); // NOPMD + } catch (InvocationTargetException e1) { + throw new IllegalStateException(e1); + } catch (InstantiationException e1) { + throw new IllegalStateException(e1); + } + } + + getChildren().add(test); + return test; + } catch (IllegalArgumentException e) { + throw new IllegalStateException(e); + } catch (SecurityException e) { + throw new IllegalStateException(e); + } catch (IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + + /** + * This method is especially useful for leaf nodes when you want to append several children to the same parent node, + * without having to declare a temporary variable to hold the parent node (which could have long and ugly type) + * + * @param resource + * @return the parent node + */ + public TreeNode appendChild(final N resource) { + addChild(resource); + return this; + } + + /** + * This method applies a visitor to all nodes in a breadth first fashon + * + * Currently null payloads are skipped + * + * @see Visitor + * @param visitor + */ + public void breadthFirst(final V visitor) { + final Queue> queue = new LinkedList>(); + + queue.add(this); + while (!queue.isEmpty()) { + final TreeNode current = queue.remove(); + log.info("visiting " + current); + current.accept(visitor); + queue.addAll(current.getChildren()); + } + + } + + /** + * depth first. + * + * Currently null payloads are skipped + * + * @see Visitor + * @param Visitor + */ + public void depthFirst(final V visitor) { + baseDepthFirst(visitor); + } + + public void baseDepthFirst(final V visitor) { + accept(visitor); + + for (C el : children) + el.baseDepthFirst(visitor); + } + + /** + * For the curious, this method takes care of retrieving the runtime type information for the tree node element + * declared for children nodes. + * + * Because of java type erasure, this is not strictly needed for making this kind of tree work, but it's needed if + * we want to enable people typing ugly long signatures and use type aliases as described in the class + * documentation; otherwise a cast exception would occur. + * + * Aargh, any serious language which permits type polymorphysm should have a type alias feature + * + * @param clazz + * the class object of this class + * @return the class object of the node element describing children + */ + @SuppressWarnings({ "unchecked", "rawtypes"}) + protected Class autoChildNodeType(final Class clazz) { + + final Type superType = clazz.getGenericSuperclass(); + + if (superType instanceof ParameterizedType) { + final ParameterizedType paramSuperType = (ParameterizedType) superType; + + int argumentIndex; + if (paramSuperType.getRawType() == TreeNode.class) + argumentIndex = 3; + else + argumentIndex = 2; + + + final Type argument = (paramSuperType).getActualTypeArguments()[argumentIndex]; + + return getRawType(argument); + } else { + return autoChildNodeType((Class) superType); + } + } + + @SuppressWarnings("unchecked") + protected X getRawType(final Type type) { + if (type instanceof ParameterizedType) + return (X) ((ParameterizedType) type).getRawType(); + return (X) type; + } + + public List getChildren() { + return children; + } + + public void setChildren(final List children) { + this.children = children; + } + + public T getResource() { + return resource; + } + + public void setResource(final T resource) { + this.resource = resource; + } + + public void accept(final V dummy) { + log.fatal("should be ovverriden"); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/IterableIterator.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/IterableIterator.java new file mode 100644 index 0000000..4c05cf4 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/IterableIterator.java @@ -0,0 +1,24 @@ +package eu.dnetlib.miscutils.iterators; + +import java.util.Iterator; + +/** + * Useful if you want to quickly iterate an iterable with the new java 5 syntax. + * + * @author marko + * + * @param + */ +public class IterableIterator implements Iterable { + private Iterator iter; + + public IterableIterator(Iterator iter) { + this.iter = iter; + } + + @Override + public Iterator iterator() { + return iter; + } +} + diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/IterablePair.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/IterablePair.java new file mode 100644 index 0000000..ab45ef7 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/IterablePair.java @@ -0,0 +1,21 @@ +package eu.dnetlib.miscutils.iterators; + +import java.util.Iterator; +import java.util.List; + +import eu.dnetlib.miscutils.collections.Pair; + +public class IterablePair implements Iterable> { + private final List
first; + private final List second; + + public IterablePair(List first, List second) { + this.first = first; + this.second = second; + } + + @Override + public Iterator> iterator() { + return new ParallelIterator(first.iterator(), second.iterator()); + } +} \ No newline at end of file diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/ParallelIterator.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/ParallelIterator.java new file mode 100644 index 0000000..bd05291 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/ParallelIterator.java @@ -0,0 +1,29 @@ +package eu.dnetlib.miscutils.iterators; + +import java.util.Iterator; + +import eu.dnetlib.miscutils.collections.Pair; + +public class ParallelIterator implements Iterator> { + + private final Iterator iA; + private final Iterator iB; + + public ParallelIterator(Iterator iA, Iterator iB) { + this.iA = iA; this.iB = iB; + } + + @Override + public boolean hasNext() { return iA.hasNext() && iB.hasNext(); } + + @Override + public Pair next() { + return new Pair(iA.next(), iB.next()); + } + + @Override + public void remove() { + iA.remove(); + iB.remove(); + } +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/xml/IterableXmlParser.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/xml/IterableXmlParser.java new file mode 100644 index 0000000..29a4bdb --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/xml/IterableXmlParser.java @@ -0,0 +1,29 @@ +package eu.dnetlib.miscutils.iterators.xml; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.Iterator; + +public class IterableXmlParser implements Iterable { + + private String element; + + private InputStream inputStream; + + public IterableXmlParser(String element, InputStream inputStream) { + this.element = element; + this.inputStream = inputStream; + } + + public IterableXmlParser(String element, String xml) { + this.element = element; + this.inputStream = new ByteArrayInputStream(xml.getBytes(Charset.forName(XMLIterator.UTF_8))); + } + + @Override + public Iterator iterator() { + return new XMLIterator(element, inputStream); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/xml/XMLIterator.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/xml/XMLIterator.java new file mode 100644 index 0000000..dc41973 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/iterators/xml/XMLIterator.java @@ -0,0 +1,170 @@ +package eu.dnetlib.miscutils.iterators.xml; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringWriter; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; +import java.util.Iterator; + +import javax.xml.stream.XMLEventFactory; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLEventWriter; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.StartElement; +import javax.xml.stream.events.XMLEvent; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class XMLIterator implements Iterator { + + private static final Log log = LogFactory.getLog(XMLIterator.class); + + private ThreadLocal inputFactory = new ThreadLocal() { + + @Override + protected XMLInputFactory initialValue() { + return XMLInputFactory.newInstance(); + } + }; + + private ThreadLocal outputFactory = new ThreadLocal() { + + @Override + protected XMLOutputFactory initialValue() { + return XMLOutputFactory.newInstance(); + } + }; + + private ThreadLocal eventFactory = new ThreadLocal() { + + @Override + protected XMLEventFactory initialValue() { + return XMLEventFactory.newInstance(); + } + }; + + public static final String UTF_8 = "UTF-8"; + + final XMLEventReader parser; + + private XMLEvent current = null; + + private String element; + + private InputStream inputStream; + + public XMLIterator(final String element, final InputStream inputStream) { + super(); + this.element = element; + this.inputStream = inputStream; + this.parser = getParser(); + try { + this.current = findElement(parser); + } catch (XMLStreamException e) { + log.warn("cannot init parser position. No element found: " + element); + current = null; + } + } + + @Override + public boolean hasNext() { + return current != null; + } + + @Override + public String next() { + String result = null; + try { + result = copy(parser); + current = findElement(parser); + return result; + } catch (XMLStreamException e) { + throw new RuntimeException(String.format("error copying xml, built so far: '%s'", result), e); + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("finally") + private String copy(final XMLEventReader parser) throws XMLStreamException { + final StringWriter result = new StringWriter(); + try { + final XMLEventWriter writer = outputFactory.get().createXMLEventWriter(result); + final StartElement start = current.asStartElement(); + final StartElement newRecord = eventFactory.get().createStartElement(start.getName(), start.getAttributes(), start.getNamespaces()); + + // new root record + writer.add(newRecord); + + // copy the rest as it is + while (parser.hasNext()) { + final XMLEvent event = parser.nextEvent(); + + // TODO: replace with depth tracking instead of close tag tracking. + if (event.isEndElement() && event.asEndElement().getName().getLocalPart().equals(element)) { + writer.add(event); + break; + } + + writer.add(event); + } + writer.close(); + } finally { + return result.toString(); + } + } + + /** + * Looks for the next occurrence of the splitter element. + * + * @param parser + * @return + * @throws XMLStreamException + */ + private XMLEvent findElement(final XMLEventReader parser) throws XMLStreamException { + + /* + * if (current != null && element.equals(current.asStartElement().getName().getLocalPart())) { return current; } + */ + + XMLEvent peek = parser.peek(); + if (peek != null && peek.isStartElement()) { + String name = peek.asStartElement().getName().getLocalPart(); + if (element.equals(name)) { return peek; } + } + + while (parser.hasNext()) { + final XMLEvent event = parser.nextEvent(); + if (event != null && event.isStartElement()) { + String name = event.asStartElement().getName().getLocalPart(); + if (element.equals(name)) { return event; } + } + } + return null; + } + + private XMLEventReader getParser() { + try { + return inputFactory.get().createXMLEventReader(sanitize(inputStream)); + } catch (XMLStreamException e) { + throw new RuntimeException(e); + } + } + + private Reader sanitize(final InputStream in) { + final CharsetDecoder charsetDecoder = Charset.forName(UTF_8).newDecoder(); + charsetDecoder.onMalformedInput(CodingErrorAction.REPLACE); + charsetDecoder.onUnmappableCharacter(CodingErrorAction.REPLACE); + return new InputStreamReader(in, charsetDecoder); + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/jaxb/JaxbFactory.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/jaxb/JaxbFactory.java new file mode 100644 index 0000000..0756fc7 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/jaxb/JaxbFactory.java @@ -0,0 +1,216 @@ +package eu.dnetlib.miscutils.jaxb; + +import java.io.StringReader; +import java.io.StringWriter; +import java.lang.annotation.Annotation; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.namespace.QName; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; + +/** + * Common base class for implementing the Jaxb ObjectFactory pattern. + * + * @author marko + * + * @param + * type of the roote element + */ +@XmlRegistry +public class JaxbFactory { + + /** + * jaxb context. + */ + private JAXBContext context; + + /** + * class for the root element handled by this factory. + */ + private Class clazz; + + /** + * Prevent instantiating with 0 arguments. + * + * @throws JAXBException + */ + protected JaxbFactory() throws JAXBException { + // prevent instantiation + } + + /** + * creates a new jaxb factory. + * + * This constructor is needed because spring constructor injection doesn't work well will varargs. + * + * @param clazz + * @throws JAXBException + */ + public JaxbFactory(final Class clazz) throws JAXBException { + this(clazz, new Class[] {}); + } + + /** + * creates a new jaxb factory. + * + * @param clazz + * class for the root element + * @param classes + * other classes + * @throws JAXBException + * could happen + */ + @SuppressWarnings("unchecked") + public JaxbFactory(final Class clazz, Class... classes) throws JAXBException { + Class[] all = new Class[classes.length + 1]; + for (int i = 0; i < classes.length; i++) + all[i + 1] = classes[i]; + all[0] = clazz; + + this.clazz = (Class) clazz; + context = JAXBContext.newInstance(all); + } + + /** + * Create a new T instance. + * + * @return new T instance + */ + public T newInstance() { + try { + return clazz.newInstance(); + } catch (InstantiationException e) { + throw new IllegalStateException("jaxb bean not instantiable, e"); + } catch (IllegalAccessException e) { + throw new IllegalStateException("jaxb bean not instantiable, e"); + } + } + + /** + * Parses a given string and creates a java object. + * + * @param value + * serialized representation + * @return java object + * @throws JAXBException + * could happen + */ + public T parse(final String value) throws JAXBException { + return parse(new StreamSource(new StringReader(value))); + } + + /** + * Parses a given source and creates a java object. + * + * @param source + * serialized representation + * @return java object + * @throws JAXBException + * could happen + */ + @SuppressWarnings("unchecked") + public T parse(final Source source) throws JAXBException { + final Unmarshaller unmarshaller = context.createUnmarshaller(); + return (T) unmarshaller.unmarshal(source); + } + + /** + * Serializes a java object to the xml representation. + * + * @param value + * java object + * @return xml string + * @throws JAXBException + * could happen + */ + public String serialize(final T value) throws JAXBException { + final Marshaller marshaller = context.createMarshaller(); + final StringWriter buffer = new StringWriter(); + marshaller.marshal(createElement(value), buffer); + return buffer.toString(); + } + + /** + * Serializes a java object to a xml sink. + * + * @param value + * java object + * @param result + * transform sink + * @throws JAXBException + * could happen + */ + public void serialize(final T value, final Result result) throws JAXBException { + final Marshaller marshaller = context.createMarshaller(); + marshaller.marshal(createElement(value), result); + } + + /** + * creates a jax element for a given java object. + * + * @param value + * java object + * @return jaxb element + */ + protected JAXBElement createElement(final T value) { + final XmlRootElement ann = findAnnotation(XmlRootElement.class, clazz); + return new JAXBElement(new QName(ann.namespace(), ann.name()), this.clazz, null, value); + } + + /** + * recursively searches a given annotation. + * + * @param + * annotation type + * @param annotation + * annotation to search + * @param clazz + * root of the class hierarchy. + * @return annotation + */ + private X findAnnotation(final Class annotation, final Class clazz) { + if (clazz == null) + return null; + + final X ann = clazz.getAnnotation(annotation); + if (ann != null) + return ann; + + for (Class iface : clazz.getInterfaces()) { + final X iann = findAnnotation(annotation, iface); + if (iann != null) + return iann; + } + + final X parent = findAnnotation(annotation, clazz.getSuperclass()); + if (parent != null) + return parent; + + return null; + } + + public JAXBContext getContext() { + return context; + } + + public void setContext(final JAXBContext context) { + this.context = context; + } + + public Class getClazz() { + return clazz; + } + + public void setClazz(final Class clazz) { + this.clazz = clazz; + } + +} diff --git a/dnet-core-components/src/main/java/eu/dnetlib/miscutils/maps/ConcurrentSizedMap.java b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/maps/ConcurrentSizedMap.java new file mode 100644 index 0000000..da4fd65 --- /dev/null +++ b/dnet-core-components/src/main/java/eu/dnetlib/miscutils/maps/ConcurrentSizedMap.java @@ -0,0 +1,53 @@ +package eu.dnetlib.miscutils.maps; + +import java.util.Queue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; + +/** + * + * @author claudio + * + * @param + * @param + */ +public class ConcurrentSizedMap extends ConcurrentHashMap { + + private static final long serialVersionUID = 5864196164431521782L; + + public int DEFAULT_SIZE = 4; + + private int queueSize; + + private Queue queue; + + public ConcurrentSizedMap() { + super(); + queue = new ConcurrentLinkedQueue(); + this.queueSize = DEFAULT_SIZE; + } + + @Override + public V put(K key, V value) { + queue.add(key); + if (queue.size() > queueSize) + super.remove(queue.poll()); + + return super.put(key, value); + } + + @Override + public V remove(Object key) { + queue.remove(key); + return super.remove(key); + } + + public void setQueueSize(int queueSize) { + this.queueSize = queueSize; + } + + public int getQueueSize() { + return queueSize; + } + +} diff --git a/dnet-core-components/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory b/dnet-core-components/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory new file mode 100644 index 0000000..b53ca85 --- /dev/null +++ b/dnet-core-components/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory @@ -0,0 +1 @@ +net.sf.saxon.TransformerFactoryImpl \ No newline at end of file diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/AffixCollectionTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/AffixCollectionTest.java new file mode 100644 index 0000000..55f73fe --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/AffixCollectionTest.java @@ -0,0 +1,22 @@ +package eu.dnetlib.miscutils.collections; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +public class AffixCollectionTest { + + @Test + public void testIterator() { + final List list = new ArrayList(); + list.add("100"); + + final AffixCollection mapped = new AffixCollection(list, "_test"); + for (String el : mapped) + assertEquals("check array", "100_test", el); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/BloomFilterTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/BloomFilterTest.java new file mode 100644 index 0000000..6c7e221 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/BloomFilterTest.java @@ -0,0 +1,491 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package eu.dnetlib.miscutils.collections; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +import org.junit.Test; + +/** + * Tests for BloomFilter.java + * + * @author Magnus Skjegstad + */ +public class BloomFilterTest { + static Random r = new Random(); + + @Test + public void testConstructorCNK() throws Exception { + System.out.println("BloomFilter(c,n,k)"); + + for (int i = 0; i < 10000; i++) { + double c = r.nextInt(20) + 1; + int n = r.nextInt(10000) + 1; + int k = r.nextInt(20) + 1; + BloomFilter bf = new BloomFilter(c, n, k); + assertEquals(bf.getK(), k); + assertEquals(bf.getExpectedBitsPerElement(), c, 0); + assertEquals(bf.getExpectedNumberOfElements(), n); + assertEquals(bf.size(), c*n, 0); + } + } + + + /** + * Test of createHash method, of class BloomFilter. + * @throws Exception + */ + @Test + public void testCreateHash_String() throws Exception { + System.out.println("createHash"); + String val = UUID.randomUUID().toString(); + int result1 = BloomFilter.createHash(val); + int result2 = BloomFilter.createHash(val); + assertEquals(result2, result1); + int result3 = BloomFilter.createHash(UUID.randomUUID().toString()); + assertNotSame(result3, result2); + + int result4 = BloomFilter.createHash(val.getBytes("UTF-8")); + assertEquals(result4, result1); + } + + /** + * Test of createHash method, of class BloomFilter. + * @throws UnsupportedEncodingException + */ + @Test + public void testCreateHash_byteArr() throws UnsupportedEncodingException { + System.out.println("createHash"); + String val = UUID.randomUUID().toString(); + byte[] data = val.getBytes("UTF-8"); + int result1 = BloomFilter.createHash(data); + int result2 = BloomFilter.createHash(val); + assertEquals(result1, result2); + } + + /** + * Test of createHash method, of class BloomFilter. + * @throws UnsupportedEncodingException + */ + @Test + public void testCreateHashes_byteArr() throws UnsupportedEncodingException { + System.out.println("createHashes"); + String val = UUID.randomUUID().toString(); + byte[] data = val.getBytes("UTF-8"); + int[] result1 = BloomFilter.createHashes(data, 10); + int[] result2 = BloomFilter.createHashes(data, 10); + assertEquals(result1.length, 10); + assertEquals(result2.length, 10); + assertArrayEquals(result1, result2); + int[] result3 = BloomFilter.createHashes(data, 5); + assertEquals(result3.length, 5); + for (int i = 0; i < result3.length; i++) + assertEquals(result3[i], result1[i]); + + } + + /** + * Test of equals method, of class BloomFilter. + * @throws UnsupportedEncodingException + */ + @Test + public void testEquals() throws UnsupportedEncodingException { + System.out.println("equals"); + BloomFilter instance1 = new BloomFilter(1000, 100); + BloomFilter instance2 = new BloomFilter(1000, 100); + + for (int i = 0; i < 100; i++) { + String val = UUID.randomUUID().toString(); + instance1.add(val); + instance2.add(val); + } + + assert(instance1.equals(instance2)); + assert(instance2.equals(instance1)); + + instance1.add("Another entry"); // make instance1 and instance2 different before clearing + + instance1.clear(); + instance2.clear(); + + assert(instance1.equals(instance2)); + assert(instance2.equals(instance1)); + + for (int i = 0; i < 100; i++) { + String val = UUID.randomUUID().toString(); + instance1.add(val); + instance2.add(val); + } + + assertTrue(instance1.equals(instance2)); + assertTrue(instance2.equals(instance1)); + } + + /** + * Test of hashCode method, of class BloomFilter. + * @throws UnsupportedEncodingException + */ + @Test + public void testHashCode() throws UnsupportedEncodingException { + System.out.println("hashCode"); + + BloomFilter instance1 = new BloomFilter(1000, 100); + BloomFilter instance2 = new BloomFilter(1000, 100); + + assertTrue(instance1.hashCode() == instance2.hashCode()); + + for (int i = 0; i < 100; i++) { + String val = UUID.randomUUID().toString(); + instance1.add(val); + instance2.add(val); + } + + assertTrue(instance1.hashCode() == instance2.hashCode()); + + instance1.clear(); + instance2.clear(); + + assertTrue(instance1.hashCode() == instance2.hashCode()); + + instance1 = new BloomFilter(100, 10); + instance2 = new BloomFilter(100, 9); + assertFalse(instance1.hashCode() == instance2.hashCode()); + + instance1 = new BloomFilter(100, 10); + instance2 = new BloomFilter(99, 9); + assertFalse(instance1.hashCode() == instance2.hashCode()); + + instance1 = new BloomFilter(100, 10); + instance2 = new BloomFilter(50, 10); + assertFalse(instance1.hashCode() == instance2.hashCode()); + } + + /** + * Test of expectedFalsePositiveProbability method, of class BloomFilter. + */ + @Test + public void testExpectedFalsePositiveProbability() { + // These probabilities are taken from the bloom filter probability table at + // http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html + System.out.println("expectedFalsePositiveProbability"); + BloomFilter instance = new BloomFilter(1000, 100); + double expResult = 0.00819; // m/n=10, k=7 + double result = instance.expectedFalsePositiveProbability(); + assertEquals(instance.getK(), 7); + assertEquals(expResult, result, 0.000009); + + instance = new BloomFilter(100, 10); + expResult = 0.00819; // m/n=10, k=7 + result = instance.expectedFalsePositiveProbability(); + assertEquals(instance.getK(), 7); + assertEquals(expResult, result, 0.000009); + + instance = new BloomFilter(20, 10); + expResult = 0.393; // m/n=2, k=1 + result = instance.expectedFalsePositiveProbability(); + assertEquals(1, instance.getK()); + assertEquals(expResult, result, 0.0005); + + instance = new BloomFilter(110, 10); + expResult = 0.00509; // m/n=11, k=8 + result = instance.expectedFalsePositiveProbability(); + assertEquals(8, instance.getK()); + assertEquals(expResult, result, 0.00001); + } + + /** + * Test of clear method, of class BloomFilter. + */ + @Test + public void testClear() { + System.out.println("clear"); + BloomFilter instance = new BloomFilter(1000, 100); + for (int i = 0; i < instance.size(); i++) + instance.setBit(i, true); + instance.clear(); + for (int i = 0; i < instance.size(); i++) + assertSame(instance.getBit(i), false); + } + + /** + * Test of add method, of class BloomFilter. + * @throws Exception + */ + @Test + public void testAdd() throws Exception { + System.out.println("add"); + BloomFilter instance = new BloomFilter(1000, 100); + + for (int i = 0; i < 100; i++) { + String val = UUID.randomUUID().toString(); + instance.add(val); + assert(instance.contains(val)); + } + } + + /** + * Test of addAll method, of class BloomFilter. + * @throws Exception + */ + @Test + public void testAddAll() throws Exception { + System.out.println("addAll"); + List v = new ArrayList(); + BloomFilter instance = new BloomFilter(1000, 100); + + for (int i = 0; i < 100; i++) + v.add(UUID.randomUUID().toString()); + + instance.addAll(v); + + for (int i = 0; i < 100; i++) + assert(instance.contains(v.get(i))); + } + + /** + * Test of contains method, of class BloomFilter. + * @throws Exception + */ + @Test + public void testContains() throws Exception { + System.out.println("contains"); + BloomFilter instance = new BloomFilter(10000, 10); + + for (int i = 0; i < 10; i++) { + instance.add(Integer.toBinaryString(i)); + assert(instance.contains(Integer.toBinaryString(i))); + } + + assertFalse(instance.contains(UUID.randomUUID().toString())); + } + + /** + * Test of containsAll method, of class BloomFilter. + * @throws Exception + */ + @Test + public void testContainsAll() throws Exception { + System.out.println("containsAll"); + List v = new ArrayList(); + BloomFilter instance = new BloomFilter(1000, 100); + + for (int i = 0; i < 100; i++) { + v.add(UUID.randomUUID().toString()); + instance.add(v.get(i)); + } + + assert(instance.containsAll(v)); + } + + /** + * Test of getBit method, of class BloomFilter. + */ + @Test + public void testGetBit() { + System.out.println("getBit"); + BloomFilter instance = new BloomFilter(1000, 100); + Random r = new Random(); + + for (int i = 0; i < 100; i++) { + boolean b = r.nextBoolean(); + instance.setBit(i, b); + assertSame(instance.getBit(i), b); + } + } + + /** + * Test of setBit method, of class BloomFilter. + */ + @Test + public void testSetBit() { + System.out.println("setBit"); + + BloomFilter instance = new BloomFilter(1000, 100); + + for (int i = 0; i < 100; i++) { + instance.setBit(i, true); + assertSame(instance.getBit(i), true); + } + + for (int i = 0; i < 100; i++) { + instance.setBit(i, false); + assertSame(instance.getBit(i), false); + } + } + + /** + * Test of size method, of class BloomFilter. + */ + @Test + public void testSize() { + System.out.println("size"); + for (int i = 100; i < 1000; i++) { + BloomFilter instance = new BloomFilter(i, 10); + assertEquals(instance.size(), i); + } + } + + /** Test error rate * + * @throws UnsupportedEncodingException + */ + @Test + public void testFalsePositiveRate1() throws UnsupportedEncodingException { + // Numbers are from // http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html + System.out.println("falsePositiveRate1"); + + for (int j = 10; j < 21; j++) { + System.out.print(j-9 + "/11"); + List v = new ArrayList(); + BloomFilter instance = new BloomFilter(100*j,100); + + for (int i = 0; i < 100; i++) { + byte[] bytes = new byte[100]; + r.nextBytes(bytes); + v.add(bytes); + } + instance.addAll(v); + + long f = 0; + double tests = 300000; + for (int i = 0; i < tests; i++) { + byte[] bytes = new byte[100]; + r.nextBytes(bytes); + if (instance.contains(bytes)) { + if (!v.contains(bytes)) { + f++; + } + } + } + + double ratio = f / tests; + + System.out.println(" - got " + ratio + ", math says " + instance.expectedFalsePositiveProbability()); + assertEquals(instance.expectedFalsePositiveProbability(), ratio, 0.01); + } + } + + /** Test for correct k **/ + @Test + public void testGetK() { + // Numbers are from http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html + System.out.println("testGetK"); + BloomFilter instance = null; + + instance = new BloomFilter(2, 1); + assertEquals(1, instance.getK()); + + instance = new BloomFilter(3, 1); + assertEquals(2, instance.getK()); + + instance = new BloomFilter(4, 1); + assertEquals(3, instance.getK()); + + instance = new BloomFilter(5, 1); + assertEquals(3, instance.getK()); + + instance = new BloomFilter(6, 1); + assertEquals(4, instance.getK()); + + instance = new BloomFilter(7, 1); + assertEquals(5, instance.getK()); + + instance = new BloomFilter(8, 1); + assertEquals(6, instance.getK()); + + instance = new BloomFilter(9, 1); + assertEquals(6, instance.getK()); + + instance = new BloomFilter(10, 1); + assertEquals(7, instance.getK()); + + instance = new BloomFilter(11, 1); + assertEquals(8, instance.getK()); + + instance = new BloomFilter(12, 1); + assertEquals(8, instance.getK()); + } + + /** + * Test of contains method, of class BloomFilter. + */ + @Test + public void testContains_GenericType() { + System.out.println("contains"); + int items = 100; + BloomFilter instance = new BloomFilter(0.01, items); + + for (int i = 0; i < items; i++) { + String s = UUID.randomUUID().toString(); + instance.add(s); + assertTrue(instance.contains(s)); + } + } + + /** + * Test of contains method, of class BloomFilter. + */ + @Test + public void testContains_byteArr() { + System.out.println("contains"); + + int items = 100; + BloomFilter instance = new BloomFilter(0.01, items); + + for (int i = 0; i < items; i++) { + byte[] bytes = new byte[500]; + r.nextBytes(bytes); + instance.add(bytes); + assertTrue(instance.contains(bytes)); + } + } + + /** + * Test of count method, of class BloomFilter. + */ + @Test + public void testCount() { + System.out.println("count"); + int expResult = 100; + BloomFilter instance = new BloomFilter(0.01, expResult); + for (int i = 0; i < expResult; i++) { + byte[] bytes = new byte[100]; + r.nextBytes(bytes); + instance.add(bytes); + } + int result = instance.count(); + assertEquals(expResult, result); + + instance = new BloomFilter(0.01, expResult); + for (int i = 0; i < expResult; i++) { + instance.add(UUID.randomUUID().toString()); + } + result = instance.count(); + assertEquals(expResult, result); + } + + +} \ No newline at end of file diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/FilteredCollectionTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/FilteredCollectionTest.java new file mode 100644 index 0000000..33339cb --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/FilteredCollectionTest.java @@ -0,0 +1,47 @@ +package eu.dnetlib.miscutils.collections; + +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import eu.dnetlib.miscutils.functional.CompositeUnaryFunction; +import eu.dnetlib.miscutils.functional.UnaryFunction; + +public class FilteredCollectionTest { + + @Test + public void testFilterComposition() { + final List list = new ArrayList(); + list.add(1); + list.add(4); + list.add(8); + + final Filter fi1 = new Filter() { // NOPMD + @Override + public Boolean evaluate(final Integer arg) { + return arg < 8; + } + }; + + final UnaryFunction square = new UnaryFunction() { + @Override + public Integer evaluate(final Integer arg) { + return arg * arg; + } + }; + + final FilteredCollection fic = new FilteredCollection(list, fi1); + for (Integer el : fic) + assertTrue("check array", el < 8); + + final CompositeUnaryFunction cf1 = new CompositeUnaryFunction(fi1); + final FilteredCollection fc2 = new FilteredCollection(list, cf1.of(square)); + for (Integer el : fc2) + assertTrue("check array", el < 8); + + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/MappedCollectionTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/MappedCollectionTest.java new file mode 100644 index 0000000..d206c88 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/MappedCollectionTest.java @@ -0,0 +1,29 @@ +package eu.dnetlib.miscutils.collections; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +public class MappedCollectionTest { + + @Test + public void testIterator() { + final List list = new ArrayList(); + list.add(100); + + final MappedCollection mapped = new MappedCollection(list, new UnaryFunction() { //NOPMD + @Override + public String evaluate(final Integer arg) { + return arg.toString(); + } + }); + for (String el : mapped) + assertEquals("check array", el, "100"); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/TypeFilteredCollectionTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/TypeFilteredCollectionTest.java new file mode 100644 index 0000000..8353b2d --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/collections/TypeFilteredCollectionTest.java @@ -0,0 +1,69 @@ +package eu.dnetlib.miscutils.collections; + +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; +import org.junit.Test; + +import static org.junit.Assert.*; // NOPMD + + +public class TypeFilteredCollectionTest { + + private void checkContainsTestString(final Iterable iter) { + int count = 0; // NOPMD + for (String el : iter) { + assertEquals("check array", el, "test"); + count++; // NOPMD + } + assertEquals("check count", count, 1); + } + + @Test + public void testFilter() { + final List list = new ArrayList(); + list.add(1); + list.add("test"); + + final TypeFilteredCollection tfc; + tfc = new TypeFilteredCollection(list, String.class); + checkContainsTestString(tfc); + } + + @Test + public void testNull() { + final List list = new ArrayList(); + assertNotNull("dummy", list); + + list.add(null); + list.add("test"); + + final TypeFilteredCollection tfc; + tfc = new TypeFilteredCollection(list, String.class); + checkContainsTestString(tfc); + } + + @Test + public void testJDom() throws DocumentException { + final String xmlSource = "xxxxxxxx"; + + final Document document = new SAXReader().read(new StringReader(xmlSource)); + + @SuppressWarnings("unchecked") + final List children = document.selectNodes("//child"); + + final TypeFilteredCollection tfc; + tfc = new TypeFilteredCollection(children, Element.class); + for (Element el : tfc) { + assertEquals("check array", el.asXML(), ""); + } + + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/datetime/DateUtilsTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/datetime/DateUtilsTest.java new file mode 100644 index 0000000..1b12596 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/datetime/DateUtilsTest.java @@ -0,0 +1,40 @@ +package eu.dnetlib.miscutils.datetime; + +import java.text.ParseException; +import java.util.Date; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class DateUtilsTest { + + private final DateUtils dateUtils = new DateUtils(); + + @Test + public void testGetDuration() { + String theDate = "1900-01-01T00:13:57"; + String duration = dateUtils.getDuration(theDate); + assertEquals("00:13:57", duration); + } + + @Test + public void getISOdateTimeFromLong(){ + Long dateLong = Long.parseLong("1520531435465"); + String iso = DateUtils.calculate_ISO8601(dateLong); + System.out.println(iso); + } + + + @Test + public void test1() throws ParseException { + String fromDate = "2019-04-11"; + Date date = org.apache.commons.lang3.time.DateUtils.parseDate( + fromDate, + new String[] { "yyyy-MM-dd", "yyyy-MM-dd'T'HH:mm:ssXXX", "yyyy-MM-dd'T'HH:mm:ss.SSSX", "yyyy-MM-dd'T'HH:mm:ssZ", + "yyyy-MM-dd'T'HH:mm:ss.SX" }); + long timestamp = date.toInstant().toEpochMilli(); + System.out.println(timestamp); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/dom4j/XPathHelperTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/dom4j/XPathHelperTest.java new file mode 100644 index 0000000..b21e3bf --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/dom4j/XPathHelperTest.java @@ -0,0 +1,38 @@ +/** + * + */ +package eu.dnetlib.miscutils.dom4j; + +import static org.junit.Assert.assertEquals; + +import java.io.StringReader; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.junit.Test; + +/** + * @author marko + * + */ +public class XPathHelperTest { + + /** + * Test method for {@link eu.dnetlib.miscutils.dom4j.XPathHelper#selectElements(org.dom4j.Node, java.lang.String)}. + * + * @throws DocumentException + */ + @Test + public void testSelectElements() throws DocumentException { + final String xmlSource = "xxxxxxxx"; + + final Document document = new SAXReader().read(new StringReader(xmlSource)); + + for (Element el : XPathHelper.selectElements(document, "//child")) { + assertEquals("check elements", el.asXML(), ""); + } + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/CompositeUnaryFunctionTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/CompositeUnaryFunctionTest.java new file mode 100644 index 0000000..76e83d6 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/CompositeUnaryFunctionTest.java @@ -0,0 +1,86 @@ +package eu.dnetlib.miscutils.functional; + +import static org.junit.Assert.*; // NOPMD + +import org.junit.Test; + +public class CompositeUnaryFunctionTest { + + @Test + public void testOf() { + final UnaryFunction toStringBase = new UnaryFunction() { // NOPMD + @Override + public String evaluate(final Integer arg) { + return arg.toString(); + } + }; + + final UnaryFunction fromStringBase = new UnaryFunction() { + @Override + public Integer evaluate(final String arg) { + return Integer.decode(arg); + } + }; + + final CompositeUnaryFunction toString = new CompositeUnaryFunction(toStringBase); + final CompositeUnaryFunction fromString = new CompositeUnaryFunction(fromStringBase); + + assertEquals("evaluation", toString.evaluate(10), "10"); + assertEquals("evaluation", fromString.evaluate("10"), (Integer) 10); + + final UnaryFunction stringIdentity = toString.of(fromString); + final UnaryFunction integerIdentity = fromString.of(toString); + final UnaryFunction integerIdentity2 = fromString.of(stringIdentity).of(toString).of(integerIdentity); + + assertEquals("string evaluation", stringIdentity.evaluate("10"), "10"); + assertEquals("integer evaluation", integerIdentity.evaluate(10), (Integer) 10); + assertEquals("integer identity", integerIdentity2.evaluate(10), (Integer) 10); + } + + private transient int calls; + private transient final static int TIMES = 100; + + @Test + public void testRecursive() { + calls = 0; + final UnaryFunction incrementBase = new UnaryFunction() { // NOPMD + @Override + public Integer evaluate(final Integer arg) { + calls++; + return arg + 1; + } + }; + + final CompositeUnaryFunction increment = new CompositeUnaryFunction(incrementBase); + + CompositeUnaryFunction comp = increment; + for (int i = 1; i <= 100; i++) { + assertEquals("compare", comp.evaluate(0), (Integer) i); + comp = comp.of(increment); + } + + assertEquals("number of calls", calls, (TIMES * (TIMES + 1) / 2)); + } + + @Test + public void testCurry() { + final UnaryFunction, Integer> add = new UnaryFunction, Integer>() { // NOPMD + @Override + public UnaryFunction evaluate(final Integer arg) { + return new UnaryFunction() { + @Override + public Integer evaluate(final Integer brg) { + return arg + brg; + } + }; + + } + }; + + final UnaryFunction increment = add.evaluate(1); + + assertEquals("check add", add.evaluate(1).evaluate(2), (Integer) 3); + assertEquals("check increment", increment.evaluate(1), (Integer) 2); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/ThreadSafeUnaryFunctionTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/ThreadSafeUnaryFunctionTest.java new file mode 100644 index 0000000..6a4a000 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/ThreadSafeUnaryFunctionTest.java @@ -0,0 +1,58 @@ +package eu.dnetlib.miscutils.functional; + +import static org.junit.Assert.*; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.junit.Before; +import org.junit.Test; + +import eu.dnetlib.miscutils.functional.ThreadSafeUnaryFunction; +import eu.dnetlib.miscutils.functional.UnaryFunction; + +public class ThreadSafeUnaryFunctionTest { + + /** + * Object under test. + */ + private ThreadSafeUnaryFunction tsUnaryFunction; + + private final static int N_THREAD = 10; + + private ExecutorService executor; + + @Before + public void setUp() { + executor = Executors.newFixedThreadPool(N_THREAD); + } + + /** + * method creates N_THREAD threads such that each one performs a function.evaluate call + * @param function + */ + private void createThreads(final ThreadSafeUnaryFunction function) { + for (int i = 0; i < N_THREAD; i++) { + final Integer j = i; + executor.execute(new Runnable() { + + @Override + public void run() { + assertEquals(String.valueOf(j), function.evaluate(j)); + } + }); + } + } + + @Test + public void testThreadSafeUnaryFunction_1() { + tsUnaryFunction = new ThreadSafeUnaryFunction(new ThreadLocal>() { + @Override + protected synchronized UnaryFunction initialValue() { + return new UnsafeUnaryFunction(); + } + }); + createThreads(tsUnaryFunction); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/UnsafeUnaryFunction.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/UnsafeUnaryFunction.java new file mode 100644 index 0000000..8be2aa4 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/UnsafeUnaryFunction.java @@ -0,0 +1,10 @@ +package eu.dnetlib.miscutils.functional; + +import eu.dnetlib.miscutils.functional.UnaryFunction; + +public class UnsafeUnaryFunction implements UnaryFunction { + @Override + public String evaluate(Integer arg) { + return String.valueOf(arg); + } +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/string/EscapeUnescapeTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/string/EscapeUnescapeTest.java new file mode 100644 index 0000000..b2e4d9e --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/string/EscapeUnescapeTest.java @@ -0,0 +1,34 @@ +package eu.dnetlib.miscutils.functional.string; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; + +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +public class EscapeUnescapeTest { + + @Test + public void testEscape() throws IOException { + String xml = getRecord(); + System.out.println(xml); + System.out.println("##############"); + String escaped = new EscapeHtml().evaluate(xml); + System.out.println(escaped); + + String unescaped = new UnescapeHtml().evaluate(escaped); + System.out.println("##############"); + System.out.println(unescaped); + + } + + private String getRecord() throws IOException { + InputStream is = getClass().getResourceAsStream("record.xml"); + StringWriter sw = new StringWriter(); + IOUtils.copy(is, sw); + + return sw.toString(); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/string/SanitizerTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/string/SanitizerTest.java new file mode 100644 index 0000000..7e10847 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/string/SanitizerTest.java @@ -0,0 +1,43 @@ +package eu.dnetlib.miscutils.functional.string; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import java.io.StringWriter; + +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +public class SanitizerTest { + + @Test + public void testIdentity() { + verifyIdentity("+-@°#()!$%&/()?' "); + verifyIdentity("asça"); + verifyIdentity("qwéèrtç°§"); + verifyIdentity("AÁaáCĆcćEÉeéIÍiíLĹlĺNŃnńOÓoóRŔrŕSŚsśUÚuúYÝyýZŹzź"); + verifyIdentity("AÂaâCĈcĉEÊeêGĜgĝHĤhĥIÎiîJĴjĵOÔoôSŜsŝUÛuûWŴwŵYŶyŷ"); + verifyIdentity("CÇcçGĢgģKĶkķLĻlļNŅnņRŖrŗSŞsşTŢtţ"); + verifyIdentity("ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΆΈΉΊΌΎΏΪΫαβγδεζηθικλμνξοπρσςτυφχψωάέήίόύώΐΰ"); + verifyIdentity("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"); + verifyIdentity("абвгдеёжзийклмнопрстуфхцчшщъыьэюя"); + verifyIdentity("ـآ آ ـا ا بـبـب ب تـتـت ت ثـثـث ث جـجـج ج حـحـح ح خـخـخ خ ـد د ـذ ذ ـر ر ـز ز سـسـس س"); + } + + @Test + public void testInvalid() throws Exception { + StringWriter sw = new StringWriter(); + + IOUtils.copy(getClass().getResourceAsStream("invalid.txt"), sw); + + String pre = sw.toString(); + String post = Sanitizer.sanitize(pre); + + assertFalse(pre.equals(post)); + } + + private void verifyIdentity(String s) { + assertEquals(s, Sanitizer.sanitize(s)); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltTest.java new file mode 100644 index 0000000..7c86b5b --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/ApplyXsltTest.java @@ -0,0 +1,41 @@ +package eu.dnetlib.miscutils.functional.xml; + +import static org.junit.Assert.*; + +import java.io.IOException; + +import javax.xml.transform.TransformerFactory; + +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnit44Runner; +import org.springframework.core.io.ClassPathResource; + +@RunWith(MockitoJUnit44Runner.class) +public class ApplyXsltTest { + + TransformerFactory tf = TransformerFactory.newInstance(); + + private static final Class transformerClass = net.sf.saxon.TransformerFactoryImpl.class; + + @Test + public void testTransformerFactoryType() { + assertEquals(tf.getClass(), transformerClass); + } + + @Test + public void applyXslt() throws IOException { + String record = IOUtils.toString((new ClassPathResource("/eu/dnetlib/miscutils/functional/xml/sampleRecord.xml")).getInputStream()); + String layout = IOUtils.toString((new ClassPathResource("/eu/dnetlib/miscutils/functional/xml/sampleIndexLayout.xml")).getInputStream()); + String indexXsltOfXslt = IOUtils.toString((new ClassPathResource("/eu/dnetlib/miscutils/functional/xml/layoutToRecordStylesheet.xsl")).getInputStream()); + ApplyXslt applyXslt = new ApplyXslt(IOUtils.toString((new ClassPathResource("/eu/dnetlib/miscutils/functional/xml/recordStylesheet.xsl")).getInputStream())); + ApplyXslt xslt1 = new ApplyXslt(indexXsltOfXslt); + String indexXslt = xslt1.evaluate(layout); + ApplyXslt xslt2 = new ApplyXslt(indexXslt); + String response = xslt2.evaluate(record); + System.out.println(response); + + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/IndentXmlStringTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/IndentXmlStringTest.java new file mode 100644 index 0000000..43d8a8c --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/IndentXmlStringTest.java @@ -0,0 +1,19 @@ +package eu.dnetlib.miscutils.functional.xml; + +import org.junit.Before; +import org.junit.Test; + +public class IndentXmlStringTest { + + @Before + public void setUp() throws Exception { + + } + + @Test + public void testEvaluate() { + String indented = new IndentXmlString().evaluate(""); + System.out.println(indented); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/dnetFunctionsTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/dnetFunctionsTest.java new file mode 100644 index 0000000..67b98ec --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/functional/xml/dnetFunctionsTest.java @@ -0,0 +1,107 @@ +package eu.dnetlib.miscutils.functional.xml; + +import static org.junit.Assert.assertEquals; + +import java.io.StringReader; +import java.io.StringWriter; + +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.dom4j.Document; +import org.dom4j.io.SAXReader; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnit44Runner; + +@RunWith(MockitoJUnit44Runner.class) +public class dnetFunctionsTest { + + private static final String XSLT = + "" + + "" + + "" + + " " + + " " + + " " + + " " + + "" + + ""; + + private Transformer transformer; + + @Before + public void setUp() { + try { + transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new StringReader(XSLT))); + } catch (Exception e) { + System.out.println("**** INITIALIZATION FAILED ****"); + } + } + + @Test + public void testDecade_1() throws Exception { + assertEquals("1980-1989", process("primi anni 80", "decade")); + } + + @Test + public void testDecade_2() throws Exception { + assertEquals("2000-2009", process("04-05-2007", "decade")); + } + + @Test + public void testDecade_3() throws Exception { + assertEquals("1960-1969", process("1964", "decade")); + } + + @Test + public void testDecade_4() throws Exception { + assertEquals("n/a", process("XXXXXXXXXXXX", "decade")); + } + + @Test + public void testDecade_5() throws Exception { + assertEquals("1880-1889", process(" 1887-01-01 ", "decade")); + } + + @Test + public void testDecade_6() throws Exception { + assertEquals("1880-1889", process("\n\n 1887-01-01 \n\n", "decade")); + } + + @Test + public void testDecade_7() throws Exception { + assertEquals("1840-1849", process(" 1840-03-05 ", "decade")); + } + + @Test + public void testYear_1() throws Exception { + assertEquals("1840", process("1840-03-05", "year")); + } + + @Test + public void testYear_2() throws Exception { + assertEquals("1840", process("1840/03/05", "year")); + } + + private String process(String s, String attr) throws Exception { + String xml = "" + s + ""; + + StringWriter strw = new StringWriter(); + transformer.transform(new StreamSource(new StringReader(xml)), new StreamResult(strw)); + + Document document = (new SAXReader()).read(new StringReader((strw.toString()))); + + System.out.println(document.asXML()); + + String res = document.valueOf("/OUTS/OUTPUT/@" + attr); + + System.out.println(s + " --> " + res); + + return res; + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/TreeNodeTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/TreeNodeTest.java new file mode 100644 index 0000000..6a06a62 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/TreeNodeTest.java @@ -0,0 +1,63 @@ +package eu.dnetlib.miscutils.hstree; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; + +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SampleResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; +import eu.dnetlib.miscutils.hstree.sample.tree.FirstChild; +import eu.dnetlib.miscutils.hstree.sample.tree.MyTreeNode; +import eu.dnetlib.miscutils.hstree.sample.tree.RootTree; + +public class TreeNodeTest { + + private static final String EXISTS = "exists"; + + /** + * This test simply shows how to create a statically checked tree. The tree grammar for this test is defined in + * package eu.rinfrastructures.genericstest.sample.tree and it contains resource payloads defined in package + * eu.rinfrastructures.genericstest.sample.resources + */ + @Test + public void simpleTest() { + final MyTreeNode root = new RootTree(new SampleResource()); + + final FirstChild ch1 = root.addChild(new ChildResource()); + assertNotNull(EXISTS, ch1); + + ch1.addChild(new SubResource()); + ch1.addChild(new SubResource()); + + final FirstChild ch2 = root.addChild(new ChildResource()); + assertNotNull(EXISTS, ch2); + + ch2.addChild(new SubResource()); + ch2.addChild(new SubResource()); + ch2.addChild(new SubResource()); + + } + + @Test + public void typeSafeness() { + final MyTreeNode root = new RootTree(new SampleResource()); + + final FirstChild ch1 = root.addChild(new ChildResource()); + assertNotNull(EXISTS, ch1); + + ch1.addChild(new SubResource()); + + // ILLEGAL: + //c1.addChild(new SampleResource()); + } + + @Test + public void cascade() { + final MyTreeNode root = new RootTree(new SampleResource()); + assertNotNull(EXISTS, root); + + root.addChild(new ChildResource()).appendChild(new SubResource()).appendChild(new SubResource()).addChild(new SubResource()); + + } +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/VisitorTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/VisitorTest.java new file mode 100644 index 0000000..bbeb0ac --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/VisitorTest.java @@ -0,0 +1,90 @@ +package eu.dnetlib.miscutils.hstree; + +import static org.junit.Assert.*; // NOPMD + +import org.junit.Before; +import org.junit.Test; + +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SampleResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; +import eu.dnetlib.miscutils.hstree.sample.tree.FirstChild; +import eu.dnetlib.miscutils.hstree.sample.tree.MyComputingVisitor; +import eu.dnetlib.miscutils.hstree.sample.tree.MyLoggingVisitor; +import eu.dnetlib.miscutils.hstree.sample.tree.MyTreeNode; +import eu.dnetlib.miscutils.hstree.sample.tree.MyTreeVisitor; +import eu.dnetlib.miscutils.hstree.sample.tree.RootTree; + +public class VisitorTest { + + transient RootTree root = null; + transient MyTreeVisitor loggingVisitor = null; + transient MyComputingVisitor computingVisitor = null; + + @Before + public void setUp() throws Exception { + root = new RootTree(new SampleResource()); + + root.addChild(new ChildResource()).appendChild(new SubResource()).appendChild(new SubResource()).addChild(new SubResource()); + + loggingVisitor = new MyLoggingVisitor(); + computingVisitor = new MyComputingVisitor(); + } + + @Test + public void testVisit() { + final MyTreeNode root = new RootTree(new SampleResource()); + assertNotNull("exists", root); + + final FirstChild ch1 = root.addChild(new ChildResource()); + ch1.addChild(new SubResource()); + ch1.addChild(new SubResource()); + + final FirstChild ch2 = root.addChild(new ChildResource()); + ch2.addChild(new SubResource()); + ch2.addChild(new SubResource()); + ch2.addChild(new SubResource()); + + root.breadthFirst(loggingVisitor); + } + + @Test + public void testVisit2() { + final MyTreeNode root = new RootTree(new SampleResource()); + assertNotNull("exists", root); + + root.addChild(new ChildResource()).appendChild(new SubResource()).appendChild(new SubResource()).addChild(new SubResource()); + root.appendChild(new ChildResource()).appendChild(new ChildResource()).appendChild(new ChildResource()).addChild(new ChildResource()).addChild( + new SubResource()); + + root.breadthFirst(loggingVisitor); + } + + @Test + public void testVisit3() { + final MyTreeNode root = new RootTree(new SampleResource()); + assertNotNull("exists", root); + + root.addChild(new ChildResource()).appendChild(new SubResource()).appendChild(new SubResource()).addChild(new SubResource()); + root.appendChild(new ChildResource()).appendChild(new ChildResource()).appendChild(new ChildResource()).addChild(new ChildResource()).addChild( + new SubResource()); + + root.depthFirst(loggingVisitor); + } + + @Test + public void testMyVisitor() { + assertNotNull("dummy", root); + + root.accept(loggingVisitor); + root.getChildren().get(0).accept(loggingVisitor); + } + + @Test + public void testComputingVisitor() { + assertNotNull("dummy", root); + + root.breadthFirst(computingVisitor); + assertEquals("check count", 113, computingVisitor.getCount()); + } +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/WrongTreeNodeTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/WrongTreeNodeTest.java new file mode 100644 index 0000000..5cc409b --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/WrongTreeNodeTest.java @@ -0,0 +1,44 @@ +package eu.dnetlib.miscutils.hstree; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SampleResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; +import eu.dnetlib.miscutils.hstree.sample.wrongtree.WrongFirstChild; +import eu.dnetlib.miscutils.hstree.sample.wrongtree.WrongRootTree; +import eu.dnetlib.miscutils.hstree.sample.wrongtree.WrongSecondChild; + +public class WrongTreeNodeTest { + + /** + * Try to break/misalign the signatures of the 'sample.wrongtree' package. The code should not be able to compile. + */ + @Test + public void simpleTest() { + final WrongRootTree root = new WrongRootTree(new SampleResource()); + + final WrongFirstChild ch1 = root.addChild(new ChildResource()); + ch1.addChild(new SubResource()); + ch1.addChild(new SubResource()); + + final WrongFirstChild ch2 = root.addChild(new ChildResource()); + ch2.addChild(new SubResource()); + ch2.addChild(new SubResource()); + final WrongSecondChild sc1 = ch2.addChild(new SubResource()); + + // of course we can do obscene things like this, + // but if somebody casts there is no escape. + boolean gotRuntimeEx = false; // NOPMD + try { + sc1.addChild((Void) null); + } catch (RuntimeException e) { + if (e.getMessage().equals(TreeNode.CHILDR_UNDER_LEAF)) + gotRuntimeEx = true; + } + assertTrue("got exception", gotRuntimeEx); // TODO: exploit junit4 for checking exceptions + + } +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/ChildResource.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/ChildResource.java new file mode 100644 index 0000000..255879c --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/ChildResource.java @@ -0,0 +1,5 @@ +package eu.dnetlib.miscutils.hstree.sample.resources; + +public class ChildResource extends Resource { // NOPMD + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/Resource.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/Resource.java new file mode 100644 index 0000000..9127039 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/Resource.java @@ -0,0 +1,5 @@ +package eu.dnetlib.miscutils.hstree.sample.resources; + +public class Resource { // NOPMD + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/SampleResource.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/SampleResource.java new file mode 100644 index 0000000..35edf3f --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/SampleResource.java @@ -0,0 +1,5 @@ +package eu.dnetlib.miscutils.hstree.sample.resources; + +public class SampleResource extends Resource { // NOPMD + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/SubResource.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/SubResource.java new file mode 100644 index 0000000..a4fd642 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/resources/SubResource.java @@ -0,0 +1,5 @@ +package eu.dnetlib.miscutils.hstree.sample.resources; + +public class SubResource extends Resource { // NOPMD + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/FirstChild.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/FirstChild.java new file mode 100644 index 0000000..261505e --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/FirstChild.java @@ -0,0 +1,12 @@ +package eu.dnetlib.miscutils.hstree.sample.tree; + +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; + +public class FirstChild extends MyTreeNode { + @Override + public void accept(final MyTreeVisitor visitor) { + visitor.visit(getResource()); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyComputingVisitor.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyComputingVisitor.java new file mode 100644 index 0000000..f77f05d --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyComputingVisitor.java @@ -0,0 +1,41 @@ +package eu.dnetlib.miscutils.hstree.sample.tree; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SampleResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; + +public class MyComputingVisitor implements MyTreeVisitor { + private static final Log log = LogFactory.getLog(MyComputingVisitor.class); // NOPMD by marko on 11/24/08 5:02 PM + + int count; + + @Override + public void visit(final SampleResource resource) { + log.info("increasing sampleresource"); + count += 100; + } + + @Override + public void visit(final ChildResource resource) { + log.info("increasing childresource"); + count += 10; + } + + @Override + public void visit(final SubResource resource) { + log.info("increasing subresource"); + count += 1; + } + + public int getCount() { + return count; + } + + public void setCount(final int count) { + this.count = count; + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyLoggingVisitor.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyLoggingVisitor.java new file mode 100644 index 0000000..b2ab8a5 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyLoggingVisitor.java @@ -0,0 +1,49 @@ +package eu.dnetlib.miscutils.hstree.sample.tree; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SampleResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; + +public class MyLoggingVisitor implements MyTreeVisitor { + private static final Log log = LogFactory.getLog(MyLoggingVisitor.class); // NOPMD by marko on 11/24/08 5:02 PM + + /* + * (non-Javadoc) + * + * @see + * eu.rinfrastructures.genericstest.sample.wrongtree.MyTreeVisitor#visit(eu.rinfrastructures.genericstest.sample + * .resources.SampleResource) + */ + @Override + public void visit(final SampleResource resource) { + log.info("sample"); + } + + /* + * (non-Javadoc) + * + * @see + * eu.rinfrastructures.genericstest.sample.wrongtree.MyTreeVisitor#visit(eu.rinfrastructures.genericstest.sample + * .resources.ChildResource) + */ + @Override + public void visit(final ChildResource resource) { + log.info("child"); + } + + /* + * (non-Javadoc) + * + * @see + * eu.rinfrastructures.genericstest.sample.wrongtree.MyTreeVisitor#visit(eu.rinfrastructures.genericstest.sample + * .resources.SubResource) + */ + @Override + public void visit(final SubResource resource) { + log.info("sub"); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyTreeNode.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyTreeNode.java new file mode 100644 index 0000000..f94ae95 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyTreeNode.java @@ -0,0 +1,14 @@ +package eu.dnetlib.miscutils.hstree.sample.tree; + +import eu.dnetlib.miscutils.hstree.TreeNode; + +public class MyTreeNode> extends TreeNode { + + public MyTreeNode() { + // no action + } + + public MyTreeNode(final T resource) { + super(resource); + } +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyTreeVisitor.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyTreeVisitor.java new file mode 100644 index 0000000..6a1e20c --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/MyTreeVisitor.java @@ -0,0 +1,15 @@ +package eu.dnetlib.miscutils.hstree.sample.tree; + +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SampleResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; + +public interface MyTreeVisitor { + + void visit(SampleResource resource); + + void visit(ChildResource resource); + + void visit(SubResource resource); + +} \ No newline at end of file diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/RootTree.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/RootTree.java new file mode 100644 index 0000000..5bb734e --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/RootTree.java @@ -0,0 +1,16 @@ +package eu.dnetlib.miscutils.hstree.sample.tree; + +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SampleResource; + +public class RootTree extends MyTreeNode { + + public RootTree(final SampleResource resource) { + super(resource); + } + + @Override + public void accept(final MyTreeVisitor visitor) { + visitor.visit(getResource()); + } +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/SecondChild.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/SecondChild.java new file mode 100644 index 0000000..aaa298f --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/tree/SecondChild.java @@ -0,0 +1,12 @@ +package eu.dnetlib.miscutils.hstree.sample.tree; + +import eu.dnetlib.miscutils.hstree.NilTreeNode; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; + +public class SecondChild extends MyTreeNode> { + @Override + public void accept(final MyTreeVisitor visitor) { + visitor.visit(getResource()); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongFirstChild.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongFirstChild.java new file mode 100644 index 0000000..9895a53 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongFirstChild.java @@ -0,0 +1,10 @@ +package eu.dnetlib.miscutils.hstree.sample.wrongtree; + +import eu.dnetlib.miscutils.hstree.TreeNode; +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; +import eu.dnetlib.miscutils.hstree.sample.tree.MyLoggingVisitor; + +public class WrongFirstChild extends TreeNode { // NOPMD + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongRootTree.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongRootTree.java new file mode 100644 index 0000000..bf46930 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongRootTree.java @@ -0,0 +1,14 @@ +package eu.dnetlib.miscutils.hstree.sample.wrongtree; + +import eu.dnetlib.miscutils.hstree.TreeNode; +import eu.dnetlib.miscutils.hstree.sample.resources.ChildResource; +import eu.dnetlib.miscutils.hstree.sample.resources.SampleResource; +import eu.dnetlib.miscutils.hstree.sample.tree.MyLoggingVisitor; + +public class WrongRootTree extends TreeNode { + + public WrongRootTree(final SampleResource resource) { + super(resource); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongSecondChild.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongSecondChild.java new file mode 100644 index 0000000..34362eb --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/hstree/sample/wrongtree/WrongSecondChild.java @@ -0,0 +1,10 @@ +package eu.dnetlib.miscutils.hstree.sample.wrongtree; + +import eu.dnetlib.miscutils.hstree.NilTreeNode; +import eu.dnetlib.miscutils.hstree.TreeNode; +import eu.dnetlib.miscutils.hstree.sample.resources.SubResource; +import eu.dnetlib.miscutils.hstree.sample.tree.MyLoggingVisitor; + +public class WrongSecondChild extends TreeNode> { // NOPMD + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/iterators/xml/IterableXmlParserTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/iterators/xml/IterableXmlParserTest.java new file mode 100644 index 0000000..4e4e777 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/iterators/xml/IterableXmlParserTest.java @@ -0,0 +1,113 @@ +package eu.dnetlib.miscutils.iterators.xml; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.zip.GZIPInputStream; +import java.util.zip.ZipInputStream; + +import org.apache.commons.io.IOUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.io.SAXReader; +import org.junit.Before; +import org.junit.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +public class IterableXmlParserTest { + + private Resource xmlZip = new ClassPathResource("eu/dnetlib/miscutils/iterators/xml/opendoar.zip"); + + private Resource xmlGz = new ClassPathResource("eu/dnetlib/miscutils/iterators/xml/opendoar.xml.gz"); + + private Resource xmlZipErr = new ClassPathResource("eu/dnetlib/miscutils/iterators/xml/opendoarErr.zip"); + + private Resource xmlSingle = new ClassPathResource("eu/dnetlib/miscutils/iterators/xml/singleRepo.xml"); + + private String element = "repository"; + + private IterableXmlParser parser; + + private SAXReader reader; + + @Before + public void setUp() throws Exception { + reader = new SAXReader(); + } + + @Test + public void testGz() throws Exception { + doTest(new GZIPInputStream(xmlGz.getInputStream()), element); + } + + @Test + public void test() throws Exception { + doTest(read(new ZipInputStream(xmlZip.getInputStream())), element); + } + + @Test + public void testErr() throws Exception { + doTest(read(new ZipInputStream(xmlZipErr.getInputStream())), element); + } + + @Test + public void testSingle() throws Exception { + doTest(xmlSingle.getInputStream(), element); + } + + @Test + public void testOaiRecord() throws Exception { + int count = doTest(new ClassPathResource("eu/dnetlib/miscutils/iterators/xml/oaiRecord.xml").getInputStream(), "record"); + assertTrue(count == 1); + } + + @Test + public void testWeird() throws Exception { + int count = doTest(new ClassPathResource("eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml").getInputStream(), "record"); + assertTrue(count == 3); + } + + @Test + public void testWeirdGz() throws Exception { + int count = doTest(new GZIPInputStream(new ClassPathResource("eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml.gz").getInputStream()), "record"); + assertTrue(count == 3); + } + + private int doTest(final InputStream stream, final String element) throws DocumentException { + parser = new IterableXmlParser(element, stream); + int count = 0; + for (String xml : parser) { + System.out.println(xml); + Document doc = reader.read(new StringReader(xml)); + assertNotNull(doc); + assertNotNull(doc.selectSingleNode("//" + element)); + count++; + } + return count; + } + + // helper method, reads the compressed text out of the xmlZip file + private InputStream read(final ZipInputStream zis) throws IOException { + + final StringWriter sw = new StringWriter(); + while (zis.getNextEntry() != null) { + + byte[] buffer = new byte[1]; + + while (zis.read(buffer) != -1) { + IOUtils.write(buffer, sw, "UTF-8"); + } + } + zis.close(); + sw.close(); + + return new ByteArrayInputStream(sw.toString().getBytes()); + } + +} diff --git a/dnet-core-components/src/test/java/eu/dnetlib/miscutils/maps/ConcurrentSizedMapTest.java b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/maps/ConcurrentSizedMapTest.java new file mode 100644 index 0000000..1265588 --- /dev/null +++ b/dnet-core-components/src/test/java/eu/dnetlib/miscutils/maps/ConcurrentSizedMapTest.java @@ -0,0 +1,44 @@ +package eu.dnetlib.miscutils.maps; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import org.junit.Before; +import org.junit.Test; + +import eu.dnetlib.miscutils.maps.ConcurrentSizedMap; + +public class ConcurrentSizedMapTest { + + private ConcurrentSizedMap map; + + private int size = 2; + + @Before + public void setUp() throws Exception { + map = new ConcurrentSizedMap(); + map.setQueueSize(size); + } + + @Test + public void testMap() throws InterruptedException { + + map.put("a", "value a"); + assertNotNull((map.get("a"))); + + map.put("b", "value b"); + assertNotNull((map.get("b"))); + + map.put("c", "value c"); + assertNotNull((map.get("c"))); + assertEquals(size, map.size()); + + assertNull(map.get("a")); + map.put("a", "new value a"); + + assertEquals("new value a", map.get("a")); + assertEquals(size, map.size()); + } + +} diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/encoding/testSource.xml b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/encoding/testSource.xml new file mode 100644 index 0000000..47b0cec --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/encoding/testSource.xml @@ -0,0 +1 @@ +
http://localhost:8090/app/services/resultSet
rs-a1028c6a-bdab-4dbd-b6d1-d97e997bcbf0ns1:ResultSetServicens2:ResultSetServiceServicedevelopment
\ No newline at end of file diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/string/invalid.txt b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/string/invalid.txt new file mode 100644 index 0000000..6078ccd --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/string/invalid.txt @@ -0,0 +1,2 @@ +Experimental electron densities were determined from high-resolution X-ray diffraction data sets measured with synchrotron radiation at 100 K, +whereas theoretical calculations were performed using DFT methods at the B3LYP-311++G(3df,3pd) level of approximation. diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/string/record.xml b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/string/record.xml new file mode 100644 index 0000000..051934a --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/string/record.xml @@ -0,0 +1,46 @@ + + +
+ od_______908::92a0e1241032a6c3817c9e248ad570ee + d2b15e4e-6596-4add-a0d9-865fa6152c9c_TURTdG9yZURTUmVzb3VyY2VzL01EU3RvcmVEU1Jlc291cmNlVHlwZQ==::oai:europepmc.org:2701111 + 2013-07-17T18:30:00Z + + + 4fd8cd43-226c-408b-8401-0840456a678a_UmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU= + jcbfm + pmc-open + od_______908 +
+ + + TIMP-1 attenuates blood–brain barrier permeability in mice with acute liver failure + Chen, Feng + Radisky, Evette S + Das, Pritam + Batra, Jyotica + Hata, Toshiyuki + Hori, Tomohide + Baine, Ann-Marie T + Gardner, Lindsay + Yue, Mei Y + Bu, Guojun + del Zoppo, Gregory + Patel, Tushar C + Nguyen, Justin H + Original Article + Blood–brain barrier (BBB) dysfunction in acute liver failure (ALF) results in increased BBB permeability that often precludes the patients from obtaining a life-saving liver transplantation. It remains controversial whether matrix metalloproteinase-9 (MMP-9) from the injured liver contributes to the deregulation of BBB function in ALF. We selectively upregulated a physiologic inhibitor of MMP-9 (TIMP-1) with a single intracerebroventricular injection of TIMP-1 cDNA plasmids at 48 and 72 hours, or with pegylated-TIMP-1 protein. Acute liver failure was induced with tumor necrosis factor-α and 𝒟-(+)-galactosamine in mice. Permeability of BBB was assessed with sodium fluorescein (NaF) extravasation. We found a significant increase in TIMP-1 within the central nervous system (CNS) after the administration of TIMP-1 cDNA plasmids and that increased TIMP-1 within the CNS resulted in an attenuation of BBB permeability, a reduction in activation of epidermal growth factor receptor and p38 mitogen-activated protein kinase signals, and a restoration of the tight junction protein occludin in mice with experimental ALF. Pegylated TIMP-1 provided similar protection against BBB permeability in mice with ALF. Our results provided a proof of principle that MMP-9 contributes to the BBB dysfunction in ALF and suggests a potential therapeutic role of TIMP-1 in ALF. + Nature Publishing Group + http://europepmc.org/articles/PMC3705430/ + Text + en + + PMC: PMC3705430 + 2013 + doi: 10.1038/jcbfm.2013.45 + + +
\ No newline at end of file diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/layoutToRecordStylesheet.xsl b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/layoutToRecordStylesheet.xsl new file mode 100644 index 0000000..1d4d8fb --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/layoutToRecordStylesheet.xsl @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + . + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/recordStylesheet.xsl b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/recordStylesheet.xsl new file mode 100644 index 0000000..653370b --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/recordStylesheet.xsl @@ -0,0 +1,109 @@ + + + + EMF + + + + + + + + + + + <xsl:value-of select="."/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + +
+
+
+
diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/sampleIndexLayout.xml b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/sampleIndexLayout.xml new file mode 100644 index 0000000..1952d46 --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/sampleIndexLayout.xml @@ -0,0 +1,42 @@ + + +
+ + + + + +
+ + + EMF + Eagle Metadata Format + cleaned + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/sampleRecord.xml b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/sampleRecord.xml new file mode 100644 index 0000000..1551220 --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/functional/xml/sampleRecord.xml @@ -0,0 +1,87 @@ + +
+ 367b05cf-13f6-4d3a-8c2d-9fd172b353ce_UmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU=::http://irt.kcl.ac.uk/irt2009/IRT001.html_artifact + 2014-03-19T11:41:15+01:00 + + 367b05cf-13f6-4d3a-8c2d-9fd172b353ce_UmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU= + +
+ + + artifact::BSR::f85e57d02d6efd679ce5a7a689c7960b + http://irt.kcl.ac.uk/irt2009/IRT001.html + + 2014-02-12 + PML + + + Creative Commons licence Attribution UK 2.0 + (http://creativecommons.org/licenses/by/2.0/uk/). + All reuse or distribution of this work must contain somewhere a link back to the URL + http://irt.kcl.ac.uk/ + + + Reference to Apollo (?) + Fragment from the lower part of a small, white + marble + panel ( + 0.09 + 0.14 + 0.02 + ; no edges + surviving, but there is a space after 1. 3); re-used at a later date for an + inscription cut in third century capitals, of which the letters [...]TT[...] alone survive. + Artifact + + Inscription + panel + white + marble + + + + + + + + Second to early third centuries A.D. (lettering) + + + Tripolitania + Sabratha: Capitolium + + + + + + + Libya + Marsa + Zawaghah + + + + + + + ###refersTrismegistosCard0### + + + + + + + + Rustic capitals: line 1, 0.05; line 2, 0.04; line 3, 0.03. + + 0 + 0 + + visual::BSR::f85e57d02d6efd679ce5a7a689c7960b::1 + ###relTranslationObj### + transcription::BSR::f85e57d02d6efd679ce5a7a689c7960b + + + + +
\ No newline at end of file diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/oaiRecord.xml b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/oaiRecord.xml new file mode 100644 index 0000000..1894ea9 --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/oaiRecord.xml @@ -0,0 +1,36 @@ + + + + + webcrawl____::6469a2bd0de26af9612c1869d19edd18 + webcrawl____::6469a2bd0de26af9612c1869d19edd18 + + + webcrawl____ + + + Independent Associations of Glucose Status and Arterial + Stiffness With Left Ventricular Diastolic Dysfunction An 8-year + follow-up of the Hoorn Study + 2012-01-01 + AMER DIABETES ASSOC + eng + DIABETES CARE + + + + + 10.2337/dc11-1336 + webcrawl____::6469a2bd0de26af9612c1869d19edd18 + CLOSED + 0001 + + http://dx.doi.org/10.2337/dc11-1336 + + + \ No newline at end of file diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/opendoar.xml.gz b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/opendoar.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..4ad43fb8e7e5accc70131a56e9bb729a7cb49639 GIT binary patch literal 372557 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%0AV$)l>q!O?)Ga*%h?fpP8GpphV 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 ReC*v{{y&j^I#YOnMgUD<)q?;4 literal 0 HcmV?d00001 diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/singleRepo.xml b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/singleRepo.xml new file mode 100644 index 0000000..c6791f5 --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/singleRepo.xml @@ -0,0 +1,36 @@ + + + + Copyright 2012, University of Nottingham + OpenDOAR data is available for re-use under a Creative Commons Attribution-Non-Commercial-Share Alike licence + + + Aalborg University - Electronic Library + + Y + http://www.aub.aau.dk/ + + Aalborg Universitetsbiblioteks + + Y + http://www.aub.aau.dk/ + Aalborg Universitet + + Y + http://www.aau.dk/ + Aalborg Universitetsbibliotek, Langagervej 2, 9220 Aalborg + + DK + Denmark + + 57.035000 + 9.932300 + 96 359400 + + This site is a university repository providing access to the research papers and publications of lecturers, and Ph.D theses, of Aalborg University. This site is poor in supporting information and background documentation, however contact details are readily available if problems are encountered. + + 35 + 2012-06-27 + + + \ No newline at end of file diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml new file mode 100644 index 0000000..7d62dc0 --- /dev/null +++ b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml @@ -0,0 +1,129 @@ + + +

+ oai:HAL:hal-00782129v1 + 2013-01-29 + type:COMM + subject:info + collection:UNIV-RENNES1 + collection:CNRS + collection:INRIA + collection:INRIA-RENNES + collection:IRISA + collection:IRISA_SET + collection:TESTINRIA +
+ + + HAL CCSD + Coupling 3G with DVB networks for low cost services + Jedidi, Azza + Tlais, Mazen + Weis, Frédéric + ACES (INRIA - IRISA) ; INRIA - Université de Rennes 1 - Institut National des Sciences Appliquées (INSA) - Rennes - CNRS + International audience + MASS'09 : International Conference on Management and Service Science + Wuhan, China + IEEE + IEEE + hal-00782129 + https://hal.inria.fr/hal-00782129 + https://hal.inria.fr/hal-00782129 + IEEE. MASS'09 : International Conference on Management and Service Science, Sep 2009, Wuhan, China. IEEE, pp.1-5, &lt;10.1109/ICMSS.2009.5303609&gt; + DOI : 10.1109/ICMSS.2009.5303609 + en + [INFO.INFO-OH] Computer Science/Other + Conference papers + Next generation networks will result from the convergence of the different existing technologies, taking benefit from their complementary properties . In this context, recent research has addressed Digital Video Broadcast (DVB) networks, which benefit of very high broadcast capacities, and has tried to couple them with complementary networks. In our work, we focus on DVB-SH, satellite services for hand-held devices, which is a hybrid (satellite/terrestrial) standard. We couple DVB-SH with a 3G cellular network, thus providing a bidirectional interactivity path. DVB-SH benefits from a very high bandwidth capacity that allows unidirectional IP-TV channels broadcast. A residual bandwidth in the DVB-SH path may still be available because of two reasons; the variable bit rates of served flows and/or some DVB reserved channels by the 3G provider. In our work, we focus on this small residual bandwidth and its potential utilization. The idea is to realize an efficient switching of IP data, coming from 3G networks, to the residual bandwidth of DVB Networks. The goal is to use this architecture in order to provide interactive low cost services over DVB networks. Keyword: Network convergence, DVB, 3G, residual bandwidth, switching, multimedia, low cost services + 2009-09-16 + + + + +
+ oai:HAL:hal-00782130v1 + 2013-06-03 + type:COMM + subject:shs + collection:CNRS + collection:UNIV-MONTP3 + collection:SHS + collection:PRAXILING + collection:AO-LINGUISTIQUE +
+ + + HAL CCSD + Révolution et disparition + Steuckardt, Agnès + PRAXILING UMR5267 (Praxiling) ; Université Paul Valéry - Montpellier III - CNRS + International audience + Disparitions et changements linguistiques + Disparitions et changements linguistiques + Claire Badiou-Monferran; Thomas Verjans + hal-00782130 + https://hal.archives-ouvertes.fr/hal-00782130 + https://hal.archives-ouvertes.fr/hal-00782130 + Claire Badiou-Monferran; Thomas Verjans. Disparitions et changements linguistiques, Dec 2010, France. à paraître + fr + Changement linguistique + Référent + Révolution française + [SHS.LANGUE] Humanities and Social Sciences/Linguistics + Conference papers + Cette étude suit, du début de l'âge classique à la Révolution, les représentations de la disparition linguistique : si elles s'opposent sur la place réservée aux mots du passé, elles se rejoignent dans une conception de la langue que Sylvain Auroux (1986) qualifiait de " politique ", où est attribué aux locuteurs un rôle de véritables " sujets de la langue ". Dans un second temps, elle met à l'épreuve de l'expérience cette conception politique de la disparition, en prenant l'exemple des abolitions opérées pendant la période révolutionnaire. + 2011 + + +
+ +
+ oai:HAL:hal-00504740v2 + 2013-06-12 + type:COMM + subject:info + subject:spi + collection:L2S + collection:SUPELEC + collection:SUP_LSS + collection:SUP_SIGNAUX +
+ + + HAL CCSD + GPU implementation of a 3D bayesian CT algorithm and its application on real foam reconstruction + Gac, Nicolas + Vabre, Alexandre + Mohammad-Djafari, Ali + Rabanal, Asier + Buyens, Fanny + Laboratoire des signaux et systèmes (L2S) ; Université Paris XI - Paris Sud - SUPELEC - UMR8506 CNRS + Laboratoire d'Intégration des Systèmes et des Technologies (LIST) + Financement OMTE DIGITEO + 5 pages + International audience + The 1st CT Meeting Proceedings + The First International Conference on Image Formation in X-Ray Computed Tomography + Salt Lake City, United States + hal-00504740 + https://hal.archives-ouvertes.fr/hal-00504740 + https://hal.archives-ouvertes.fr/hal-00504740/document + https://hal.archives-ouvertes.fr/hal-00504740 + The First International Conference on Image Formation in X-Ray Computed Tomography, Jun 2010, Salt Lake City, United States. http://www.ucair.med.utah.edu/CTmeeting/ProceedingsCTMeeting2010.pdf, pp.151-155 + en + Computed Tomograhy (CT) + Iterative 3D reconstruction + Bayesian estimation + GPU implementation + [INFO.INFO-IM] Computer Science/Medical Imaging + [INFO.INFO-DC] Computer Science/Distributed, Parallel, and Cluster Computing + [INFO.INFO-TS] Computer Science/Signal and Image Processing + [SPI.SIGNAL] Engineering Sciences/Signal and Image processing + Conference papers + A great number of image reconstruction algorithms, based on analytical filtered backprojection, are implemented for X-ray Computed Tomography (CT) [1, 3]. The limits of these methods appear when the number of projections is small, and/or not equidistributed around the object. In this specific context, iterative algebraic methods are implemented. A great number of them are mainly based on least square criterion. Recently, we proposed a regularized version based on Bayesian estimation approach. The main problem that appears when using such methods as well as any iterative algebraic methods is the computation time and especially for projection and backprojection steps. In this paper, first we show how we implemented some main steps of such algorithems which are the forward projection and backward backprojection steps on GPU hardware, and then we show some results on real application of the 3D tomographic reconstruction of metallic foams from a small number of projections. Through this application, we also show the good quality of results as well as a significant speed up of the computation with GPU implementation. + projet TomoX + 2010-06-21 + + +
+ \ No newline at end of file diff --git a/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml.gz b/dnet-core-components/src/test/resources/eu/dnetlib/miscutils/iterators/xml/weirdRecords.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..da42d87d67ebc06b07d8ebe157e7e96e098e6d41 GIT binary patch literal 3211 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 + + + 4.0.0 + dnet-core + eu.dnetlib + pom + 1.0.0-SNAPSHOT + + + + dnet-core-components + + + + + + GNU Affero General Public License, Version 3 + https://www.gnu.org/licenses/agpl-3.0.html + repo + + + + + + + Redmine + https://issue.openaire.research-infrastructures.eu/projects/dnet + + + + + + jenkins + https://jenkins-dnet.d4science.org + + + + + + scm:git:gitea@code-repo.d4science.org:D-Net/dnet-core.git + scm:git:gitea@code-repo.d4science.org:D-Net/dnet-core.git + https://code-repo.d4science.org/D-Net/dnet-core + HEAD + + + + + + + + + + + dnet-deps + dnet-dependencies + http://maven.research-infrastructures.eu/nexus/content/repositories/dnet-deps + default + + + dnet45-releases + D-Net 45 Releases + http://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-releases + default + + true + + + + + + + + + + + org.apache.commons + commons-lang3 + 3.5 + + + commons-codec + commons-codec + 1.9 + + + dom4j + dom4j + 1.6.1 + + + jaxen + jaxen + 1.1.6 + + + saxonica + saxon + 9.1.0.8 + + + saxonica + saxon-dom + 9.1.0.8 + + + jgrapht + jgrapht + 0.7.2 + + + net.sf.ehcache + ehcache + 2.8.0 + + + com.google.guava + guava + 23.3-jre + + + org.mockito + mockito-core + 1.6 + test + + + junit + junit + 4.9 + test + + + org.springframework + spring-test + [4.2.5.RELEASE] + false + + + commons-io + commons-io + 2.5 + test + + + + + + + + + + target + target/classes + ${project.artifactId}-${project.version} + target/test-classes + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + UTF-8 + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + + attach-sources + verify + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + true + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.0.0 + + + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + + + + + org.apache.maven.wagon + wagon-ssh + 2.10 + + + + + + + dnet45-snapshots + D-Net 45 Snapshots + http://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-snapshots + default + + + dnet45-releases + D-Net 45 Releases + http://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-releases + default + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + + +

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