forked from IntellectualSites/FastAsyncWorldEdit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AbstractFactory.java
136 lines (117 loc) · 4.2 KB
/
AbstractFactory.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* Copyright (C) WorldEdit team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.internal.registry;
import com.fastasyncworldedit.core.configuration.Caption;
import com.fastasyncworldedit.core.extension.factory.parser.AliasedParser;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.NoMatchException;
import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* An abstract implementation of a factory for internal usage.
*
* @param <E> the element that the factory returns
*/
@SuppressWarnings("ProtectedField")
public abstract class AbstractFactory<E> {
protected final WorldEdit worldEdit;
private final List<InputParser<E>> parsers = new ArrayList<>();
/**
* Create a new factory.
*
* @param worldEdit the WorldEdit instance
* @param defaultParser the parser to fall back to
*/
protected AbstractFactory(WorldEdit worldEdit, InputParser<E> defaultParser) {
checkNotNull(worldEdit);
checkNotNull(defaultParser);
this.worldEdit = worldEdit;
this.parsers.add(defaultParser);
}
/**
* Gets an immutable list of parsers.
*
* <p>
* To add parsers, use the register method.
* </p>
*
* @return the parsers
*/
public List<InputParser<E>> getParsers() {
return Collections.unmodifiableList(parsers);
}
//FAWE start - javadoc
/**
* Parse a string and context to each {@link InputParser} added to this factory. If no result found, throws {@link InputParseException}
*
* @param input input string
* @param context input context
* @return parsed result
* @throws InputParseException if no result found
*/
//FAWE end
public E parseFromInput(String input, ParserContext context) throws InputParseException {
E match;
for (InputParser<E> parser : parsers) {
match = parser.parseFromInput(input, context);
if (match != null) {
return match;
}
}
throw new NoMatchException(Caption.of("worldedit.error.no-match", TextComponent.of(input)));
}
@Deprecated
public List<String> getSuggestions(String input) {
return getSuggestions(input, new ParserContext());
}
public List<String> getSuggestions(String input, ParserContext context) {
return parsers.stream().flatMap(
p -> p.getSuggestions(input, context)
).collect(Collectors.toList());
}
/**
* Registers an InputParser to this factory.
*
* @param inputParser The input parser
*/
public void register(InputParser<E> inputParser) {
checkNotNull(inputParser);
parsers.add(parsers.size() - 1, inputParser);
}
/**
* Test all parsers to see if alias is contained by one of them
*
* @param alias alias to test
* @return if a parser contains the alias
*/
public boolean containsAlias(String alias) {
return parsers.stream().anyMatch(p -> {
if (!(p instanceof AliasedParser)) {
return false;
}
return ((AliasedParser) p).getMatchedAliases().contains(alias);
});
}
}