Estoy escribiendo código para crear una biblioteca de plantillas de Java. Estoy escribiendo una pieza específica de código en un lector leerá el texto de la plantilla y sacar los marcadores de posición ( "$ {} marcador de posición). Hasta ahora, cuando Jtesting, parecía funcionar con un único marcador de posición, pero cuando intento más de uno, el código no parece volver bucle y leer el resto de la plantilla.
No puedo, por la vida de mí, ver por qué el código está fallando.
He depurado el código, y todo lo que puedo ver es que cuando se almacena el primer marcador de posición, no es un bucle hacia atrás, pero en su lugar se deserción.
Código es el siguiente:
import java.io.IOException;
import java.io.Reader;
public class placeholderFinder {
private Reader reader;
public placeholderFinder(Reader reader) {
this.reader = reader;
}
public static final int NORMALTEXT = 0;
public static final int PLACEHOLDERTEXT = 1;
private int state = NORMALTEXT;
private StringBuilder placeholder = new StringBuilder();
public String nextPlaceholderFinder() throws IOException {
for (int p = reader.read(); p != -1; p = reader.read()) {
if (p == '$') {
if (state == NORMALTEXT) {
state = PLACEHOLDERTEXT;
placeholder.append((char) p);
}
} else if (state == PLACEHOLDERTEXT) {
placeholder.append((char) p);
}
if (p == '}') {
if (state == PLACEHOLDERTEXT) {
state = NORMALTEXT;
String placeholderStore = placeholder.toString();
placeholder.setLength(0);
return placeholderStore;
}
}
}
return null;
}
}
Y el Jtest
@Test
void testWithPlaceholders() throws IOException {
Reader reader = new StringReader("a ${name} ${date}");
placeholderFinder finder = new placeholderFinder(reader);
String expectedresult = "${name}${date}";
String actualcode = finder.nextPlaceholderFinder();
assertEquals(expectedresult, actualcode);
Su declaración solución actual después de que el primer marcador de posición se encuentra, se puede cambiar a pasar por todos los personajes de la reader
antes de regresar. Aquí hay un ejemplo:
public String nextPlaceholderFinder() throws IOException {
for (int p = reader.read(); p != -1; p = reader.read()) {
if (p == '$') {
if (state == NORMALTEXT) {
state = PLACEHOLDERTEXT;
placeholder.append((char) p);
}
} else if (state == PLACEHOLDERTEXT) {
placeholder.append((char) p);
}
if (p == '}') {
if (state == PLACEHOLDERTEXT) {
state = NORMALTEXT;
}
}
}
return placeholder.toString();
}