mirror of
https://github.com/octoleo/plantuml.git
synced 2024-12-22 02:49:06 +00:00
Version 5974
This commit is contained in:
parent
6ace15b789
commit
581798f94d
@ -60,7 +60,7 @@ final public class BlockUmlBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
static boolean isArobaseEnduml(String s) {
|
||||
public static boolean isArobaseEnduml(String s) {
|
||||
s = s.trim();
|
||||
return s.equals("@enduml") || s.startsWith("@enduml ");
|
||||
}
|
||||
@ -71,7 +71,7 @@ final public class BlockUmlBuilder {
|
||||
return s.startsWith("'");
|
||||
}
|
||||
|
||||
static boolean isArobaseStartuml(String s) {
|
||||
public static boolean isArobaseStartuml(String s) {
|
||||
s = s.trim();
|
||||
return s.equals("@startuml") || s.startsWith("@startuml ");
|
||||
}
|
||||
|
@ -33,11 +33,15 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import net.sourceforge.plantuml.suggest.SuggestEngineResult;
|
||||
import net.sourceforge.plantuml.suggest.SuggestEngineStatus;
|
||||
|
||||
class ErrorUml {
|
||||
|
||||
private final String error;
|
||||
private final int position;
|
||||
private final ErrorUmlType type;
|
||||
private SuggestEngineResult suggest;
|
||||
|
||||
ErrorUml(ErrorUmlType type, String error, int position) {
|
||||
if (error == null || type == null || StringUtils.isEmpty(error)) {
|
||||
@ -51,8 +55,7 @@ class ErrorUml {
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
final ErrorUml this2 = (ErrorUml) obj;
|
||||
return this.type == this2.type && this.position == this2.position
|
||||
&& this.error.equals(this2.error);
|
||||
return this.type == this2.type && this.position == this2.position && this.error.equals(this2.error);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -77,4 +80,16 @@ class ErrorUml {
|
||||
return position;
|
||||
}
|
||||
|
||||
public final SuggestEngineResult getSuggest() {
|
||||
return suggest;
|
||||
}
|
||||
|
||||
public final boolean hasSuggest() {
|
||||
return suggest != null && suggest.getStatus() == SuggestEngineStatus.ONE_SUGGESTION;
|
||||
}
|
||||
|
||||
public void setSuggest(SuggestEngineResult suggest) {
|
||||
this.suggest = suggest;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5746 $
|
||||
* Revision $Revision: 5974 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -36,6 +36,7 @@ package net.sourceforge.plantuml;
|
||||
public class OptionFlags {
|
||||
|
||||
static public final boolean PBBACK = false;
|
||||
static public final boolean SUGGEST = false;
|
||||
|
||||
void reset() {
|
||||
keepTmpFiles = false;
|
||||
|
@ -82,7 +82,7 @@ public class PSystemBuilder {
|
||||
|
||||
final List<PSystemError> errors = new ArrayList<PSystemError>();
|
||||
for (PSystemFactory systemFactory : factories) {
|
||||
final PSystem sys = new PSystemSingleBuilder(strings, systemFactory).getPSystem();
|
||||
final PSystem sys = new PSystemSingleBuilder(new UmlSource(strings), systemFactory).getPSystem();
|
||||
if (isOk(sys)) {
|
||||
return sys;
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5898 $
|
||||
* Revision $Revision: 5971 $
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
@ -43,64 +43,46 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
|
||||
public class PSystemError extends AbstractPSystem {
|
||||
|
||||
private final List<ErrorUml> errorsUml = new ArrayList<ErrorUml>();
|
||||
private final List<String> htmlStrings = new ArrayList<String>();
|
||||
private final List<String> plainStrings = new ArrayList<String>();
|
||||
private final int higherErrorPosition;
|
||||
private final Collection<String> errs;
|
||||
private final List<ErrorUml> printedErrors;
|
||||
|
||||
public PSystemError(UmlSource source, List<ErrorUml> errorUml) {
|
||||
this.errorsUml.addAll(errorUml);
|
||||
public PSystemError(UmlSource source, List<ErrorUml> all) {
|
||||
this.setSource(source);
|
||||
|
||||
final int higherErrorPositionExecution = getHigherErrorPosition(ErrorUmlType.EXECUTION_ERROR);
|
||||
final int higherErrorPositionSyntax = getHigherErrorPosition(ErrorUmlType.SYNTAX_ERROR);
|
||||
|
||||
final int higherErrorPositionExecution = getHigherErrorPosition(ErrorUmlType.EXECUTION_ERROR, all);
|
||||
final int higherErrorPositionSyntax = getHigherErrorPosition(ErrorUmlType.SYNTAX_ERROR, all);
|
||||
|
||||
if (higherErrorPositionExecution == Integer.MIN_VALUE && higherErrorPositionSyntax == Integer.MIN_VALUE) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
if (higherErrorPositionExecution >= higherErrorPositionSyntax) {
|
||||
higherErrorPosition = higherErrorPositionExecution;
|
||||
errs = getErrorsAt(higherErrorPositionExecution, ErrorUmlType.EXECUTION_ERROR);
|
||||
printedErrors = getErrorsAt(higherErrorPositionExecution, ErrorUmlType.EXECUTION_ERROR, all);
|
||||
} else {
|
||||
assert higherErrorPositionSyntax > higherErrorPositionExecution;
|
||||
higherErrorPosition = higherErrorPositionSyntax;
|
||||
errs = getErrorsAt(higherErrorPositionSyntax, ErrorUmlType.SYNTAX_ERROR);
|
||||
printedErrors = getErrorsAt(higherErrorPositionSyntax, ErrorUmlType.SYNTAX_ERROR, all);
|
||||
}
|
||||
appendSource(higherErrorPosition, errs);
|
||||
|
||||
|
||||
|
||||
// final Collection<ErrorUml> executions = getErrors(ErrorUmlType.EXECUTION_ERROR);
|
||||
// if (executions.size() > 0) {
|
||||
// higherErrorPosition = getHigherErrorPosition(ErrorUmlType.EXECUTION_ERROR);
|
||||
// errs = getErrorsAt(higherErrorPosition, ErrorUmlType.EXECUTION_ERROR);
|
||||
// appendSource(higherErrorPosition, errs);
|
||||
// } else {
|
||||
// higherErrorPosition = getHigherErrorPosition(ErrorUmlType.SYNTAX_ERROR);
|
||||
// errs = getErrorsAt(higherErrorPosition, ErrorUmlType.SYNTAX_ERROR);
|
||||
// if (errs.size() != 1) {
|
||||
// throw new UnsupportedOperationException(errs.toString());
|
||||
// }
|
||||
// appendSource(higherErrorPosition, errs);
|
||||
// }
|
||||
appendSource(higherErrorPosition);
|
||||
|
||||
}
|
||||
|
||||
public PSystemError(UmlSource source, ErrorUml... errorUml) {
|
||||
this(source, Arrays.asList(errorUml));
|
||||
public PSystemError(UmlSource source, ErrorUml singleError) {
|
||||
this(source, Collections.singletonList(singleError));
|
||||
}
|
||||
|
||||
public List<File> createFiles(File suggestedFile, FileFormatOption fileFormat) throws IOException, InterruptedException {
|
||||
public List<File> createFiles(File suggestedFile, FileFormatOption fileFormat) throws IOException,
|
||||
InterruptedException {
|
||||
if (suggestedFile.exists() && suggestedFile.isDirectory()) {
|
||||
throw new IllegalArgumentException("File is a directory "+suggestedFile);
|
||||
throw new IllegalArgumentException("File is a directory " + suggestedFile);
|
||||
}
|
||||
OutputStream os = null;
|
||||
try {
|
||||
@ -122,7 +104,7 @@ public class PSystemError extends AbstractPSystem {
|
||||
return new GraphicStrings(htmlStrings);
|
||||
}
|
||||
|
||||
private void appendSource(int position, Collection<String> errs) {
|
||||
private void appendSource(int position) {
|
||||
final int limit = 4;
|
||||
int start;
|
||||
final int skip = position - limit + 1;
|
||||
@ -150,15 +132,30 @@ public class PSystemError extends AbstractPSystem {
|
||||
underscore.append("^");
|
||||
}
|
||||
plainStrings.add(underscore.toString());
|
||||
for (String er : errs) {
|
||||
htmlStrings.add(" <font color=red>" + er);
|
||||
plainStrings.add(" " + er);
|
||||
for (ErrorUml er : printedErrors) {
|
||||
htmlStrings.add(" <color:red>" + er.getError());
|
||||
plainStrings.add(" " + er.getError());
|
||||
}
|
||||
boolean suggested = false;
|
||||
for (ErrorUml er : printedErrors) {
|
||||
if (er.hasSuggest()) {
|
||||
suggested = true;
|
||||
}
|
||||
}
|
||||
if (suggested) {
|
||||
htmlStrings.add(" <color:white><i>Did you mean:");
|
||||
for (ErrorUml er : printedErrors) {
|
||||
if (er.hasSuggest()) {
|
||||
htmlStrings.add("<color:white>"
|
||||
+ StringUtils.hideComparatorCharacters(er.getSuggest().getSuggestedLine()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Collection<ErrorUml> getErrors(ErrorUmlType type) {
|
||||
private Collection<ErrorUml> getErrors(ErrorUmlType type, List<ErrorUml> all) {
|
||||
final Collection<ErrorUml> result = new LinkedHashSet<ErrorUml>();
|
||||
for (ErrorUml error : errorsUml) {
|
||||
for (ErrorUml error : all) {
|
||||
if (error.getType() == type) {
|
||||
result.add(error);
|
||||
}
|
||||
@ -166,24 +163,24 @@ public class PSystemError extends AbstractPSystem {
|
||||
return result;
|
||||
}
|
||||
|
||||
private int getHigherErrorPosition(ErrorUmlType type) {
|
||||
private int getHigherErrorPosition(ErrorUmlType type, List<ErrorUml> all) {
|
||||
int max = Integer.MIN_VALUE;
|
||||
for (ErrorUml error : getErrors(type)) {
|
||||
for (ErrorUml error : getErrors(type, all)) {
|
||||
if (error.getPosition() > max) {
|
||||
max = error.getPosition();
|
||||
}
|
||||
}
|
||||
// if (max == Integer.MIN_VALUE) {
|
||||
// throw new IllegalStateException();
|
||||
// }
|
||||
// if (max == Integer.MIN_VALUE) {
|
||||
// throw new IllegalStateException();
|
||||
// }
|
||||
return max;
|
||||
}
|
||||
|
||||
private Collection<String> getErrorsAt(int position, ErrorUmlType type) {
|
||||
final Collection<String> result = new TreeSet<String>();
|
||||
for (ErrorUml error : getErrors(type)) {
|
||||
private List<ErrorUml> getErrorsAt(int position, ErrorUmlType type, List<ErrorUml> all) {
|
||||
final List<ErrorUml> result = new ArrayList<ErrorUml>();
|
||||
for (ErrorUml error : getErrors(type, all)) {
|
||||
if (error.getPosition() == position && StringUtils.isNotEmpty(error.getError())) {
|
||||
result.add(error.getError());
|
||||
result.add(error);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -193,10 +190,6 @@ public class PSystemError extends AbstractPSystem {
|
||||
return "(Error)";
|
||||
}
|
||||
|
||||
public final List<ErrorUml> getErrorsUml() {
|
||||
return Collections.unmodifiableList(errorsUml);
|
||||
}
|
||||
|
||||
public void print(PrintStream ps) {
|
||||
for (String s : plainStrings) {
|
||||
ps.println(StringUtils.showComparatorCharacters(s));
|
||||
@ -207,7 +200,7 @@ public class PSystemError extends AbstractPSystem {
|
||||
return higherErrorPosition;
|
||||
}
|
||||
|
||||
public final Collection<String> getErrs() {
|
||||
return Collections.unmodifiableCollection(errs);
|
||||
public final Collection<ErrorUml> getErrorsUml() {
|
||||
return Collections.unmodifiableCollection(printedErrors);
|
||||
}
|
||||
}
|
||||
|
@ -44,6 +44,9 @@ import net.sourceforge.plantuml.command.CommandControl;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.PSystemCommandFactory;
|
||||
import net.sourceforge.plantuml.command.ProtectedCommand;
|
||||
import net.sourceforge.plantuml.suggest.SuggestEngine;
|
||||
import net.sourceforge.plantuml.suggest.SuggestEngineResult;
|
||||
import net.sourceforge.plantuml.suggest.SuggestEngineStatus;
|
||||
|
||||
final public class PSystemSingleBuilder {
|
||||
|
||||
@ -66,9 +69,9 @@ final public class PSystemSingleBuilder {
|
||||
return sys;
|
||||
}
|
||||
|
||||
public PSystemSingleBuilder(List<String> strings, PSystemFactory systemFactory) throws IOException {
|
||||
source = new UmlSource(strings);
|
||||
it = strings.iterator();
|
||||
public PSystemSingleBuilder(UmlSource s, PSystemFactory systemFactory) throws IOException {
|
||||
this.source = s;
|
||||
it = s.iterator();
|
||||
if (BlockUmlBuilder.isArobaseStartuml(next()) == false) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
@ -130,7 +133,15 @@ final public class PSystemSingleBuilder {
|
||||
}
|
||||
final CommandControl commandControl = systemFactory.isValid(Arrays.asList(s));
|
||||
if (commandControl == CommandControl.NOT_OK) {
|
||||
sys = new PSystemError(source, new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", nb - 1));
|
||||
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", nb - 1);
|
||||
if (OptionFlags.SUGGEST) {
|
||||
final SuggestEngine engine = new SuggestEngine(source, systemFactory);
|
||||
final SuggestEngineResult result = engine.tryToSuggest();
|
||||
if (result.getStatus() == SuggestEngineStatus.ONE_SUGGESTION) {
|
||||
err.setSuggest(result);
|
||||
}
|
||||
}
|
||||
sys = new PSystemError(source, err);
|
||||
return;
|
||||
} else if (commandControl == CommandControl.OK_PARTIAL) {
|
||||
final boolean ok = manageMultiline(systemFactory, s);
|
||||
@ -142,8 +153,8 @@ final public class PSystemSingleBuilder {
|
||||
final Command cmd = new ProtectedCommand(systemFactory.createCommand(Arrays.asList(s)));
|
||||
final CommandExecutionResult result = cmd.execute(Arrays.asList(s));
|
||||
if (result.isOk() == false) {
|
||||
sys = new PSystemError(source, new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(),
|
||||
nb - 1));
|
||||
sys = new PSystemError(source,
|
||||
new ErrorUml(ErrorUmlType.EXECUTION_ERROR, result.getError(), nb - 1));
|
||||
return;
|
||||
}
|
||||
testDeprecated(Arrays.asList(s), cmd);
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5810 $
|
||||
* Revision $Revision: 5969 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -103,8 +103,8 @@ public class Run {
|
||||
ps.println("ERROR");
|
||||
final PSystemError sys = (PSystemError) system;
|
||||
ps.println(sys.getHigherErrorPosition());
|
||||
for (String er : sys.getErrs()) {
|
||||
ps.println(er);
|
||||
for (ErrorUml er : sys.getErrorsUml()) {
|
||||
ps.println(er.getError());
|
||||
}
|
||||
} else {
|
||||
ps.println("OTHER");
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5749 $
|
||||
* Revision $Revision: 5957 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -36,6 +36,7 @@ package net.sourceforge.plantuml;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
@ -307,11 +308,18 @@ public class StringUtils {
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
public static void trim(List<String> data) {
|
||||
public static void trim(List<String> data, boolean removeEmptyLines) {
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
final String s = data.get(i);
|
||||
data.set(i, s.trim());
|
||||
}
|
||||
if (removeEmptyLines) {
|
||||
for (final Iterator<String> it = data.iterator(); it.hasNext();) {
|
||||
if (it.next().length() == 0) {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ public class CommandLinkLongActivity extends CommandMultilines2<ActivityDiagram>
|
||||
}
|
||||
|
||||
public CommandExecutionResult execute(List<String> lines) {
|
||||
StringUtils.trim(lines);
|
||||
StringUtils.trim(lines, false);
|
||||
final Map<String, RegexPartialMatch> line0 = getStartingPattern().matcher(lines.get(0).trim());
|
||||
final IEntity entity1 = CommandLinkActivity.getEntity(getSystem(), line0, true);
|
||||
if (line0.get("STEREOTYPE").get(0) != null) {
|
||||
|
@ -69,17 +69,15 @@ public class CommandCreateEntityClassMultilines2 extends CommandMultilines2<Clas
|
||||
|
||||
|
||||
public CommandExecutionResult execute(List<String> lines) {
|
||||
StringUtils.trim(lines);
|
||||
StringUtils.trim(lines, true);
|
||||
final Map<String, RegexPartialMatch> line0 = getStartingPattern().matcher(lines.get(0).trim());
|
||||
final Entity entity = executeArg0(line0);
|
||||
if (entity == null) {
|
||||
return CommandExecutionResult.error("No such entity");
|
||||
}
|
||||
for (String s : lines.subList(1, lines.size() - 1)) {
|
||||
if (s.length()==0) {
|
||||
continue;
|
||||
}
|
||||
if (s.length() > 0 && VisibilityModifier.isVisibilityCharacter(s.charAt(0))) {
|
||||
assert s.length() > 0;
|
||||
if (VisibilityModifier.isVisibilityCharacter(s.charAt(0))) {
|
||||
getSystem().setVisibilityModifierPresent(true);
|
||||
}
|
||||
entity.addFieldOrMethod(s);
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5750 $
|
||||
* Revision $Revision: 5957 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
@ -47,7 +47,7 @@ public class CommandMultilinesFooter extends CommandMultilines<UmlDiagram> {
|
||||
}
|
||||
|
||||
public CommandExecutionResult execute(List<String> lines) {
|
||||
StringUtils.trim(lines);
|
||||
StringUtils.trim(lines, false);
|
||||
final Matcher m = getStartingPattern().matcher(lines.get(0).trim());
|
||||
if (m.find() == false) {
|
||||
throw new IllegalStateException();
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5750 $
|
||||
* Revision $Revision: 5957 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
@ -47,7 +47,7 @@ public class CommandMultilinesHeader extends CommandMultilines<UmlDiagram> {
|
||||
}
|
||||
|
||||
public CommandExecutionResult execute(List<String> lines) {
|
||||
StringUtils.trim(lines);
|
||||
StringUtils.trim(lines, false);
|
||||
final Matcher m = getStartingPattern().matcher(lines.get(0).trim());
|
||||
if (m.find() == false) {
|
||||
throw new IllegalStateException();
|
||||
|
@ -86,12 +86,10 @@ public class CommandSkinParamMultilines extends CommandMultilinesBracket<UmlDiag
|
||||
}
|
||||
|
||||
lines = new ArrayList<String>(lines.subList(1, lines.size() - 1));
|
||||
StringUtils.trim(lines);
|
||||
StringUtils.trim(lines, true);
|
||||
|
||||
for (String s : lines) {
|
||||
if (s.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
assert s.length() > 0;
|
||||
if (s.equals("}")) {
|
||||
context.pop();
|
||||
continue;
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5847 $
|
||||
* Revision $Revision: 5972 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
|
@ -55,14 +55,15 @@ public class CommandCreateEntityObjectMultilines extends CommandMultilines<Objec
|
||||
}
|
||||
|
||||
public CommandExecutionResult execute(List<String> lines) {
|
||||
StringUtils.trim(lines);
|
||||
StringUtils.trim(lines, true);
|
||||
final List<String> line0 = StringUtils.getSplit(getStartingPattern(), lines.get(0).trim());
|
||||
final Entity entity = executeArg0(line0);
|
||||
if (entity == null) {
|
||||
return CommandExecutionResult.error("No such entity");
|
||||
}
|
||||
for (String s : lines.subList(1, lines.size() - 1)) {
|
||||
if (s.length() > 0 && VisibilityModifier.isVisibilityCharacter(s.charAt(0))) {
|
||||
assert s.length() > 0;
|
||||
if (VisibilityModifier.isVisibilityCharacter(s.charAt(0))) {
|
||||
getSystem().setVisibilityModifierPresent(true);
|
||||
}
|
||||
entity.addField(s);
|
||||
|
159
src/net/sourceforge/plantuml/suggest/SuggestEngine.java
Normal file
159
src/net/sourceforge/plantuml/suggest/SuggestEngine.java
Normal file
@ -0,0 +1,159 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.sourceforge.net
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML 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.
|
||||
*
|
||||
* PlantUML 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 General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
|
||||
* in the United States and other countries.]
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4975 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.suggest;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.BlockUmlBuilder;
|
||||
import net.sourceforge.plantuml.UmlSource;
|
||||
import net.sourceforge.plantuml.command.Command;
|
||||
import net.sourceforge.plantuml.command.CommandControl;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.PSystemCommandFactory;
|
||||
import net.sourceforge.plantuml.command.ProtectedCommand;
|
||||
|
||||
final public class SuggestEngine {
|
||||
|
||||
// private final UmlSource source;
|
||||
private final PSystemCommandFactory systemFactory;
|
||||
private final Iterator<String> it;
|
||||
private int nb = 0;
|
||||
|
||||
public SuggestEngine(UmlSource source, PSystemCommandFactory systemFactory) {
|
||||
// this.source = source;
|
||||
this.systemFactory = systemFactory;
|
||||
this.it = source.iterator();
|
||||
if (BlockUmlBuilder.isArobaseStartuml(next()) == false) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasNext() {
|
||||
return it.hasNext();
|
||||
}
|
||||
|
||||
private String next() {
|
||||
nb++;
|
||||
return it.next();
|
||||
}
|
||||
|
||||
public SuggestEngineResult tryToSuggest() throws IOException {
|
||||
return executeUmlCommand();
|
||||
}
|
||||
|
||||
private SuggestEngineResult executeUmlCommand() throws IOException {
|
||||
systemFactory.reset();
|
||||
while (hasNext()) {
|
||||
final String s = next();
|
||||
if (BlockUmlBuilder.isArobaseEnduml(s)) {
|
||||
return SuggestEngineResult.SYNTAX_OK;
|
||||
}
|
||||
final SuggestEngineResult check = checkAndCorrect(s);
|
||||
if (check.getStatus() != SuggestEngineStatus.SYNTAX_OK) {
|
||||
return check;
|
||||
}
|
||||
final CommandControl commandControl = systemFactory.isValid(Arrays.asList(s));
|
||||
if (commandControl == CommandControl.OK_PARTIAL) {
|
||||
final boolean ok = manageMultiline(s);
|
||||
if (ok == false) {
|
||||
return SuggestEngineResult.CANNOT_CORRECT;
|
||||
}
|
||||
} else if (commandControl == CommandControl.OK) {
|
||||
final Command cmd = new ProtectedCommand(systemFactory.createCommand(Arrays.asList(s)));
|
||||
final CommandExecutionResult result = cmd.execute(Arrays.asList(s));
|
||||
if (result.isOk() == false) {
|
||||
return SuggestEngineResult.CANNOT_CORRECT;
|
||||
}
|
||||
} else {
|
||||
assert false;
|
||||
}
|
||||
}
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
private boolean manageMultiline(final String init) throws IOException {
|
||||
final List<String> lines = new ArrayList<String>();
|
||||
lines.add(init);
|
||||
while (hasNext()) {
|
||||
final String s = next();
|
||||
if (BlockUmlBuilder.isArobaseEnduml(s)) {
|
||||
return false;
|
||||
}
|
||||
lines.add(s);
|
||||
final CommandControl commandControl = systemFactory.isValid(lines);
|
||||
if (commandControl == CommandControl.NOT_OK) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
if (commandControl == CommandControl.OK) {
|
||||
// final Command cmd = systemFactory.createCommand(lines);
|
||||
// return cmd.execute(lines).isOk();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
SuggestEngineResult checkAndCorrect(String incorrectLine) {
|
||||
CommandControl commandControl = systemFactory.isValid(Arrays.asList(incorrectLine));
|
||||
if (commandControl != CommandControl.NOT_OK) {
|
||||
return SuggestEngineResult.SYNTAX_OK;
|
||||
}
|
||||
|
||||
// Remove one
|
||||
for (int i = 0; i < incorrectLine.length(); i++) {
|
||||
final String newS = incorrectLine.substring(0, i) + incorrectLine.substring(i + 1);
|
||||
commandControl = systemFactory.isValid(Arrays.asList(newS));
|
||||
if (commandControl != CommandControl.NOT_OK) {
|
||||
return new SuggestEngineResult(newS, nb);
|
||||
}
|
||||
}
|
||||
|
||||
// Inverse
|
||||
for (int i = 0; i < incorrectLine.length() - 1; i++) {
|
||||
final String newS = incorrectLine.substring(0, i) + incorrectLine.charAt(i + 1) + incorrectLine.charAt(i)
|
||||
+ incorrectLine.substring(i + 2);
|
||||
commandControl = systemFactory.isValid(Arrays.asList(newS));
|
||||
if (commandControl != CommandControl.NOT_OK) {
|
||||
return new SuggestEngineResult(newS, nb);
|
||||
}
|
||||
}
|
||||
|
||||
return SuggestEngineResult.CANNOT_CORRECT;
|
||||
}
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.sourceforge.net
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML 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.
|
||||
*
|
||||
* PlantUML 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 General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
|
||||
* in the United States and other countries.]
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4975 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.suggest;
|
||||
|
||||
public class SuggestEngineResult {
|
||||
|
||||
private final SuggestEngineStatus status;
|
||||
private final String suggestedLine;
|
||||
private final int numLine;
|
||||
|
||||
public static final SuggestEngineResult CANNOT_CORRECT = new SuggestEngineResult(SuggestEngineStatus.CANNOT_CORRECT);
|
||||
public static final SuggestEngineResult SYNTAX_OK = new SuggestEngineResult(SuggestEngineStatus.SYNTAX_OK);
|
||||
|
||||
private SuggestEngineResult(SuggestEngineStatus status) {
|
||||
if (status == SuggestEngineStatus.ONE_SUGGESTION) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
this.status = status;
|
||||
this.suggestedLine = null;
|
||||
this.numLine = -1;
|
||||
}
|
||||
|
||||
public SuggestEngineResult(String suggestedLine, int numLine) {
|
||||
this.status = SuggestEngineStatus.ONE_SUGGESTION;
|
||||
this.suggestedLine = suggestedLine;
|
||||
this.numLine = numLine;
|
||||
}
|
||||
|
||||
public final SuggestEngineStatus getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public final String getSuggestedLine() {
|
||||
return suggestedLine;
|
||||
}
|
||||
|
||||
public final int getNumLine() {
|
||||
return numLine;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.sourceforge.net
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML 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.
|
||||
*
|
||||
* PlantUML 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 General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
|
||||
* in the United States and other countries.]
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4975 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.suggest;
|
||||
|
||||
public enum SuggestEngineStatus {
|
||||
SYNTAX_OK, CANNOT_CORRECT, ONE_SUGGESTION
|
||||
|
||||
}
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5955 $
|
||||
* Revision $Revision: 5975 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.version;
|
||||
@ -36,11 +36,11 @@ package net.sourceforge.plantuml.version;
|
||||
public class Version {
|
||||
|
||||
public static int version() {
|
||||
return 5954;
|
||||
return 5974;
|
||||
}
|
||||
|
||||
public static long compileTime() {
|
||||
return 1294857964687L;
|
||||
return 1294953848234L;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user