SequentialIdGenerator.java

1
package fr.sii.ogham.core.id.generator;
2
3
import java.io.UnsupportedEncodingException;
4
import java.net.URLEncoder;
5
import java.util.concurrent.atomic.AtomicLong;
6
7
import org.slf4j.Logger;
8
import org.slf4j.LoggerFactory;
9
10
/**
11
 * Generates a simple sequence:
12
 * <ul>
13
 * <li>Either 1, 2, 3, ..., n</li>
14
 * <li>Or {@code <name>}1, {@code <name>}2, {@code <name>}3, ...,
15
 * {@code <name>}n</li>
16
 * </ul>
17
 * 
18
 * <p>
19
 * Name is URL encoded
20
 * 
21
 * <p>
22
 * If the generated id is greater than {@link Long#MAX_VALUE}, then it restarts
23
 * from 0.
24
 * 
25
 * @author Aurélien Baudet
26
 *
27
 */
28
public class SequentialIdGenerator implements IdGenerator {
29
	private static final Logger LOG = LoggerFactory.getLogger(SequentialIdGenerator.class);
30
31
	private final AtomicLong idx;
32
	private final boolean useNamePrefix;
33
34
	/**
35
	 * The sequence starts at 0 and doesn't use the name (only a number).
36
	 */
37
	public SequentialIdGenerator() {
38
		this(false);
39
	}
40
41
	/**
42
	 * The sequence starts at 0 and use the name only if {@code useNamePrefix}
43
	 * parameter is true.
44
	 * 
45
	 * @param useNamePrefix
46
	 *            use the name in the generated sequence
47
	 */
48
	public SequentialIdGenerator(boolean useNamePrefix) {
49
		this(useNamePrefix, 0);
50
	}
51
52
	/**
53
	 * The sequence starts at {@code initial} parameter value and use the name
54
	 * only if {@code useNamePrefix} parameter is true.
55
	 * 
56
	 * @param useNamePrefix
57
	 *            use the name in the generated sequence
58
	 * @param initial
59
	 *            the sequence start value
60
	 */
61
	public SequentialIdGenerator(boolean useNamePrefix, int initial) {
62
		super();
63
		this.idx = new AtomicLong(initial);
64
		this.useNamePrefix = useNamePrefix;
65
	}
66
67
	@Override
68
	public String generate(String name) {
69
		long id = idx.getAndIncrement();
70 6 1. generate : changed conditional boundary → NO_COVERAGE
2. generate : negated conditional → NO_COVERAGE
3. generate : changed conditional boundary → KILLED
4. generate : changed conditional boundary → KILLED
5. generate : negated conditional → KILLED
6. generate : negated conditional → KILLED
		if (id < 0) {
71 1 1. generate : Replaced long addition with subtraction → NO_COVERAGE
			id = id + Long.MIN_VALUE;
72
		}
73 3 1. generate : replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::generate → NO_COVERAGE
2. generate : replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::generate → KILLED
3. generate : replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::generate → KILLED
		return namePrefix(name) + id;
74
	}
75
76
	private String namePrefix(String name) {
77 3 1. namePrefix : negated conditional → NO_COVERAGE
2. namePrefix : negated conditional → KILLED
3. namePrefix : negated conditional → KILLED
		if (!useNamePrefix) {
78
			return "";
79
		}
80
		try {
81 2 1. namePrefix : replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::namePrefix → NO_COVERAGE
2. namePrefix : replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::namePrefix → KILLED
			return URLEncoder.encode(name, "UTF-8");
82
		} catch (UnsupportedEncodingException e) {
83
			LOG.warn("Failed to use {} as id prefix => no prefix used", name, e);
84
			return "";
85
		}
86
	}
87
88
}

Mutations

70

1.1
Location : generate
Killed by : oghamall.it.resolver.FreemarkerRelativeResourcesTests.relativeToPrefixSuffixAndPath(oghamall.it.resolver.FreemarkerRelativeResourcesTests)
changed conditional boundary → KILLED

2.2
Location : generate
Killed by : oghamcore.it.html.translator.InlineImageTranslatorTest.oghamAttributesShoulBeRemoved(oghamcore.it.html.translator.InlineImageTranslatorTest)
changed conditional boundary → KILLED

3.3
Location : generate
Killed by : none
changed conditional boundary → NO_COVERAGE

4.4
Location : generate
Killed by : oghamcore.it.html.translator.InlineImageTranslatorTest.oghamAttributesShoulBeRemoved(oghamcore.it.html.translator.InlineImageTranslatorTest)
negated conditional → KILLED

5.5
Location : generate
Killed by : oghamall.it.resolver.FreemarkerRelativeResourcesTests.relativeToPrefixSuffixAndPath(oghamall.it.resolver.FreemarkerRelativeResourcesTests)
negated conditional → KILLED

6.6
Location : generate
Killed by : none
negated conditional → NO_COVERAGE

71

1.1
Location : generate
Killed by : none
Replaced long addition with subtraction → NO_COVERAGE

73

1.1
Location : generate
Killed by : oghamcore.it.html.translator.InlineImageTranslatorTest.oghamAttributesShoulBeRemoved(oghamcore.it.html.translator.InlineImageTranslatorTest)
replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::generate → KILLED

2.2
Location : generate
Killed by : oghamall.it.resolver.FreemarkerRelativeResourcesTests.relativeToPrefixSuffixAndPath(oghamall.it.resolver.FreemarkerRelativeResourcesTests)
replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::generate → KILLED

3.3
Location : generate
Killed by : none
replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::generate → NO_COVERAGE

77

1.1
Location : namePrefix
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : namePrefix
Killed by : oghamall.it.resolver.FreemarkerRelativeResourcesTests.relativeToPrefixSuffixAndPath(oghamall.it.resolver.FreemarkerRelativeResourcesTests)
negated conditional → KILLED

3.3
Location : namePrefix
Killed by : oghamcore.it.html.translator.InlineImageTranslatorTest.oghamAttributesShoulBeRemoved(oghamcore.it.html.translator.InlineImageTranslatorTest)
negated conditional → KILLED

81

1.1
Location : namePrefix
Killed by : none
replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::namePrefix → NO_COVERAGE

2.2
Location : namePrefix
Killed by : oghamall.it.resolver.FreemarkerRelativeResourcesTests.relativeToPrefixSuffixAndPath(oghamall.it.resolver.FreemarkerRelativeResourcesTests)
replaced return value with "" for fr/sii/ogham/core/id/generator/SequentialIdGenerator::namePrefix → KILLED

Active mutators

Tests examined


Report generated by PIT OGHAM