#java #uml #plantuml
Вопрос:
В моем Java-приложении я хочу использовать PlantUML для создания диаграмм. Я хочу создавать диаграммы в PlantUML, используя его Java API, без использования кода диаграммы PlantUML. К сожалению, в Интернете не хватает примеров или документации по этому вопросу, и единственным документированным API является тот, который генерирует диаграмму из кода диаграммы в виде строки, и это мне не помогает. Какой API в PlantUML можно использовать для создания диаграммы таким образом?
Ответ №1:
Мне не кажется, что PlantUML предназначен для использования таким образом: API не задокументирован. Сказав это, это проект с открытым исходным кодом, поэтому вы можете загрузить исходные файлы и следить за выполнением для данной строки UML, а затем воссоздать это выполнение с помощью вызовов методов, избегая источника UML, если это то, что вам нужно. Если у вас есть отладчик, который может проходить через сторонний код, например IntelliJ, это очень поможет.
У меня была небольшая попытка в этом. Вот класс, который сгенерирует диаграмму «Боб -> Алиса : привет» с использованием Java API без перехода через исходную строку UML. Я включил строковую версию UML для сравнения:
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.SourceStringReader;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
import net.sourceforge.plantuml.skin.ArrowConfiguration;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import static com.google.common.base.Preconditions.checkState;
public class PlantUMLDemoMain {
public static void main(String[] args) throws Exception {
generateFromStringSource(new File("from-string.png"));
generateFromApi(new File("from-api.png"));
}
private static void generateFromApi(File file) throws IOException {
// 1. setup:
SequenceDiagramFactory f = new SequenceDiagramFactory();
SequenceDiagram diagram = f.createEmptyDiagram();
// 2. Build the diagram:
// "Bob -> Alice : hello"
// See net.sourceforge.plantuml.sequencediagram.command.CommandArrow#executeArg
Display bobD = Display.getWithNewlines("Bob");
Participant bobP = diagram.getOrCreateParticipant("Bob", bobD);
Display aliceD = Display.getWithNewlines("Alice");
Participant aliceP = diagram.getOrCreateParticipant("Alice", aliceD);
Display label = Display.getWithNewlines("hello");
ArrowConfiguration config = ArrowConfiguration.withDirectionNormal();
Message msg = new Message(bobP, aliceP, label, config, diagram.getNextMessageNumber());
checkState(null == diagram.addMessage(msg));
// 3. Output the diagram
// See net.sourceforge.plantuml.SourceStringReader#generateImage
diagram.makeDiagramReady();
checkState(1 == diagram.getNbImages());
try (OutputStream os = new FileOutputStream(file)) {
ImageData imageData = diagram.exportDiagram(os, 0, new FileFormatOption(FileFormat.PNG));
System.out.println("generateFromApi: " diagram.getDescription().getDescription());
}
}
private static void generateFromStringSource(File file) throws IOException {
String source = "@startumln";
source = "Bob -> Alice : hellon";
source = "@endumln";
SourceStringReader reader = new SourceStringReader(source);
// Write the first image to "png"
String desc = reader.generateImage(file);
// Return a null string if no generation
System.out.println("generateFromStringSource: " desc);
}
}
Это будет сделано с build.sbt
помощью файла, подобного этому:
libraryDependencies = "net.sourceforge.plantuml" % "plantuml" % "8059"
libraryDependencies = "com.google.guava" % "guava" % "31.0.1-jre"
Вывод generateFromApi
идентичен generateFromStringSource
и выглядит следующим образом:
Комментарии:
1. Спасибо. Есть идеи, как добавить активацию в реальном времени?
2. Нет, извините. Вам придется либо поискать в их исходном коде, пока вы не найдете методы «SequenceDiagram» или «Участник», которые соответствуют этому, и/или написать диаграмму кода uml, которая использует эту функцию, и посмотреть, как соответствующий класс «sequencediagram.command.*» делает это и копирует это.